// Copyright 2011 Google Inc. All Rights Reserved.
// Author: qianzhang@google.com (ken Zhang)

#ifndef _CHANNEL_BUFFER_H_
#define _CHANNEL_BUFFER_H_

#ifndef MAX
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#endif
#ifndef MIN
#define MIN(x, y) ((x) < (y) ? (x) : (y))
#endif

struct channel_entry_t {
  int ch;
  int state;
  int ctrl_bits;  // 0x01 fix muticast IP/port
  char ch_name[20];
  char ch_desc[32];
  char src_ip[16];
  int src_port;
  char epg_id[8];
  char dev_name[32];
  char dev_tuning[16];
  char av_inf[1024];
  int frq;
};

struct channel_list_t {
  int num;
  int channel_num;
  struct channel_entry_t *ce;
};

char *join_alloc_string(char *str1, char *str2);
int get_string(char *p, const char *name, char *string, int max_len,
               char **next);
int get_string_with_quote(char *p, const char *name, char *string, int max_len,
                          char **next);
int get_string_token(char *p, int num, char *string, int max_len, char **next);
int get_int_val(char *p, const char *name, int *val, char **next);

struct channel_list_t *create_channel_list(int num);
void release_channel_list(struct channel_list_t *cl);
struct channel_list_t *join_channel_list(struct channel_list_t *cl1,
                                         struct channel_list_t *cl2);

int make_channel_entry_buffer(struct channel_entry_t *ce, char *buf, int size);
int parse_channel_entry_buffer(struct channel_entry_t *ce, char *buf);
struct channel_list_t *load_channel_entry(char *file_name);
int save_channel_entry(char *file_name, struct channel_list_t *cl);

#endif
