configuration.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:15k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * configuration.h : configuration management module
  3.  * This file describes the programming interface for the configuration module.
  4.  * It includes functions allowing to declare, get or set configuration options.
  5.  *****************************************************************************
  6.  * Copyright (C) 1999, 2000 VideoLAN
  7.  * $Id: configuration.h 8803 2004-09-26 12:59:50Z gbazin $
  8.  *
  9.  * Authors: Gildas Bazin <gbazin@videolan.org>
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  24.  *****************************************************************************/
  25. /*****************************************************************************
  26.  * Macros used to build the configuration structure.
  27.  *****************************************************************************/
  28. /* Configuration hint types */
  29. #define CONFIG_HINT_END                     0x0001  /* End of config */
  30. #define CONFIG_HINT_CATEGORY                0x0002  /* Start of new category */
  31. #define CONFIG_HINT_SUBCATEGORY             0x0003  /* Start of sub-category */
  32. #define CONFIG_HINT_SUBCATEGORY_END         0x0004  /* End of sub-category */
  33. #define CONFIG_HINT_USAGE                   0x0005  /* Usage information */
  34. #define CONFIG_HINT                         0x000F
  35. /* Configuration item types */
  36. #define CONFIG_ITEM_STRING                  0x0010  /* String option */
  37. #define CONFIG_ITEM_FILE                    0x0020  /* File option */
  38. #define CONFIG_ITEM_MODULE                  0x0030  /* Module option */
  39. #define CONFIG_ITEM_INTEGER                 0x0040  /* Integer option */
  40. #define CONFIG_ITEM_BOOL                    0x0050  /* Bool option */
  41. #define CONFIG_ITEM_FLOAT                   0x0060  /* Float option */
  42. #define CONFIG_ITEM_DIRECTORY               0x0070  /* Directory option */
  43. #define CONFIG_ITEM_KEY                     0x0080  /* Hot key option */
  44. #define CONFIG_ITEM                         0x00F0
  45. struct module_config_t
  46. {
  47.     int          i_type;                               /* Configuration type */
  48.     char        *psz_type;                          /* Configuration subtype */
  49.     char        *psz_name;                                    /* Option name */
  50.     char         i_short;                      /* Optional short option name */
  51.     char        *psz_text;      /* Short comment on the configuration option */
  52.     char        *psz_longtext;   /* Long comment on the configuration option */
  53.     char        *psz_value;                                  /* Option value */
  54.     int          i_value;                                    /* Option value */
  55.     float        f_value;                                    /* Option value */
  56.     int         i_min;                               /* Option minimum value */
  57.     int         i_max;                               /* Option maximum value */
  58.     float       f_min;                               /* Option minimum value */
  59.     float       f_max;                               /* Option maximum value */
  60.     /* Function to call when commiting a change */
  61.     vlc_callback_t pf_callback;
  62.     void          *p_callback_data;
  63.     /* Values list */
  64.     char       **ppsz_list;        /* List of possible values for the option */
  65.     int         *pi_list;          /* Idem for integers */
  66.     char       **ppsz_list_text;   /* Friendly names for list values */
  67.     int          i_list;           /* Options list size */
  68.     /* Actions list */
  69.     vlc_callback_t *ppf_action;    /* List of possible actions for a config */
  70.     char           **ppsz_action_text;         /* Friendly names for actions */
  71.     int            i_action;                            /* actions list size */
  72.     /* Misc */
  73.     vlc_mutex_t *p_lock;            /* Lock to use when modifying the config */
  74.     vlc_bool_t   b_dirty;          /* Dirty flag to indicate a config change */
  75.     vlc_bool_t   b_advanced;          /* Flag to indicate an advanced option */
  76.     /* Original option values */
  77.     char        *psz_value_orig;
  78.     int          i_value_orig;
  79.     float        f_value_orig;
  80. };
  81. /*****************************************************************************
  82.  * Prototypes - these methods are used to get, set or manipulate configuration
  83.  * data.
  84.  *****************************************************************************/
  85. VLC_EXPORT( int,    __config_GetType,  (vlc_object_t *, const char *) );
  86. VLC_EXPORT( int,    __config_GetInt,   (vlc_object_t *, const char *) );
  87. VLC_EXPORT( void,   __config_PutInt,   (vlc_object_t *, const char *, int) );
  88. VLC_EXPORT( float,  __config_GetFloat, (vlc_object_t *, const char *) );
  89. VLC_EXPORT( void,   __config_PutFloat, (vlc_object_t *, const char *, float) );
  90. VLC_EXPORT( char *, __config_GetPsz,   (vlc_object_t *, const char *) );
  91. VLC_EXPORT( void,   __config_PutPsz,   (vlc_object_t *, const char *, const char *) );
  92. VLC_EXPORT( int,    __config_LoadCmdLine,  ( vlc_object_t *, int *, char *[], vlc_bool_t ) );
  93. VLC_EXPORT( char *,   config_GetHomeDir,     ( void ) );
  94. VLC_EXPORT( int,    __config_LoadConfigFile, ( vlc_object_t *, const char * ) );
  95. VLC_EXPORT( int,    __config_SaveConfigFile, ( vlc_object_t *, const char * ) );
  96. VLC_EXPORT( void,   __config_ResetAll, ( vlc_object_t * ) );
  97. VLC_EXPORT( module_config_t *, config_FindConfig,( vlc_object_t *, const char * ) );
  98. VLC_EXPORT( module_t *, config_FindModule,( vlc_object_t *, const char * ) );
  99. VLC_EXPORT( void, config_Duplicate, ( module_t *, module_config_t * ) );
  100.             void  config_Free       ( module_t * );
  101. VLC_EXPORT( void, config_SetCallbacks, ( module_config_t *, module_config_t * ) );
  102. VLC_EXPORT( void, config_UnsetCallbacks, ( module_config_t * ) );
  103. #define config_GetType(a,b) __config_GetType(VLC_OBJECT(a),b)
  104. #define config_GetInt(a,b) __config_GetInt(VLC_OBJECT(a),b)
  105. #define config_PutInt(a,b,c) __config_PutInt(VLC_OBJECT(a),b,c)
  106. #define config_GetFloat(a,b) __config_GetFloat(VLC_OBJECT(a),b)
  107. #define config_PutFloat(a,b,c) __config_PutFloat(VLC_OBJECT(a),b,c)
  108. #define config_GetPsz(a,b) __config_GetPsz(VLC_OBJECT(a),b)
  109. #define config_PutPsz(a,b,c) __config_PutPsz(VLC_OBJECT(a),b,c)
  110. #define config_LoadCmdLine(a,b,c,d) __config_LoadCmdLine(VLC_OBJECT(a),b,c,d)
  111. #define config_LoadConfigFile(a,b) __config_LoadConfigFile(VLC_OBJECT(a),b)
  112. #define config_SaveConfigFile(a,b) __config_SaveConfigFile(VLC_OBJECT(a),b)
  113. #define config_ResetAll(a) __config_ResetAll(VLC_OBJECT(a))
  114. /* internal only */
  115. int config_CreateDir( vlc_object_t *, char * );
  116. /*****************************************************************************
  117.  * Macros used to build the configuration structure.
  118.  *
  119.  * Note that internally we support only 3 types of config data: int , float
  120.  *   and string.
  121.  *   The other types declared here just map to one of these 3 basic types but
  122.  *   have the advantage of also providing very good hints to a configuration
  123.  *   interface so as to make it more user friendly.
  124.  * The configuration structure also includes category hints. These hints can
  125.  *   provide a configuration interface with some very useful data and again
  126.  *   allow for a more user friendly interface.
  127.  *****************************************************************************/
  128. #define add_category_hint( text, longtext, advc ) 
  129.     i_config++; 
  130.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  131.         (i_config+11) * sizeof(module_config_t)); 
  132.     { static module_config_t tmp = { CONFIG_HINT_CATEGORY, NULL, NULL, '', text, longtext }; p_config[ i_config ] = tmp; p_config[i_config].b_advanced = advc; }
  133. #define add_subcategory_hint( text, longtext ) 
  134.     i_config++; 
  135.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  136.         (i_config+11) * sizeof(module_config_t)); 
  137.     { static module_config_t tmp = { CONFIG_HINT_SUBCATEGORY, NULL, NULL, '', text, longtext }; p_config[ i_config ] = tmp; }
  138. #define end_subcategory_hint 
  139.     i_config++; 
  140.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  141.         (i_config+11) * sizeof(module_config_t)); 
  142.     { static module_config_t tmp = { CONFIG_HINT_SUBCATEGORY_END, NULL, NULL, '' }; p_config[ i_config ] = tmp; }
  143. #define add_usage_hint( text ) 
  144.     i_config++; 
  145.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  146.         (i_config+11) * sizeof(module_config_t)); 
  147.     { static module_config_t tmp = { CONFIG_HINT_USAGE, NULL, NULL, '', text }; p_config[ i_config ] = tmp; }
  148. #define add_string( name, psz_value, p_callback, text, longtext, advc ) 
  149.     i_config++; 
  150.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  151.         (i_config+11) * sizeof(module_config_t)); 
  152.     { static module_config_t tmp = { CONFIG_ITEM_STRING, NULL, name, '', text, longtext, psz_value }; tmp.b_advanced = advc; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; }
  153. #define add_file( name, psz_value, p_callback, text, longtext, advc ) 
  154.     i_config++; 
  155.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  156.         (i_config+11) * sizeof(module_config_t)); 
  157.     { static module_config_t tmp = { CONFIG_ITEM_FILE, NULL, name, '', text, longtext, psz_value, 0, 0 }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  158. #define add_directory( name, psz_value, p_callback, text, longtext, advc ) 
  159.     i_config++; 
  160.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  161.         (i_config+11) * sizeof(module_config_t)); 
  162.     { static module_config_t tmp = { CONFIG_ITEM_DIRECTORY, NULL, name, '', text, longtext, psz_value, 0, 0 }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  163. #define add_module( name, psz_caps, psz_value, p_callback, text, longtext, advc ) 
  164.     i_config++; 
  165.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  166.         (i_config+11) * sizeof(module_config_t)); 
  167.     { static module_config_t tmp = { CONFIG_ITEM_MODULE, psz_caps, name, '', text, longtext, psz_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  168. #define add_integer( name, i_value, p_callback, text, longtext, advc ) 
  169.     i_config++; 
  170.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  171.         (i_config+11) * sizeof(module_config_t)); 
  172.     { static module_config_t tmp = { CONFIG_ITEM_INTEGER, NULL, name, '', text, longtext, NULL, i_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  173. #define add_key( name, i_value, p_callback, text, longtext, advc ) 
  174.     i_config++; 
  175.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  176.         (i_config+11) * sizeof(module_config_t)); 
  177.     { static module_config_t tmp = { CONFIG_ITEM_KEY, NULL, name, '', text, longtext, NULL, i_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  178. #define add_integer_with_range( name, i_value, i_min, i_max, p_callback, text, longtext, advc ) 
  179.     i_config++; 
  180.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  181.         (i_config+11) * sizeof(module_config_t)); 
  182.     { static module_config_t tmp = { CONFIG_ITEM_INTEGER, NULL, name, '', text, longtext, NULL, i_value, 0, i_min, i_max }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  183. #define add_float( name, f_value, p_callback, text, longtext, advc ) 
  184.     i_config++; 
  185.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  186.         (i_config+11) * sizeof(module_config_t)); 
  187.     { static module_config_t tmp = { CONFIG_ITEM_FLOAT, NULL, name, '', text, longtext, NULL, 0, f_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  188. #define add_float_with_range( name, f_value, f_min, f_max, p_callback, text, longtext, advc ) 
  189.     i_config++; 
  190.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  191.         (i_config+11) * sizeof(module_config_t)); 
  192.     { static module_config_t tmp = { CONFIG_ITEM_FLOAT, NULL, name, '', text, longtext, NULL, 0, f_value, 0, 0, f_min, f_max }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  193. #define add_bool( name, b_value, p_callback, text, longtext, advc ) 
  194.     i_config++; 
  195.     if(!(i_config%10)) p_config = (module_config_t* )realloc(p_config, 
  196.         (i_config+11) * sizeof(module_config_t)); 
  197.     { static module_config_t tmp = { CONFIG_ITEM_BOOL, NULL, name, '', text, longtext, NULL, b_value }; p_config[ i_config ] = tmp; p_config[ i_config ].pf_callback = p_callback; p_config[i_config].b_advanced = advc; }
  198. /* Modifier macros for the config options (used for fine tuning) */
  199. #define change_short( ch ) 
  200.     p_config[i_config].i_short = ch;
  201. #define change_string_list( list, list_text, list_update_func ) 
  202.     p_config[i_config].i_list = sizeof(list)/sizeof(char *); 
  203.     p_config[i_config].ppsz_list = list; 
  204.     p_config[i_config].ppsz_list_text = list_text;
  205. #define change_integer_list( list, list_text, list_update_func ) 
  206.     p_config[i_config].i_list = sizeof(list)/sizeof(int); 
  207.     p_config[i_config].pi_list = list; 
  208.     p_config[i_config].ppsz_list_text = list_text;
  209. #define change_integer_range( min, max ) 
  210.     p_config[i_config].i_min = min; 
  211.     p_config[i_config].i_max = max;
  212. #define change_float_range( min, max ) 
  213.     p_config[i_config].f_min = min; 
  214.     p_config[i_config].f_max = max;
  215. #define change_action_add( pf_action, action_text ) 
  216.     if( !p_config[i_config].i_action ) 
  217.     { p_config[i_config].ppsz_action_text = 0; 
  218.       p_config[i_config].ppf_action = 0; } 
  219.     p_config[i_config].ppf_action = (vlc_callback_t *) 
  220.       realloc( p_config[i_config].ppf_action, 
  221.       (p_config[i_config].i_action + 1) * sizeof(void *) ); 
  222.     p_config[i_config].ppsz_action_text = (char **)
  223.       realloc( p_config[i_config].ppsz_action_text, 
  224.       (p_config[i_config].i_action + 1) * sizeof(void *) ); 
  225.     p_config[i_config].ppf_action[p_config[i_config].i_action] = pf_action; 
  226.     p_config[i_config].ppsz_action_text[p_config[i_config].i_action] = 
  227.       action_text; 
  228.     p_config[i_config].i_action++;