diff -r e5b3a2155e1a -r d2c4c66342f3 messagingfw/deprecate/senduiservices/serviceresolver/src/senduisrappui.cpp --- /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 +#include +#include +#include // CClientMtmRegistry +#include +#include +#include +#include + +#include +#include +#include "centralrepository.h" +#include "senduisrappui.h" +#include "SendUiPrivateCRKeys.h" +#include "senduiproperty.h" +#include "senduiserviceslog.h" // Logging +#include + +// ======== 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( 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 servicesArray; + RPointerArray 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 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& 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& aServiceList, + RPointerArray& aServiceProviders, + CCoeEnv* aCoeEnv ) + { + CSendUiSingleton* singleton = CSendUiSingleton::NewL(); + CleanupStack::PushL( singleton ); + aServiceList.Reset(); + + RImplInfoPtrArray implInfoArray; + RPointerArray 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 +