OsStatus CredentialDB::load() { // Critical Section here OsLock lock( sLockMutex ); OsStatus result = OS_SUCCESS; if ( m_pFastDB != NULL ) { // Clean out the existing DB rows before loading // a new set from persistent storage removeAllRows (); UtlString fileName = OsPath::separator + mDatabaseName + ".xml"; UtlString pathName = SipXecsService::Path(SipXecsService::DatabaseDirType, fileName.data()); OsSysLog::add(FAC_DB, PRI_DEBUG, "CredentialDB::load loading \"%s\"", pathName.data()); TiXmlDocument doc ( pathName ); // Verify that we can load the file (i.e it must exist) if( doc.LoadFile() ) { // the checksum is used to determine if the db changed between reloads int loadChecksum = 0; TiXmlNode * rootNode = doc.FirstChild ("items"); if (rootNode != NULL) { // the folder node contains at least the name/displayname/ // and autodelete elements, it may contain others for( TiXmlNode *itemNode = rootNode->FirstChild( "item" ); itemNode; itemNode = itemNode->NextSibling( "item" ) ) { // Create a hash dictionary for element attributes UtlHashMap nvPairs; for( TiXmlNode *elementNode = itemNode->FirstChild(); elementNode; elementNode = elementNode->NextSibling() ) { // Bypass comments and other element types only interested // in parsing element attributes if ( elementNode->Type() == TiXmlNode::ELEMENT ) { UtlString elementName = elementNode->Value(); UtlString elementValue; result = SIPDBManager::getAttributeValue ( *itemNode, elementName, elementValue); // update the load checksum loadChecksum += ( elementName.hash() + elementValue.hash() ); if (result == OS_SUCCESS) { UtlString* collectableKey = new UtlString( elementName ); UtlString* collectableValue = new UtlString( elementValue ); nvPairs.insertKeyAndValue ( collectableKey, collectableValue ); } else if ( elementNode->FirstChild() == NULL ) { // Null Element value creaete a special // char string we have key and value so insert UtlString* collectableKey = new UtlString( elementName ); UtlString* collectableValue = new UtlString( SPECIAL_IMDB_NULL_VALUE ); nvPairs.insertKeyAndValue ( collectableKey, collectableValue ); } } } // If this is an old credentials file, it may not contain // the pintoken element - if not, duplicate the passtoken // to create it. if (!nvPairs.contains(&gPintokenKey)) { UtlString* pintokenKey = new UtlString(gPintokenKey); UtlString* pintokenValue = new UtlString(*((UtlString*)nvPairs.findValue(&gPasstokenKey))); nvPairs.insertKeyAndValue(pintokenKey, pintokenValue); } // Insert the item row into the IMDB insertRow ( nvPairs ); } } // Update the tableInfo table and determine if the db has // changed as a result of the reload (setting the // changed tableInfo field SIPDBManager::getInstance()-> updateDatabaseInfo( mDatabaseName, loadChecksum); } else { OsSysLog::add(FAC_DB, PRI_WARNING, "CredentialDB::load failed to load \"%s\"", pathName.data()); result = OS_FAILED; } } else { OsSysLog::add(FAC_DB, PRI_ERR, "CredentialDB::load failed - no DB"); result = OS_FAILED; } return result; }