ncdengine/provider/protocol/src/ncdprotocoldefaultobserverimpl.cpp
changeset 0 ba25891c3a9e
equal deleted inserted replaced
-1:000000000000 0:ba25891c3a9e
       
     1 /*
       
     2 * Copyright (c) 2006 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:   MNcdProtocolDefaultObserverImpl implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <s32mem.h>
       
    20 #include <e32property.h>
       
    21 
       
    22 #include "catalogsdebug.h"
       
    23 #include "catalogsconstants.h"
       
    24 #include "catalogscontext.h"
       
    25 #include "ncd_cp_actionrequest.h"
       
    26 #include "ncd_cp_clientconfiguration.h"
       
    27 #include "ncd_cp_detail.h"
       
    28 #include "ncd_cp_query.h"
       
    29 #include "ncd_cp_serverdetails.h"
       
    30 #include "ncd_pp_error.h"
       
    31 #include "ncd_pp_datablock.h"
       
    32 #include "ncd_pp_information.h"
       
    33 #include "ncd_pp_subscription.h"
       
    34 #include "ncdprotocoldefaultobserverimpl.h"
       
    35 #include "ncdconfigurationmanager.h"
       
    36 #include "ncd_cp_cookie.h"
       
    37 #include "ncdserverdetails.h"
       
    38 #include "ncdproviderdefines.h"
       
    39 #include "ncdsubscriptionmanagerimpl.h"
       
    40 
       
    41 // Action targets
       
    42 _LIT( KNcdActionTargetMasterServerUri, "masterServerUri" );
       
    43 _LIT( KNcdActionTargetSkin, "skin" );
       
    44 _LIT( KNcdActionTargetClient, "client" );
       
    45 
       
    46 
       
    47 
       
    48 CNcdProtocolDefaultObserver* CNcdProtocolDefaultObserver::NewL(
       
    49     MCatalogsContext& aContext,
       
    50     MNcdConfigurationManager& aConfigurationManager,
       
    51     CNcdSubscriptionManager& aSubscriptionManager,
       
    52     const TDesC& aServerUri )
       
    53     {
       
    54     CNcdProtocolDefaultObserver* self = new(ELeave) 
       
    55         CNcdProtocolDefaultObserver( aContext, 
       
    56             aConfigurationManager, aSubscriptionManager );
       
    57     CleanupStack::PushL( self );
       
    58     self->ConstructL( aServerUri );
       
    59     CleanupStack::Pop( self );
       
    60     return self;
       
    61     }
       
    62 
       
    63 CNcdProtocolDefaultObserver::CNcdProtocolDefaultObserver( 
       
    64     MCatalogsContext& aContext,
       
    65     MNcdConfigurationManager& aConfigurationManager,
       
    66     CNcdSubscriptionManager& aSubscriptionManager )
       
    67     : iContext( aContext ),
       
    68       iConfigurationManager( aConfigurationManager ),
       
    69       iSubscriptionManager( aSubscriptionManager )
       
    70     {
       
    71     }
       
    72 
       
    73 CNcdProtocolDefaultObserver::~CNcdProtocolDefaultObserver()
       
    74     {
       
    75     delete iServerUri;
       
    76     }
       
    77 
       
    78 
       
    79 void CNcdProtocolDefaultObserver::ConstructL( const TDesC& aServerUri )
       
    80     {
       
    81     iServerUri = aServerUri.AllocL();
       
    82     }
       
    83 
       
    84 //*****************************************************************************
       
    85 // MNcdParserConfigurationProtocolObserver
       
    86 //*****************************************************************************
       
    87 
       
    88 void CNcdProtocolDefaultObserver::ConfigurationBeginL( const TDesC& /*aVersion*/, 
       
    89                                                        TInt /*aExpirationDelta*/ ) 
       
    90     { 
       
    91     DLTRACEIN((""));
       
    92     }
       
    93     
       
    94 void CNcdProtocolDefaultObserver::ConfigurationQueryL( 
       
    95     MNcdConfigurationProtocolQuery* aQuery )
       
    96     {
       
    97     DLTRACEIN((""));
       
    98     // The queries by now should be handled by other interested parties.
       
    99     // Do nothing.
       
   100     delete aQuery;
       
   101     }
       
   102     
       
   103 void CNcdProtocolDefaultObserver::ClientConfigurationL( 
       
   104     MNcdConfigurationProtocolClientConfiguration* aConfiguration ) 
       
   105     {
       
   106     DLTRACEIN((""));
       
   107     CleanupDeletePushL( aConfiguration );
       
   108 
       
   109     // Should interpret details to grab master server validity information, 
       
   110     // for example
       
   111 
       
   112     // pass cookies to cookie handler
       
   113     TInt cookieCount = aConfiguration->CookieCount();
       
   114     DLINFO(("cookie count=%d",cookieCount));
       
   115     
       
   116     // Get SSID
       
   117     const TDesC8& ssid( iConfigurationManager.SsidL( iContext ) );
       
   118     
       
   119     MNcdServerDetails& details( 
       
   120         iConfigurationManager.ServerDetailsL( iContext, 
       
   121         *iServerUri,
       
   122         NcdProviderDefines::KConfigNamespace ));
       
   123 
       
   124     
       
   125     for ( TInt i = 0; i < cookieCount; ++i ) 
       
   126         {
       
   127         const MNcdConfigurationProtocolCookie& cookie( 
       
   128             aConfiguration->CookieL( i ) );
       
   129         details.AddCookieL( cookie, ssid );
       
   130         }
       
   131 
       
   132     CleanupStack::PopAndDestroy( aConfiguration );
       
   133     DLTRACEOUT((""));
       
   134     }
       
   135 
       
   136 void CNcdProtocolDefaultObserver::ConfigurationDetailsL( 
       
   137     CArrayPtr<MNcdConfigurationProtocolDetail>* aDetails ) 
       
   138     {
       
   139     DLTRACEIN((""));    
       
   140     aDetails->ResetAndDestroy();
       
   141     delete aDetails;
       
   142     }
       
   143 
       
   144 void CNcdProtocolDefaultObserver::ConfigurationActionRequestL( 
       
   145     MNcdConfigurationProtocolActionRequest* aActionRequest ) 
       
   146     {
       
   147     DLTRACEIN((""));
       
   148 
       
   149     CleanupDeletePushL( aActionRequest );
       
   150     
       
   151     if( aActionRequest->Type() == MNcdConfigurationProtocolActionRequest::ETypeUpdate &&
       
   152         aActionRequest->UpdateDetails() )
       
   153     	{
       
   154     	DLTRACE(( "Update" ));
       
   155 
       
   156     	DLINFO(( _L("Target: %S"), &aActionRequest->Target() ));
       
   157        	DLINFO(( _L("Id: %S"), &aActionRequest->UpdateDetails()->Id() ));
       
   158     	DLINFO(( _L("Version: %S"), &aActionRequest->UpdateDetails()->Version() ));
       
   159     	DLINFO(( _L("Uri: %S"), &aActionRequest->UpdateDetails()->Uri() ));
       
   160     	DLINFO(( "Forced: %d", aActionRequest->Force() ));
       
   161 
       
   162     	DLINFO(( "Client SID %08x", iContext.SecureId().iId ));    	
       
   163     	
       
   164     	if ( aActionRequest->Target() == KNcdActionTargetMasterServerUri && 
       
   165     	     aActionRequest->UpdateDetails()->Uri().Length() ) 
       
   166     	    {
       
   167     	    const TDesC& currentMaster( iConfigurationManager.MasterServerAddressL( 
       
   168     	        iContext ) );
       
   169     	        
       
   170     	    // Ensure that request was received from the master server
       
   171     	    if ( *iServerUri == currentMaster )
       
   172     	        {    	        
       
   173     	        /**
       
   174     	         * @ Improve this check to notice missing '/' at the end of the URIs
       
   175     	         */
       
   176     	        if ( aActionRequest->UpdateDetails()->Uri() != currentMaster )
       
   177     	            {    	            
       
   178             	    DLINFO(("Updating MasterServerUri")); 
       
   179             	       
       
   180             	    iConfigurationManager.SetMasterServerAddressL( iContext,
       
   181             	        aActionRequest->UpdateDetails()->Uri(), 0 );    	    
       
   182     	            }
       
   183     	        else
       
   184     	            {
       
   185     	            DLINFO(("MasterServerUri didn't change"));
       
   186     	            }
       
   187     	        }
       
   188     	    else
       
   189     	        {
       
   190     	        DLERROR(( _L("Invalid update request source! Request source: %S"),
       
   191     	            iServerUri ));
       
   192     	        }
       
   193     	    }
       
   194     	else if( aActionRequest->Target() == KNcdActionTargetSkin || 
       
   195     	         aActionRequest->Target() == KNcdActionTargetClient ) 
       
   196     	    {
       
   197         	HBufC* msgQueueName = HBufC::NewLC( KCatalogsUpdateQueueNameFormat().Length() + 8 );
       
   198         	msgQueueName->Des().Format( KCatalogsUpdateQueueNameFormat, iContext.SecureId().iId );
       
   199         	
       
   200         	DLINFO(( _L("Opening client's update message queue: %S"), msgQueueName ));
       
   201         	RMsgQueueBase queue;
       
   202         	
       
   203         	TInt err = queue.OpenGlobal( *msgQueueName );
       
   204         	if( err == KErrNone )
       
   205         	    {        	    
       
   206         	    CleanupClosePushL( queue );
       
   207                 TInt msgSize = queue.MessageSize();
       
   208 
       
   209                 // Prepare a buffer to write to update information P&S variable.
       
   210                 CBufFlat* buffer = CBufFlat::NewL( KCatalogsUpdateInformationMaxSize + msgSize );
       
   211                 CleanupStack::PushL( buffer );
       
   212                 
       
   213                 // Externalize the info to the buffer.
       
   214                 RBufWriteStream stream( *buffer );
       
   215                 CleanupClosePushL( stream );
       
   216                 stream << (TInt32)(aActionRequest->Target().Size() + 
       
   217                                    aActionRequest->UpdateDetails()->Id().Size() + 
       
   218                                    aActionRequest->UpdateDetails()->Version().Size() +
       
   219                                    aActionRequest->UpdateDetails()->Uri().Size() +
       
   220                                    sizeof( TInt32 ));
       
   221                 stream << aActionRequest->Target();
       
   222                 stream << aActionRequest->UpdateDetails()->Id();
       
   223             	stream << aActionRequest->UpdateDetails()->Version();
       
   224                 stream << aActionRequest->UpdateDetails()->Uri();
       
   225                 stream << (TInt32)aActionRequest->Force();
       
   226                 
       
   227                 // Write the update information to the client's update message queue.
       
   228                 TInt bytesToSend = buffer->Size();
       
   229                 for( TInt sendPos = 0; sendPos < bytesToSend; sendPos += msgSize )
       
   230                     {
       
   231                     const TUint8* sendPtr = buffer->Ptr( sendPos ).Ptr();
       
   232                     queue.SendBlocking( sendPtr, msgSize );
       
   233                     }
       
   234                 
       
   235                 DLINFO(( "Update information sent to message queue" ));
       
   236                 
       
   237                 CleanupStack::PopAndDestroy( 3, &queue ); // stream-close, buffer, queue
       
   238         	    }
       
   239             
       
   240             // Clean up the local info buffer.
       
   241             CleanupStack::PopAndDestroy( msgQueueName ); 
       
   242     	    }
       
   243     	else
       
   244     	    {
       
   245     	    DLINFO(("Unknown Action target"));
       
   246     	    }
       
   247     	}
       
   248     // Action request no longer needed, delete it.
       
   249     CleanupStack::PopAndDestroy( aActionRequest );
       
   250     }
       
   251 
       
   252 
       
   253 void CNcdProtocolDefaultObserver::ConfigurationServerDetailsL( 
       
   254     MNcdConfigurationProtocolServerDetails* aServerDetails )
       
   255     {
       
   256     DLTRACEIN((""));
       
   257     DASSERT( aServerDetails );
       
   258     DASSERT( iServerUri );
       
   259     DLINFO(("Server supports %d capabilities", 
       
   260         aServerDetails->CapabilityCount() ));
       
   261     
       
   262     CleanupDeletePushL( aServerDetails );
       
   263     
       
   264     if ( aServerDetails->CapabilityCount() )
       
   265         {
       
   266         DLTRACE(("Adding capabilities to server details"));
       
   267         MNcdServerDetails& details( 
       
   268             iConfigurationManager.ServerDetailsL( iContext, 
       
   269                 *iServerUri,
       
   270                 NcdProviderDefines::KConfigNamespace ));
       
   271         
       
   272         // Clear old caps so that we don't just keep on adding them.
       
   273         // AddCapabilityL does NOT check for duplicates
       
   274         details.ClearCapabilitiesL();
       
   275 
       
   276         for ( TInt i = 0; i < aServerDetails->CapabilityCount(); ++i )
       
   277             {
       
   278             details.AddCapabilityL( aServerDetails->CapabilityL( i ) );
       
   279             }
       
   280         iConfigurationManager.SaveConfigurationToDbL( iContext );
       
   281         }
       
   282     CleanupStack::PopAndDestroy( aServerDetails );
       
   283     }
       
   284     
       
   285 void CNcdProtocolDefaultObserver::ConfigurationErrorL( 
       
   286     MNcdConfigurationProtocolError* aError ) 
       
   287     {
       
   288     DLTRACEIN((""));
       
   289     delete aError;
       
   290     }
       
   291     
       
   292 void CNcdProtocolDefaultObserver::ConfigurationEndL() 
       
   293     {
       
   294     DLTRACEIN((""));
       
   295     }
       
   296 
       
   297 
       
   298 //*****************************************************************************
       
   299 // MNcdParserInformationObserver
       
   300 //*****************************************************************************
       
   301 
       
   302 void CNcdProtocolDefaultObserver::InformationL( 
       
   303     MNcdPreminetProtocolInformation* aData )
       
   304     {
       
   305     DLTRACEIN(( _L("Namespace: %S"), &aData->Namespace() ));
       
   306     CleanupDeletePushL( aData );
       
   307     
       
   308 
       
   309     TInt cookieCount = aData->CookieCount();
       
   310     DLINFO(("cookie count=%d",cookieCount));
       
   311 
       
   312     MNcdServerDetails& details( 
       
   313         iConfigurationManager.ServerDetailsL( iContext, *iServerUri,
       
   314             aData->Namespace() ));
       
   315 
       
   316 
       
   317     // Get SSID
       
   318     const TDesC8& ssid( iConfigurationManager.SsidL( iContext ) );
       
   319     
       
   320     for ( TInt i = 0; i < cookieCount; ++i ) 
       
   321         {
       
   322         const MNcdConfigurationProtocolCookie& cookie( aData->CookieL( i ) );
       
   323         details.AddCookieL( cookie, ssid );
       
   324         }
       
   325     
       
   326     
       
   327     // Handle server capabilities
       
   328     DLTRACE(("Handle server capabilities"));
       
   329     const MNcdConfigurationProtocolServerDetails* serverDetails = 
       
   330         aData->ServerDetails();
       
   331     
       
   332     DLTRACE(("ServerDetails-ptr: %x", serverDetails ));
       
   333         
       
   334     if ( serverDetails && serverDetails->CapabilityCount() )
       
   335         {
       
   336         // Clear old caps so that we don't just keep on adding them.
       
   337         // AddCapabilityL does NOT check for duplicates
       
   338         details.ClearCapabilitiesL();
       
   339 
       
   340         DLINFO(("Capabilities: %d", serverDetails->CapabilityCount() ));
       
   341         DLTRACE(("Adding capabilities to server details"));
       
   342         
       
   343         for ( TInt i = 0; i < serverDetails->CapabilityCount(); ++i )
       
   344             {
       
   345             details.AddCapabilityL( serverDetails->CapabilityL( i ) );
       
   346             }
       
   347         
       
   348         }
       
   349     iConfigurationManager.SaveConfigurationToDbL( iContext );
       
   350     CleanupStack::PopAndDestroy( aData );
       
   351     DLTRACEOUT(("Protocol information handled"));
       
   352     }
       
   353 
       
   354 //*****************************************************************************
       
   355 // MNcdParserDataBlocksObserver
       
   356 //*****************************************************************************
       
   357 
       
   358 void CNcdProtocolDefaultObserver::DataBlocksL( 
       
   359     CArrayPtr<MNcdPreminetProtocolDataBlock>* aData ) 
       
   360     {
       
   361     DLTRACEIN((""));
       
   362     aData->ResetAndDestroy();
       
   363     delete aData;
       
   364     }
       
   365 
       
   366 //*****************************************************************************
       
   367 // MNcdParserErrorObserver
       
   368 //*****************************************************************************
       
   369 
       
   370 void CNcdProtocolDefaultObserver::ErrorL( MNcdPreminetProtocolError* aData )
       
   371     {
       
   372     DLTRACEIN((""));
       
   373     delete aData;
       
   374     }
       
   375 
       
   376 
       
   377 //*****************************************************************************
       
   378 // MNcdParserQueryObserver
       
   379 //*****************************************************************************
       
   380 
       
   381 void CNcdProtocolDefaultObserver::QueryL( MNcdConfigurationProtocolQuery* aData )
       
   382     {
       
   383     DLTRACEIN((""));
       
   384     delete aData;
       
   385     }
       
   386 
       
   387 //*****************************************************************************
       
   388 // MNcdParserSubscriptionObserver
       
   389 //*****************************************************************************
       
   390 
       
   391 void CNcdProtocolDefaultObserver::ValidSubscriptionL(
       
   392     MNcdPreminetProtocolSubscription* aData ) 
       
   393     {
       
   394     DLTRACEIN((""));
       
   395     iSubscriptionManager.InternalizeSubscriptionL(
       
   396         iContext.FamilyId(), *iServerUri, *aData, &iContext, NULL );
       
   397     delete aData;
       
   398     }
       
   399 
       
   400 void CNcdProtocolDefaultObserver::OldSubscriptionL(
       
   401     MNcdPreminetProtocolSubscription* aData ) 
       
   402     {
       
   403     DLTRACEIN((""));
       
   404     iSubscriptionManager.InternalizeSubscriptionL(
       
   405         iContext.FamilyId(), *iServerUri, *aData, &iContext, NULL );
       
   406     delete aData;
       
   407     }