#include <Configuration.h>
Inheritance diagram for ACE_Configuration:
Public Types | |
STRING | |
INTEGER | |
BINARY | |
INVALID | |
enum | VALUETYPE { STRING, INTEGER, BINARY, INVALID } |
Enumeration for the various types of values we can store. More... | |
Public Member Functions | |
virtual | ~ACE_Configuration (void) |
Destructor. | |
virtual const ACE_Configuration_Section_Key & | root_section (void) const |
Obtain a reference to the root section of this configuration. | |
virtual int | open_section (const ACE_Configuration_Section_Key &base, const ACE_TCHAR *sub_section, int create, ACE_Configuration_Section_Key &result)=0 |
virtual int | remove_section (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *sub_section, int recursive)=0 |
Removes a named section. | |
virtual int | enumerate_values (const ACE_Configuration_Section_Key &key, int index, ACE_TString &name, VALUETYPE &type)=0 |
virtual int | enumerate_sections (const ACE_Configuration_Section_Key &key, int index, ACE_TString &name)=0 |
virtual int | set_string_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name, const ACE_TString &value)=0 |
Sets a string-typed value. | |
virtual int | set_integer_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name, u_int value)=0 |
Sets a integer-typed value. | |
virtual int | set_binary_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name, const void *data, size_t length)=0 |
Sets a binary-typed value. | |
virtual int | get_string_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name, ACE_TString &value)=0 |
Gets a string-typed value. | |
virtual int | get_integer_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name, u_int &value)=0 |
Gets an integer-typed value. | |
virtual int | get_binary_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name, void *&data, size_t &length)=0 |
Gets a binary-typed value. | |
virtual int | find_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name, VALUETYPE &type)=0 |
virtual int | remove_value (const ACE_Configuration_Section_Key &key, const ACE_TCHAR *name)=0 |
Removes a named value. | |
int | expand_path (const ACE_Configuration_Section_Key &key, const ACE_TString &path_in, ACE_Configuration_Section_Key &key_out, int create=1) |
int | export_config (const ACE_TCHAR *filename) |
int | import_config (const ACE_TCHAR *filename) |
bool | operator== (const ACE_Configuration &rhs) const |
bool | operator!= (const ACE_Configuration &rhs) const |
Static Public Attributes | |
static ACE_TCHAR | NULL_String_ = '\0' |
Protected Member Functions | |
ACE_Configuration (void) | |
Default ctor. | |
ACE_Section_Key_Internal * | get_internal_key (const ACE_Configuration_Section_Key &key) |
Resolves the internal key from a section key. | |
int | validate_name (const ACE_TCHAR *name, int allow_path=0) |
int | validate_value_name (const ACE_TCHAR *name) |
ACE_Configuration (const ACE_Configuration &rhs) | |
ACE_Configuration & | operator= (const ACE_Configuration &rhs) |
Protected Attributes | |
ACE_Configuration_Section_Key | root_ |
For internal use only.
This class provides an interface for configuration databases. A concrete class is required that implements the interface.
ACE_Configuration_Win32Registry
Definition at line 138 of file Configuration.h.
ACE_Configuration::~ACE_Configuration | ( | void | ) | [virtual] |
ACE_Configuration::ACE_Configuration | ( | void | ) | [protected] |
ACE_Configuration::ACE_Configuration | ( | const ACE_Configuration & | rhs | ) | [protected] |
virtual int ACE_Configuration::enumerate_sections | ( | const ACE_Configuration_Section_Key & | key, | |
int | index, | |||
ACE_TString & | name | |||
) | [pure virtual] |
Enumerates through the subsections in a section.
key | Section key to iterate through. | |
index | Iteration position. Must be zero on the first call to iterate through key. Increment index by one on each successive call to this method. | |
name | Receives the subsection's name. |
0 | for success, name has a valid name. | |
1 | there are no more subsections in the section. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by ACE_Ini_ImpExp::export_section(), ACE_Registry_ImpExp::export_section(), and operator==().
virtual int ACE_Configuration::enumerate_values | ( | const ACE_Configuration_Section_Key & | key, | |
int | index, | |||
ACE_TString & | name, | |||
VALUETYPE & | type | |||
) | [pure virtual] |
Enumerates through the values in a section.
key | Section key to iterate through. | |
index | Iteration position. Must be zero on the first call to iterate through key. Increment index by one on each successive call to this method. | |
name | Receives the value's name. | |
type | Receives the value's data type. |
0 | for success, name and type are valid. | |
1 | there are no more values in the section. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Referenced by ACE_Ini_ImpExp::export_section(), ACE_Registry_ImpExp::export_section(), and operator==().
int ACE_Configuration::expand_path | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TString & | path_in, | |||
ACE_Configuration_Section_Key & | key_out, | |||
int | create = 1 | |||
) |
Expands <path_in> to <key_out> from key. If create is true, the subsections are created. Returns 0 on success, non zero on error The path consists of sections separated by the backslash '\' or forward slash '/'. Returns 0 on success, -1 if <create) is 0 and the path refers a nonexistant section
Definition at line 107 of file Configuration.cpp.
References open_section(), and ACE_String_Base< CHAR >::rep().
Referenced by ACE_Ini_ImpExp::import_config(), and ACE_Registry_ImpExp::import_config().
00111 { 00112 // Make a copy of key 00113 ACE_Configuration_Section_Key current_section = key; 00114 ACE_Auto_Basic_Array_Ptr<ACE_TCHAR> pData (path_in.rep ()); 00115 ACE_Tokenizer parser (pData.get ()); 00116 parser.delimiter_replace ('\\', '\0'); 00117 parser.delimiter_replace ('/', '\0'); 00118 00119 for (ACE_TCHAR *temp = parser.next (); 00120 temp != 0; 00121 temp = parser.next ()) 00122 { 00123 // Open the section 00124 if (open_section (current_section, 00125 temp, 00126 create, 00127 key_out)) 00128 return -1; 00129 00130 current_section = key_out; 00131 } 00132 00133 return 0; 00134 00135 }
int ACE_Configuration::export_config | ( | const ACE_TCHAR * | filename | ) |
Definition at line 140 of file Configuration.cpp.
References ACE_Registry_ImpExp::export_config().
00141 { 00142 ACE_Registry_ImpExp exporter (*this); 00143 return exporter.export_config (filename); 00144 }
virtual int ACE_Configuration::find_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name, | |||
VALUETYPE & | type | |||
) | [pure virtual] |
Retrieves the type of a named configuration value.
key | Configuration section to look up the name in. | |
name | Name of the configuration value to get the type of. | |
type | Receives the data type of the named value, if it exists. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Referenced by operator==().
virtual int ACE_Configuration::get_binary_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name, | |||
void *& | data, | |||
size_t & | length | |||
) | [pure virtual] |
Gets a binary-typed value.
key | Configuration section to get the value from. | |
name | Name of the configuration value to get. | |
data | Receives a pointer to memory holding the binary data for the value. This method allocates the memory pointed to using operator new[]. The caller is responsible for freeing the memory using operator delete[]. | |
length | Receives the number of bytes in the value. |
0 | for success; caller is responsible for freeing the returned memory. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by ACE_Ini_ImpExp::export_section(), ACE_Registry_ImpExp::export_section(), and operator==().
virtual int ACE_Configuration::get_integer_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name, | |||
u_int & | value | |||
) | [pure virtual] |
Gets an integer-typed value.
key | Configuration section to get the value from. | |
name | Name of the configuration value to get. | |
value | Receives the configuration value if it exists and has type INTEGER. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by ACE_Ini_ImpExp::export_section(), ACE_Registry_ImpExp::export_section(), and operator==().
ACE_Section_Key_Internal * ACE_Configuration::get_internal_key | ( | const ACE_Configuration_Section_Key & | key | ) | [protected] |
Resolves the internal key from a section key.
Definition at line 101 of file Configuration.cpp.
References ACE_Configuration_Section_Key::key_.
Referenced by ACE_Configuration_Heap::enumerate_sections(), ACE_Configuration_Heap::enumerate_values(), and ACE_Configuration_Heap::load_key().
00102 { 00103 return key.key_; 00104 }
virtual int ACE_Configuration::get_string_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name, | |||
ACE_TString & | value | |||
) | [pure virtual] |
Gets a string-typed value.
key | Configuration section to get the value from. | |
name | Name of the configuration value to get. | |
value | Receives the configuration value if it exists and has type STRING. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by ACE_Ini_ImpExp::export_section(), ACE_Registry_ImpExp::export_section(), and operator==().
int ACE_Configuration::import_config | ( | const ACE_TCHAR * | filename | ) |
Definition at line 147 of file Configuration.cpp.
References ACE_Registry_ImpExp::import_config().
00148 { 00149 ACE_Registry_ImpExp importer (*this); 00150 return importer.import_config (filename); 00151 }
virtual int ACE_Configuration::open_section | ( | const ACE_Configuration_Section_Key & | base, | |
const ACE_TCHAR * | sub_section, | |||
int | create, | |||
ACE_Configuration_Section_Key & | result | |||
) | [pure virtual] |
Opens a named section in an existing section.
base | Existing section in which to open the named section. | |
sub_section | Name of the section to open. | |
create | If zero, the named section must exist. If non-zero, the named section will be created if it does not exist. | |
result | Reference; receives the section key for the new section. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by expand_path(), ACE_Ini_ImpExp::export_section(), ACE_Registry_ImpExp::export_section(), and operator==().
bool ACE_Configuration::operator!= | ( | const ACE_Configuration & | rhs | ) | const |
Determine if the contents of this object are different from the contents of the object on the right hand side. Returns 0 (False) if they are equal and 1 (True) if they are not equal
Definition at line 428 of file Configuration.cpp.
ACE_Configuration& ACE_Configuration::operator= | ( | const ACE_Configuration & | rhs | ) | [protected] |
bool ACE_Configuration::operator== | ( | const ACE_Configuration & | rhs | ) | const |
Determine if the contents of this object is the same as the contents of the object on the right hand side. Returns 1 (True) if they are equal and 0 (False) if they are not equal
Definition at line 208 of file Configuration.cpp.
References BINARY, ACE_String_Base< CHAR >::c_str(), enumerate_sections(), enumerate_values(), find_value(), get_binary_value(), get_integer_value(), get_string_value(), INTEGER, open_section(), root_section(), and STRING.
00209 { 00210 bool rc = true; 00211 int sectionIndex = 0; 00212 ACE_TString sectionName; 00213 ACE_Configuration *nonconst_this = const_cast<ACE_Configuration*> (this); 00214 ACE_Configuration &nonconst_rhs = const_cast<ACE_Configuration&> (rhs); 00215 00216 const ACE_Configuration_Section_Key& rhsRoot = rhs.root_section (); 00217 ACE_Configuration_Section_Key rhsSection; 00218 ACE_Configuration_Section_Key thisSection; 00219 00220 // loop through each section in this object 00221 while ((rc) && (nonconst_this->enumerate_sections (this->root_, 00222 sectionIndex, 00223 sectionName) == 0)) 00224 { 00225 // find that section in the rhs object 00226 if (nonconst_rhs.open_section (rhsRoot, 00227 sectionName.c_str (), 00228 0, 00229 rhsSection) != 0) 00230 { 00231 // If the rhs object does not contain the section then we are 00232 // not equal. 00233 rc = false; 00234 } 00235 else if (nonconst_this->open_section (this->root_, 00236 sectionName.c_str (), 00237 0, 00238 thisSection) != 0) 00239 { 00240 // if there is some error opening the section in this object 00241 rc = false; 00242 } 00243 else 00244 { 00245 // Well the sections match 00246 int valueIndex = 0; 00247 ACE_TString valueName; 00248 VALUETYPE valueType; 00249 VALUETYPE rhsType; 00250 00251 // Enumerate each value in this section 00252 while ((rc) && nonconst_this->enumerate_values (thisSection, 00253 valueIndex, 00254 valueName, 00255 valueType) == 0) 00256 { 00257 // look for the same value in the rhs section 00258 if (nonconst_rhs.find_value (rhsSection, 00259 valueName.c_str (), 00260 rhsType) != 0) 00261 { 00262 // We're not equal if the same value cannot 00263 // be found in the rhs object. 00264 rc = false; 00265 } 00266 else if (valueType != rhsType) 00267 { 00268 // we're not equal if the types do not match. 00269 rc = false; 00270 } 00271 else 00272 { 00273 // finally compare values. 00274 if (valueType == STRING) 00275 { 00276 ACE_TString thisString, rhsString; 00277 if (nonconst_this->get_string_value (thisSection, 00278 valueName.c_str (), 00279 thisString) != 0) 00280 { 00281 // we're not equal if we cannot get this string 00282 rc = false; 00283 } 00284 else if (nonconst_rhs.get_string_value ( 00285 rhsSection, 00286 valueName.c_str (), 00287 rhsString) != 0) 00288 { 00289 // we're not equal if we cannot get rhs string 00290 rc = false; 00291 } 00292 rc = (thisString == rhsString); 00293 } 00294 else if (valueType == INTEGER) 00295 { 00296 u_int thisInt = 0; 00297 u_int rhsInt = 0; 00298 if (nonconst_this->get_integer_value ( 00299 thisSection, 00300 valueName.c_str (), 00301 thisInt) != 0) 00302 { 00303 // we're not equal if we cannot get this int 00304 rc = false; 00305 } 00306 else if (nonconst_rhs.get_integer_value ( 00307 rhsSection, 00308 valueName.c_str (), 00309 rhsInt) != 0) 00310 { 00311 // we're not equal if we cannot get rhs int 00312 rc = false; 00313 } 00314 rc = (thisInt == rhsInt); 00315 } 00316 else if (valueType == BINARY) 00317 { 00318 void* thisData = 0; 00319 void* rhsData = 0; 00320 size_t thisLength = 0; 00321 size_t rhsLength = 0; 00322 if (nonconst_this->get_binary_value (thisSection, 00323 valueName.c_str (), 00324 thisData, 00325 thisLength) != 0) 00326 { 00327 // we're not equal if we cannot get this data 00328 rc = false; 00329 } 00330 else if (nonconst_rhs.get_binary_value ( 00331 rhsSection, 00332 valueName.c_str (), 00333 rhsData, 00334 rhsLength) != 0) 00335 { 00336 // we're not equal if we cannot get this data 00337 rc = false; 00338 } 00339 00340 rc = (thisLength == rhsLength); 00341 // are the length's the same? 00342 00343 if (rc) 00344 { 00345 unsigned char* thisCharData = 00346 (unsigned char*)thisData; 00347 unsigned char* rhsCharData = (unsigned char*)rhsData; 00348 // yes, then check each element 00349 for (size_t count = 0; 00350 (rc) && (count < thisLength); 00351 count++) 00352 { 00353 rc = (* (thisCharData + count) == * (rhsCharData + count)); 00354 } 00355 00356 delete [] thisCharData; 00357 delete [] rhsCharData; 00358 }// end if the length's match 00359 } 00360 // We should never have valueTypes of INVALID, therefore 00361 // we're not comparing them. How would we since we have 00362 // no get operation for invalid types. 00363 // So, if we have them, we guess they are equal. 00364 00365 }// end else if values match. 00366 00367 ++valueIndex; 00368 00369 }// end value while loop 00370 00371 // look in the rhs for values not in this 00372 valueIndex = 0; 00373 while ((rc) && (nonconst_rhs.enumerate_values (rhsSection, 00374 valueIndex, 00375 valueName, 00376 rhsType) == 0)) 00377 { 00378 // look for the same value in this section 00379 if (nonconst_this->find_value (thisSection, 00380 valueName.c_str (), 00381 valueType) != 0) 00382 { 00383 // We're not equal if the same value cannot 00384 // be found in the rhs object. 00385 rc = false; 00386 } 00387 ++valueIndex; 00388 }// end while for rhs values not in this. 00389 00390 }// end else if sections match. 00391 00392 ++sectionIndex; 00393 00394 }// end section while loop 00395 00396 // Finally, make sure that there are no sections in rhs that do not 00397 // exist in this 00398 sectionIndex = 0; 00399 while ((rc) 00400 && (nonconst_rhs.enumerate_sections (rhsRoot, 00401 sectionIndex, 00402 sectionName) == 0)) 00403 { 00404 // find the section in this 00405 if (nonconst_this->open_section (this->root_, 00406 sectionName.c_str (), 00407 0, 00408 thisSection) != 0) 00409 { 00410 // if there is some error opening the section in this object 00411 rc = false; 00412 } 00413 else if (nonconst_rhs.open_section (rhsRoot, 00414 sectionName.c_str (), 00415 0, 00416 rhsSection) != 0) 00417 { 00418 // If the rhs object does not contain the section then we 00419 // are not equal. 00420 rc = false; 00421 } 00422 ++sectionIndex; 00423 } 00424 return rc; 00425 }
virtual int ACE_Configuration::remove_section | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | sub_section, | |||
int | recursive | |||
) | [pure virtual] |
Removes a named section.
key | Section key to remove the named section from. | |
sub_section | Name of the section to remove. | |
recursive | If non zero, any subkeys below sub_section are removed as well. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
virtual int ACE_Configuration::remove_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name | |||
) | [pure virtual] |
Removes a named value.
key | Configuration section to remove the named value from. | |
name | Name of the configuration value to remove. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
const ACE_Configuration_Section_Key & ACE_Configuration::root_section | ( | void | ) | const [virtual] |
Obtain a reference to the root section of this configuration.
Definition at line 197 of file Configuration.cpp.
References root_.
Referenced by ACE_Ini_ImpExp::export_config(), ACE_Registry_ImpExp::export_config(), ACE_Ini_ImpExp::import_config(), ACE_Registry_ImpExp::import_config(), and operator==().
00198 { 00199 return root_; 00200 }
virtual int ACE_Configuration::set_binary_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name, | |||
const void * | data, | |||
size_t | length | |||
) | [pure virtual] |
Sets a binary-typed value.
key | Configuration section to set the value in. | |
name | Name of the configuration value to set. If a value with the specified name exists, it is replaced. | |
data | Pointer to the binary data for the value. | |
length | Number of bytes for the new value. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by ACE_Registry_ImpExp::import_config().
virtual int ACE_Configuration::set_integer_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name, | |||
u_int | value | |||
) | [pure virtual] |
Sets a integer-typed value.
key | Configuration section to set the value in. | |
name | Name of the configuration value to set. If a value with the specified name exists, it is replaced. | |
value | The integer to set the configuration value to. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by ACE_Registry_ImpExp::import_config(), and ACE_Registry_ImpExp::process_previous_line_format().
virtual int ACE_Configuration::set_string_value | ( | const ACE_Configuration_Section_Key & | key, | |
const ACE_TCHAR * | name, | |||
const ACE_TString & | value | |||
) | [pure virtual] |
Sets a string-typed value.
key | Configuration section to set the value in. | |
name | Name of the configuration value to set. If a value with the specified name exists, it is replaced. | |
value | The string to set the configuration value to. |
0 | for success. | |
-1 | for error; ACE_OS::last_error() retrieves error code. |
Implemented in ACE_Configuration_Heap.
Referenced by ACE_Ini_ImpExp::import_config(), ACE_Registry_ImpExp::import_config(), and ACE_Registry_ImpExp::process_previous_line_format().
int ACE_Configuration::validate_name | ( | const ACE_TCHAR * | name, | |
int | allow_path = 0 | |||
) | [protected] |
Tests to see if name is valid. name must be < 255 characters and not contain the path separator '\', brackets [] or = (maybe just restrict to alphanumeric?) returns non zero if name is not valid. The path separator is allowed, except for the first character, if allow_path is true.
Definition at line 154 of file Configuration.cpp.
References ACE_TEXT, and ACE_OS::strcspn().
Referenced by ACE_Configuration_Heap::open_section(), ACE_Configuration_Heap::remove_section(), and validate_value_name().
00155 { 00156 // Invalid character set 00157 const ACE_TCHAR* reject = 00158 allow_path ? ACE_TEXT ("][") : ACE_TEXT ("\\]["); 00159 00160 // Position of the first invalid character or terminating null. 00161 size_t const pos = ACE_OS::strcspn (name, reject); 00162 00163 // Check if it is an invalid character. 00164 if (name[pos] != ACE_TEXT ('\0')) 00165 { 00166 errno = EINVAL; 00167 return -1; 00168 } 00169 00170 // The first character can never be a path separator. 00171 if (name[0] == ACE_TEXT ('\\')) 00172 { 00173 errno = EINVAL; 00174 return -1; 00175 } 00176 00177 // Validate length. 00178 if (pos == 0 || pos > 255) 00179 { 00180 errno = ENAMETOOLONG; 00181 return -1; 00182 } 00183 00184 return 0; 00185 }
int ACE_Configuration::validate_value_name | ( | const ACE_TCHAR * | name | ) | [protected] |
Test to see if name is valid. The default value for a key can be unnamed, which means either name is == 0 or name == '` is valid. Otherwise, it calls validate_name() to test name for the same rules that apply to keys.
Definition at line 188 of file Configuration.cpp.
References validate_name().
Referenced by ACE_Configuration_Heap::find_value(), ACE_Configuration_Heap::get_binary_value(), ACE_Configuration_Heap::get_integer_value(), ACE_Configuration_Heap::get_string_value(), ACE_Configuration_Heap::remove_value(), ACE_Configuration_Heap::set_binary_value(), ACE_Configuration_Heap::set_integer_value(), and ACE_Configuration_Heap::set_string_value().
00189 { 00190 if (name == 0 || *name == this->NULL_String_) 00191 return 0; 00192 00193 return this->validate_name (name); 00194 }
ACE_TCHAR ACE_Configuration::NULL_String_ = '\0' [static] |
* Represents the "NULL" string to simplify the internal logic.
Definition at line 397 of file Configuration.h.
Referenced by ACE_Configuration_Heap::find_value(), ACE_Configuration_Heap::get_binary_value(), ACE_Configuration_Heap::get_integer_value(), ACE_Configuration_Heap::get_string_value(), ACE_Configuration_Heap::remove_value(), ACE_Configuration_Heap::set_binary_value(), ACE_Configuration_Heap::set_integer_value(), and ACE_Configuration_Heap::set_string_value().
Definition at line 429 of file Configuration.h.
Referenced by ACE_Configuration_Heap::ACE_Configuration_Heap(), ACE_Configuration_Heap::create_index(), and root_section().