summaryrefslogtreecommitdiff
path: root/ace/Configuration_Import_Export.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ace/Configuration_Import_Export.cpp')
-rw-r--r--ace/Configuration_Import_Export.cpp554
1 files changed, 0 insertions, 554 deletions
diff --git a/ace/Configuration_Import_Export.cpp b/ace/Configuration_Import_Export.cpp
deleted file mode 100644
index 890fb479dd8..00000000000
--- a/ace/Configuration_Import_Export.cpp
+++ /dev/null
@@ -1,554 +0,0 @@
-// $Id$
-
-#include "ace/Configuration_Import_Export.h"
-
-ACE_Config_ImpExp_Base::ACE_Config_ImpExp_Base (ACE_Configuration& config)
- : config_ (config)
-{
-}
-
-ACE_Config_ImpExp_Base::~ACE_Config_ImpExp_Base ()
-{
-}
-
-ACE_Registry_ImpExp::ACE_Registry_ImpExp (ACE_Configuration& config)
- : ACE_Config_ImpExp_Base (config)
-{
-}
-
-ACE_Registry_ImpExp::~ACE_Registry_ImpExp ()
-{
-}
-
-// Imports the configuration database from filename.
-// No existing data is removed.
-// Since the open method relies on this method, this method
-// acts as open if an open has not already occurred.
-
-int
-ACE_Registry_ImpExp::import_config (const ACE_TCHAR* filename)
-{
- FILE* in = ACE_OS::fopen (filename, ACE_LIB_TEXT ("r"));
- if (!in)
- return -1;
-
- // @@ XXX - change this to a dynamic buffer
- ACE_TCHAR buffer[4096];
- ACE_Configuration_Section_Key section;
- while (ACE_OS::fgets (buffer, 4096, in))
- {
- // Check for a comment
- if (buffer[0] == ACE_LIB_TEXT (';') || buffer[0] == ACE_LIB_TEXT ('#'))
- continue;
-
- if (buffer[0] == ACE_LIB_TEXT ('['))
- {
- // We have a new section here, strip out the section name
- ACE_TCHAR* end = ACE_OS::strrchr (buffer, ACE_LIB_TEXT (']'));
- if (!end)
- {
- ACE_OS::fclose (in);
- return -3;
- }
- *end = 0;
-
- if (config_.expand_path (config_.root_section (), buffer + 1, section, 1))
- {
- ACE_OS::fclose (in);
- return -3;
- }
- continue;
- }
-
- if (buffer[0] == ACE_LIB_TEXT ('"'))
- {
- // we have a value
- ACE_TCHAR* end = ACE_OS::strchr (buffer+1, '"');
- if (!end) // no closing quote, not a value so just skip it
- continue;
-
- // null terminate the name
- *end = 0;
- ACE_TCHAR* name = buffer + 1;
- end+=2;
- // determine the type
- if (*end == '\"')
- {
- // string type
- // truncate trailing "
- ++end;
- ACE_TCHAR* trailing = ACE_OS::strrchr (end, '"');
- if (trailing)
- *trailing = 0;
- if (config_.set_string_value (section, name, end))
- {
- ACE_OS::fclose (in);
- return -4;
- }
- }
- else if (ACE_OS::strncmp (end, ACE_LIB_TEXT ("dword:"), 6) == 0)
- {
- // number type
- ACE_TCHAR* endptr = 0;
- u_int value = ACE_OS::strtoul (end + 6, &endptr, 16);
- if (config_.set_integer_value (section, name, value))
- {
- ACE_OS::fclose (in);
- return -4;
- }
- }
- else if (ACE_OS::strncmp (end, ACE_LIB_TEXT ("hex:"), 4) == 0)
- {
- // binary type
- u_int string_length = ACE_OS::strlen (end + 4);
- // divide by 3 to get the actual buffer length
- u_int length = string_length / 3;
- u_int remaining = length;
- u_char* data = new u_char[length];
- u_char* out = data;
- ACE_TCHAR* inb = end + 4;
- ACE_TCHAR* endptr = 0;
- while (remaining)
- {
- u_char charin = (u_char) ACE_OS::strtoul (inb, &endptr, 16);
- *out = charin;
- ++out;
- --remaining;
- inb += 3;
- }
- if (config_.set_binary_value (section, name, data, length))
- {
- ACE_OS::fclose (in);
- return -4;
- }
- }
- else
- {
- // invalid type, ignore
- continue;
- }
- }
- }
-
- if (ferror (in))
- {
- ACE_OS::fclose (in);
- return -1;
- }
-
- ACE_OS::fclose (in);
- return 0;
-}
-
-// This method exports the entire configuration database to <filename>. If
-// <filename> is NULL (the default), data is persisted to the <filename>
-// provided to 'open'. If the internal filename is empty this method
-// returns -1. Once the file is opened this method calls 'export_section'
-// passing the root section.
-
-int
-ACE_Registry_ImpExp::export_config (const ACE_TCHAR* filename)
-{
- int result = -1;
-
- FILE* out = ACE_OS::fopen (filename, ACE_LIB_TEXT ("w"));
- if (out)
- {
- result = this->export_section (config_.root_section (),
- ACE_LIB_TEXT (""),
- out);
- ACE_OS::fclose (out);
- }
- return result;
-}
-
-// Method provided by derived classes in order to write one section
-// to the file specified. Called by export_config when exporting
-// the entire configuration object.
-
-int
-ACE_Registry_ImpExp::export_section (const ACE_Configuration_Section_Key& section,
- const ACE_TString& path,
- FILE* out)
-{
- // don't export the root
- if (path.length ())
- {
- // Write out the section header
- ACE_TString header = ACE_LIB_TEXT ("[");
- header += path;
- header += ACE_LIB_TEXT ("]");
- header += ACE_LIB_TEXT (" \n");
- if (ACE_OS::fputs (header.fast_rep (), out) < 0)
- return -1;
- // Write out each value
- int index = 0;
- ACE_TString name;
- ACE_Configuration::VALUETYPE type;
- ACE_TString line;
- ACE_TCHAR int_value[32];
- ACE_TCHAR bin_value[3];
- void* binary_data;
- u_int binary_length;
- ACE_TString string_value;
- while (!config_.enumerate_values (section, index, name, type))
- {
- line = ACE_LIB_TEXT ("\"") + name + ACE_LIB_TEXT ("\"=");
- switch (type)
- {
- case ACE_Configuration::INTEGER:
- {
- u_int value;
- if (config_.get_integer_value (section, name.fast_rep (), value))
- return -2;
- ACE_OS::sprintf (int_value, ACE_LIB_TEXT ("%08x"), value);
- line += ACE_LIB_TEXT ("dword:");
- line += int_value;
- break;
- }
- case ACE_Configuration::STRING:
- {
- if (config_.get_string_value (section,
- name.fast_rep (),
- string_value))
- return -2;
- line += ACE_LIB_TEXT ("\"");
- line += string_value + ACE_LIB_TEXT ("\"");
- break;
- }
-#ifdef _WIN32
- case ACE_Configuration::INVALID:
- break; // JDO added break. Otherwise INVALID is processed
- // like BINARY. If that's correct, please remove the
- // break and these comments
-#endif
- case ACE_Configuration::BINARY:
- {
- // not supported yet - maybe use BASE64 codeing?
- if (config_.get_binary_value (section,
- name.fast_rep (),
- binary_data,
- binary_length))
- return -2;
- line += ACE_LIB_TEXT ("hex:");
- unsigned char* ptr = (unsigned char*)binary_data;
- while (binary_length)
- {
- if (ptr != binary_data)
- {
- line += ACE_LIB_TEXT (",");
- }
- ACE_OS::sprintf (bin_value, ACE_LIB_TEXT ("%02x"), *ptr);
- line += bin_value;
- --binary_length;
- ++ptr;
- }
- delete (char *)binary_data;
- break;
- }
- default:
- return -3;
- }
- line += ACE_LIB_TEXT ("\n");
- if (ACE_OS::fputs (line.fast_rep (), out) < 0)
- return -4;
- index++;
- }
- }
- // Export all sub sections
- int index = 0;
- ACE_TString name;
- ACE_Configuration_Section_Key sub_key;
- ACE_TString sub_section;
- while (!config_.enumerate_sections (section, index, name))
- {
- ACE_TString sub_section (path);
- if (path.length ())
- sub_section += ACE_LIB_TEXT ("\\");
- sub_section += name;
- if (config_.open_section (section, name.fast_rep (), 0, sub_key))
- return -5;
- if (export_section (sub_key, sub_section.fast_rep (), out))
- return -6;
- index++;
- }
- return 0;
-}
-
-ACE_Ini_ImpExp::ACE_Ini_ImpExp (ACE_Configuration& config)
- : ACE_Config_ImpExp_Base (config)
-{
-}
-
-ACE_Ini_ImpExp::~ACE_Ini_ImpExp (void)
-{
-}
-
-// Method to read file and populate object.
-int
-ACE_Ini_ImpExp::import_config (const ACE_TCHAR* fileName)
-{
- FILE* in = ACE_OS::fopen (fileName, ACE_LIB_TEXT ("r"));
- if (!in)
- return -1;
-
- // @@ Make this a dynamic size!
- ACE_TCHAR buffer[4096];
- ACE_Configuration_Section_Key section;
- while (ACE_OS::fgets (buffer, sizeof buffer, in))
- {
- // Check for a comment and blank line
- if (buffer[0] == ACE_LIB_TEXT (';') ||
- buffer[0] == ACE_LIB_TEXT ('#') ||
- buffer[0] == ACE_LIB_TEXT ('\r') ||
- buffer[0] == ACE_LIB_TEXT ('\n'))
- continue;
-
- if (buffer[0] == ACE_LIB_TEXT ('['))
- {
- // We have a new section here, strip out the section name
- ACE_TCHAR* end = ACE_OS::strrchr (buffer, ACE_LIB_TEXT (']'));
- if (!end)
- {
- ACE_OS::fclose (in);
- return -3;
- }
- *end = 0;
-
- if (config_.expand_path (config_.root_section (), buffer + 1, section, 1))
- {
- ACE_OS::fclose (in);
- return -3;
- }
-
- continue;
- }
-
- // we have a line
- const ACE_TCHAR *name = this->skip_whitespace (buffer);
- if (name)
- {
- ACE_TCHAR *end = (ACE_TCHAR *) ACE_OS::strpbrk (name, ACE_LIB_TEXT ("= \t\n\r"));
-
- // locate equal sign after name and retrieve value
- const ACE_TCHAR *value = ACE_OS::strrchr (name, ACE_LIB_TEXT ('='));
- if (value)
- {
- value++; // jump over equal sign
- value = this->skip_whitespace (value);
- ACE_TCHAR *value_end;
- if (value[0] != ACE_LIB_TEXT ('"'))
- value_end = (ACE_TCHAR *) ACE_OS::strpbrk (value, ACE_LIB_TEXT (" \t\n\r"));
- else
- {
- // double quote delimited allows spaces and tabs in string
- value++;
- value_end = (ACE_TCHAR *) ACE_OS::strpbrk (value, ACE_LIB_TEXT ("\"\n\r"));
- }
- if (value_end)
- *value_end = '\0'; // terminate value
- }
- else
- value = ACE_LIB_TEXT ("");
-
- if (end)
- *end = '\0'; // terminate name now
-
- if (config_.set_string_value (section, name, value))
- {
- ACE_OS::fclose (in);
- return -4;
- }
- }
- }
-
- if (ferror (in))
- {
- ACE_OS::fclose (in);
- return -1;
- }
-
- ACE_OS::fclose (in);
- return 0;
-}
-
-// This method exports the entire configuration database to
-// <filename>. If <filename> is NULL (the default), data is persisted
-// to the <filename> provided to 'open'. If the internal filename is
-// empty this method returns -1. Once the file is opened this method
-// calls 'export_section' passing the root section.
-
-int
-ACE_Ini_ImpExp::export_config (const ACE_TCHAR* filename)
-{
- int result = -1;
-
- FILE* out = ACE_OS::fopen (filename, ACE_LIB_TEXT ("w"));
- if (out)
- {
- result = this->export_section (config_.root_section (), ACE_LIB_TEXT (""), out);
- ACE_OS::fclose (out);
- }
- return result;
-}
-
-// Method provided by derived classes in order to write one section to the
-// file specified. Called by export_config when exporting the entire
-// configuration objet
-
-int
-ACE_Ini_ImpExp::export_section (const ACE_Configuration_Section_Key& section,
- const ACE_TString& path,
- FILE* out)
-{
- // don't export the root
- if (path.length ())
- {
- // Write out the section header
- ACE_TString header = ACE_LIB_TEXT ("[");
- header += path;
- header += ACE_LIB_TEXT ("]");
- header += ACE_LIB_TEXT (" \n");
- if (ACE_OS::fputs (header.fast_rep (), out) < 0)
- return -1;
- // Write out each value
- int index = 0;
- ACE_TString name;
- ACE_Configuration::VALUETYPE type;
- ACE_TString line;
- ACE_TCHAR int_value[32];
- ACE_TCHAR bin_value[3];
- void* binary_data;
- u_int binary_length;
- ACE_TString string_value;
- while (!config_.enumerate_values (section, index, name, type))
- {
- line = name + ACE_LIB_TEXT ("=");
- switch (type)
- {
- case ACE_Configuration::INTEGER:
- {
- u_int value;
- if (config_.get_integer_value (section, name.fast_rep (), value))
- return -2;
- ACE_OS::sprintf (int_value, ACE_LIB_TEXT ("%08x"), value);
- line += int_value;
- break;
- }
- case ACE_Configuration::STRING:
- {
- if (config_.get_string_value (section,
- name.fast_rep (),
- string_value))
- return -2;
- if (string_has_white_space (string_value.c_str ()))
- {
- line += ACE_LIB_TEXT ("\"");
- line += string_value + ACE_LIB_TEXT ("\"");
- }
- else
- {
- line += string_value;
- }
- break;
- }
-#ifdef _WIN32
- case ACE_Configuration::INVALID:
- break; // JDO added break. Otherwise INVALID is processed
- // like BINARY. If that's correct, please remove the
- // break and these comments
-#endif
- case ACE_Configuration::BINARY:
- {
- // not supported yet - maybe use BASE64 codeing?
- if (config_.get_binary_value (section,
- name.fast_rep (),
- binary_data,
- binary_length))
- return -2;
- line += ACE_LIB_TEXT ("\"");
- unsigned char* ptr = (unsigned char*)binary_data;
- while (binary_length)
- {
- if (ptr != binary_data)
- {
- line += ACE_LIB_TEXT (",");
- }
- ACE_OS::sprintf (bin_value, ACE_LIB_TEXT ("%02x"), *ptr);
- line += bin_value;
- --binary_length;
- ++ptr;
- }
- line += ACE_LIB_TEXT ("\"");
- delete (char *)binary_data;
- break;
- }
- default:
- return -3;
-
- }// end switch on type
-
- line += ACE_LIB_TEXT ("\n");
- if (ACE_OS::fputs (line.fast_rep (), out) < 0)
- return -4;
- index++;
- }// end while enumerating values
- }
- // Export all sub sections
- int index = 0;
- ACE_TString name;
- ACE_Configuration_Section_Key sub_key;
- ACE_TString sub_section;
- while (!config_.enumerate_sections (section, index, name))
- {
- ACE_TString sub_section (path);
- if (path.length ())
- sub_section += ACE_LIB_TEXT ("\\");
- sub_section += name;
- if (config_.open_section (section, name.fast_rep (), 0, sub_key))
- return -5;
- if (export_section (sub_key, sub_section.fast_rep (), out))
- return -6;
- index++;
- }
- return 0;
-
-}
-
-// Method to skip whitespaces in a string. Whitespace is defined as:
-// spaces (' ') and tabs ('\t'). Returns a pointer to the first
-// non-whitespace character in the buffer provided. It does return
-// null ('\0') if it is reached
-
-const ACE_TCHAR *
-ACE_Ini_ImpExp::skip_whitespace (const ACE_TCHAR *src)
-{
- const ACE_TCHAR *cp;
-
- for (cp = src;
- (*cp != '\0') && ((*cp == ' ') || (*cp == '\t'));
- cp++)
- continue;
-
- return cp;
-}
-
-// Looks in provided string for whitespace. Whitespace is defined as
-// spaces (' ') and tabs ('\t'). Returns true if found and false if
-// not found
-
-int
-ACE_Ini_ImpExp::string_has_white_space (const ACE_TCHAR *string_value)
-{
- int rc = 0;
-
- while ((!rc) && (*string_value != '\0'))
- {
- if ((*string_value == ' ') || (*string_value == '\t'))
- rc = 1;
-
- string_value++;
- }
-
- return rc;
-}