PECengine/AttributeLibrary2/SrcAttributeBase/CPEngPresenceAttrModel.cpp
changeset 0 094583676ce7
equal deleted inserted replaced
-1:000000000000 0:094583676ce7
       
     1 /*
       
     2 * Copyright (c) 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:  Attribute model implementation.
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDE FILES
       
    19 
       
    20 #include "CPEngPresenceAttrModel.h"
       
    21 #include "CPEngPresenceAttrConstructor.h"
       
    22 #include "CPEngAttrModelAsyncDataSetHook.h"
       
    23 #include "CPEngPresenceAttrModelStorageProxy.h"
       
    24 #include "PEngAttributeRequestCodec.h"
       
    25 
       
    26 
       
    27 #include "MPEngXMLSerializer.h"
       
    28 #include "MPEngXMLParser.h"
       
    29 
       
    30 #include "MPEngPresenceAttrModelTypeImp.h"
       
    31 
       
    32 
       
    33 #include "PresenceDebugPrint.h"
       
    34 
       
    35 
       
    36 #include <E32Base.h>
       
    37 #include <S32Strm.h>
       
    38 
       
    39 
       
    40 
       
    41 
       
    42 //LOCAL constants
       
    43 namespace
       
    44     {
       
    45 #if defined(_DEBUG)
       
    46     _LIT( KPEngAttributeModelPanicCategory, "PEngAttrModel" );
       
    47 #endif
       
    48 
       
    49     enum TPEngAttributeModelPanics
       
    50         {
       
    51         EPEngDataIntNotSupported,
       
    52         EPEngDataDesC8NotSupported,
       
    53         EPEngDataDesC16NotSupported,
       
    54         EPEngSetDataIntNotSupported,
       
    55         EPEngSetDataDesC8NotSupported,
       
    56         EPEngSetDataDesC16NotSupported,
       
    57         EPEngSetDataDesC8AsyncNotSupported,
       
    58         EPEngSetDataDesC16AsyncNotSupported,
       
    59         EPEngInternalizeMismatch,
       
    60         };
       
    61 
       
    62 
       
    63     void PanicAttrModel( TPEngAttributeModelPanics aReason )
       
    64         {
       
    65 #if defined(_DEBUG)
       
    66         User::Panic( KPEngAttributeModelPanicCategory, aReason );
       
    67 #endif
       
    68 
       
    69         // suppress the unreferenced variable warning
       
    70         ( void ) aReason;
       
    71         }
       
    72 
       
    73 
       
    74     void PanicAttrModelL( TPEngAttributeModelPanics aReason, TInt aLeaveCode )
       
    75         {
       
    76 #if defined(_DEBUG)
       
    77         PanicAttrModel( aReason );
       
    78 #else
       
    79         User::Leave( aLeaveCode );
       
    80 #endif
       
    81 
       
    82         // suppress the unreferenced variable warnings
       
    83         ( void ) aReason;
       
    84         ( void ) aLeaveCode;
       
    85         }
       
    86     }
       
    87 
       
    88 
       
    89 
       
    90 
       
    91 // ============================= MEMBER FUNCTIONS =============================
       
    92 // -----------------------------------------------------------------------------
       
    93 // CPEngAttributeConstruct::NewL()
       
    94 // Two-phased constructor.
       
    95 // -----------------------------------------------------------------------------
       
    96 //
       
    97 CPEngPresenceAttrModel* CPEngPresenceAttrModel::NewL(
       
    98     CPEngPresenceAttrConstructor& aTypeConstructor,
       
    99     const TDesC& aPresenceID,
       
   100     MPEngPresenceAttrModelTypeImp* aTypeImp )
       
   101     {
       
   102     CPEngPresenceAttrModel* self = new ( ELeave ) CPEngPresenceAttrModel(
       
   103         aTypeConstructor );
       
   104     CleanupStack::PushL( self );
       
   105     self->ConstructL( aPresenceID );
       
   106     CleanupStack::Pop( self );
       
   107 
       
   108     //TypeImp ownership is taken only in full success
       
   109     self->iTypeImp = aTypeImp;
       
   110     return self;
       
   111     }
       
   112 
       
   113 
       
   114 
       
   115 // C++ default constructor can NOT contain any code, that
       
   116 // might leave.
       
   117 //
       
   118 CPEngPresenceAttrModel::CPEngPresenceAttrModel(
       
   119     CPEngPresenceAttrConstructor& aTypeConstructor )
       
   120         : iTypeConstructor( aTypeConstructor ),
       
   121         iDataSource( EPEngAttrLocalDefault ),
       
   122         iQualifier( EFalse )
       
   123     {
       
   124     iTypeConstructor.OpenRef();
       
   125     }
       
   126 
       
   127 
       
   128 // Destructor
       
   129 CPEngPresenceAttrModel::~CPEngPresenceAttrModel()
       
   130     {
       
   131     delete iStorage;
       
   132     delete iTypeImp;
       
   133     delete iPresenceId;
       
   134     delete iAsyncSetHook;
       
   135 
       
   136     iTypeConstructor.CloseRef();
       
   137     }
       
   138 
       
   139 
       
   140 
       
   141 
       
   142 // -----------------------------------------------------------------------------
       
   143 // CPEngPresenceAttrModel::ConstructL()
       
   144 // -----------------------------------------------------------------------------
       
   145 //
       
   146 void CPEngPresenceAttrModel::ConstructL( const TDesC& aPresenceID )
       
   147     {
       
   148     iPresenceId = aPresenceID.AllocL();
       
   149     iStorage = CPEngPresenceAttrModelStorageProxy::NewL( *this );
       
   150     }
       
   151 
       
   152 
       
   153 
       
   154 // -----------------------------------------------------------------------------
       
   155 // CPEngPresenceAttrModel::Type()
       
   156 // From MPEngPresenceAttrModel
       
   157 // -----------------------------------------------------------------------------
       
   158 //
       
   159 TUint32 CPEngPresenceAttrModel::Type() const
       
   160     {
       
   161     return iTypeConstructor.iType;
       
   162     }
       
   163 
       
   164 
       
   165 // -----------------------------------------------------------------------------
       
   166 // CPEngPresenceAttrModel::TypeProperties()
       
   167 // From MPEngPresenceAttrModel
       
   168 // -----------------------------------------------------------------------------
       
   169 //
       
   170 const MPEngPresenceAttrTypeProperties2& CPEngPresenceAttrModel::TypeProperties() const
       
   171     {
       
   172     return iTypeConstructor;
       
   173     }
       
   174 
       
   175 
       
   176 // -----------------------------------------------------------------------------
       
   177 // CPEngPresenceAttrModel::PresenceID()
       
   178 // From MPEngPresenceAttrModel
       
   179 // -----------------------------------------------------------------------------
       
   180 //
       
   181 const TDesC& CPEngPresenceAttrModel::PresenceID() const
       
   182     {
       
   183     return *iPresenceId;
       
   184     }
       
   185 
       
   186 
       
   187 // -----------------------------------------------------------------------------
       
   188 // CPEngPresenceAttrModel::DataSource()
       
   189 // From MPEngPresenceAttrModel
       
   190 // -----------------------------------------------------------------------------
       
   191 //
       
   192 TPEngAttrDataSource CPEngPresenceAttrModel::DataSource() const
       
   193     {
       
   194     return iDataSource;
       
   195     }
       
   196 
       
   197 
       
   198 // -----------------------------------------------------------------------------
       
   199 // CPEngPresenceAttrModel::Qualifier()
       
   200 // From MPEngPresenceAttrModel
       
   201 // -----------------------------------------------------------------------------
       
   202 //
       
   203 TBool CPEngPresenceAttrModel::Qualifier() const
       
   204     {
       
   205     return iQualifier;
       
   206     }
       
   207 
       
   208 
       
   209 // -----------------------------------------------------------------------------
       
   210 // CPEngPresenceAttrModel::DataInt()
       
   211 // From MPEngPresenceAttrModel
       
   212 // -----------------------------------------------------------------------------
       
   213 //
       
   214 TInt CPEngPresenceAttrModel::DataInt( TInt aField,
       
   215                                       TInt aGroup ) const
       
   216     {
       
   217     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::DataDesC8(%d, %d) [%08x]" ),
       
   218              aField, aGroup, iTypeConstructor.iType );
       
   219 
       
   220     TInt data = 0;
       
   221     if ( !iTypeImp->GetData( &data, NULL, NULL, aField, aGroup ) )
       
   222         {
       
   223         PENG_DP( D_PENG_LIT( "Scope / value type not supported" ) );
       
   224         PanicAttrModel( EPEngDataIntNotSupported );
       
   225         return KErrNotSupported;
       
   226         }
       
   227 
       
   228     return data;
       
   229     }
       
   230 
       
   231 
       
   232 // -----------------------------------------------------------------------------
       
   233 // CPEngPresenceAttrModel::DataDesC8()
       
   234 // From MPEngPresenceAttrModel
       
   235 // -----------------------------------------------------------------------------
       
   236 //
       
   237 const TPtrC8 CPEngPresenceAttrModel::DataDesC8( TInt aField,
       
   238                                                 TInt aGroup ) const
       
   239     {
       
   240     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::DataDesC8(%d, %d) [%08x]" ),
       
   241              aField, aGroup, iTypeConstructor.iType );
       
   242 
       
   243 
       
   244     TPtrC8 data( NULL, 0 );
       
   245     if ( !iTypeImp->GetData( NULL, &data, NULL, aField, aGroup ) )
       
   246         {
       
   247         PENG_DP( D_PENG_LIT( "Scope / value type not supported" ) );
       
   248         PanicAttrModel( EPEngDataDesC8NotSupported );
       
   249         return KNullDesC8();
       
   250         }
       
   251 
       
   252     return data;
       
   253     }
       
   254 
       
   255 
       
   256 // -----------------------------------------------------------------------------
       
   257 // CPEngPresenceAttrModel::DataDesC16()
       
   258 // From MPEngPresenceAttrModel
       
   259 // -----------------------------------------------------------------------------
       
   260 //
       
   261 const TPtrC16 CPEngPresenceAttrModel::DataDesC16( TInt aField,
       
   262                                                   TInt aGroup ) const
       
   263     {
       
   264     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::DataDesC16(%d, %d) [%08x]" ),
       
   265              aField, aGroup, iTypeConstructor.iType );
       
   266 
       
   267 
       
   268     TPtrC16 data( NULL, 0 );
       
   269     if ( !iTypeImp->GetData( NULL, NULL, &data, aField, aGroup ) )
       
   270         {
       
   271         PENG_DP( D_PENG_LIT( "Scope / value type not supported" ) );
       
   272         PanicAttrModel( EPEngDataDesC16NotSupported );
       
   273         return KNullDesC16();
       
   274         }
       
   275 
       
   276     return data;
       
   277     }
       
   278 
       
   279 
       
   280 // -----------------------------------------------------------------------------
       
   281 // CPEngPresenceAttrModel::SetQualifier()
       
   282 // From MPEngPresenceAttrModel
       
   283 // -----------------------------------------------------------------------------
       
   284 //
       
   285 void CPEngPresenceAttrModel::SetQualifier( TBool aQualifier )
       
   286     {
       
   287     iQualifier = aQualifier;
       
   288 
       
   289     //data has been locally edited
       
   290     iDataSource = EPEngAttrLocalEdited;
       
   291     }
       
   292 
       
   293 
       
   294 // -----------------------------------------------------------------------------
       
   295 // CPEngPresenceAttrModel::SetDataIntL()
       
   296 // From MPEngPresenceAttrModel
       
   297 // -----------------------------------------------------------------------------
       
   298 //
       
   299 void CPEngPresenceAttrModel::SetDataIntL( TInt aData,
       
   300                                           TInt aField,
       
   301                                           TInt aGroup )
       
   302     {
       
   303     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::SetDataIntL(%d, %d, %d) [%08x]" ),
       
   304              aData, aField, aGroup, iTypeConstructor.iType );
       
   305 
       
   306     if ( !iTypeImp->SetDataL( &aData, NULL, NULL, aField, aGroup ) )
       
   307         {
       
   308         PENG_DP( D_PENG_LIT( "Scope / value type / value not supported" ) );
       
   309         PanicAttrModelL( EPEngSetDataIntNotSupported, KErrNotSupported );
       
   310         }
       
   311 
       
   312     iQualifier = ETrue;
       
   313     iDataSource = EPEngAttrLocalEdited;
       
   314     }
       
   315 
       
   316 
       
   317 // -----------------------------------------------------------------------------
       
   318 // CPEngPresenceAttrModel::SetDataDesC8L()
       
   319 // From MPEngPresenceAttrModel
       
   320 // -----------------------------------------------------------------------------
       
   321 //
       
   322 void CPEngPresenceAttrModel::SetDataDesC8L( const TDesC8& aData,
       
   323                                             TInt aField,
       
   324                                             TInt aGroup )
       
   325     {
       
   326     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::SetDataDesC8L(%d, %d) [%08x]" ),
       
   327              aField, aGroup, iTypeConstructor.iType );
       
   328 
       
   329     if ( !iTypeImp->SetDataL( NULL, &aData, NULL, aField, aGroup ) )
       
   330         {
       
   331         PENG_DP( D_PENG_LIT( "Scope / value type / value itself not supported" ) );
       
   332         PanicAttrModelL( EPEngSetDataDesC8NotSupported, KErrNotSupported );
       
   333         }
       
   334 
       
   335     iQualifier = ETrue;
       
   336     iDataSource = EPEngAttrLocalEdited;
       
   337     }
       
   338 
       
   339 
       
   340 // -----------------------------------------------------------------------------
       
   341 // CPEngPresenceAttrModel::SetDataDesC16L()
       
   342 // From MPEngPresenceAttrModel
       
   343 // -----------------------------------------------------------------------------
       
   344 //
       
   345 void CPEngPresenceAttrModel::SetDataDesC16L( const TDesC16& aData,
       
   346                                              TInt aField,
       
   347                                              TInt aGroup )
       
   348     {
       
   349     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::SetDataDesC16L(%d, %d) [%08x]" ),
       
   350              aField, aGroup, iTypeConstructor.iType );
       
   351 
       
   352     if ( !iTypeImp->SetDataL( NULL, NULL, &aData, aField, aGroup ) )
       
   353         {
       
   354         PENG_DP( D_PENG_LIT( "Scope / value type / value not supported" ) );
       
   355         PanicAttrModelL( EPEngSetDataDesC16NotSupported, KErrNotSupported );
       
   356         }
       
   357 
       
   358     iQualifier = ETrue;
       
   359     iDataSource = EPEngAttrLocalEdited;
       
   360     }
       
   361 
       
   362 // -----------------------------------------------------------------------------
       
   363 // CPEngPresenceAttrModel::SetDataDesC8AsyncL()
       
   364 // From MPEngPresenceAttrModel
       
   365 // -----------------------------------------------------------------------------
       
   366 //
       
   367 void CPEngPresenceAttrModel::SetDataDesC8AsyncL( const TDesC8& aData,
       
   368                                                  TRequestStatus& aRequestStatus,
       
   369                                                  TInt aField,
       
   370                                                  TInt aGroup )
       
   371     {
       
   372     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::SetDataDesC8AsyncL(%d, %d) [%08x]" ),
       
   373              aField, aGroup, iTypeConstructor.iType );
       
   374 
       
   375     LazyInitAsyncSetHookL();
       
   376 
       
   377     iAsyncSetHook->InitializeLC( aRequestStatus,
       
   378                                  *this,        //Self is updated when processing done
       
   379                                  *iTypeImp );  //Real model is canceled
       
   380 
       
   381     if ( !iTypeImp->SetDataAsyncL( &aData, NULL, iAsyncSetHook->Status(), aField, aGroup ) )
       
   382         {
       
   383         PENG_DP( D_PENG_LIT( "Scope / value type / value not supported" ) );
       
   384         PanicAttrModelL( EPEngSetDataDesC8AsyncNotSupported, KErrNotSupported );
       
   385         }
       
   386 
       
   387     CleanupStack::Pop();
       
   388     iAsyncSetHook->Activate();
       
   389     }
       
   390 
       
   391 
       
   392 
       
   393 
       
   394 // -----------------------------------------------------------------------------
       
   395 // CPEngPresenceAttrModel::SetDataDesC16AsyncL()
       
   396 // From MPEngPresenceAttrModel
       
   397 // -----------------------------------------------------------------------------
       
   398 //
       
   399 void CPEngPresenceAttrModel::SetDataDesC16AsyncL( const TDesC16& aData,
       
   400                                                   TRequestStatus& aRequestStatus,
       
   401                                                   TInt aField,
       
   402                                                   TInt aGroup )
       
   403     {
       
   404     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::SetDataDesC16AsyncL(%d, %d) [%08x]" ),
       
   405              aField, aGroup, iTypeConstructor.iType );
       
   406 
       
   407     LazyInitAsyncSetHookL();
       
   408 
       
   409     iAsyncSetHook->InitializeLC( aRequestStatus,
       
   410                                  *this,        //Self is updated when processing done
       
   411                                  *iTypeImp );  //Real model is canceled
       
   412 
       
   413 
       
   414     if ( !iTypeImp->SetDataAsyncL( NULL, &aData, iAsyncSetHook->Status(), aField, aGroup ) )
       
   415         {
       
   416         PENG_DP( D_PENG_LIT( "Scope / value type / value not supported" ) );
       
   417         PanicAttrModelL( EPEngSetDataDesC16AsyncNotSupported, KErrNotSupported );
       
   418         }
       
   419 
       
   420     CleanupStack::Pop();
       
   421     iAsyncSetHook->Activate();
       
   422     }
       
   423 
       
   424 
       
   425 // -----------------------------------------------------------------------------
       
   426 // CPEngPresenceAttrModel::CancelSetDataAsync()
       
   427 // From MPEngPresenceAttrModel
       
   428 // -----------------------------------------------------------------------------
       
   429 //
       
   430 void CPEngPresenceAttrModel::CancelSetDataAsync()
       
   431     {
       
   432     PENG_DP( D_PENG_LIT( "MPEngPresenceAttrModel2::CancelSetDataAsync() [%08x]" ),
       
   433              iTypeConstructor.iType );
       
   434 
       
   435     if ( iAsyncSetHook )
       
   436         {
       
   437         iAsyncSetHook->Cancel();
       
   438         }
       
   439     }
       
   440 
       
   441 
       
   442 // -----------------------------------------------------------------------------
       
   443 // CPEngPresenceAttrModel::Extension()
       
   444 // -----------------------------------------------------------------------------
       
   445 //
       
   446 const MPEngAttrModelExtension2* CPEngPresenceAttrModel::Extension() const
       
   447     {
       
   448     return NULL;
       
   449     }
       
   450 
       
   451 
       
   452 MPEngAttrModelExtension2* CPEngPresenceAttrModel::Extension()
       
   453     {
       
   454     return NULL;
       
   455     }
       
   456 
       
   457 
       
   458 // -----------------------------------------------------------------------------
       
   459 // CPEngPresenceAttrModel::TypeExtension()
       
   460 // -----------------------------------------------------------------------------
       
   461 //
       
   462 TAny* CPEngPresenceAttrModel::TypeExtension( TUint32 aType )
       
   463     {
       
   464     return iTypeImp->TypeExtension( aType );
       
   465     }
       
   466 
       
   467 
       
   468 // -----------------------------------------------------------------------------
       
   469 // CPEngPresenceAttrModel::Advanced()
       
   470 // -----------------------------------------------------------------------------
       
   471 //
       
   472 const MPEngPresenceAdvancedAttrModel2* CPEngPresenceAttrModel::Advanced() const
       
   473     {
       
   474     return this;
       
   475     }
       
   476 
       
   477 MPEngPresenceAdvancedAttrModel2* CPEngPresenceAttrModel::Advanced()
       
   478     {
       
   479     return this;
       
   480     }
       
   481 
       
   482 
       
   483 // -----------------------------------------------------------------------------
       
   484 // CPEngPresenceAttrModel::CloneLC()
       
   485 // -----------------------------------------------------------------------------
       
   486 //
       
   487 MPEngPresenceAttrModel2* CPEngPresenceAttrModel::CloneLC() const
       
   488     {
       
   489     MPEngPresenceAdvancedAttrModel2* clone =
       
   490         iTypeConstructor.NewAttributeInstanceLC( EFalse, PresenceID() );
       
   491 
       
   492     PEngAttributeRequestCodec::CopyModelDataL( *this, *clone );
       
   493 
       
   494     return clone;
       
   495     }
       
   496 
       
   497 
       
   498 // -----------------------------------------------------------------------------
       
   499 // CPEngPresenceAttrModel::Close()
       
   500 // -----------------------------------------------------------------------------
       
   501 //
       
   502 void CPEngPresenceAttrModel::Close()
       
   503     {
       
   504     delete this;
       
   505     }
       
   506 
       
   507 
       
   508 // -----------------------------------------------------------------------------
       
   509 // CPEngPresenceAttrModel::EncodeToXmlL()
       
   510 // from MPEngPresenceAdvancedAttrModel
       
   511 // -----------------------------------------------------------------------------
       
   512 //
       
   513 void CPEngPresenceAttrModel::EncodeToXmlL( MPEngXMLSerializer& aSerializer ) const
       
   514     {
       
   515     PENG_DP( D_PENG_LIT( "CPEngPresenceAttrModel::EncodeValueToXmlL() [%08x]" ),
       
   516              iTypeConstructor.iType );
       
   517 
       
   518     TPtrC8 xmlName;
       
   519     TPtrC8 xmlNameSpace;
       
   520 
       
   521     User::LeaveIfError( iTypeConstructor.GetCurrentXmlNames( xmlName, xmlNameSpace ) );
       
   522     aSerializer.StartTagL( xmlName );
       
   523         {
       
   524         aSerializer.StartTagL( KQualifierXMLTag );
       
   525             {
       
   526             if ( iQualifier )
       
   527                 {
       
   528                 aSerializer.RawValueL( KXMLValueTrue );
       
   529                 }
       
   530             else
       
   531                 {
       
   532                 aSerializer.RawValueL( KXMLValueFalse );
       
   533                 }
       
   534             }
       
   535         aSerializer.EndTagL( KQualifierXMLTag );
       
   536 
       
   537         if ( iQualifier )
       
   538             {
       
   539             //Attribute qualifier is TRUE
       
   540             //==>let the derived model to serialize its data
       
   541             iTypeImp->EncodeDataToXmlL( aSerializer );
       
   542             }
       
   543         }
       
   544 
       
   545 
       
   546     aSerializer.EndTagL( xmlName );
       
   547     }
       
   548 
       
   549 
       
   550 // -----------------------------------------------------------------------------
       
   551 // CPEngPresenceAttrModel::DecodeAttributeFromXmlL()
       
   552 // from MPEngPresenceAdvancedAttrModel
       
   553 // -----------------------------------------------------------------------------
       
   554 //
       
   555 void CPEngPresenceAttrModel::DecodeFromXmlL( MPEngXMLParser& aParser,
       
   556                                              const TDesC8& aDataBlock )
       
   557     {
       
   558     PENG_DP( D_PENG_LIT( "CPEngPresenceAttrModel::DecodeValueFromXmlL() [%08x]" ),
       
   559              iTypeConstructor.iType );
       
   560 
       
   561     iQualifier = ETrue;
       
   562     if ( aParser.DecodeL( aDataBlock, KQualifierXMLTag, EFalse ) )
       
   563         {
       
   564         if ( aParser.ResultL().CompareF( KXMLValueFalse ) == 0 )
       
   565             {
       
   566             //Attribute qualifier is FALSE only if it is explicitly
       
   567             //stated so in the XML
       
   568             iQualifier = EFalse;
       
   569             }
       
   570         }
       
   571 
       
   572     if ( iQualifier )
       
   573         {
       
   574         //Attribute data is updated only if the qualifier was TRUE
       
   575         iTypeImp->DecodeDataFromXmlL( aParser, aDataBlock );
       
   576         }
       
   577     else
       
   578         {
       
   579         iTypeImp->ResetDataL();
       
   580         }
       
   581 
       
   582     HandleAttributeUpdatedToNetwork();
       
   583     }
       
   584 
       
   585 
       
   586 // -----------------------------------------------------------------------------
       
   587 // CPEngPresenceAttrModel::Storage()
       
   588 // from MPEngPresenceAdvancedAttrModel
       
   589 // -----------------------------------------------------------------------------
       
   590 //
       
   591 const CPEngPresenceAttrModelStorageProxy& CPEngPresenceAttrModel::Storage() const
       
   592     {
       
   593     return *iStorage;
       
   594     }
       
   595 
       
   596 CPEngPresenceAttrModelStorageProxy& CPEngPresenceAttrModel::Storage()
       
   597     {
       
   598     return *iStorage;
       
   599     }
       
   600 
       
   601 
       
   602 
       
   603 // -----------------------------------------------------------------------------
       
   604 // CPEngPresenceAttrModel::ExternalizeSize()
       
   605 // from MPEngPresenceAdvancedAttrModel
       
   606 // -----------------------------------------------------------------------------
       
   607 //
       
   608 TInt CPEngPresenceAttrModel::ExternalizeSize() const
       
   609     {
       
   610     TInt sizeInBytes = 14;
       
   611     // 4 bytes: extension1
       
   612     // 4 bytes: TypeId
       
   613     // 1 byte: DataSource
       
   614     // 1 byte: Qualifier
       
   615     // 4 bytes: extension2
       
   616 
       
   617     //And get externalize size from real model..
       
   618     sizeInBytes = sizeInBytes + iTypeImp->DataExternalizeSize();
       
   619 
       
   620     return sizeInBytes;
       
   621     }
       
   622 
       
   623 
       
   624 // -----------------------------------------------------------------------------
       
   625 // CPEngPresenceAttrModel::ExternalizeL()
       
   626 // from MPEngPresenceAdvancedAttrModel
       
   627 // -----------------------------------------------------------------------------
       
   628 //
       
   629 void CPEngPresenceAttrModel::ExternalizeL( RWriteStream& aStream ) const
       
   630     {
       
   631     aStream.WriteUint32L( 0 ); //Write 32 bit for future extension
       
   632     aStream.WriteUint32L( iTypeConstructor.iType );
       
   633     aStream.WriteInt8L( iDataSource );
       
   634     aStream.WriteInt8L( iQualifier );
       
   635     aStream.WriteInt32L( 0 ); //Write 32 bit for future extension
       
   636 
       
   637     //let model implementation externalize its data..
       
   638     iTypeImp->ExternalizeDataL( aStream );
       
   639     }
       
   640 
       
   641 
       
   642 // -----------------------------------------------------------------------------
       
   643 // CPEngPresenceAttrModel::InternalizeL()
       
   644 // from MPEngPresenceAdvancedAttrModel
       
   645 // -----------------------------------------------------------------------------
       
   646 //
       
   647 void CPEngPresenceAttrModel::InternalizeL( RReadStream& aStream )
       
   648     {
       
   649     aStream.ReadUint32L(); //future extension
       
   650     TUint32 interType = aStream.ReadUint32L();
       
   651     iDataSource = static_cast<TPEngAttrDataSource> ( aStream.ReadInt8L() );
       
   652     iQualifier = aStream.ReadInt8L();
       
   653     aStream.ReadUint32L(); //future extension
       
   654 
       
   655     // Check from attribute type that correct type is internalized.
       
   656     __ASSERT_ALWAYS( interType == iTypeConstructor.iType,
       
   657                      PanicAttrModelL( EPEngInternalizeMismatch, KErrCorrupt ) );
       
   658 
       
   659     //Try internalize type specific data.
       
   660     //Reset contents if corrupted
       
   661     TRAPD( err, iTypeImp->InternalizeDataL( aStream ) );
       
   662     if ( ( err == KErrCorrupt ) ||
       
   663          ( err == KErrEof ) )
       
   664         {
       
   665         iTypeImp->ResetDataL();
       
   666         }
       
   667     else
       
   668         {
       
   669         User::LeaveIfError( err );
       
   670         }
       
   671     }
       
   672 
       
   673 
       
   674 // -----------------------------------------------------------------------------
       
   675 // CPEngPresenceAttrModel::HandleAttributeUpdatedToNetwork()
       
   676 // from MPEngPresenceAdvancedAttrModel
       
   677 // -----------------------------------------------------------------------------
       
   678 //
       
   679 void CPEngPresenceAttrModel::HandleAttributeUpdatedToNetwork()
       
   680     {
       
   681     iDataSource = EPEngAttrNetwork;
       
   682     }
       
   683 
       
   684 
       
   685 
       
   686 // -----------------------------------------------------------------------------
       
   687 // CPEngPresenceAttrModel::HandleNetworkSessionStateChangeL()
       
   688 // from MPEngPresenceAdvancedAttrModel
       
   689 // -----------------------------------------------------------------------------
       
   690 //
       
   691 void CPEngPresenceAttrModel::HandleNetworkSessionStateChangeL( TBool aSessionOpen )
       
   692     {
       
   693     iTypeImp->HandleNetworkSessionStateChangeL( aSessionOpen );
       
   694     }
       
   695 
       
   696 
       
   697 
       
   698 // -----------------------------------------------------------------------------
       
   699 // CPEngPresenceAttrModel::LazyInitAsyncSetHookL()
       
   700 // -----------------------------------------------------------------------------
       
   701 //
       
   702 void CPEngPresenceAttrModel::LazyInitAsyncSetHookL()
       
   703     {
       
   704     if ( !iAsyncSetHook )
       
   705         {
       
   706         iAsyncSetHook = new ( ELeave ) CPEngAttrModelAsyncDataSetHook();
       
   707         }
       
   708     }
       
   709 
       
   710 
       
   711 
       
   712 
       
   713 //  End of File
       
   714 
       
   715