diff -r 0efa10d348c0 -r a5a39a295112 idlefw/plugins/profileplugin/src/caiprofileplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/plugins/profileplugin/src/caiprofileplugin.cpp Wed Sep 01 12:22:09 2010 +0100 @@ -0,0 +1,450 @@ +/* +* Copyright (c) 2005-2007 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: Profile plug-in publisher +* +*/ + +// System includes +#include +#include +#include +#include + +// User includes +#include +#include +#include + +#include "aiprofileplugincontentmodel.h" +#include "caiprofileplugin.h" +#include "caiprofileengine.h" +#include "aipluginsettings.h" + +// Constants + +// PUA code for the timed profile, missing from PUAcodes.hrh +#define KAiTimedProfilePUA 0xF815 +#define KAiRTL 0x200F + +const TImplementationProxy KImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KImplUidProfilePlugin, CAiProfilePlugin::NewL ) + }; + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// CAiProfilePlugin::NewL +// +// --------------------------------------------------------------------------- +// +CAiProfilePlugin* CAiProfilePlugin::NewL() + { + CAiProfilePlugin* self = new ( ELeave ) CAiProfilePlugin; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::CAiProfilePlugin() +// +// --------------------------------------------------------------------------- +// +CAiProfilePlugin::CAiProfilePlugin() + { + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::ConstructL +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::ConstructL() + { + iContent = + AiUtility::CreateContentItemArrayIteratorL( KAiProfileContent ); + + iEvents = + AiUtility::CreateContentItemArrayIteratorL( KAiProfileEvents ); + + iResources = + AiUtility::CreateContentItemArrayIteratorL( KAiProfileResources ); + + iEngine = CAiProfileEngine::NewL( this ); + + iEngine->UpdateProfileNamesL(); + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::~CAiProfilePlugin +// Deletes all data created to heap +// --------------------------------------------------------------------------- +// +CAiProfilePlugin::~CAiProfilePlugin() + { + Release( iContent ); + Release( iEvents ); + Release( iResources ); + + delete iActiveProfileAndChar; + delete iPreviousProfileNameAndChar; + delete iEngine; + + iObservers.Close(); + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::PublishL +// Publishes the profiles +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::PublishL() + { + TInt err( KErrNone ); + TInt observers( iObservers.Count() ); + TInt transactionId ( reinterpret_cast( this ) ); + + iCurrentCount = iEngine->NumberOfProfiles(); + + for ( TInt i = 0; i < observers; i++ ) + { + MAiContentObserver* observer( iObservers[i] ); + + err = observer->StartTransaction( transactionId ); + + if ( err == KErrNotSupported ) + { + // The observer does not support transactions, check for real errors. + return; + } + + //Active Profile name + if ( observer->CanPublish( *this, EAiProfileContentActiveProfileName, EAiProfileContentActiveProfileName ) ) + { + observer->Publish( *this, EAiProfileContentActiveProfileName, iEngine->ActiveProfileName(), EAiProfileContentActiveProfileName ); + } + + if ( observer->CanPublish( *this, EAiProfileActiveProfileNameAndIconChar, 0 ) ) + { + delete iActiveProfileAndChar; + iActiveProfileAndChar = NULL; + + // silent/non-silent icon + timed icon + space + possible RTL*2 = 5 + TInt maxChars( iEngine->ActiveProfileName().Length() + 5 ); + + iActiveProfileAndChar = HBufC::NewL( maxChars ); + TPtr profileNamePtr( iActiveProfileAndChar->Des() ); + + if( AknLayoutUtils::LayoutMirrored() ) + { + profileNamePtr.Append( KAiRTL ); + } + + if ( iEngine->IsActiveProfileTimedL() ) + { + profileNamePtr.Append( KAiTimedProfilePUA ); + } + + if ( iEngine->IsActiveProfileSilentL() ) + { + profileNamePtr.Append( KPuaCodeSilentSymbol ); + } + else + { + profileNamePtr.Append( KPuaCodeAprofSound ); + } + + _LIT( KSpace, " " ); + + profileNamePtr.Append( KSpace ); + + if ( AknLayoutUtils::LayoutMirrored() ) + { + profileNamePtr.Append( KAiRTL ); + } + + profileNamePtr.Append( iEngine->ActiveProfileName() ); + + if ( !iPreviousProfileNameAndChar || + iPreviousProfileNameAndChar->CompareC( *iActiveProfileAndChar ) != 0 ) + { + delete iPreviousProfileNameAndChar; + iPreviousProfileNameAndChar = NULL; + observer->Publish( *this, EAiProfileActiveProfileNameAndIconChar, profileNamePtr, 0 ); + + iPreviousProfileNameAndChar = iActiveProfileAndChar->AllocL(); + } + } + + //Swap Profile name ( 1.phase: General or Silent ) + if ( observer->CanPublish( *this, EAiProfileContentSwapProfileName, EAiProfileContentSwapProfileName ) ) + { + observer->Publish( *this, EAiProfileContentSwapProfileName, iEngine->SwapProfileName(), EAiProfileContentSwapProfileName ); + } + + //All profile names + // clean profiles that are already deleted. + // Cleans the array blindly from the end, because in the next + // step all the profiles are republished + if ( iPreviousCount > iCurrentCount ) + { + for( TInt k = iCurrentCount; k < iPreviousCount; k++ ) + { + observer->Clean( *this, EAiProfileContentProfileName, k + 1 ); + } + } + + for ( TInt j = 0; j < iCurrentCount; j++ ) + { + if ( observer->CanPublish( *this, EAiProfileContentProfileName, j + 1 ) ) + { + observer->Publish(*this, EAiProfileContentProfileName, iEngine->ProfileNameByIndex( j ), j + 1 ); + } + } + + //Active Profile silent indicator char + if ( observer->CanPublish( *this, EAiProfileActiveProfileSilentChar, EAiProfileActiveProfileSilentChar ) ) + { + if ( iEngine->IsActiveProfileSilentL() ) + { + TBuf<1> silent; // one character + silent.Append( KPuaCodeSilentSymbol ); + + observer->Publish( *this, EAiProfileActiveProfileSilentChar, silent, EAiProfileActiveProfileSilentChar ); + } + else + { + observer->Clean( *this, EAiProfileActiveProfileSilentChar, EAiProfileActiveProfileSilentChar ); + } + } + + //Active Profile silent indicator resource + if ( observer->CanPublish( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileIcon ) ) + { + observer->Clean( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileSilentIconResource ); + observer->Clean( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileGeneralIconResource ); + observer->Clean( *this, EAiProfileActiveProfileIcon, EAiProfileActiveProfileTimedIconResource ); + + if ( iEngine->IsActiveProfileTimedL() ) + { + observer->Publish( *this, + EAiProfileActiveProfileIcon, + EAiProfileActiveProfileTimedIconResource, + EAiProfileActiveProfileTimedIconResource ); + } + else if ( iEngine->IsActiveProfileSilentL() ) + { + observer->Publish( *this, + EAiProfileActiveProfileIcon, + EAiProfileActiveProfileSilentIconResource, + EAiProfileActiveProfileSilentIconResource ); + } + else + { + observer->Publish( *this, + EAiProfileActiveProfileIcon, + EAiProfileActiveProfileGeneralIconResource, + EAiProfileActiveProfileGeneralIconResource ); + } + } + + // in case of Offline profile profile indicator is not shown + if ( observer->CanPublish( *this, EAiProfileContentActiveProfileName, EAiProfileContentActiveProfileName ) && + iEngine->IsOffline() ) + { + observer->Clean( *this, EAiProfileActiveProfileSilentChar, EAiProfileActiveProfileSilentChar ); + observer->Clean( *this, EAiProfileActiveProfileIcon, 1 ); + observer->Clean( *this, EAiProfileActiveProfileIcon, 2 ); + + // uncomment also this and respective policy lines in profiles.xml if whole widget needs to be hidden in AI3 + //observer->Clean( *this, EAiProfileContentActiveProfileName, EAiProfileContentActiveProfileName ); + } + + if ( err == KErrNone ) + { + err = observer->Commit( transactionId ); + + if ( err == KErrNotSupported) + { + return; + } + } + } + + iPreviousCount = iCurrentCount; + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::Start +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::Start( TStartReason /*aReason*/ ) + { + iPublishRequired = ETrue; + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::Stop +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::Stop( TStopReason /*aReason*/ ) + { + CleanPublishedProfileNames(); + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::Resume +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::Resume( TResumeReason aReason ) + { + if ( aReason == EForeground ) + { + TRAP_IGNORE( DoResumeL() ); + } + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::Suspend +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::Suspend( TSuspendReason /*aReason*/ ) + { + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::SubscribeL +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::SubscribeL( MAiContentObserver& aObserver ) + { + iObservers.AppendL( &aObserver ); + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::ConfigureL +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::ConfigureL( RAiSettingsItemArray& /*aSettings*/ ) + { + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::GetProperty +// +// --------------------------------------------------------------------------- +// +TAny* CAiProfilePlugin::GetProperty( TProperty aProperty ) + { + if ( aProperty == EPublisherContent ) + { + return static_cast< MAiContentItemIterator* >( iContent ); + } + else if ( aProperty == EPublisherEvents ) + { + return static_cast< MAiContentItemIterator* >( iEvents ); + } + else if ( aProperty == EPublisherResources ) + { + return static_cast< MAiContentItemIterator* >( iResources ); + } + + return NULL; + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::HandleEvent +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::HandleEvent( TInt aEvent, const TDesC& aParam ) + { + TRAP_IGNORE( iEngine->HandleAiEventL( aEvent, aParam ) ); + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::DoResumeL +// +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::DoResumeL() + { + if ( iPublishRequired ) + { + iPublishRequired = EFalse; + + PublishL(); + } + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::NotifyContentUpdate() +// This method is called from the engine, when the profile data has changed +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::NotifyContentUpdate() + { + iPublishRequired = ETrue; + + TRAP_IGNORE( DoResumeL() ); + } + +// --------------------------------------------------------------------------- +// CAiProfilePlugin::CleanPublishedProfileNames +// Clean profile names from content +// --------------------------------------------------------------------------- +// +void CAiProfilePlugin::CleanPublishedProfileNames() + { + TInt obsCount( iObservers.Count() ); + + for ( TInt i( 0 ); i < obsCount; i++ ) + { + MAiContentObserver* observer( iObservers[i] ); + + for ( TInt j( 0 ); j < iCurrentCount && observer; j++ ) + { + observer->Clean( *this, EAiProfileContentProfileName, j + 1 ); + } + } + + delete iPreviousProfileNameAndChar; + iPreviousProfileNameAndChar = NULL; + + iPreviousCount = 0; + } + +// ======== GLOBAL FUNCTIONS ======== +// --------------------------------------------------------------------------- +// Constructs and returns an application object. +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + aTableCount = sizeof( KImplementationTable ) / + sizeof( TImplementationProxy ); + + return KImplementationTable; + }