diff -r 6295dc2169f3 -r 8486d82aef45 connectivitylayer/isce/isinameservice_dll/src/namerecords.cpp --- a/connectivitylayer/isce/isinameservice_dll/src/namerecords.cpp Wed Apr 21 14:29:55 2010 +0300 +++ b/connectivitylayer/isce/isinameservice_dll/src/namerecords.cpp Tue Oct 19 13:16:20 2010 +0300 @@ -19,146 +19,264 @@ #include "namerecords.h" #include #include "isinameservicetrace.h" // For C_TRACE, ASSERT_RESET.. and fault codes +#include "isihelpers.h" // For PN_DEV_OWN enum TISINameRecordsFaults { EISINameRecordsMemAllocFailure = 0x01, + EISINameRecordsNullPointer, + EISINameRecordsNullPointer2, + EISINameRecordsNullPointer3, + EISINameRecordsNullPointer4, + EISINameRecordsNotFoundEntry, }; +const TUint8 KAlwaysAssert( 0x00 ); +const TUint16 KOwnDeviceRouter( PN_DEV_OWN << 8 ); + DNameRecords::DNameRecords() - { - //nothing - C_TRACE( ( _T( "DNameRecords::DNameRecords <->" ) ) ); - } + { + //nothing + C_TRACE( ( _T( "DNameRecords::DNameRecords <>" ) ) ); + } DNameRecords::~DNameRecords() - { - C_TRACE( ( _T( "DNameRecords::~DNameRecords ->" ) ) ); - TInt i = 0; - while( i" ) ) ); + for( TUint32 i( 0 ); i < iNameTableArray.Count(); i++ ) + { + delete iNameTableArray[ i ]; + iNameTableArray.Remove( i ); + } + iNameTableArray.Reset(); + C_TRACE( ( _T( "DNameRecords::~DNameRecords<" ) ) ); + } -TUint8 DNameRecords::AddName( const TUint32 aName, - const TUint16 aPhonetAddress, - const TUint8 aFlags ) +TUint8 DNameRecords::AddName( + const TUint32 aName, + const TUint16 aPhonetAddress, + const TUint8 aFlags + ) { - C_TRACE( ( _T( "DNameRecords::AddName name:0x%x phonetAdd:%d flags: %d ->" ), aName, aPhonetAddress, aFlags ) ); + C_TRACE( ( _T( "DNameRecords::AddName name:0x%x phonetAdd:0x%04x flags: 0x%x>" ), aName, aPhonetAddress, aFlags ) ); + TUint8 error( PN_NAME_OK ); + switch( aFlags ) + { + case PN_NAME_UNDEF : + case PN_NAME_NOCHG : + { + error = AddNewName( aName, aPhonetAddress, aFlags ); + break; + } + default: + { + TRACE_ASSERT_ALWAYS( KAlwaysAssert ); + error = PN_NAME_UNKNOWN; + break; + } + } + C_TRACE( ( _T( "DNameRecords::AddName name:0x%x phonetAdd:0x%04x flags: 0x%x %d<" ), aName, aPhonetAddress, aFlags, error ) ); + return error; + } - TUint8 error = PN_NAME_OK ; - TUint i = 0; - TBool nameFound = EFalse; - - if( aFlags == PN_NAME_UNDEF || - aFlags == PN_NAME_NOCHG ) +TUint8 DNameRecords::RemoveName( + const TUint32 aName + ) + { + C_TRACE( ( _T( "DNameRecords::RemoveName name:0x%x>" ), aName ) ); + TUint8 error( PN_NAME_UNKNOWN ); + TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName ); + if( nameEntry ) { - while( iiName == aName) - { - nameFound = ETrue; - if( iNameTableArray[i]->iFlags != PN_NAME_UNDEF ) - { - error = PN_NAME_NOT_ALLOWED; - } - else - { - iNameTableArray[i]->iPhonetAddress = aPhonetAddress; - iNameTableArray[i]->iFlags = aFlags; - } - break; - } - i++; - }//while + if( nameEntry->iFlags == PN_NAME_UNDEF ) + { + RemoveUndefinedEntry( *nameEntry ); + error = PN_NAME_OK; + } + else + { + error = PN_NAME_NOT_ALLOWED; + TRACE_ASSERT_ALWAYS( KAlwaysAssert ); + } } - else - { - error = PN_NAME_UNKNOWN; - } - if( !nameFound ) + // No need for else, as name is unknown + TRACE_ASSERT_ALWAYS( PN_NAME_OK == error ); + C_TRACE( ( _T( "DNameRecords::RemoveName name:0x%x %d<" ), aName, error ) ); + return error; + } + +TInt DNameRecords::LookupPhonetAddress( + const TUint32 aName, + TUint16* aPhonetAddress + ) + { + C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress name:0x%x>" ), aName ) ); + ASSERT_RESET_ALWAYS( aPhonetAddress, ( EISINameRecordsNullPointer2 | EDISINameRecordsTraceId << KClassIdentifierShift ) ); + TInt error( KErrNotFound ); + TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName ); + if( nameEntry ) { - TNameTable* table = new TNameTable( aName, aPhonetAddress, aFlags ); + *aPhonetAddress = nameEntry->iPhonetAddress; + error = KErrNone; + } + // No need for else, as name is not found + C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress name:0x%x %d<" ), aName, error ) ); + return error; + } - ASSERT_RESET_ALWAYS( table, EISINameRecordsMemAllocFailure | EDISINameRecordsTraceId << KClassIdentifierShift ); - iNameTableArray.Append( table ); - +TInt DNameRecords::LookupNamePhonetAddressAndFlags( + const TUint32 aName, + TUint16* aPhonetAddress, + TUint8* aFlags + ) + { + C_TRACE( ( _T( "DNameRecords::LookupNamePhonetAddressAndFlags name:0x%x>" ), aName ) ); + ASSERT_RESET_ALWAYS( aPhonetAddress, ( EISINameRecordsNullPointer3 | EDISINameRecordsTraceId << KClassIdentifierShift ) ); + ASSERT_RESET_ALWAYS( aFlags, ( EISINameRecordsNullPointer4 | EDISINameRecordsTraceId << KClassIdentifierShift ) ); + TInt error( KErrNotFound ); + TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName ); + if( nameEntry ) + { + *aPhonetAddress = nameEntry->iPhonetAddress; + *aFlags = nameEntry->iFlags; + error = KErrNone; } + // No need for else, as name is not found + C_TRACE( ( _T( "DNameRecords::LookupNamePhonetAddressAndFlags name:0x%x %d<" ), aName, error ) ); return error; } -TUint8 DNameRecords::RemoveName( const TUint32 aName ) - { - C_TRACE( ( _T( "DNameRecords::RemoveName name:0x%x ->" ), aName ) ); - TUint8 error = PN_NAME_UNKNOWN; - TInt i = 0; - while( i* aResultsArray + ) + { + C_TRACE( ( _T( "DNameRecords::NameQuery name:0x%x mask:0x%x &aResultsArray: 0x%x>" ), aName, aMask, &aResultsArray ) ); + FindMatchingNameTableEntriesWithMask( aName, aMask, aResultsArray ); + C_TRACE( ( _T( "DNameRecords::NameQuery name:0x%x mask:0x%x &aResultsArray: 0x%x<" ), aName, aMask, &aResultsArray ) ); + } + +// privates start + +TUint8 DNameRecords::AddNewName( + const TUint32 aName, + const TUint16 aPhonetAddress, + const TUint8 aFlags + ) + { + E_TRACE( ( _T( "DNameRecords::AddNewName 0x%x 0x%04x 0x%x>" ), aName, aPhonetAddress, aFlags ) ); + const TUint32 nameTableCount( iNameTableArray.Count() ); + TUint8 error( PN_NAME_OK ); + TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName ); + if( nameEntry ) { - if( iNameTableArray[i]->iName == aName) - { - error = PN_NAME_NOT_ALLOWED; - if( iNameTableArray[i]->iFlags == PN_NAME_UNDEF ) - { - delete iNameTableArray[i];; - iNameTableArray.Remove(i); - iNameTableArray.Compress(); - error = PN_NAME_OK; - } - break; - } - i++; - } //while + error = AddExistinNameToNameTableArray( nameEntry, aName, aPhonetAddress, aFlags ); + } + else + { + error = AddNewNameToNameTableArray( aName, aPhonetAddress, aFlags ); + } + E_TRACE( ( _T( "DNameRecords::AddNewName 0x%x 0x%04x 0x%x error %d<" ), aName, aPhonetAddress, aFlags, error ) ); + return error; + } +TUint8 DNameRecords::AddExistinNameToNameTableArray( + TNameTableEntry* aNameTableEntry, + const TUint32 aName, + const TUint16 aPhonetAddress, + const TUint8 aFlags + ) + { + E_TRACE( ( _T( "DNameRecords::AddExistinNameToNameTableArray 0x%x 0x%04x 0x%x exists 0x%x>" ), aName, aPhonetAddress, aFlags, aNameTableEntry ) ); + TUint8 error( PN_NAME_NOT_ALLOWED ); + ASSERT_RESET_ALWAYS( aNameTableEntry, ( EISINameRecordsNullPointer | EDISINameRecordsTraceId << KClassIdentifierShift ) ); + if( aNameTableEntry->iFlags != PN_NAME_NOCHG ) + { + aNameTableEntry->iPhonetAddress = aPhonetAddress; + aNameTableEntry->iFlags = aFlags; + error = PN_NAME_OK; + } + // No need for else, if not changeable doing nothing. + TRACE_ASSERT_ALWAYS( PN_NAME_OK == error ); + E_TRACE( ( _T( "DNameRecords::AddExistinNameToNameTableArray 0x%x 0x%04x 0x%x exists 0x%x error %d<" ), aName, aPhonetAddress, aFlags, aNameTableEntry, error ) ); return error; } -TInt32 DNameRecords::LookupPhonetAddress( const TUint32 aName, TUint16* aPhonetAddress ) - { - C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress name:0x%x ->" ), aName ) ); - TInt32 error = KErrNotFound; - TInt i = 0; - - while( i" ), aName, aPhonetAddress, aFlags ) ); + TUint8 error( PN_NAME_NOT_ALLOWED ); + // This check is only needed here as these PhoNet addresses may never exist. + if( KOwnDeviceRouter != aPhonetAddress ) { - C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress ind:0x%x " ), i ) ); - if( iNameTableArray[i]->iName == aName) - { - C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress found phonet address: 0x%x" ), iNameTableArray[i]->iPhonetAddress ) ); - *aPhonetAddress = iNameTableArray[i]->iPhonetAddress; - error = KErrNone; - break; - } - i++; - }//while - + TNameTableEntry* table = new TNameTableEntry( aName, aPhonetAddress, aFlags ); + E_TRACE( ( _T( "DNameRecords::AddNewNameToNameTableArray 0x%x 0x%x 0x%x new 0x%x<>" ), aName, aPhonetAddress, aFlags, table ) ); + ASSERT_RESET_ALWAYS( table, ( EISINameRecordsMemAllocFailure | EDISINameRecordsTraceId << KClassIdentifierShift ) ); + iNameTableArray.Append( table ); + error = PN_NAME_OK; + } + // No need for else as not allowed. + TRACE_ASSERT_ALWAYS( PN_NAME_OK == error ); + E_TRACE( ( _T( "DNameRecords::AddNewNameToNameTableArray 0x%x 0x%04x 0x%x 0x%x<" ), aName, aPhonetAddress, aFlags, error ) ); return error; } -RArray * DNameRecords::GetNameTable() +TNameTableEntry* DNameRecords::FindMatchingNameTableEntry( + const TUint32 aName + ) { - C_TRACE( ( _T( "DNameRecords::GetNameTable ->" ) ) ); - return &iNameTableArray ; + E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntry 0x%x>" ), aName ) ); + TNameTableEntry* tableEntry = NULL; + const TUint32 nameTableCount( iNameTableArray.Count() ); + for( TUint32 i( 0 ); i < nameTableCount; i++ ) + { + if( iNameTableArray[ i ]->iName == aName ) + { + tableEntry = iNameTableArray[ i ]; + break; + } + // No need for else, continue for + } + E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntry 0x%x entry 0x%x<" ), aName, tableEntry ) ); + return tableEntry; } -TInt32 DNameRecords::NameQuery( const TUint32 aName, const TUint32 aMask, RArray *aResultsArray ) - { - C_TRACE( ( _T( "DNameRecords::AddName name:0x%x mask:%d &aResultsArray: 0x%x ->" ), aName, aMask, &aResultsArray ) ); - - TInt i = 0; - TInt32 count = 0;//KErrNotFound - while( i* aResultsArray + ) + { + E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntriesWithMask 0x%x 0x%x 0x%x>" ), aName, aMask, aResultsArray ) ); + const TUint32 nameTableCount( iNameTableArray.Count() ); + for( TUint32 i( 0 ); i < nameTableCount; i++ ) { - if( aName == iNameTableArray[i]->iName || - (aName & aMask ) == ( iNameTableArray[i]->iName & aMask ) ) + TNameTableEntry* tableEntry = iNameTableArray[ i ]; + if( ( aName == tableEntry->iName ) || + ( ( aName & aMask ) == ( tableEntry->iName & aMask ) ) ) { - aResultsArray->Append( iNameTableArray[i] ); - count++; + E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntriesWithMask 0x%x 0x%x found" ), aName, aMask ) ); + aResultsArray->Append( tableEntry ); } - i++; - }//while - return count; - } + // No need for else, if not found no actions. + } + E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntriesWithMask 0x%x 0x%x 0x%x<" ), aName, aMask, aResultsArray ) ); + } +void DNameRecords::RemoveUndefinedEntry( + TNameTableEntry& aNameEntryToRemove + ) + { + E_TRACE( ( _T( "DNameRecords::RemoveUndefinedEntry 0x%x>" ), &aNameEntryToRemove ) ); + const TInt index = iNameTableArray.Find( &aNameEntryToRemove ); + ASSERT_RESET_ALWAYS( ( index != KErrNotFound ), ( EISINameRecordsNotFoundEntry | EDISINameRecordsTraceId << KClassIdentifierShift ) ); + delete iNameTableArray[ index ]; + iNameTableArray.Remove( index ); + iNameTableArray.Compress(); + E_TRACE( ( _T( "DNameRecords::RemoveUndefinedEntry 0x%x<" ), &aNameEntryToRemove ) ); + }