connectivitylayer/isce/isinameservice_dll/src/namerecords.cpp
changeset 9 8486d82aef45
parent 5 8ccc39f9d787
equal deleted inserted replaced
8:6295dc2169f3 9:8486d82aef45
    17 
    17 
    18 
    18 
    19 #include "namerecords.h"
    19 #include "namerecords.h"
    20 #include <nsisi.h>
    20 #include <nsisi.h>
    21 #include "isinameservicetrace.h"  // For C_TRACE, ASSERT_RESET.. and fault codes
    21 #include "isinameservicetrace.h"  // For C_TRACE, ASSERT_RESET.. and fault codes
       
    22 #include "isihelpers.h"           // For PN_DEV_OWN
    22 
    23 
    23 enum TISINameRecordsFaults
    24 enum TISINameRecordsFaults
    24     {
    25     {
    25     EISINameRecordsMemAllocFailure = 0x01,
    26     EISINameRecordsMemAllocFailure = 0x01,
       
    27     EISINameRecordsNullPointer,
       
    28     EISINameRecordsNullPointer2,
       
    29     EISINameRecordsNullPointer3,
       
    30     EISINameRecordsNullPointer4,
       
    31     EISINameRecordsNotFoundEntry,
    26     };
    32     };
    27 
    33 
       
    34 const TUint8 KAlwaysAssert( 0x00 );
       
    35 const TUint16 KOwnDeviceRouter( PN_DEV_OWN << 8 );
       
    36 
    28 DNameRecords::DNameRecords()
    37 DNameRecords::DNameRecords()
    29 	{
    38     {
    30 	//nothing
    39     //nothing
    31 	C_TRACE( ( _T( "DNameRecords::DNameRecords <->" ) ) );
    40     C_TRACE( ( _T( "DNameRecords::DNameRecords <>" ) ) );
    32 	}
    41     }
    33 
    42 
    34 DNameRecords::~DNameRecords()
    43 DNameRecords::~DNameRecords()
    35 	{
    44     {
    36 	C_TRACE( ( _T( "DNameRecords::~DNameRecords ->" ) ) );
    45     C_TRACE( ( _T( "DNameRecords::~DNameRecords>" ) ) );
    37 	TInt i = 0;
    46     for( TUint32 i( 0 ); i < iNameTableArray.Count(); i++ )
    38     while( i<iNameTableArray.Count())
    47         {
    39 		{
    48         delete iNameTableArray[ i ];
    40     	delete iNameTableArray[i];
    49         iNameTableArray.Remove( i );
    41     	iNameTableArray.Remove(i);
    50         }
    42 		}
    51     iNameTableArray.Reset();
    43 	iNameTableArray.Reset();
    52     C_TRACE( ( _T( "DNameRecords::~DNameRecords<" ) ) );
    44 	}
    53     }
    45 
    54 
    46 TUint8 DNameRecords::AddName( const TUint32 aName,
    55 TUint8 DNameRecords::AddName( 
    47     						  const TUint16 aPhonetAddress,
    56         const TUint32 aName,
    48     						  const TUint8  aFlags )
    57         const TUint16 aPhonetAddress,
    49     {
    58         const TUint8 aFlags
    50     C_TRACE( ( _T( "DNameRecords::AddName name:0x%x phonetAdd:%d flags: %d ->" ), aName, aPhonetAddress, aFlags ) );
    59         )
    51 
    60     {
    52 	TUint8 error = PN_NAME_OK ;
    61     C_TRACE( ( _T( "DNameRecords::AddName name:0x%x phonetAdd:0x%04x flags: 0x%x>" ), aName, aPhonetAddress, aFlags ) );
    53     TUint i = 0;
    62     TUint8 error( PN_NAME_OK );
    54     TBool nameFound = EFalse;
    63     switch( aFlags )
    55 
    64         {
    56     if( aFlags == PN_NAME_UNDEF ||
    65         case PN_NAME_UNDEF :
    57     	aFlags == PN_NAME_NOCHG  )
    66         case PN_NAME_NOCHG :
    58         {
    67             {
    59         while( i<iNameTableArray.Count())
    68             error = AddNewName( aName, aPhonetAddress, aFlags );
    60         	{
    69             break;
    61             if( iNameTableArray[i]->iName == aName)
    70             }
    62                 {
    71         default:
    63                 nameFound = ETrue;
    72             {
    64                 if(  iNameTableArray[i]->iFlags != PN_NAME_UNDEF )
    73             TRACE_ASSERT_ALWAYS( KAlwaysAssert );
    65                     {
    74             error = PN_NAME_UNKNOWN;
    66                     error = PN_NAME_NOT_ALLOWED;
    75             break;
    67                     }
    76             }
    68                 else
    77         }
    69                     {
    78     C_TRACE( ( _T( "DNameRecords::AddName name:0x%x phonetAdd:0x%04x flags: 0x%x %d<" ), aName, aPhonetAddress, aFlags, error ) );
    70                     iNameTableArray[i]->iPhonetAddress = aPhonetAddress;
    79     return error;
    71                     iNameTableArray[i]->iFlags = aFlags;
    80     }
    72                     }
    81 
    73                 break;
    82 TUint8 DNameRecords::RemoveName(
    74                 }
    83         const TUint32 aName
    75             i++;
    84         )
    76             }//while
    85     {
       
    86     C_TRACE( ( _T( "DNameRecords::RemoveName name:0x%x>" ), aName ) );
       
    87     TUint8 error( PN_NAME_UNKNOWN );
       
    88     TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName );
       
    89     if( nameEntry )
       
    90         {
       
    91         if( nameEntry->iFlags == PN_NAME_UNDEF )
       
    92             {
       
    93             RemoveUndefinedEntry( *nameEntry );
       
    94             error = PN_NAME_OK;
       
    95             }
       
    96         else
       
    97             {
       
    98             error = PN_NAME_NOT_ALLOWED;
       
    99             TRACE_ASSERT_ALWAYS( KAlwaysAssert );
       
   100             }
       
   101         }
       
   102      // No need for else, as name is unknown
       
   103     TRACE_ASSERT_ALWAYS( PN_NAME_OK == error );
       
   104     C_TRACE( ( _T( "DNameRecords::RemoveName name:0x%x %d<" ), aName, error ) );
       
   105     return error;
       
   106     }
       
   107 
       
   108 TInt DNameRecords::LookupPhonetAddress(
       
   109         const TUint32 aName,
       
   110         TUint16* aPhonetAddress
       
   111         )
       
   112     {
       
   113     C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress name:0x%x>" ), aName ) );
       
   114     ASSERT_RESET_ALWAYS( aPhonetAddress, ( EISINameRecordsNullPointer2 | EDISINameRecordsTraceId << KClassIdentifierShift ) );
       
   115     TInt error( KErrNotFound );
       
   116     TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName );
       
   117     if( nameEntry )
       
   118         {
       
   119         *aPhonetAddress = nameEntry->iPhonetAddress;
       
   120         error = KErrNone;
       
   121         }
       
   122      // No need for else, as name is not found
       
   123     C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress name:0x%x %d<" ), aName, error ) );
       
   124     return error;
       
   125     }
       
   126 
       
   127 TInt DNameRecords::LookupNamePhonetAddressAndFlags(
       
   128         const TUint32 aName,
       
   129         TUint16* aPhonetAddress,
       
   130         TUint8* aFlags
       
   131         )
       
   132     {
       
   133     C_TRACE( ( _T( "DNameRecords::LookupNamePhonetAddressAndFlags name:0x%x>" ), aName ) );
       
   134     ASSERT_RESET_ALWAYS( aPhonetAddress, ( EISINameRecordsNullPointer3 | EDISINameRecordsTraceId << KClassIdentifierShift ) );
       
   135     ASSERT_RESET_ALWAYS( aFlags, ( EISINameRecordsNullPointer4 | EDISINameRecordsTraceId << KClassIdentifierShift ) );
       
   136     TInt error( KErrNotFound );
       
   137     TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName );
       
   138     if( nameEntry )
       
   139         {
       
   140         *aPhonetAddress = nameEntry->iPhonetAddress;
       
   141         *aFlags = nameEntry->iFlags;
       
   142         error = KErrNone;
       
   143         }
       
   144      // No need for else, as name is not found
       
   145     C_TRACE( ( _T( "DNameRecords::LookupNamePhonetAddressAndFlags name:0x%x %d<" ), aName, error ) );
       
   146     return error;
       
   147     }
       
   148 
       
   149 void DNameRecords::NameQuery(
       
   150         const TUint32 aName,
       
   151         const TUint32 aMask,
       
   152         RArray <TNameTableEntry*>* aResultsArray
       
   153         )
       
   154     {
       
   155     C_TRACE( ( _T( "DNameRecords::NameQuery name:0x%x mask:0x%x &aResultsArray: 0x%x>" ), aName, aMask, &aResultsArray ) );
       
   156     FindMatchingNameTableEntriesWithMask( aName, aMask, aResultsArray );
       
   157     C_TRACE( ( _T( "DNameRecords::NameQuery name:0x%x mask:0x%x &aResultsArray: 0x%x<" ), aName, aMask, &aResultsArray ) );
       
   158     }
       
   159 
       
   160 // privates start
       
   161 
       
   162 TUint8 DNameRecords::AddNewName(
       
   163         const TUint32 aName,
       
   164         const TUint16 aPhonetAddress,
       
   165         const TUint8 aFlags
       
   166         )
       
   167     {
       
   168     E_TRACE( ( _T( "DNameRecords::AddNewName 0x%x 0x%04x 0x%x>" ), aName, aPhonetAddress, aFlags ) );
       
   169     const TUint32 nameTableCount( iNameTableArray.Count() );
       
   170     TUint8 error( PN_NAME_OK );
       
   171     TNameTableEntry* nameEntry = FindMatchingNameTableEntry( aName );
       
   172     if( nameEntry )
       
   173         {
       
   174         error = AddExistinNameToNameTableArray( nameEntry, aName, aPhonetAddress, aFlags );
    77         }
   175         }
    78     else
   176     else
    79     	{
   177         {
    80     	error = PN_NAME_UNKNOWN;
   178         error = AddNewNameToNameTableArray( aName, aPhonetAddress, aFlags );
    81     	}
   179         }
    82     if( !nameFound )
   180     E_TRACE( ( _T( "DNameRecords::AddNewName 0x%x 0x%04x 0x%x error %d<" ), aName, aPhonetAddress, aFlags, error ) );
    83         {
   181     return error;
    84     	TNameTable* table = new TNameTable( aName, aPhonetAddress, aFlags );
   182     }
    85 
   183 
    86         ASSERT_RESET_ALWAYS( table, EISINameRecordsMemAllocFailure | EDISINameRecordsTraceId << KClassIdentifierShift );
   184 TUint8 DNameRecords::AddExistinNameToNameTableArray(
    87     	iNameTableArray.Append( table );
   185         TNameTableEntry* aNameTableEntry,
    88 
   186         const TUint32 aName,
    89         }
   187         const TUint16 aPhonetAddress,
    90     return error;
   188         const TUint8 aFlags
    91     }
   189         )
    92 
   190     {
    93 TUint8 DNameRecords::RemoveName( const TUint32 aName )
   191     E_TRACE( ( _T( "DNameRecords::AddExistinNameToNameTableArray 0x%x 0x%04x 0x%x exists 0x%x>" ), aName, aPhonetAddress, aFlags, aNameTableEntry ) );
    94 	{
   192     TUint8 error( PN_NAME_NOT_ALLOWED );
    95 	C_TRACE( ( _T( "DNameRecords::RemoveName name:0x%x  ->" ), aName ) );
   193     ASSERT_RESET_ALWAYS( aNameTableEntry, ( EISINameRecordsNullPointer | EDISINameRecordsTraceId << KClassIdentifierShift ) );
    96     TUint8 error = PN_NAME_UNKNOWN;
   194     if( aNameTableEntry->iFlags != PN_NAME_NOCHG )
    97     TInt i = 0;
   195         {
    98     while( i<iNameTableArray.Count() )
   196         aNameTableEntry->iPhonetAddress = aPhonetAddress;
    99         {
   197         aNameTableEntry->iFlags = aFlags;
   100         if( iNameTableArray[i]->iName == aName)
   198         error = PN_NAME_OK;
   101             {
   199         }
   102             error = PN_NAME_NOT_ALLOWED;
   200     // No need for else, if not changeable doing nothing.
   103             if( iNameTableArray[i]->iFlags == PN_NAME_UNDEF )
   201     TRACE_ASSERT_ALWAYS( PN_NAME_OK == error );
   104                 {
   202     E_TRACE( ( _T( "DNameRecords::AddExistinNameToNameTableArray 0x%x 0x%04x 0x%x exists 0x%x error %d<" ), aName, aPhonetAddress, aFlags, aNameTableEntry, error ) );
   105             	delete iNameTableArray[i];;
   203     return error;
   106             	iNameTableArray.Remove(i);
   204     }
   107             	iNameTableArray.Compress();
   205 
   108                 error = PN_NAME_OK;
   206 TUint8 DNameRecords::AddNewNameToNameTableArray(
   109                 }
   207         const TUint32 aName,
       
   208         const TUint16 aPhonetAddress,
       
   209         const TUint8 aFlags
       
   210         )
       
   211     {
       
   212     E_TRACE( ( _T( "DNameRecords::AddNewNameToNameTableArray 0x%x 0x%04x 0x%x>" ), aName, aPhonetAddress, aFlags ) );
       
   213     TUint8 error( PN_NAME_NOT_ALLOWED );
       
   214     // This check is only needed here as these PhoNet addresses may never exist.
       
   215     if( KOwnDeviceRouter != aPhonetAddress )
       
   216         {
       
   217         TNameTableEntry* table = new TNameTableEntry( aName, aPhonetAddress, aFlags );
       
   218         E_TRACE( ( _T( "DNameRecords::AddNewNameToNameTableArray 0x%x 0x%x 0x%x new 0x%x<>" ), aName, aPhonetAddress, aFlags, table ) );
       
   219         ASSERT_RESET_ALWAYS( table, ( EISINameRecordsMemAllocFailure | EDISINameRecordsTraceId << KClassIdentifierShift ) );
       
   220         iNameTableArray.Append( table );
       
   221         error = PN_NAME_OK;
       
   222         }
       
   223     // No need for else as not allowed.
       
   224     TRACE_ASSERT_ALWAYS( PN_NAME_OK == error );
       
   225     E_TRACE( ( _T( "DNameRecords::AddNewNameToNameTableArray 0x%x 0x%04x 0x%x 0x%x<" ), aName, aPhonetAddress, aFlags, error ) );
       
   226     return error;
       
   227     }
       
   228 
       
   229 TNameTableEntry* DNameRecords::FindMatchingNameTableEntry(
       
   230         const TUint32 aName
       
   231         )
       
   232     {
       
   233     E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntry 0x%x>" ), aName ) );
       
   234     TNameTableEntry* tableEntry = NULL;
       
   235     const TUint32 nameTableCount( iNameTableArray.Count() );
       
   236     for( TUint32 i( 0 ); i < nameTableCount; i++ )
       
   237         {
       
   238         if( iNameTableArray[ i ]->iName == aName )
       
   239             {
       
   240             tableEntry = iNameTableArray[ i ];
   110             break;
   241             break;
   111             }
   242             }
   112         i++;
   243         // No need for else, continue for
   113         } //while
   244         }
   114 
   245     E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntry 0x%x entry 0x%x<" ), aName, tableEntry ) );
   115     return error;
   246     return tableEntry;
   116     }
   247     }
   117 
   248 
   118 TInt32 DNameRecords::LookupPhonetAddress( const TUint32 aName, TUint16* aPhonetAddress )
   249 void DNameRecords::FindMatchingNameTableEntriesWithMask(
   119 	{
   250         const TUint32 aName,
   120 	C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress name:0x%x  ->" ), aName ) );
   251         const TUint32 aMask,
   121 	TInt32 error = KErrNotFound;
   252         RArray <TNameTableEntry*>* aResultsArray
   122     TInt i = 0;
   253         )
   123 
   254     {
   124     while( i<iNameTableArray.Count() )
   255     E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntriesWithMask 0x%x 0x%x 0x%x>" ), aName, aMask, aResultsArray ) );
   125         {
   256     const TUint32 nameTableCount( iNameTableArray.Count() );
   126         C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress ind:0x%x " ), i ) );
   257     for( TUint32 i( 0 ); i < nameTableCount; i++ )
   127         if( iNameTableArray[i]->iName == aName)
   258         {
   128             {
   259         TNameTableEntry* tableEntry = iNameTableArray[ i ];
   129             C_TRACE( ( _T( "DNameRecords::LookupPhonetAddress found phonet address: 0x%x" ), iNameTableArray[i]->iPhonetAddress ) );
   260         if( ( aName == tableEntry->iName ) ||
   130             *aPhonetAddress = iNameTableArray[i]->iPhonetAddress;
   261             ( ( aName & aMask ) == ( tableEntry->iName & aMask ) ) )
   131             error = KErrNone;
   262             {
   132             break;
   263             E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntriesWithMask 0x%x 0x%x found" ), aName, aMask ) );
   133             }
   264             aResultsArray->Append( tableEntry );
   134         i++;
   265             }
   135         }//while
   266         // No need for else, if not found no actions.
   136 
   267         }
   137     return error;
   268     E_TRACE( ( _T( "DNameRecords::FindMatchingNameTableEntriesWithMask 0x%x 0x%x 0x%x<" ), aName, aMask, aResultsArray ) );
   138     }
   269     }
   139 
   270 
   140 RArray <TNameTable*>* DNameRecords::GetNameTable()
   271 void DNameRecords::RemoveUndefinedEntry(
   141     {
   272         TNameTableEntry& aNameEntryToRemove
   142 	C_TRACE( ( _T( "DNameRecords::GetNameTable ->" ) ) );
   273         )
   143 	return &iNameTableArray ;
   274     {
   144     }
   275     E_TRACE( ( _T( "DNameRecords::RemoveUndefinedEntry 0x%x>" ), &aNameEntryToRemove ) );
   145 
   276     const TInt index = iNameTableArray.Find( &aNameEntryToRemove );
   146 TInt32 DNameRecords::NameQuery( const TUint32 aName, const TUint32 aMask, RArray <TNameTable*> *aResultsArray )
   277     ASSERT_RESET_ALWAYS( ( index != KErrNotFound ), ( EISINameRecordsNotFoundEntry | EDISINameRecordsTraceId << KClassIdentifierShift ) );
   147 	{
   278     delete iNameTableArray[ index ];
   148 	C_TRACE( ( _T( "DNameRecords::AddName name:0x%x mask:%d &aResultsArray: 0x%x ->" ), aName, aMask, &aResultsArray ) );
   279     iNameTableArray.Remove( index );
   149 
   280     iNameTableArray.Compress();
   150     TInt i = 0;
   281     E_TRACE( ( _T( "DNameRecords::RemoveUndefinedEntry 0x%x<" ), &aNameEntryToRemove ) );
   151     TInt32 count = 0;//KErrNotFound
   282     }
   152     while( i<iNameTableArray.Count() )
       
   153         {
       
   154         if( aName == iNameTableArray[i]->iName ||
       
   155         	(aName & aMask ) == ( iNameTableArray[i]->iName & aMask ) )
       
   156             {
       
   157             aResultsArray->Append( iNameTableArray[i] );
       
   158             count++;
       
   159             }
       
   160         i++;
       
   161         }//while
       
   162     return count;
       
   163 	}
       
   164