idlefw/plugins/shortcutplugin/src/caiscutextserver.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/shortcutplugin/src/caiscutextserver.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,396 @@
+/*
+* Copyright (c) 2005-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:  Shortcut plug-in xSP extension server class.
+*
+*/
+
+
+#include <centralrepository.h>
+#include <apgcli.h>
+#include <apadef.h>
+#include <apgwgnam.h>
+#include <bautils.h>
+#include <e32property.h>
+
+#include <aknmessagequerydialog.h>
+#include <StringLoader.h>
+
+#include <aiscutplugindomaincrkeys.h>
+#include <aiscutpluginres.rsg>
+#include <aiscutextdefs.h>
+
+#include "caiscutextserver.h"
+#include "caiscutextsession.h"
+#include "taiscutparser.h"
+#include "caiscutextserver.h"
+#include "activeidle2domainpskeys.h"
+
+
+// Amount of bytes the data buffer increases at a time.
+const TInt KAppsListDataGranularity = 100;
+
+// The length of '0x' in front of a hex literal.
+const TInt KTokenPrefix = 2;
+
+// Index to UID 3
+const TInt KUidIndex = 2;
+
+// Count of characters one UID occupies in CenRep (prefix + 8 digits + spacer)
+const TInt KUidStorageLength = KTokenPrefix + 8 + 1;
+
+_LIT(KUidFormat, "0x%08X ");
+
+_LIT(KResource, "z:\\resource\\aiscutpluginres.rsc");
+
+_LIT(KRomDrive, "z");
+
+
+CLinkParams::CLinkParams(CAiScutExtServer& aServer, HBufC* aTargetDefinition)
+    : iServer(aServer)
+    {
+    iTargetDefinition = aTargetDefinition;
+    }
+
+CLinkParams::~CLinkParams()
+    {
+    delete iTargetDefinition;
+    }
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutExtServer::CAiScutExtServer( MAiScutExtMessageHandler& aObserver, RWsSession& aWsSession )
+    : CServer2( CActive::EPriorityStandard ), iObserver( aObserver ), iWsSession(aWsSession)
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutExtServer::ConstructL()
+{
+    iIdle = CIdle::NewL( EPriorityStandard );
+
+    TFileName fileName( KResource );
+    CEikonEnv* env = CEikonEnv::Static();
+    BaflUtils::NearestLanguageFile( env->FsSession(), fileName );
+    iResourceOffset = env->AddResourceFileL( fileName );    
+
+    ReadAppListL();
+}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CAiScutExtServer::~CAiScutExtServer()
+    {
+    if( iIdle )
+        {
+        iIdle->Cancel();
+        delete iIdle;
+        }
+
+    CEikonEnv::Static()->DeleteResourceFile( iResourceOffset );
+
+    iShowUids.Close();
+    iUids.Close();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CSession2* CAiScutExtServer::NewSessionL(
+    const TVersion& aVersion, const RMessage2& /*aMessage*/ ) const
+    {
+    TVersion version(
+        KAiScutExtServMajorVersionNumber,
+        KAiScutExtServMinorVersionNumber,
+        KAiScutExtServBuildVersionNumber );
+
+    if ( !User::QueryVersionSupported( version, aVersion ) )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    CAiScutExtSession* session = new( ELeave ) CAiScutExtSession( iObserver );
+    return session;
+}
+
+// ---------------------------------------------------------------------------
+// Read a list of application UIDs which we must not show the tip.
+// ---------------------------------------------------------------------------
+//
+void CAiScutExtServer::ReadAppListL()
+    {
+    CRepository* repository = CRepository::NewL( KCRUidShortcutItems );
+    CleanupStack::PushL( repository );
+
+    RBuf buffer;
+    buffer.CreateL( KAppsListDataGranularity );
+    buffer.CleanupClosePushL();
+
+    TInt err = repository->Get( KAIxSPNoTipAppsList, buffer );
+    while( err == KErrOverflow )
+        {
+        buffer.ReAllocL( buffer.MaxLength() + KAppsListDataGranularity );
+        err = repository->Get( KAIxSPNoTipAppsList, buffer );
+        }
+
+    // Handle error silently if reading from Central Repository fails.
+    if( err == KErrNone )
+        {
+        // Parse application UIDs and put them to list.
+        TLex lex(buffer);
+
+        while( !lex.Eos() )
+            {
+            TPtrC token( lex.NextToken() );
+            if( token.Length() < KTokenPrefix )
+                {
+                break;
+                }
+            TLex lexUid( token.Right( token.Length() - KTokenPrefix ) );
+
+            TUint32 uid;
+            if( lexUid.Val( uid, EHex ) == KErrNone )
+                {
+                iUids.AppendL( TUid::Uid( uid ) );
+                }
+            }
+        }
+
+    CleanupStack::PopAndDestroy();      // buffer
+    CleanupStack::PopAndDestroy( repository );
+    }
+
+// ---------------------------------------------------------------------------
+// Saves the list of applications UIDs.
+// ---------------------------------------------------------------------------
+//
+void CAiScutExtServer::WriteAppListL()
+    {
+    CRepository* repository = CRepository::NewL( KCRUidShortcutItems );
+    CleanupStack::PushL( repository );
+
+    RBuf buffer;
+    buffer.CreateL( iUids.Count() * KUidStorageLength );
+    buffer.Zero();
+    buffer.CleanupClosePushL();
+
+    TBuf<KUidStorageLength> uidString;
+
+    for(TInt c = 0; c < iUids.Count(); c++)
+        {
+        uidString.Format( KUidFormat, iUids[c] );
+        buffer.Append( uidString );   // Ignore error
+        }
+
+    User::LeaveIfError( repository->Set( KAIxSPNoTipAppsList, buffer ) );
+
+    CleanupStack::PopAndDestroy();    // buffer
+    CleanupStack::PopAndDestroy( repository );
+    }
+
+// ---------------------------------------------------------------------------
+// Tests if the client has connected us before, i.e. determines if
+// the tip message should be shown.
+// ---------------------------------------------------------------------------
+//
+TBool CAiScutExtServer::HasConnectedBefore( TUid& aUid, const RMessage2& aMessage )
+    {
+    // First test if the current theme supports the xSP feature
+    TInt isXspSupported = EPSAiXspNotSupported;
+    TInt err = RProperty::Get( KPSUidAiInformation, KActiveIdleThemeSupportsXsp,
+        isXspSupported );
+
+    if( err != KErrNone || isXspSupported == EPSAiXspNotSupported)
+    {
+        // xSP is not supported so don't show the dialog. Also if we could not
+        // read the P&S key we won't show the dialog.
+        return ETrue;
+    }
+
+    RThread threadClient;
+
+    if( aMessage.Client( threadClient ) != KErrNone )
+        {
+        // In case of error we report that the client has connected us
+        // before in order not to show the dialog.
+        return ETrue;
+        }
+
+    RProcess processClient;
+
+    if( threadClient.Process(processClient) != KErrNone )
+        {
+        // Prevent dialog from showing in case of error.
+        return ETrue;
+        }
+
+    // See if client application is in ROM
+    TFileName fileName = processClient.FileName();
+    TPtr processDrive( fileName.LeftTPtr( KRomDrive().Length() ) );
+    processDrive.LowerCase();
+
+    if( processDrive == KRomDrive() )
+        {
+        // Don't show tip message for ROM clients.
+        return ETrue;
+        }
+
+    TUidType uidType = processClient.Type();
+
+    // UID3 of the client process
+    TUid uid3( uidType[ KUidIndex ] );
+    aUid = uid3;
+
+    // See if the uid is already in the list
+    if( iUids.Find( uid3 ) != KErrNotFound )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+void CAiScutExtServer::ShowTipMessage( TUid aUid )
+    {
+    if( iShowUids.Find( aUid ) == KErrNotFound )
+        {
+        iShowUids.Append( aUid );
+        iIdle->Cancel();
+        iIdle->Start( TCallBack( CAiScutExtServer::IdleCallBack, this ) );
+        }
+    }
+
+TInt CAiScutExtServer::IdleCallBack(TAny* aParam)
+    {
+    CAiScutExtServer* p = (CAiScutExtServer*) aParam;
+
+    p->iIdle->Cancel();
+
+    if( p->iIsForeground )
+        {
+        TRAP_IGNORE( p->DoShowTipMessageL() );
+        }
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// Shows a dialog
+// ---------------------------------------------------------------------------
+//
+void CAiScutExtServer::DoShowTipMessageL()
+    {
+    // Find out the name of the application
+    RApaLsSession als;
+    User::LeaveIfError( als.Connect() );
+    CleanupClosePushL( als );
+
+    while( iShowUids.Count() > 0 && !iIsTipMessageVisible)
+        {
+        TUid uid = iShowUids[ 0 ];
+        TApaAppInfo appInfo;
+        User::LeaveIfError( als.GetAppInfo( appInfo, uid ) );
+
+        // Prepare the parameters for the link function
+        HBufC* definitionBuf = HBufC::NewLC( KMaxDefinitionLength );
+        TPtr definition( definitionBuf->Des() );
+        definition.Format( KScutFormatApplication, uid );
+
+        TBool isInShortcuts = iObserver.HandleIsInShortcutsL( definition );
+
+        CLinkParams* params = new( ELeave) CLinkParams( *this, definitionBuf );
+        CleanupStack::Pop( definitionBuf );
+        CleanupStack::PushL( params );
+
+        TCallBack cb(CAiScutExtServer::LinkCallBack, params);
+
+        // Read and format tip message from the resource file
+        HBufC* messageBuf = StringLoader::LoadLC( R_AI_SC_QUERY_MODIFY_GS, appInfo.iCaption );
+        TPtr message( messageBuf->Des() );
+
+        // Don't show the tip if the application is already in shortcuts
+        if( !isInShortcuts )
+            {
+            iIsTipMessageVisible = ETrue;
+            CAknMessageQueryDialog* note = CAknMessageQueryDialog::NewL( message );
+            params->iNote = note;
+
+            note->SetLink( cb );
+            note->ExecuteLD( R_SCUT_XSPTIP_NOTE );
+            iIsTipMessageVisible = EFalse;
+            }
+
+        // Update the list so we don't show the tip message
+        // again for this application.
+        iUids.Append( uid );   // Ignore error
+        iShowUids.Remove( 0 );
+
+        // Save the list of uids to persistant memory.
+        WriteAppListL();
+
+        CleanupStack::PopAndDestroy( messageBuf );
+        CleanupStack::PopAndDestroy( params );
+        }
+
+    CleanupStack::PopAndDestroy();  // als
+    }
+
+// ---------------------------------------------------------------------------
+// Opens the shurtcuts settings view
+// ---------------------------------------------------------------------------
+//
+TInt CAiScutExtServer::LinkCallBack(TAny* aParam)
+    {
+    CLinkParams* params = (CLinkParams*) aParam;
+
+    TRAP_IGNORE(
+        params->iServer.iObserver.HandleIssuePutInShortcutsL(
+            params->iTargetDefinition->Des() );
+    );
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CAiScutExtServer::ResumeL( TAiTransitionReason aReason )
+    {
+    switch( aReason )
+        {
+        case EAiIdleForeground:
+            iIsForeground = ETrue;
+            DoShowTipMessageL();
+            break;
+
+        case EAiIdleBackground:
+            iIsForeground = EFalse;
+            break;
+
+        default:
+            break;
+        }
+    }
+
+// End of File.