BOOL CSecurity::FromXML(CXMLElement* pXML) { if ( ! pXML->IsNamed( _T("security") ) ) return FALSE; int nCount = 0; for ( POSITION pos = pXML->GetElementIterator() ; pos ; ) { CXMLElement* pElement = pXML->GetNextElement( pos ); if ( pElement->IsNamed( _T("rule") ) ) { CQuickLock oLock( m_pSection ); CSecureRule* pRule = NULL; CString strGUID = pElement->GetAttributeValue( _T("guid") ); BOOL bExisting = FALSE; GUID pGUID; if ( Hashes::fromGuid( strGUID, &pGUID ) ) { if ( ( pRule = GetGUID( pGUID ) ) != NULL ) bExisting = TRUE; if ( pRule == NULL ) { pRule = new CSecureRule( FALSE ); pRule->m_pGUID = pGUID; } } else { pRule = new CSecureRule(); } if ( pRule->FromXML( pElement ) ) { if ( ! bExisting ) m_pRules.AddTail( pRule ); nCount++; } else { if ( ! bExisting ) delete pRule; } } } return nCount > 0; }