--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/widgetmanager/src/wmstore.cpp Wed Sep 15 12:00:00 2010 +0300
@@ -0,0 +1,367 @@
+/*
+* Copyright (c) 2009 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:
+* Implementation of the store for WidgetManager
+*
+*/
+
+// INCLUDE FILES
+#include <aknlayoutscalable_apps.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+#include <AknUtils.h>
+#include <AknsDrawUtils.h>
+#include <AknBidiTextUtils.h>
+#include <AknsFrameBackgroundControlContext.h>
+#include <gulicon.h>
+#include <avkon.mbg>
+#include <widgetmanager.mbg>
+#include <apgcli.h>
+#include <apgtask.h>
+#include <widgetregistryclient.h> // widgetreqistry
+#include <bacline.h>
+#include <escapeutils.h>
+#include <browserlauncher.h>
+#include <centralrepository.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+#include "wmimageconverter.h"
+#include "wmstore.h"
+#include "wmcommon.h"
+#include "wmplugin.h"
+#include "wmresourceloader.h"
+#include "wmmaincontainer.h"
+#include "wmconfiguration.h"
+#include "wmprocessmonitor.h"
+
+// CONSTANTS
+
+// MEMBER FUNCTIONS
+
+// ---------------------------------------------------------
+// CWmStore::NewL
+// ---------------------------------------------------------
+//
+CWmStore* CWmStore::NewL( CWmConfItem& aWmConfItem,
+ CWmResourceLoader& aResourceLoader )
+ {
+ CWmStore* self = new (ELeave) CWmStore( aWmConfItem );
+ CleanupStack::PushL( self );
+ self->ConstructL( aResourceLoader );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CWmStore::~CWmStore
+// ---------------------------------------------------------
+//
+CWmStore::~CWmStore()
+ {
+ delete iIcon;
+ delete iMask;
+
+ // if MAknIconFileProvider was used to create image from icon string
+ // then it'll try accessing imageconverter after bitmap deletion
+ // for de-reference open file count, so it should be deleted last.
+ delete iImageConverter;
+ delete iProcessMonitor;
+ delete iBrowserLauncher;
+ }
+
+// ---------------------------------------------------------
+// CWmStore::CWmStore
+// ---------------------------------------------------------
+//
+CWmStore::CWmStore( CWmConfItem& aWmConfItem )
+ : iWmConfItem( aWmConfItem )
+ {
+ iIcon = NULL;
+ iMask = NULL;
+ iProcessMonitor = NULL;
+ iBrowserLauncher = NULL;
+ }
+
+// ---------------------------------------------------------
+// CWmStore::ConstructL
+// ---------------------------------------------------------
+//
+void CWmStore::ConstructL( CWmResourceLoader& aResourceLoader )
+ {
+ // start image converter for the icon
+ iImageConverter = CWmImageConverter::NewL();
+
+ // get size of icon for double large style list
+ TRect rect;
+ TAknLayoutRect layout;
+
+ layout.LayoutRect( rect,
+ AknLayoutScalable_Avkon::list_double_large_graphic_pane_g1( 0 ).LayoutLine() );
+
+ TSize iconSize( layout.Rect().Width(),
+ layout.Rect().Height() );
+
+ // create icon
+ TInt err = iImageConverter->HandleIconString(
+ iconSize,
+ iWmConfItem.Icon(),
+ iIcon,
+ iMask,
+ ETrue ); // force scaling for non scaleble icons
+
+ if ( err != KErrNone )
+ {
+ // lets use basket icon
+ // skin( 0x101f86e3 0x23f6 ):mif( z:\resource\apps\widgetmanager.mif 16388 16389 )
+ _LIT( KSkinMifIconFormat, "skin( 0x%x 0x%x ):mif( %S %d %d )");
+ const TInt KMaxIconDescriptorLength = 256;
+ TBuf<KMaxIconDescriptorLength> buf;
+ buf.Format( KSkinMifIconFormat(),
+ EAknsMajorGeneric, EAknsMinorGenericQgnPropLmShopping,
+ &aResourceLoader.IconFilePath(),
+ EMbmWidgetmanagerQgn_menu_shopping,
+ EMbmWidgetmanagerQgn_menu_shopping_mask );
+
+ iImageConverter->HandleIconString(
+ iconSize,
+ buf,
+ iIcon,
+ iMask,
+ EFalse ); // force scaling for non scaleble icons
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmStore::StoreIcon
+// ---------------------------------------------------------
+//
+CFbsBitmap* CWmStore::StoreIcon()
+ {
+ return iIcon;
+ }
+
+// ---------------------------------------------------------
+// CWmStore::StoreMask
+// ---------------------------------------------------------
+//
+CFbsBitmap* CWmStore::StoreMask()
+ {
+ return iMask;
+ }
+
+// ---------------------------------------------------------
+// CWmStore::Heading
+// ---------------------------------------------------------
+//
+const TDesC& CWmStore::Heading()
+ {
+ return iWmConfItem.Title();
+ }
+
+// ---------------------------------------------------------
+// CWmStore::Order
+// ---------------------------------------------------------
+//
+TInt CWmStore::Order() const
+ {
+ return iWmConfItem.Order();
+ }
+
+// ---------------------------------------------------------
+// CWmStore::ExecuteL
+// ---------------------------------------------------------
+//
+void CWmStore::ExecuteL()
+ {
+ if ( iWmConfItem.Id() == EOvi )
+ {
+ if ( !iProcessMonitor )
+ {
+ iProcessMonitor = CWmProcessMonitor::NewL();
+ }
+ // if process monitor is active laucher was allready started.
+ // this is for ignoring multiple presses
+ if ( !iProcessMonitor->IsActive() )
+ {
+ RunOviL();
+ }
+ }
+ else if ( iWmConfItem.Id() >= EStore1 && iWmConfItem.Id() < ELastItem )
+ {
+ // if this leaves it means we need to start browser
+ // becouse application info was not given
+ TRAPD( err, RunApplicationL() )
+ if ( err != KErrNone )
+ {
+ StartBrowserL( iWmConfItem.BrowserUrl() );
+ }
+ }
+ else
+ {
+ // Not supported
+ User::Leave( KErrGeneral );
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmStore::RunOviL
+// ---------------------------------------------------------
+//
+void CWmStore::RunOviL()
+ {
+ RApaLsSession session;
+ User::LeaveIfError( session.Connect() );
+ CleanupClosePushL( session );
+
+ //get app info
+ TApaAppInfo appInfo;
+ if ( session.GetAppInfo( appInfo, iWmConfItem.AppUid() ) == KErrNone )
+ {
+ // Form parameter
+ HBufC* param = HBufC::NewLC( iWmConfItem.AppParam().Length() );
+ param->Des().Copy( iWmConfItem.AppParam() );
+
+ // do the launch
+ RProcess process;
+ User::LeaveIfError( process.Create( appInfo.iFullName, *param ) );
+
+ iProcessMonitor->Monitor( process );
+ process.Resume();
+
+ CleanupStack::PopAndDestroy( param );
+ }
+
+ CleanupStack::PopAndDestroy( &session );
+ }
+
+// ---------------------------------------------------------
+// CWmStore::StartBrowserL
+// ---------------------------------------------------------
+//
+void CWmStore::StartBrowserL( const TDesC& aUrl )
+ {
+ // already running/or request launch or url is empty
+ if ( iBrowserLauncher || !aUrl.Length() ) { return; }
+
+ _LIT( KUrlPrefix, "4 ");
+ HBufC* param = HBufC::NewLC( aUrl.Length() + KUrlPrefix().Length() );
+ param->Des().Append( KUrlPrefix );
+ param->Des().Append( aUrl );
+
+ // Create browser launcher
+ CBrowserLauncher* launcher = CBrowserLauncher::NewLC();
+
+ // Asynchronous operation to launch the browser with given URL
+ launcher->LaunchBrowserEmbeddedL(
+ *param, NULL, this, NULL );
+
+ CleanupStack::Pop( launcher );
+ iBrowserLauncher = launcher;
+ launcher = NULL;
+
+ CleanupStack::PopAndDestroy( param );
+ }
+
+// ---------------------------------------------------------
+// CWmStore::HandleServerAppExit
+// ---------------------------------------------------------
+//
+void CWmStore::HandleServerAppExit( TInt aReason )
+ {
+ MAknServerAppExitObserver::HandleServerAppExit( aReason );
+ delete iBrowserLauncher;
+ iBrowserLauncher = NULL;
+ }
+
+// ---------------------------------------------------------
+// CWmStore::RunApplicationL
+// ---------------------------------------------------------
+//
+void CWmStore::RunApplicationL()
+ {
+ CWmConfiguration::TStoreAppType type = iWmConfItem.AppType();
+ if ( type == CWmConfiguration::EUnknown ||
+ type >= CWmConfiguration::EReserved )
+ {
+ // Leave if not found
+ User::Leave( KErrArgument );
+ }
+
+ switch( type )
+ {
+ case CWmConfiguration::ES60:
+ case CWmConfiguration::EQt:
+ {
+ StartProcessL( iWmConfItem.AppUid(),
+ iWmConfItem.AppParam() );
+ }
+ break;
+ case CWmConfiguration::ECwrt:
+ {
+ StartWidgetL( iWmConfItem.AppUid(),
+ iWmConfItem.AppParam() );
+ }
+ break;
+ case CWmConfiguration::EWrt:
+ {
+ StartWidgetL( iWmConfItem.AppUid(), KNullDesC );
+ }
+ break;
+ }
+ }
+
+// ---------------------------------------------------------
+// CWmStore::StartProcessL
+// ---------------------------------------------------------
+//
+void CWmStore::StartProcessL( TUid aUid, const TDesC& aParam )
+ {
+ RApaLsSession session;
+ User::LeaveIfError( session.Connect() );
+ CleanupClosePushL( session );
+
+ //get app info
+ TApaAppInfo appInfo;
+ User::LeaveIfError( session.GetAppInfo( appInfo, aUid ) );
+ // do the launch
+ RProcess process;
+ User::LeaveIfError( process.Create( appInfo.iFullName, aParam ) );
+ process.Resume();
+
+ CleanupStack::PopAndDestroy( &session );
+ }
+
+// ---------------------------------------------------------
+// CWmStore::StartWidgetL
+// ---------------------------------------------------------
+//
+void CWmStore::StartWidgetL( TUid aAppUid, const TDesC& aParams )
+ {
+ if ( aAppUid == KNullUid )
+ User::Leave( KErrArgument );
+
+ HBufC* params = aParams.AllocLC();
+
+ RApaLsSession appArc;
+ User::LeaveIfError( appArc.Connect() );
+ CleanupClosePushL( appArc );
+
+ TThreadId threadId;
+ User::LeaveIfError( appArc.StartDocument( *params, aAppUid, threadId ) );
+
+ CleanupStack::PopAndDestroy( &appArc );
+ CleanupStack::PopAndDestroy( params );
+ }
+
+// End of file