IMPSengine/datautils/src/impstdataaccessor.cpp
changeset 0 094583676ce7
equal deleted inserted replaced
-1:000000000000 0:094583676ce7
       
     1 /*
       
     2 * Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 * data accessor class for imps fields. 
       
    16 *
       
    17 */
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include    <e32std.h>
       
    21 #include    "impsfields.h"
       
    22 #include    "impsconst.h"
       
    23 #include    "impskey.h"
       
    24 #include    "impserrors.h"
       
    25 #include    "impsutils.h"
       
    26 #include    "impstdataaccessor.h"
       
    27 #include    "impsdatautils.h"
       
    28 
       
    29 // ================= MEMBER FUNCTIONS =======================
       
    30 
       
    31 // ---------------------------------------------------------
       
    32 // TImpsDataAccessor::TImpsDataAccessor
       
    33 // ---------------------------------------------------------
       
    34 //
       
    35 EXPORT_C TImpsDataAccessor::TImpsDataAccessor()
       
    36     {
       
    37     iImpsFields = NULL;
       
    38     }
       
    39 // ---------------------------------------------------------
       
    40 // TImpsDataAccessor::TImpsDataAccessor
       
    41 // ---------------------------------------------------------
       
    42 //
       
    43 EXPORT_C TImpsDataAccessor::TImpsDataAccessor(CImpsFields* aImpsFields)
       
    44     {
       
    45     iImpsFields = aImpsFields;
       
    46     }
       
    47 // ---------------------------------------------------------
       
    48 // TImpsDataAccessor::SetImpsFields
       
    49 // ---------------------------------------------------------
       
    50 //
       
    51 EXPORT_C void TImpsDataAccessor::SetImpsFields( CImpsFields* aImpsFields )
       
    52     {
       
    53     iImpsFields = aImpsFields;
       
    54     }
       
    55 
       
    56 // ---------------------------------------------------------
       
    57 // TImpsDataAccessor::GetImpsFields
       
    58 // ---------------------------------------------------------
       
    59 //
       
    60 EXPORT_C CImpsFields* TImpsDataAccessor::GetImpsFields( ) const
       
    61     {
       
    62     return iImpsFields;
       
    63     }
       
    64 
       
    65 // ---------------------------------------------------------
       
    66 // TImpsDataAccessor::~TImpsDataAccessor()
       
    67 // ---------------------------------------------------------
       
    68 //
       
    69 EXPORT_C TImpsDataAccessor::~TImpsDataAccessor()
       
    70     {
       
    71     }
       
    72 
       
    73 // ---------------------------------------------------------
       
    74 // TImpsDataAccessor::NewKeyL
       
    75 // ---------------------------------------------------------
       
    76 //
       
    77 EXPORT_C MImpsKey* TImpsDataAccessor::NewKeyL()
       
    78     {
       
    79     CImpsKey* key = CImpsKey::NewL();
       
    80     return key;
       
    81     }
       
    82 
       
    83 // ---------------------------------------------------------
       
    84 // TImpsDataAccessor::StoreDescL
       
    85 // mutator for symbian descriptor value
       
    86 // ---------------------------------------------------------
       
    87 //
       
    88 EXPORT_C void TImpsDataAccessor::StoreDescL( MImpsKey* aKey, TPtrC aValue )
       
    89     {
       
    90     iData.iType = EStringType;
       
    91     iData.iValue.Set( aValue );
       
    92 
       
    93     DoStoreL( static_cast<CImpsKey*>( aKey ) );
       
    94     }
       
    95 
       
    96 // ---------------------------------------------------------
       
    97 // TImpsDataAccessor::StoreDescL8
       
    98 // mutator for symbian 8-bit descriptor value
       
    99 // ---------------------------------------------------------
       
   100 //
       
   101 EXPORT_C void TImpsDataAccessor::StoreDesc8L( MImpsKey* aKey, TPtrC8 aValue)
       
   102     {
       
   103     iData.iType = EString8Type;
       
   104     iData.iValue8.Set( aValue );
       
   105 
       
   106     DoStoreL( static_cast<CImpsKey*>( aKey ) );
       
   107     }
       
   108 
       
   109 // ---------------------------------------------------------
       
   110 // TImpsDataAccessor::StoreInteger
       
   111 // mutator for symbian integer value
       
   112 // ---------------------------------------------------------
       
   113 //
       
   114 EXPORT_C void TImpsDataAccessor::StoreIntegerL( MImpsKey* aKey, TInt aValue )
       
   115     {
       
   116     iData.iType = EIntegerType;
       
   117     iData.iValueInt = aValue;
       
   118 
       
   119     DoStoreL( static_cast<CImpsKey*>( aKey ) );
       
   120     }
       
   121 
       
   122 // ---------------------------------------------------------
       
   123 // TImpsDataAccessor::StoreBooleanL
       
   124 // mutator for symbian boolean value
       
   125 // ---------------------------------------------------------
       
   126 //
       
   127 EXPORT_C void TImpsDataAccessor::StoreBooleanL( MImpsKey* aKey, TBool aValue )
       
   128     {
       
   129     iData.iType = EBooleanType;
       
   130     iData.iValueBool = aValue;
       
   131 
       
   132     DoStoreL( static_cast<CImpsKey*>( aKey ) );
       
   133     }
       
   134 
       
   135 // ---------------------------------------------------------
       
   136 // TImpsDataAccessor::StoreEmptyL
       
   137 // mutator for symbian empty value
       
   138 // ---------------------------------------------------------
       
   139 //
       
   140 EXPORT_C void TImpsDataAccessor::StoreEmptyL( MImpsKey* aKey)
       
   141     {
       
   142     iData.iType = EEmptyType;
       
   143 
       
   144     DoStoreL( static_cast<CImpsKey*>( aKey ) );
       
   145     }
       
   146 // ---------------------------------------------------------
       
   147 // TImpsDataAccessor::StoreExtL
       
   148 // mutator for extension attribute
       
   149 // ---------------------------------------------------------
       
   150 //
       
   151 EXPORT_C void TImpsDataAccessor::StoreExtL( MImpsKey* /*aKey*/, 
       
   152                                             TPtrC8 /*aName*/, 
       
   153                                             TPtrC8 /*aValue*/)
       
   154     {
       
   155     }
       
   156 //----------------------------------------------------------
       
   157 // TImpsDataAccessor::RestoreDescL
       
   158 // accessor for symbian descriptor value
       
   159 // ---------------------------------------------------------
       
   160 //
       
   161 
       
   162 EXPORT_C TBool TImpsDataAccessor::RestoreDescL( MImpsKey* aKey, TDesC*& aDes)
       
   163     {
       
   164     iData.iType = EStringType;
       
   165 
       
   166     TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
       
   167     if( ret )
       
   168         {
       
   169         if( iData.iValuePointer )
       
   170             {
       
   171             aDes = iData.iValuePointer;
       
   172             }
       
   173         else
       
   174             {
       
   175             aDes = (TDesC*)&KNullDesC;
       
   176             }
       
   177 
       
   178         }
       
   179     return ret;
       
   180     }
       
   181 
       
   182 //----------------------------------------------------------
       
   183 // TImpsDataAccessor::RestoreDesc8L
       
   184 // accessor for symbian 8-bit descriptor value
       
   185 // ---------------------------------------------------------
       
   186 //
       
   187 
       
   188 EXPORT_C TBool TImpsDataAccessor::RestoreDesc8L( MImpsKey* aKey, 
       
   189                                                  TDesC8*& aDes )
       
   190     {
       
   191     iData.iType = EString8Type;
       
   192 
       
   193     TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
       
   194     if( ret )
       
   195         {
       
   196         if( iData.iValuePointer8 )
       
   197             {
       
   198             aDes = iData.iValuePointer8;
       
   199             }
       
   200         else
       
   201             {
       
   202             aDes = (TDesC8*)&KNullDesC8;
       
   203             }
       
   204 
       
   205         }
       
   206     return ret;
       
   207     }
       
   208 
       
   209 //----------------------------------------------------------
       
   210 // TImpsDataAccessor::RestoreIntegerL
       
   211 // accessor for integer value
       
   212 // (covers also boolean and enum types
       
   213 // ---------------------------------------------------------
       
   214 //
       
   215 
       
   216 EXPORT_C TBool TImpsDataAccessor::RestoreIntegerL( MImpsKey* aKey, TInt& aInt )
       
   217     {
       
   218     iData.iType = EIntegerType;
       
   219 
       
   220     TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
       
   221     if( ret )
       
   222         aInt = iData.iValueInt;
       
   223     return ret;
       
   224     }
       
   225 
       
   226 //----------------------------------------------------------
       
   227 // TImpsDataAccessor::RestoreBooleanL
       
   228 // accessor for integer value
       
   229 // (covers also boolean and enum types
       
   230 // ---------------------------------------------------------
       
   231 //
       
   232 
       
   233 EXPORT_C TBool TImpsDataAccessor::RestoreBooleanL( MImpsKey* aKey, 
       
   234                                                    TBool& aBool )
       
   235     {
       
   236     iData.iType = EBooleanType;
       
   237 
       
   238     TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
       
   239     if( ret )
       
   240         aBool = iData.iValueBool;
       
   241     return ret;
       
   242     }
       
   243 
       
   244 //----------------------------------------------------------
       
   245 // TImpsDataAccessor::RestoreEmptyL
       
   246 // accessor for integer value
       
   247 // (covers also boolean and enum types
       
   248 // ---------------------------------------------------------
       
   249 //
       
   250 EXPORT_C TBool TImpsDataAccessor::RestoreEmptyL( MImpsKey* aKey )
       
   251     {
       
   252     iData.iType = EEmptyType;
       
   253 
       
   254     return DoRestoreL( static_cast<CImpsKey*>( aKey ) );
       
   255     }
       
   256 
       
   257 //----------------------------------------------------------
       
   258 // TImpsDataAccessor::RestoreDesc8L
       
   259 // accessor for symbian 8-bit descriptor value
       
   260 // ---------------------------------------------------------
       
   261 //
       
   262 EXPORT_C TBool TImpsDataAccessor::RestoreExtL( MImpsKey* /* aKey */,  
       
   263                                                TDesC8*& /*aName*/, 
       
   264                                                TDesC8*& /*aValue*/)
       
   265     {
       
   266     return EFalse;
       
   267     }
       
   268 
       
   269 // ---------------------------------------------------------
       
   270 // TImpsDataAccessor::KeyTypeL
       
   271 // method returns type of related to given key
       
   272 // ---------------------------------------------------------
       
   273 //
       
   274 EXPORT_C TImpsDataType TImpsDataAccessor::KeyTypeL( MImpsKey* aKey )
       
   275     {
       
   276 
       
   277     // Just search the last element type ( or ask from data storage?)
       
   278 
       
   279     TInt eCount = aKey->Count();
       
   280     if ( !eCount )
       
   281         {
       
   282         User::Leave( KErrArgument );
       
   283         }
       
   284 
       
   285     TImpsDataType dataType(EImpsDataTypeNotSupported);
       
   286     TImpsKeyType keyType;
       
   287     TInt myVal = aKey->GetElementL( eCount - 1, keyType );
       
   288     TInt myElem = GET_ENUM( myVal );
       
   289     if( keyType == EImpsKeyTypePre )
       
   290         {
       
   291         switch ( myElem )
       
   292             {
       
   293             case EImpsKeyPRPresenceSubList:
       
   294             case EImpsKeyPRPresenceValue:
       
   295             case EImpsKeyContentType:
       
   296             // CSP 1.2
       
   297             case EImpsKeyPRText:
       
   298 
       
   299                 dataType = EImpsDataTypeDesc;
       
   300                 break;
       
   301 
       
   302             // added
       
   303             case EImpsKeyPRDevManufacturer:
       
   304             case EImpsKeyPRClientProducer:
       
   305             case EImpsKeyPRModel:
       
   306             case EImpsKeyPRClientVersion:
       
   307             case EImpsKeyPRLanguage:
       
   308             case EImpsKeyPRZone:
       
   309             case EImpsKeyPRLongitude:
       
   310             case EImpsKeyPRLatitude:
       
   311             case EImpsKeyPRCountry:  //ENUM
       
   312             case EImpsKeyPRCity:
       
   313             case EImpsKeyPRStreet:
       
   314             case EImpsKeyPRCrossing1:
       
   315             case EImpsKeyPRCrossing2:
       
   316             case EImpsKeyPRBuilding:
       
   317             case EImpsKeyPRNamedArea:
       
   318             case EImpsKeyPRContact:
       
   319             case EImpsKeyPRNote:
       
   320             case EImpsKeyPRPrefC: //enum
       
   321             case EImpsKeyPRCaddr:// enum
       
   322             case EImpsKeyPRCstatus: //enum
       
   323             case EImpsKeyPRCname:
       
   324             case EImpsKeyPRDirectContent:
       
   325             case EImpsKeyPRReferredContent:
       
   326             case EImpsKeyPRContainedvCard:
       
   327             case EImpsKeyPRReferredvCard:
       
   328             //CSP 1.2
       
   329             case EImpsKeyPRLink:
       
   330                 dataType = EImpsDataTypeDesc8;
       
   331                 break;
       
   332 
       
   333             case EImpsKeyPRStatus:
       
   334             case EImpsKeyPRCap:
       
   335                 //added
       
   336             case EImpsKeyPRClientType:
       
   337             case EImpsKeyPRAltitude:
       
   338             case EImpsKeyPRAccuracy:
       
   339             case EImpsKeyPRCpriority:
       
   340                 dataType = EImpsDataTypeInt;
       
   341                 break;
       
   342 
       
   343             case EImpsKeyPRQualifier:
       
   344                 dataType = EImpsDataTypeBoolean;
       
   345                 break;
       
   346 
       
   347             case EImpsKeyPROnlineStatus:
       
   348             case EImpsKeyPRUserAvailability:
       
   349             case EImpsKeyPRCommCap:
       
   350             case EImpsKeyPRCommC:
       
   351             // added
       
   352             case EImpsKeyPRRegistration:
       
   353             case EImpsKeyPRFreeTextLocation:
       
   354             case EImpsKeyPRPLMN:
       
   355             case EImpsKeyPRPreferredLanguage:
       
   356             case EImpsKeyPRStatusText:
       
   357             case EImpsKeyPRStatusMood:
       
   358             case EImpsKeyPRAlias:
       
   359             case EImpsKeyPRClientInfo:
       
   360             case EImpsKeyPRTimeZone:
       
   361             case EImpsKeyPRGeoLocation:
       
   362             case EImpsKeyPRAddress:
       
   363             case EImpsKeyPRPreferredContacts:
       
   364             case EImpsKeyPRAddrPref:
       
   365             case EImpsKeyPRStatusContent:
       
   366             case EImpsKeyPRContactInfo:
       
   367             case EImpsKeyPRInf_link:
       
   368             case EImpsKeyPRInfoLink:
       
   369 
       
   370                 dataType = EImpsDataTypeNone;
       
   371                 break;
       
   372 
       
   373             case EImpsKeyPRExt:
       
   374                 dataType = EImpsDataTypeExt;
       
   375             default:
       
   376                 dataType = EImpsDataTypeNotSupported;
       
   377                 break;
       
   378             };
       
   379         return dataType;
       
   380         }
       
   381     // TImpsContent
       
   382     switch ( myElem )
       
   383         {
       
   384         // The following ones are enums
       
   385         case EImpsKeySessionType:    // cannot contain non-ASCII characters
       
   386         case EImpsKeyTransactionMode:
       
   387         case EImpsKeyDigestSchema:
       
   388         case EImpsKeyClientType:
       
   389         case EImpsKeyInitialDeliveryMethod:
       
   390         case EImpsKeySupportedBearer:
       
   391         case EImpsKeySupportedCIRMethod:
       
   392         case EImpsKeySearchElement:
       
   393         case EImpsKeyInviteType:
       
   394         case EImpsKeyDeliveryMethod:
       
   395         case EImpsKeySubscribeType:
       
   396         case EImpsKeyContentEncoding:
       
   397         case EImpsKeyAcceptedTransferEncoding:
       
   398         // new in CSP 1.2
       
   399         case EImpsKeyReactiveAuthState:
       
   400         case EImpsKeyWatcherStatus:
       
   401         // Integer values, these are pure integer values
       
   402         case EImpsKeyContentSize:
       
   403         case EImpsKeyAcceptedCharSet:
       
   404         case EImpsKeyAcceptedContentLength:
       
   405         case EImpsKeyMultiTrans:
       
   406         case EImpsKeyParserSize:
       
   407         case EImpsKeyUDPPort:
       
   408         case EImpsKeyTCPPort:
       
   409         case EImpsKeyServerPollMin:
       
   410         case EImpsKeyCode:
       
   411         case EImpsKeySearchLimit:
       
   412         case EImpsKeySearchID:
       
   413         case EImpsKeySearchIndex:
       
   414         case EImpsKeySearchFindings:
       
   415         case EImpsKeyKeepAliveTime:
       
   416         case EImpsKeyTimeToLive:
       
   417         case EImpsKeyValidity:
       
   418         case EImpsKeyMessageCount:
       
   419         // new in CSP 1.2
       
   420         case EImpsKeyHistoryPeriod:
       
   421         case EImpsKeyMaxWatcherList:
       
   422             dataType = EImpsDataTypeInt;
       
   423             break;
       
   424 
       
   425         // 16-bit unicode
       
   426         case EImpsKeySessionID:
       
   427         case EImpsKeySessionCookie:
       
   428         case EImpsKeyUserID:
       
   429         case EImpsKeyTransactionID:
       
   430         case EImpsKeyTransactionContent:
       
   431         case EImpsKeyDeliveryTime:
       
   432         case EImpsKeyPassword:
       
   433         case EImpsKeyAcceptedContentType:
       
   434         case EImpsKeyTCPAddress:
       
   435         case EImpsKeyDescription:
       
   436         case EImpsKeyGroupID:
       
   437         case EImpsKeyMessageID:
       
   438         case EImpsKeyMessageURI:
       
   439         case EImpsKeyURL:
       
   440         case EImpsKeyMSISDN:
       
   441         case EImpsKeyContactList:
       
   442         case EImpsKeyDefaultContactList:
       
   443         case EImpsKeySearchString:
       
   444         case EImpsKeyInviteID:
       
   445         case EImpsKeyInviteNote:
       
   446         case EImpsKeyResponseNote:
       
   447         case EImpsKeyPresenceSubList:
       
   448         case EImpsKeySName:
       
   449         case EImpsKeyName:
       
   450         case EImpsKeyValue:
       
   451         case EImpsKeyDateTime:
       
   452         case EImpsKeyContentType:
       
   453         case EImpsKeyDefaultLanguage:
       
   454         // new in CSP 1.2
       
   455         case EImpsKeyExtendedData:
       
   456         case EImpsKeyAPIClient:
       
   457             dataType = EImpsDataTypeDesc;
       
   458             break;
       
   459 
       
   460         // 8-bit data. 
       
   461         case EImpsKeyPureData:
       
   462         case EImpsKeyNonce:
       
   463         case EImpsKeyDigestBytes:
       
   464         // new in CSP 1.2
       
   465         case EImpsKeyPresenceAttributeNSName:
       
   466         case EImpsKeySessionNSName:
       
   467         case EImpsKeyTransactionNSName:
       
   468         case EImpsKeyDomain:
       
   469             dataType = EImpsDataTypeDesc8;
       
   470             break;
       
   471 
       
   472         // Boolean data types
       
   473         case EImpsKeyPoll:
       
   474         case EImpsKeyCompletionFlag:
       
   475         case EImpsKeyJoinGroup:
       
   476         case EImpsKeySubscribeNotification:
       
   477         case EImpsKeyCapabilityRequest:
       
   478         case EImpsKeyAnyContent:
       
   479         case EImpsKeyDefaultList:
       
   480         case EImpsKeyAcceptance:
       
   481         case EImpsKeyDeliveryReport:
       
   482         case EImpsKeyInUse:
       
   483         case EImpsKeyJoinedRequest:
       
   484         case EImpsKeyAllFunctionsRequest:
       
   485         // new in CSP 1.2
       
   486         case EImpsKeyReceiveList:
       
   487         case EImpsKeyAuto_Subscribe:
       
   488         case EImpsKeyCIR:
       
   489             dataType = EImpsDataTypeBoolean;
       
   490             break;
       
   491         // special case    
       
   492         case EImpsKeyContentData:
       
   493             dataType = EImpsDataTypeContentData;
       
   494             break;
       
   495               
       
   496         // Elements not having value
       
   497         case EImpsKeySession:
       
   498         case EImpsKeySessionDescriptor:
       
   499         case EImpsKeyTransaction:
       
   500         case EImpsKeyTransactionDescriptor:
       
   501         case EImpsKeyStatus:
       
   502         case EImpsKeyPolling_Request:
       
   503         case EImpsKeyLogin_Request:
       
   504         case EImpsKeyLogin_Response:
       
   505         case EImpsKeyService_Request:
       
   506         case EImpsKeyService_Response:
       
   507         case EImpsKeyClientCapability_Request:
       
   508         case EImpsKeyClientCapability_Response:
       
   509         case EImpsKeyLogout_Request:
       
   510         case EImpsKeyDisconnect:
       
   511         case EImpsKeyKeepAlive_Request:
       
   512         case EImpsKeyKeepAlive_Response:
       
   513         case EImpsKeyGetSPInfo_Request:
       
   514         case EImpsKeyGetSPInfo_Response:
       
   515         case EImpsKeySearch_Request:
       
   516         case EImpsKeyStopSearch_Request:
       
   517         case EImpsKeySearch_Response:
       
   518         case EImpsKeyInvite_Request:
       
   519         case EImpsKeyInvite_Response:
       
   520         case EImpsKeyInviteUser_Request:
       
   521         case EImpsKeyInviteUser_Response:
       
   522         case EImpsKeyCancelInvite_Request:
       
   523         case EImpsKeyCancelInviteUser_Request:
       
   524         case EImpsKeySubscribePresence_Request:
       
   525         case EImpsKeyUnsubscribePresence_Request:
       
   526         case EImpsKeyPresenceNotification_Request:
       
   527         case EImpsKeyGetWatcherList_Request:
       
   528         case EImpsKeyGetWatcherList_Response:
       
   529         case EImpsKeyGetPresence_Request:
       
   530         case EImpsKeyGetPresence_Response:
       
   531         case EImpsKeyPresenceAuth_Request:
       
   532         case EImpsKeyPresenceAuth_User:
       
   533         case EImpsKeyCancelAuth_Request:
       
   534         case EImpsKeyUpdatePresence_Request:
       
   535         case EImpsKeyGetList_Request:
       
   536         case EImpsKeyGetList_Response:
       
   537         case EImpsKeyCreateList_Request:
       
   538         case EImpsKeyDeleteList_Request:
       
   539         case EImpsKeyListManage_Request:
       
   540         case EImpsKeyListManage_Response:
       
   541         case EImpsKeyCreateAttributeList_Request:
       
   542         case EImpsKeyDeleteAttributeList_Request:
       
   543         case EImpsKeyGetAttributeList_Request:
       
   544         case EImpsKeyGetAttributeList_Response:
       
   545         case EImpsKeySendMessage_Request:
       
   546         case EImpsKeySendMessage_Response:
       
   547         case EImpsKeySetDeliveryMethod_Request:
       
   548         case EImpsKeyGetMessageList_Request:
       
   549         case EImpsKeyGetMessageList_Response:
       
   550         case EImpsKeyRejectMessage_Request:
       
   551         case EImpsKeyMessageNotification:
       
   552         case EImpsKeyGetMessage_Request:
       
   553         case EImpsKeyGetMessage_Response:
       
   554         case EImpsKeyNewMessage:
       
   555         case EImpsKeyMessageDelivered:
       
   556         case EImpsKeyDeliveryReport_Request:
       
   557         case EImpsKeyForwardMessage_Request:
       
   558         case EImpsKeyGetBlockedList_Request:
       
   559         case EImpsKeyGetBlockedList_Response:
       
   560         case EImpsKeyBlockEntity_Request:
       
   561         case EImpsKeyCreateGroup_Request:
       
   562         case EImpsKeyDeleteGroup_Request:
       
   563         case EImpsKeyJoinGroup_Request:
       
   564         case EImpsKeyJoinGroup_Response:
       
   565         case EImpsKeyLeaveGroup_Request:
       
   566         case EImpsKeyLeaveGroup_Response:
       
   567         case EImpsKeyGetGroupMembers_Request:
       
   568         case EImpsKeyGetGroupMembers_Response:
       
   569         case EImpsKeyAddGroupMembers_Request:
       
   570         case EImpsKeyRemoveGroupMembers_Request:
       
   571         case EImpsKeyMemberAccess_Request:
       
   572         case EImpsKeyGetGroupProps_Request:
       
   573         case EImpsKeyGetGroupProps_Response:
       
   574         case EImpsKeySetGroupProps_Request:
       
   575         case EImpsKeyRejectList_Request:
       
   576         case EImpsKeyRejectList_Response:
       
   577         case EImpsKeySubscribeGroupNotice_Request:
       
   578         case EImpsKeySubscribeGroupNotice_Response:
       
   579         case EImpsKeyGroupChangeNotice:
       
   580         case EImpsKeyCapabilityList:
       
   581         case EImpsKeyResult:
       
   582         case EImpsKeyDetailedResult:
       
   583         case EImpsKeySender:
       
   584         case EImpsKeyRecipient:
       
   585         case EImpsKeyUser:
       
   586         case EImpsKeyGroup:
       
   587         case EImpsKeyClientID:
       
   588         case EImpsKeyScreenName:
       
   589         case EImpsKeyNickName:
       
   590         case EImpsKeyURLList:
       
   591         case EImpsKeyGroupList:
       
   592         case EImpsKeyUserList:
       
   593         case EImpsKeyNickList:
       
   594         case EImpsKeyAddNickList:
       
   595         case EImpsKeyRemoveNickList:
       
   596         case EImpsKeySearchPairList:
       
   597         case EImpsKeySearchResult:
       
   598         case EImpsKeyDefaultAttributeList:
       
   599         case EImpsKeyPresence:
       
   600         case EImpsKeyMessageInfo:
       
   601         case EImpsKeyBlockList:
       
   602         case EImpsKeyGrantList:
       
   603         case EImpsKeyEntityList:
       
   604         case EImpsKeyAddList:
       
   605         case EImpsKeyRemoveList:
       
   606         case EImpsKeyContactListProperties:
       
   607         case EImpsKeyGroupProperties:
       
   608         case EImpsKeyOwnProperties:
       
   609         case EImpsKeyProperty:
       
   610         case EImpsKeyWelcomeNote:
       
   611         case EImpsKeyAdmin:
       
   612         case EImpsKeyMod:
       
   613         case EImpsKeyUsers:
       
   614         case EImpsKeyJoined:
       
   615         case EImpsKeyLeft:
       
   616         case EImpsKeyLogo:
       
   617         case EImpsKeyAllFunctions:
       
   618         case EImpsKeyFunctions:
       
   619         case EImpsKeyWVCSPFeat:
       
   620         case EImpsKeyFundamentalFeat:
       
   621         case EImpsKeyPresenceFeat:
       
   622         case EImpsKeyIMFeat:
       
   623         case EImpsKeyGroupFeat:
       
   624         case EImpsKeyServiceFunc:
       
   625         case EImpsKeySearchFunc:
       
   626         case EImpsKeyInviteFunc:
       
   627         case EImpsKeyContListFunc:
       
   628         case EImpsKeyPresenceAuthFunc:
       
   629         case EImpsKeyPresenceDeliverFunc:
       
   630         case EImpsKeyAttListFunc:
       
   631         case EImpsKeyIMSendFunc:
       
   632         case EImpsKeyIMReceiveFunc:
       
   633         case EImpsKeyIMAuthFunc:
       
   634         case EImpsKeyGroupMgmtFunc:
       
   635         case EImpsKeyGroupUseFunc:
       
   636         case EImpsKeyGroupAuthFunc:
       
   637         // new in CSP 1.2
       
   638         case EImpsKeyExtBlock:
       
   639         case EImpsKeyAgreedCapabilityList:
       
   640         case EImpsKeyExtended_Request:
       
   641         case EImpsKeyExtended_Response:
       
   642         case EImpsKeyOtherServer:
       
   643         case EImpsKeyVerifyID_Request:
       
   644         case EImpsKeyGetReactiveAuthStatus_Request:
       
   645         case EImpsKeyGetReactiveAuthStatus_Response:
       
   646         case EImpsKeyAdminMapList:
       
   647         case EImpsKeyAdminMapping:
       
   648         case EImpsKeyGetJoinedUsers_Request:
       
   649         case EImpsKeyGetJoinedUsers_Respone:
       
   650         case EImpsKeyMapping:
       
   651         case EImpsKeyUserMapList:
       
   652         case EImpsKeyUserMapping:
       
   653         case EImpsKeyVerifyIDFunc:
       
   654         case EImpsKeyIDList:
       
   655         case EImpsKeyReactiveAuthStatus:
       
   656         case EImpsKeyReactiveAuthStatusList:
       
   657         case EImpsKeyWatcher:
       
   658         case EImpsKeyVersionList:
       
   659              dataType = EImpsDataTypeNone;
       
   660              break;
       
   661 
       
   662         case EImpsKeyGETSPI:
       
   663         case EImpsKeySRCH:
       
   664         case EImpsKeySTSRC:
       
   665         case EImpsKeyINVIT:
       
   666         case EImpsKeyCAINV:
       
   667         case EImpsKeyGCLI:
       
   668         case EImpsKeyCCLI:
       
   669         case EImpsKeyDCLI:
       
   670         case EImpsKeyMCLS:
       
   671         case EImpsKeyGETWL:
       
   672         case EImpsKeyREACT:
       
   673         case EImpsKeyCAAUT:
       
   674         case EImpsKeyGETPR:
       
   675         case EImpsKeyUPDPR:
       
   676         case EImpsKeyCALI:
       
   677         case EImpsKeyDALI:
       
   678         case EImpsKeyGALS:
       
   679         case EImpsKeyMDELIV:
       
   680         case EImpsKeyFWMSG:
       
   681         case EImpsKeySETD:
       
   682         case EImpsKeyGETLM:
       
   683         case EImpsKeyGETM:
       
   684         case EImpsKeyREJCM:
       
   685         case EImpsKeyNOTIF:
       
   686         case EImpsKeyNEWM:
       
   687         case EImpsKeyGLBLU:
       
   688         case EImpsKeyBLENT:
       
   689         case EImpsKeyCREAG:
       
   690         case EImpsKeyDELGR:
       
   691         case EImpsKeyGETGP:
       
   692         case EImpsKeySETGP:
       
   693         case EImpsKeySUBGCN:
       
   694         case EImpsKeyGRCHN:
       
   695         case EImpsKeyGETGM:
       
   696         case EImpsKeyADDGM:
       
   697         case EImpsKeyRMVGM:
       
   698         case EImpsKeyMBRAC:
       
   699         case EImpsKeyREJEC:
       
   700         // new in CSP 1.2
       
   701         case EImpsKeyMF:
       
   702         case EImpsKeyMG:
       
   703         case EImpsKeyMM:
       
   704         case EImpsKeyGETAUT:
       
   705         case EImpsKeyGETJU:
       
   706         case EImpsKeyMP:
       
   707         case EImpsKeyVRID:
       
   708             
       
   709             dataType = EImpsDataTypeNone;
       
   710             break;
       
   711 
       
   712         default:
       
   713             User::Leave( KErrArgument );
       
   714 
       
   715         };
       
   716     return dataType;
       
   717     }
       
   718 
       
   719 // ---------------------------------------------------------
       
   720 // TImpsDataAccessor::RestoreAlternativeL
       
   721 // ---------------------------------------------------------
       
   722 //
       
   723 EXPORT_C TBool TImpsDataAccessor::RestoreAlternativeL( const MImpsKey* aKey, 
       
   724                                                     TInt& aEnum, 
       
   725                                                     TInt& aIndex, 
       
   726                                                     TImpsKeyType& aType ) const
       
   727     {
       
   728     const CImpsKey* keyIn = static_cast<const CImpsKey*>( aKey );
       
   729     const CImpsData* data = iImpsFields->Data( );
       
   730     aEnum = 0;
       
   731     aIndex = 0;
       
   732     aType = EImpsKeyTypeIM;
       
   733 
       
   734     const CImpsKey* foundkey = data->CheckKey( keyIn, EPartialKeyLonger );
       
   735     if( foundkey )
       
   736         {
       
   737         // The found key can be longer than the search key
       
   738         // Since the beginning of the aKey and foundKey are the same 
       
   739         // we want the first different element from the key
       
   740         // If the lengths are the same then there is no alternative
       
   741         TInt len1 = foundkey->Count( );
       
   742         TInt len2 = aKey->Count( );
       
   743         if( len1 == len2 )
       
   744             return EFalse;
       
   745         TInt elem = foundkey->GetElementL( len2, aType );
       
   746         aIndex = GET_INDEX( elem );
       
   747         aEnum = GET_ENUM( elem );
       
   748         return ETrue;
       
   749         }
       
   750     return EFalse;
       
   751     }
       
   752 
       
   753 // ---------------------------------------------------------
       
   754 // TImpsDataAccessor::CheckBranchExistenceL
       
   755 // ---------------------------------------------------------
       
   756 //
       
   757 EXPORT_C TBool TImpsDataAccessor::CheckBranchExistenceL( 
       
   758                                             const MImpsKey* aKey ) const
       
   759     {
       
   760     const CImpsKey* keyIn = static_cast<const CImpsKey*>( aKey );
       
   761     const CImpsData* data = iImpsFields->Data( );
       
   762 
       
   763     const CImpsKey* foundkey = data->CheckKey( keyIn, EPartialKey );
       
   764     if( foundkey )
       
   765         {
       
   766         return ETrue;
       
   767         }
       
   768     return EFalse;
       
   769     }
       
   770 
       
   771 // ---------------------------------------------------------
       
   772 // TImpsDataAccessor::NbrOfTransactionsL
       
   773 // ---------------------------------------------------------
       
   774 //
       
   775 EXPORT_C TInt TImpsDataAccessor::NbrOfTransactionsL( ) const
       
   776     {
       
   777     TInt ret = 0;
       
   778     CImpsKey* myKey = CImpsKey::NewLC();
       
   779     myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
       
   780     myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0) );
       
   781 
       
   782     while( CheckBranchExistenceL( myKey ) )
       
   783         {
       
   784         ++ret;
       
   785         myKey->ReplaceLastL( CREATEKEY( EImpsKeyTransaction, ret ) );
       
   786         }
       
   787     CleanupStack::PopAndDestroy(1);
       
   788     return ret;
       
   789     }
       
   790 
       
   791 // ---------------------------------------------------------
       
   792 // TImpsDataAccessor::GetTransactionL
       
   793 // ---------------------------------------------------------
       
   794 //
       
   795 EXPORT_C TBool TImpsDataAccessor::GetTransactionL( 
       
   796     TInt aIndex, CImpsFields* aFields ) const
       
   797     {
       
   798     if( !iImpsFields )
       
   799         return EFalse;
       
   800     if( aFields )
       
   801         {
       
   802         TBool ret = EFalse;
       
   803         CImpsData* dataDes = aFields->Data( );
       
   804         CImpsData* dataSrc = iImpsFields->Data( );
       
   805 
       
   806         CImpsKey* myKey = CImpsKey::NewLC();
       
   807         myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
       
   808         myKey->AddL( CREATEKEY( EImpsKeyTransaction, aIndex) );
       
   809 
       
   810         if( CheckBranchExistenceL( myKey ) )
       
   811             {
       
   812             // Copy first transaction
       
   813             dataDes->CopyL( myKey,dataSrc );
       
   814 
       
   815             // Now we have to reset the new transaction id to 0
       
   816             dataDes->SetKeyIndex( myKey, 0 );
       
   817 
       
   818             // Copy SessionDescriptor stuff
       
   819             myKey->ReplaceLastL( CREATEKEY( EImpsKeySessionDescriptor, 0) );
       
   820             dataDes->CopyL( myKey,dataSrc );
       
   821 
       
   822             aFields->SetStatus( iImpsFields->Status( ) );
       
   823 
       
   824             CImpsDataAccessor* myAc = CImpsDataAccessor::NewLC( aFields );
       
   825             aFields->SetMessageType( TImpsDataUtils::GetMessageTypeL( myAc ) );
       
   826             CleanupStack::PopAndDestroy(1 );     // myAc
       
   827             ret = ETrue;
       
   828             }
       
   829         CleanupStack::PopAndDestroy(1);  // myKey
       
   830         return ret;
       
   831         }
       
   832     else
       
   833         {
       
   834         CImpsDataAccessor* myAc = CImpsDataAccessor::NewLC( iImpsFields );
       
   835         iImpsFields->SetMessageType( TImpsDataUtils::GetMessageTypeL( myAc ) );
       
   836         CleanupStack::PopAndDestroy( 1 );     // myAc
       
   837         return ETrue;
       
   838         }
       
   839     }
       
   840 
       
   841 // ---------------------------------------------------------
       
   842 // TImpsDataAccessor::CopyDataL
       
   843 // ---------------------------------------------------------
       
   844 //
       
   845 EXPORT_C void TImpsDataAccessor::CopyDataL( 
       
   846             MImpsDataAccessor& aSource,
       
   847             MImpsKey* aKey )
       
   848     {
       
   849     TImpsDataAccessor& iSource = static_cast<TImpsDataAccessor&>(aSource);
       
   850     CImpsKey* iKey = static_cast<CImpsKey*>( aKey );
       
   851     // source data
       
   852     CImpsData* sp  = iSource.iImpsFields->Data();
       
   853 
       
   854     // destination data
       
   855     CImpsData* dp  = iImpsFields->Data();
       
   856 
       
   857     // Copy data
       
   858     dp->CopyL( iKey, sp );
       
   859     }
       
   860 
       
   861 // ---------------------------------------------------------
       
   862 // TImpsDataAccessor::DoStoreL
       
   863 // Main storing function
       
   864 // ---------------------------------------------------------
       
   865 //
       
   866 void TImpsDataAccessor::DoStoreL( const CImpsKey* aKey )
       
   867     {
       
   868     StoreHeadersL( aKey );
       
   869     }
       
   870 
       
   871 //----------------------------------------------------------
       
   872 // TImpsDataAccessor::DoRestoreL
       
   873 // Main restoring function
       
   874 // ---------------------------------------------------------
       
   875 //
       
   876 TBool TImpsDataAccessor::DoRestoreL( const CImpsKey* aKey )
       
   877     {
       
   878     return RestoreHeadersL( aKey );
       
   879     }
       
   880 
       
   881 //----------------------------------------------------------
       
   882 // TImpsDataAccessor::StoreHeadersL
       
   883 // ---------------------------------------------------------
       
   884 //
       
   885 void TImpsDataAccessor::StoreHeadersL( const CImpsKey* aKey )
       
   886     {
       
   887     CImpsData* data = iImpsFields->Data( );
       
   888     if( iData.iType == EStringType )
       
   889         {
       
   890         data->StoreStringL( aKey, iData.iValue );
       
   891         return;
       
   892         }
       
   893     if( iData.iType == EString8Type )
       
   894         {
       
   895         data->StoreString8L( aKey, iData.iValue8 );
       
   896         return;
       
   897         }
       
   898     if( iData.iType == EIntegerType )
       
   899         {
       
   900         data->StoreIntL( aKey, iData.iValueInt );
       
   901         return;
       
   902         }
       
   903     if( iData.iType == EBooleanType )
       
   904         {
       
   905         data->StoreBooleanL( aKey, iData.iValueBool );
       
   906         return;
       
   907         }
       
   908     if( iData.iType == EEmptyType )
       
   909         {
       
   910         data->StoreEmptyL( aKey );
       
   911         return;
       
   912         }
       
   913     User::Leave( KErrArgument );
       
   914     }
       
   915 
       
   916 //----------------------------------------------------------
       
   917 // TImpsDataAccessor::RestoreHeadersL
       
   918 // ---------------------------------------------------------
       
   919 //
       
   920 TBool TImpsDataAccessor::RestoreHeadersL( const CImpsKey* aKey )
       
   921     {
       
   922     TBool ret = EFalse;
       
   923     CImpsData* data = iImpsFields->Data( );
       
   924     if( iData.iType == EStringType )
       
   925         {
       
   926         TDesC *val;
       
   927         ret = data->RestoreString( aKey, val );
       
   928         if( ret )
       
   929             iData.iValuePointer = val;
       
   930         }
       
   931     if( iData.iType == EString8Type )
       
   932         {
       
   933         TDesC8 *val;
       
   934         ret = data->RestoreString8( aKey, val );
       
   935         if( ret )
       
   936             iData.iValuePointer8 = val;
       
   937         }
       
   938     if( iData.iType == EIntegerType )
       
   939         {
       
   940         ret = data->RestoreInt( aKey, iData.iValueInt );
       
   941         }
       
   942     if( iData.iType == EBooleanType )
       
   943         {
       
   944         ret = data->RestoreBoolean( aKey, iData.iValueBool );
       
   945         }
       
   946     if( iData.iType == EEmptyType )
       
   947         {
       
   948         ret = data->RestoreEmpty( aKey );
       
   949         }
       
   950     return ret;
       
   951     }
       
   952 
       
   953 #ifdef _DEBUG
       
   954 //----------------------------------------------------------
       
   955 // TImpsDataAccessor::DumpToFileL
       
   956 // ---------------------------------------------------------
       
   957 //
       
   958 void TImpsDataAccessor::DumpToFileL(RFs& aFs, const TDesC& aFilename)
       
   959 	{
       
   960 	iImpsFields->DumpToFileL(aFs, aFilename);
       
   961 	}
       
   962 
       
   963 #endif
       
   964 //  End of File