connectivitylayer/isce/isinameservice_dll/src/namerecords.cpp
changeset 9 8486d82aef45
parent 5 8ccc39f9d787
--- 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 <nsisi.h>
 #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<iNameTableArray.Count())
-		{
-    	delete iNameTableArray[i];
-    	iNameTableArray.Remove(i);
-		}
-	iNameTableArray.Reset();
-	}
+    {
+    C_TRACE( ( _T( "DNameRecords::~DNameRecords>" ) ) );
+    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( i<iNameTableArray.Count())
-        	{
-            if( iNameTableArray[i]->iName == 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<iNameTableArray.Count() )
+void DNameRecords::NameQuery(
+        const TUint32 aName,
+        const TUint32 aMask,
+        RArray <TNameTableEntry*>* 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<iNameTableArray.Count() )
+TUint8 DNameRecords::AddNewNameToNameTableArray(
+        const TUint32 aName,
+        const TUint16 aPhonetAddress,
+        const TUint8 aFlags
+        )
+    {
+    E_TRACE( ( _T( "DNameRecords::AddNewNameToNameTableArray 0x%x 0x%04x 0x%x>" ), 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 <TNameTable*>* 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 <TNameTable*> *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<iNameTableArray.Count() )
+void DNameRecords::FindMatchingNameTableEntriesWithMask(
+        const TUint32 aName,
+        const TUint32 aMask,
+        RArray <TNameTableEntry*>* 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 ) );
+    }