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 |
|