// 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
