messagingfw/deprecate/senduiservices/serviceresolver/src/senduisrappui.cpp
branchRCL_3
changeset 22 d2c4c66342f3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/deprecate/senduiservices/serviceresolver/src/senduisrappui.cpp	Tue Aug 31 15:41:11 2010 +0300
@@ -0,0 +1,339 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:   Resolves sending service information and stores it to 
+*                Central Repository.    
+*
+*/
+
+
+
+#include <e32property.h>
+#include <e32cmn.h>
+#include <apgwgnam.h>
+#include <mtclreg.h>                         // CClientMtmRegistry
+#include <SendUiConsts.h>
+#include <CSendingService.h>
+#include <CSendingServiceInfo.h>
+#include <SendingServiceInterfaceUids.hrh>
+
+#include <CSendingServiceInfo.h>
+#include <TSendingCapabilities.h>
+#include "centralrepository.h"
+#include "senduisrappui.h"
+#include "SendUiPrivateCRKeys.h"
+#include "senduiproperty.h"
+#include "senduiserviceslog.h"              // Logging
+#include <senduisingleton.h>
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CSendUiSrAppUi::CSendUiSrAppUi() :
+    iCoeEnv( CCoeEnv::Static() )                             
+    {
+    SetFullScreenApp(EFalse); // disable possible transition effects
+    }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSendUiSrAppUi::ConstructL()
+    {
+    BaseConstructL(ENoAppResourceFile);
+
+    HideApplicationFromFSW( ETrue ); // hide from Fast Swap Window
+    
+    TApaTask task(iEikonEnv->WsSession());
+    task.SetWgId(iEikonEnv->RootWin().Identifier());
+    task.SendToBackground(); 
+
+    iIdle = CIdle::NewL( CActive::EPriorityIdle );
+    iIdle->Start( TCallBack(UpdateTask, this ));
+    }
+
+TInt CSendUiSrAppUi::UpdateTask( TAny* aThis  )
+    {
+    CSendUiSrAppUi* appUi = static_cast<CSendUiSrAppUi*>( aThis );
+    
+    TRAPD( err, appUi->HandleUpdateSendListL() );
+
+    if ( err ) 
+        {
+#ifdef _DEBUG
+        TBuf<256> buf;
+        buf.Format(_L("SendUi err"));
+        User::InfoPrint(buf);
+        LOGTEXT2(_L("SendUiServiceResolver: Error %d while loading CenRep."), err );
+#endif
+        RProperty::Set( 
+        KPSUidSendUiProperty, 
+        KSendUiUpdateOperation, 
+        KSendUiUpdateOperationDone ); 
+
+        RProperty::Set( 
+        KPSUidSendUiProperty, 
+        KSendUiUpdateRequest, 
+        KSendUiNotInitialized  ); 
+        }
+        
+    appUi->Exit();
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CSendUiSrAppUi::~CSendUiSrAppUi()
+    {
+    delete iIdle;
+    }
+
+// ---------------------------------------------------------------------------
+// HandleUpdateSendListL
+// ---------------------------------------------------------------------------
+//
+void CSendUiSrAppUi::HandleUpdateSendListL()
+    {
+    RProperty::Set( 
+        KPSUidSendUiProperty, 
+        KSendUiUpdateOperation, 
+        KSendUiUpdateOperationRunning ); 
+    
+    CRepository* myRep = CRepository::NewLC( KCRUidSendUi );
+    LOGTEXT(_L("SendUiSr: Repository created."));
+   
+    // KErrNotFound indicates undefined repository state and services are re-read by Watcher
+    // in boot, if this update fails. The correct language value is set when update completes 
+    // succesfully.
+    TInt result = myRep->Set( KKeySendUiServiceLanguage, KErrNotFound );
+    
+    LOGTEXT(_L("SendUiSr: Service Manager created."));
+    RPointerArray<CSendingServiceInfo> servicesArray;
+    RPointerArray<CSendingService> serviceProviders;
+   
+    PopulateServicesListL( servicesArray, serviceProviders, iCoeEnv );
+    
+    TSendingCapabilities serviceCapabilities;
+
+    // cleaning old and storing new sending service values to Central Repository
+    // is done in one transaction.
+    result += myRep->StartTransaction( CRepository::EConcurrentReadWriteTransaction );
+
+    if ( result != KErrNone )
+        {
+        servicesArray.Close();
+        CleanupStack::PopAndDestroy( myRep );
+        return;
+        }
+    else
+        {
+        ClearPluginListL( myRep );
+        }
+
+    TInt i(0);
+    TInt err(0);
+    for ( i = 0; i < servicesArray.Count(); i++)
+        {
+        // Store to Central Repository: uid, providerId, name, menuname, capabilities, 
+        // technologytype, messagesize, flags and serviceFeatures
+        err += AddSendingService( 
+            myRep,
+            i, 
+            servicesArray[i]->ServiceId(), 
+            servicesArray[i]->ServiceProviderId(), 
+            servicesArray[i]->TechnologyTypeId(),
+            servicesArray[i]->ServiceFeatures(),
+            servicesArray[i]->ServiceCapabilities(), 
+            servicesArray[i]->ServiceName().Left( KSendUiServiceMaxNameLength ),
+            servicesArray[i]->ServiceMenuName().Left( KSendUiServiceMaxNameLength ),
+            servicesArray[i]->ServiceAddress().Left( KSendUiServiceMaxNameLength ) );
+        }
+
+    err += myRep->Set( KKeySendUiServiceCount, servicesArray.Count() );
+    err += myRep->Set( KKeySendUiServiceLanguage, (TInt)User::Language() );
+    
+    if ( err == KErrNone )
+    	{
+        TUint32 keyInfo;
+        myRep->CommitTransaction( keyInfo );
+    	}
+    
+    servicesArray.Close();
+    serviceProviders.ResetAndDestroy();
+    CleanupStack::PopAndDestroy( myRep ); // myRep
+    
+    RProperty::Set( 
+        KPSUidSendUiProperty, 
+        KSendUiUpdateOperation, 
+        KSendUiUpdateOperationDone ); 
+
+    RProperty::Set( 
+        KPSUidSendUiProperty, 
+        KSendUiUpdateRequest, 
+        KSendUiUpdated ); 
+}
+
+// ---------------------------------------------------------------------------
+// AddSendingService
+// ---------------------------------------------------------------------------
+//
+TInt CSendUiSrAppUi::AddSendingService( 
+        CRepository* aRep,
+        TUint aIndex, 
+        TUid aMtmUid,
+        TUid aServiceProviderId,
+        TUid aTechnologyType,
+        TInt aFeatures,
+        TSendingCapabilities aCapabilities,
+        TPtrC aServiceName,
+        TPtrC aServiceMenuName,
+        TPtrC aServiceAddress )
+    {
+    // Cenrep stays in readble state during transaction
+    
+    aIndex = aIndex * KSendUiServiceIndex;
+    // "collect" errors. Focus is in the existance of errors, not on any specific error.
+    TInt err = aRep->Create( aIndex | KSendUiServiceId, (TInt)aMtmUid.iUid );
+    err += aRep->Create( aIndex | KSendUiServiceProviderId, (TInt)aServiceProviderId.iUid );
+    
+    err += aRep->Create( aIndex | KSendUiServiceName, aServiceName );
+    err += aRep->Create( aIndex | KSendUiServiceMenuName, aServiceMenuName );
+    err += aRep->Create( aIndex | KSendUiServiceAddress, aServiceAddress );
+    
+    err += aRep->Create( aIndex | KSendUiServiceFlags, aCapabilities.iFlags );
+    err += aRep->Create( aIndex | KSendUiServiceBodySize, aCapabilities.iBodySize );
+    err += aRep->Create( aIndex | KSendUiServiceMessageSize, aCapabilities.iMessageSize );
+    err += aRep->Create( aIndex | KSendUiServiceTechnologyType, (TInt)aTechnologyType.iUid );
+    err += aRep->Create( aIndex | KSendUiServiceFeatures, aFeatures );
+    LOGTEXT3(_L("SendUiServiceResolver: index %d, service %d"), aIndex, aMtmUid.iUid );
+    if ( err != KErrNone )
+    	{
+    	LOGTEXT(_L("Error while creating Central Repository data.") );
+    	}
+    return ( err != KErrNone ); 
+    }
+
+// ---------------------------------------------------------------------------
+// ClearPluginListL
+// Deletes all service detail keys from the repository.
+// ---------------------------------------------------------------------------
+//
+void CSendUiSrAppUi::ClearPluginListL( CRepository* aRep )
+    {
+    TUint32 partialKey = 0x00000000;
+    TUint32 keyMask =    0xFFFF0000; // 0, don't care mask
+    RArray<TUint32> indexKeys;
+    CleanupClosePushL( indexKeys );
+  
+    aRep->FindL( partialKey, keyMask, indexKeys );
+
+    for (int i(0) ; i < indexKeys.Count(); i++)
+        {
+        aRep->Delete( indexKeys[ i ] );
+        }
+    
+    CleanupStack::PopAndDestroy( &indexKeys );
+    }
+
+// ---------------------------------------------------------------------------
+// From class CAknAppUi.
+// ---------------------------------------------------------------------------
+//
+void CSendUiSrAppUi::HandleCommandL(TInt /*aCommand*/)
+    {
+    // no implementation required
+    }
+
+// ---------------------------------------------------------------------------
+CSendingService* CSendUiSrAppUi::LoadServiceL( 
+    TUid aServiceProviderUid, 
+    CCoeEnv* aCoeEnv, 
+    CSendUiSingleton* aSingleton,
+    RPointerArray<CSendingServiceInfo>& aServiceList )
+    {
+    CSendingService* sendingService = CSendingService::NewL( 
+        aServiceProviderUid, 
+        *aCoeEnv, 
+        *aSingleton );        
+        
+    if( sendingService )
+        {
+        CleanupStack::PushL( sendingService );
+        sendingService->PopulateServicesListL( aServiceList );
+        // if everything goes well, aServiceProviders will own this object soon enough
+        CleanupStack::Pop( sendingService ); 
+        }
+    return sendingService;
+    }
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CSendUiSrAppUi::PopulateServicesListL(
+    RPointerArray<CSendingServiceInfo>& aServiceList,
+    RPointerArray<CSendingService>&      aServiceProviders,
+    CCoeEnv* aCoeEnv )
+    {
+    CSendUiSingleton* singleton = CSendUiSingleton::NewL();
+    CleanupStack::PushL( singleton );
+    aServiceList.Reset();
+
+    RImplInfoPtrArray implInfoArray;
+    RPointerArray<CSendingServiceInfo> services;
+
+    REComSession::ListImplementationsL(
+        TUid::Uid( KSendUiSendingServiceInterface ),implInfoArray);
+
+    TInt serviceIndex(0);
+    CSendingService* sendingService;
+    while ( serviceIndex < implInfoArray.Count() )
+        {
+        sendingService = NULL;
+        TUid serviceUid = (*implInfoArray[serviceIndex]).ImplementationUid(); 
+        // If Ecom service loading fails, then just move on
+        TRAPD( error, sendingService = LoadServiceL( serviceUid, aCoeEnv, singleton, services ) );        
+        
+        if( sendingService && error == KErrNone )
+            {
+            aServiceProviders.AppendL( sendingService );
+            
+            for ( TInt index = 0; index < services.Count(); index++ )
+                {
+                aServiceList.Append( services[ index ] );
+                }
+            services.Reset();
+            
+            LOGTEXT2( _L("Provider %d creation SUCCESS."), serviceUid );
+            }
+        else
+            {
+            LOGTEXT3( _L("Provider %d creation FAILED. Error code: %d"), serviceUid, error );
+            }
+
+        serviceIndex++;
+        }
+    services.Close();
+    implInfoArray.ResetAndDestroy();
+    REComSession::FinalClose();
+    CleanupStack::PopAndDestroy( singleton );
+    }
+
+// end of file
+