#include <Configuration_Import_Export.h>
Inheritance diagram for ACE_Ini_ImpExp:


Public Member Functions | |
| ACE_Ini_ImpExp (ACE_Configuration &) | |
| virtual | ~ACE_Ini_ImpExp (void) |
| virtual int | import_config (const ACE_TCHAR *filename) |
| virtual int | export_config (const ACE_TCHAR *filename) |
Private Member Functions | |
| int | export_section (const ACE_Configuration_Section_Key §ion, const ACE_TString &path, FILE *out) |
| ACE_TCHAR * | squish (ACE_TCHAR *src) |
| ACE_Ini_ImpExp (const ACE_Ini_ImpExp &) | |
| ACE_Ini_ImpExp & | operator= (const ACE_Ini_ImpExp &) |
This method allows for lines in the .ini or .conf file like this:
TimeToLive = 100 Delay = FALSE Flags = FF34 Heading = "ACE - Adaptive Communication Environment"
(note leading whitespace (tabs) in examples below)
SeekIndex = 14 TraceLevel = 6 # Can comment lines like this Justification = left_justified
The caller can then retrieve the string with the regular function and convert the string to the desired data type.
Definition at line 162 of file Configuration_Import_Export.h.
|
|
Construction Definition at line 392 of file Configuration_Import_Export.cpp.
00393 : ACE_Config_ImpExp_Base (config) 00394 { 00395 } |
|
|
Destructor Definition at line 397 of file Configuration_Import_Export.cpp.
00398 {
00399 }
|
|
|
|
|
|
This method exports the entire configuration database to filename. Once the file is opened this method calls export_section() passing the root section. Implements ACE_Config_ImpExp_Base. Definition at line 503 of file Configuration_Import_Export.cpp. References ACE_TCHAR, ACE_TEXT, export_section(), ACE_OS::fclose(), ACE_OS::fopen(), and ACE_Configuration::root_section().
00504 {
00505 if (0 == filename)
00506 {
00507 errno = EINVAL;
00508 return -1;
00509 }
00510 int result = -1;
00511
00512 FILE* out = ACE_OS::fopen (filename, ACE_TEXT ("w"));
00513 if (out)
00514 {
00515 result = this->export_section (config_.root_section (),
00516 ACE_TEXT (""),
00517 out);
00518 // The data may have been buffered and will be flush on close,
00519 // so we need to check that the close succeeds.
00520 if (ACE_OS::fclose (out) < 0)
00521 result = -7;
00522 }
00523 return result;
00524 }
|
|
||||||||||||||||
|
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. Definition at line 531 of file Configuration_Import_Export.cpp. References ACE_TCHAR, ACE_TEXT, ACE_TString, ACE_Configuration::enumerate_sections(), ACE_Configuration::enumerate_values(), ACE_String_Base< CHAR >::fast_rep(), ACE_OS::fputs(), ACE_Configuration::get_binary_value(), ACE_Configuration::get_integer_value(), ACE_Configuration::get_string_value(), ACE_String_Base< CHAR >::length(), ACE_Configuration::open_section(), and ACE_OS::sprintf(). Referenced by export_config().
00534 {
00535 // don't export the root
00536 if (path.length ())
00537 {
00538 // Write out the section header
00539 ACE_TString header = ACE_TEXT ("[");
00540 header += path;
00541 header += ACE_TEXT ("]\n");
00542 if (ACE_OS::fputs (header.fast_rep (), out) < 0)
00543 return -1;
00544 // Write out each value
00545 int index = 0;
00546 ACE_TString name;
00547 ACE_Configuration::VALUETYPE type;
00548 ACE_TString line;
00549 ACE_TCHAR int_value[32];
00550 ACE_TCHAR bin_value[3];
00551 void* binary_data;
00552 size_t binary_length;
00553 ACE_TString string_value;
00554 while (!config_.enumerate_values (section, index, name, type))
00555 {
00556 line = name + ACE_TEXT ("=");
00557 switch (type)
00558 {
00559 case ACE_Configuration::INTEGER:
00560 {
00561 u_int value;
00562 if (config_.get_integer_value (section, name.fast_rep (), value))
00563 return -2;
00564 ACE_OS::sprintf (int_value, ACE_TEXT ("%08x"), value);
00565 line += int_value;
00566 break;
00567 }
00568 case ACE_Configuration::STRING:
00569 {
00570 if (config_.get_string_value (section,
00571 name.fast_rep (),
00572 string_value))
00573 return -2;
00574 line += string_value;
00575 break;
00576 }
00577 #ifdef _WIN32
00578 case ACE_Configuration::INVALID:
00579 break; // JDO added break. Otherwise INVALID is processed
00580 // like BINARY. If that's correct, please remove the
00581 // break and these comments
00582 #endif
00583 case ACE_Configuration::BINARY:
00584 {
00585 // not supported yet - maybe use BASE64 codeing?
00586 if (config_.get_binary_value (section,
00587 name.fast_rep (),
00588 binary_data,
00589 binary_length))
00590 return -2;
00591 line += ACE_TEXT ("\"");
00592 unsigned char* ptr = (unsigned char*)binary_data;
00593 while (binary_length)
00594 {
00595 if (ptr != binary_data)
00596 {
00597 line += ACE_TEXT (",");
00598 }
00599 ACE_OS::sprintf (bin_value, ACE_TEXT ("%02x"), *ptr);
00600 line += bin_value;
00601 --binary_length;
00602 ++ptr;
00603 }
00604 line += ACE_TEXT ("\"");
00605 delete [] (char *) binary_data;
00606 break;
00607 }
00608 default:
00609 return -3;
00610
00611 }// end switch on type
00612
00613 line += ACE_TEXT ("\n");
00614 if (ACE_OS::fputs (line.fast_rep (), out) < 0)
00615 return -4;
00616 ++index;
00617 }// end while enumerating values
00618 }
00619 // Export all sub sections
00620 int index = 0;
00621 ACE_TString name;
00622 ACE_Configuration_Section_Key sub_key;
00623 ACE_TString sub_section;
00624 while (!config_.enumerate_sections (section, index, name))
00625 {
00626 ACE_TString sub_section (path);
00627 if (path.length ())
00628 sub_section += ACE_TEXT ("\\");
00629 sub_section += name;
00630 if (config_.open_section (section, name.fast_rep (), 0, sub_key))
00631 return -5;
00632 if (export_section (sub_key, sub_section.fast_rep (), out))
00633 return -6;
00634 ++index;
00635 }
00636 return 0;
00637
00638 }
|
|
|
Imports the configuration database from filename. No existing data is removed. Implements ACE_Config_ImpExp_Base. Definition at line 403 of file Configuration_Import_Export.cpp. References ACE_TCHAR, ACE_TEXT, ACE_Configuration::expand_path(), ACE_OS::fclose(), ACE_OS::fgets(), ACE_OS::fopen(), ACE_Configuration::root_section(), ACE_Configuration::set_string_value(), squish(), ACE_OS::strchr(), ACE_OS::strlen(), and ACE_OS::strrchr().
00404 {
00405 if (0 == filename)
00406 {
00407 errno = EINVAL;
00408 return -1;
00409 }
00410 FILE* in = ACE_OS::fopen (filename, ACE_TEXT ("r"));
00411 if (!in)
00412 return -1;
00413
00414 // @@ Make this a dynamic size!
00415 ACE_TCHAR buffer[4096];
00416 ACE_Configuration_Section_Key section;
00417 while (ACE_OS::fgets (buffer, sizeof buffer, in))
00418 {
00419 ACE_TCHAR *line = this->squish (buffer);
00420 // Check for a comment and blank line
00421 if (line[0] == ACE_TEXT (';') ||
00422 line[0] == ACE_TEXT ('#') ||
00423 line[0] == '\0')
00424 continue;
00425
00426 if (line[0] == ACE_TEXT ('['))
00427 {
00428 // We have a new section here, strip out the section name
00429 ACE_TCHAR* end = ACE_OS::strrchr (line, ACE_TEXT (']'));
00430 if (!end)
00431 {
00432 ACE_OS::fclose (in);
00433 return -3;
00434 }
00435 *end = 0;
00436
00437 if (config_.expand_path (config_.root_section (),
00438 line + 1,
00439 section,
00440 1))
00441 {
00442 ACE_OS::fclose (in);
00443 return -3;
00444 }
00445
00446 continue;
00447 }
00448
00449 // We have a line; name ends at equal sign.
00450 ACE_TCHAR *end = ACE_OS::strchr (line, ACE_TEXT ('='));
00451 if (end == 0) // No '='
00452 {
00453 ACE_OS::fclose (in);
00454 return -3;
00455 }
00456 *end++ = '\0';
00457 ACE_TCHAR *name = this->squish (line);
00458 #if 0
00459 if (ACE_OS::strlen (name) == 0) // No name; just an '='
00460 {
00461 ACE_OS::fclose (in);
00462 return -3;
00463 }
00464 #endif
00465 // Now find the start of the value
00466 ACE_TCHAR *value = this->squish (end);
00467 size_t value_len = ACE_OS::strlen (value);
00468 if (value_len > 0)
00469 {
00470 // ACE 5.2 (and maybe earlier) exported strings may be enclosed
00471 // in quotes. If string is quote-delimited, strip the quotes.
00472 // Newer exported files don't have quote delimiters.
00473 if (value[0] == ACE_TEXT ('"') &&
00474 value[value_len - 1] == ACE_TEXT ('"'))
00475 {
00476 // Strip quotes off both ends.
00477 value[value_len - 1] = '\0';
00478 ++value;
00479 }
00480 }
00481
00482 if (config_.set_string_value (section, name, value))
00483 {
00484 ACE_OS::fclose (in);
00485 return -4;
00486 }
00487 } // end while fgets
00488
00489 if (ferror (in))
00490 {
00491 ACE_OS::fclose (in);
00492 return -1;
00493 }
00494
00495 ACE_OS::fclose (in);
00496 return 0;
00497 }
|
|
|
|
|
|
Method to squish leading and trailing whitespaces in a string. Whitespace is defined as: spaces (' '), tabs ('\t') or cr/lf. Returns a pointer to the first non-whitespace character in the buffer provided, or a pointer to the terminating null if the string is all whitespace. The terminating null is moved forward to the first character past the last non-whitespace. Definition at line 648 of file Configuration_Import_Export.cpp. References ACE_OS::ace_isspace(), ACE_TCHAR, and ACE_OS::strlen(). Referenced by import_config().
00649 {
00650 ACE_TCHAR *cp = 0;
00651
00652 if (src == 0)
00653 return 0;
00654
00655 // Start at the end and work backwards over all whitespace.
00656 for (cp = src + ACE_OS::strlen (src) - 1;
00657 cp != src;
00658 --cp)
00659 if (!ACE_OS::ace_isspace (*cp))
00660 break;
00661 cp[1] = '\0'; // Chop trailing whitespace
00662
00663 // Now start at the beginning and move over all whitespace.
00664 for (cp = src; ACE_OS::ace_isspace (*cp); ++cp)
00665 continue;
00666
00667 return cp;
00668 }
|
1.3.6