config_file.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * config_file.cpp - a fairly simple config file reader.  It will read
  23.  * either strings or ints out of .gmp4player_rc (or a specified file)
  24.  */
  25. #include "systems.h"
  26. #include "config_file.h"
  27. #ifdef _WIN32
  28. #include <atlbase.h>
  29. #endif
  30. // Basic list of available config variables.  Future work could make this
  31. // dynamic, but I'm not going to bother right now...
  32. CConfig::CConfig(const config_variable_t *config, uint32_t max)
  33. {
  34.   m_config_var = config;
  35.   m_config_max = max;
  36.   init();
  37. }
  38. CConfig::CConfig (const config_variable_t *config, 
  39.   uint32_t max, 
  40.   const char *name)
  41. {
  42.   m_config_var = config;
  43.   m_config_max = max;
  44.   init();
  45.   read_config_file(name);
  46.   m_changed = 0;
  47. }
  48. void CConfig::init (void)
  49. {
  50.   m_types = (int *)malloc(sizeof(int) * m_config_max);
  51.   m_values = (int *)malloc(sizeof(int) * m_config_max);
  52.   m_strings = (char **)malloc(sizeof(char *) * m_config_max);
  53.   for (uint32_t ix = 0; ix < m_config_max; ix++) {
  54.     int index = m_config_var[ix].config_index;
  55.     m_types[index] = m_config_var[ix].config_type;
  56.     m_values[index] = m_config_var[ix].default_value;
  57.     if (m_config_var[ix].default_string != NULL) {
  58.       m_strings[index] = strdup(m_config_var[ix].default_string);
  59.     } else {
  60.       m_strings[index] = NULL;
  61.     }
  62.   }
  63.   m_changed = 0;
  64. }
  65. CConfig::~CConfig(void)
  66. {
  67.   if (m_changed != 0) {
  68.     write_config_file();
  69.   }
  70.   for (uint32_t ix = 0; ix < m_config_max; ix++) {
  71.     if (m_strings[ix] != NULL) {
  72.       free(m_strings[ix]);
  73.       m_strings[ix] = NULL;
  74.     }
  75.   }
  76.   free(m_types);
  77.   m_types = NULL;
  78.   free(m_strings);
  79.   m_strings = NULL;
  80.   free(m_values);
  81.   m_values = NULL;
  82. }
  83. int CConfig::get_config_type (uint32_t index)
  84. {
  85.   if (index < 0 || index >= m_config_max)
  86.     return (-1);
  87.   return (m_types[index]);
  88. }
  89. int CConfig::get_config_value (int ix)
  90. {
  91.   uint32_t index = ix;
  92.   if (index < 0 || index >= m_config_max)
  93.     return (-1);
  94.   if (m_types[index] != CONFIG_INT)
  95.     return (-1);
  96.   return (m_values[index]);
  97. }
  98. int CConfig::get_config_default_value (uint32_t index)
  99. {
  100.   for (uint32_t ix = 0; ix < m_config_max; ix++) {
  101.     if (index == m_config_var[ix].config_index) {
  102.       if (m_config_var[ix].config_type == CONFIG_INT)
  103. return (m_config_var[ix].default_value);
  104.       else
  105. return (-1);
  106.     }
  107.   }
  108.   return (-1);
  109. }
  110. const char *CConfig::get_config_string (uint32_t index)
  111. {
  112.   if (index < 0 || index >= m_config_max)
  113.     return (NULL);
  114.   if (m_types[index] != CONFIG_STRING)
  115.     return (NULL);
  116.   return (m_strings[index]);
  117. }
  118. const char *CConfig::get_config_default_string (uint32_t index)
  119. {
  120.   for (uint32_t ix = 0; ix < m_config_max; ix++) {
  121.     if (index == m_config_var[ix].config_index) {
  122.       if (m_config_var[ix].config_type == CONFIG_STRING)
  123. return (m_config_var[ix].default_string);
  124.       else
  125. return (NULL);
  126.     }
  127.   }
  128.   return (NULL);
  129. }
  130. void CConfig::get_default_name (char *buffer) 
  131. {
  132.   char *home = getenv("HOME");
  133.   if (home == NULL) {
  134. #ifdef _WIN32
  135. strcpy(buffer, "gmp4player_rc");
  136. #else
  137.     strcpy(buffer, ".gmp4player_rc");
  138. #endif
  139.   } else {
  140.     strcpy(buffer, home);
  141.     strcat(buffer, "/.gmp4player_rc");
  142.   }
  143. }
  144. #define ADV_SPACE(a) {while (isspace(*(a)) && (*(a) != ''))(a)++;}
  145. char *CConfig::find_name (char *ptr, uint32_t &ix)
  146. {
  147.   for (ix = 0; ix < m_config_max; ix++) {
  148.     uint32_t len;
  149.     len = strlen(m_config_var[ix].config_name);
  150.     if (strncasecmp(ptr, 
  151.     m_config_var[ix].config_name, 
  152.     len) == 0) {
  153.       ptr += len;
  154.       return (ptr);
  155.     }
  156.   }
  157.   return (NULL);
  158. }
  159.   
  160. int CConfig::read_config_file (const char *name)
  161. {
  162.   FILE *ifile;
  163.   char buffer[1024];
  164.   if (name == NULL) {
  165.     get_default_name(buffer);
  166.     name = buffer;
  167.   } 
  168.   
  169.   ifile = fopen(name, "r");
  170.   if (ifile == NULL) {
  171.     printf("File %s not found", name);
  172.     return (-1);
  173.   }
  174.   while (fgets(buffer, sizeof(buffer), ifile) != NULL) {
  175.     char *ptr = buffer;
  176.     while (*ptr != '') {
  177.       ptr++;
  178.     }
  179.     ptr--;
  180.     while (isspace(*ptr)) { 
  181.       *ptr = '';
  182.       ptr--;
  183.     }
  184.     ptr = buffer;
  185.     ADV_SPACE(ptr);
  186.     if (ptr != '') {
  187.       uint32_t index;
  188.       ptr = find_name(ptr, index);
  189.       if (ptr != NULL) {
  190. ADV_SPACE(ptr);
  191. if (*ptr == '=') ptr++;
  192. ADV_SPACE(ptr);
  193. if (m_config_var[index].config_type == CONFIG_INT) {
  194.   set_config_value(m_config_var[index].config_index,
  195.    atoi(ptr));
  196. } else {
  197.   set_config_string(m_config_var[index].config_index,
  198.     strdup(ptr));
  199. }
  200.       }
  201.     }
  202.   }
  203.   fclose(ifile);
  204.   m_changed = 0; // since we only read it, don't indicate we need to set it...
  205.   return (0);
  206. }
  207. void CConfig::write_config_file (const char *name)
  208. {
  209.   FILE *ofile;
  210.   char buffer[1024];
  211.   if (name == NULL) {
  212.     get_default_name(buffer);
  213.     name = buffer;
  214.   } 
  215.   
  216.   ofile = fopen(name, "w");
  217.   for (uint32_t ix = 0; ix < m_config_max; ix++) {
  218.     uint32_t index = m_config_var[ix].config_index;
  219.     if (m_config_var[ix].config_type == CONFIG_INT) {
  220.       if (m_config_var[ix].default_value != m_values[index]) {
  221. fprintf(ofile, 
  222. "%s=%dn", 
  223. m_config_var[ix].config_name, 
  224. m_values[index]);
  225.       }
  226.     } else {
  227.       if (m_strings[index] != NULL) {
  228. if (m_config_var[ix].default_string == NULL || 
  229.     strcasecmp(m_config_var[ix].default_string, m_strings[index]) != 0) {
  230.   fprintf(ofile, "%s=%sn", m_config_var[ix].config_name, m_strings[index]);
  231. }
  232.       }
  233.     }
  234.   }
  235.   fclose(ofile);
  236.   m_changed = 0;
  237. }
  238. #ifdef _WIN32
  239. #include <atlimpl.cpp>
  240. int CConfig::read_config_file(const char *reg_name, const char *config_section)
  241. {
  242. LONG result;
  243. char buff[1024];
  244. CRegKey newrk;
  245. snprintf(buff, sizeof(buff), "%s\\%s", reg_name, config_section);
  246. result = newrk.Open(HKEY_CURRENT_USER, buff);
  247. if (result != ERROR_SUCCESS) return -1;
  248. for (uint32_t ix = 0; ix < m_config_max; ix++) {
  249. if (m_config_var[ix].config_type == CONFIG_INT) {
  250. DWORD temp;
  251. result = newrk.QueryValue(temp, m_config_var[ix].config_name);
  252. if (result == ERROR_SUCCESS) {
  253. m_values[ix] = temp;
  254. }
  255. } else {
  256. DWORD buflen;
  257. buflen = sizeof(buff);
  258. result = newrk.QueryValue(buff, m_config_var[ix].config_name,
  259.   &buflen);
  260. if (result == ERROR_SUCCESS) {
  261. char *str = strdup(buff);
  262. this->set_config_string(m_config_var[ix].config_index,
  263. str);
  264. }
  265. }
  266. }
  267. return 0;
  268. }
  269. #define FORCE_SET
  270. void CConfig::write_config_file (const char *reg_name, const char *config_section)
  271. {
  272. LONG result;
  273. char buff[1024];
  274. CRegKey newrk;
  275. snprintf(buff, sizeof(buff), "%s\\%s", reg_name, config_section);
  276. result = newrk.Create(HKEY_CURRENT_USER, buff);
  277. if (result != ERROR_SUCCESS) return;
  278. for (uint32_t ix = 0; ix < m_config_max; ix++) {
  279. if (m_config_var[ix].config_type == CONFIG_INT) {
  280. #ifdef FORCE_SET
  281. newrk.SetValue(m_values[ix], m_config_var[ix].config_name);
  282. #else
  283. if (m_values[ix] == m_config_var[ix].default_value) {
  284. newrk.DeleteValue(m_config_var[ix].config_name);
  285. } else {
  286. newrk.SetValue(m_values[ix], m_config_var[ix].config_name);
  287. }
  288. #endif
  289. } else if (m_strings[ix] != NULL) {
  290. #ifdef FORCE_SET
  291. newrk.SetValue(m_strings[ix], m_config_var[ix].config_name);
  292. #else
  293. if (strcasecmp(m_strings[ix], m_config_var[ix].default_string) == 0) {
  294. newrk.DeleteValue(m_config_var[ix].config_name);
  295. } else {
  296. newrk.SetValue(m_strings[ix], m_config_var[ix].config_name);
  297. }
  298. #endif
  299. }
  300. }
  301. newrk.Close();
  302. m_changed = 0;
  303. }
  304. #endif
  305. /* end file config_file.cpp */