videocollection/videocollectionview/src/videooperatorservice_p.cpp
changeset 55 4bfa887905cf
child 67 72c709219fcd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videocollection/videocollectionview/src/videooperatorservice_p.cpp	Mon Aug 23 14:27:29 2010 +0300
@@ -0,0 +1,245 @@
+/*
+* Copyright (c) 2008 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:   VideoOperatorServicePrivate class implementation.
+*
+*/
+
+// Version : 
+
+// INCLUDE FILES
+#include "videooperatorservice_p.h"
+#include "videocollectionviewutils.h"
+#include "videocollectioncenrepdefs.h"
+#include "videocollectiontrace.h"
+
+#include <qdesktopservices.h>
+#include <qurl.h>
+#include <e32base.h>
+#include <coemain.h>
+#include <apgcli.h>
+#include <apaid.h>
+#include <apgtask.h>
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+VideoOperatorServicePrivate::VideoOperatorServicePrivate() :
+    mProcess(0)
+{
+    
+}
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+VideoOperatorServicePrivate::~VideoOperatorServicePrivate()
+{   
+    if(mProcess)
+    {
+        disconnect(mProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
+                this, SLOT(processFinished(int, QProcess::ExitStatus)));
+        
+        disconnect(mProcess, SIGNAL(error(QProcess::ProcessError)), 
+                this, SLOT(processError(QProcess::ProcessError)));        
+        mProcess->close();
+    }
+    delete mProcess;
+}
+
+// ---------------------------------------------------------------------------
+// load
+// ---------------------------------------------------------------------------
+//
+bool VideoOperatorServicePrivate::load(int titleKey, int iconKey, int serviceUriKey, int appUidKey)
+{
+    FUNC_LOG;
+    VideoCollectionViewUtils& utils = VideoCollectionViewUtils::instance();
+    
+    mTitle = utils.getCenRepStringValue(titleKey);
+    mIconResource = utils.getCenRepStringValue(iconKey);
+    mServiceUri = utils.getCenRepStringValue(serviceUriKey);
+    mApplicationUid = utils.getCenRepIntValue(appUidKey);
+    
+    // Icon is required, either service uri or application uid is required.
+    if(mIconResource.isEmpty() || (mServiceUri.isEmpty() && mApplicationUid <= 0))
+    {
+        return false;
+    }
+    
+    return true;
+}
+
+// ---------------------------------------------------------------------------
+// title
+// ---------------------------------------------------------------------------
+//
+const QString VideoOperatorServicePrivate::title() const
+{
+    return mTitle;
+}
+
+// ---------------------------------------------------------------------------
+// iconResource
+// ---------------------------------------------------------------------------
+//
+const QString VideoOperatorServicePrivate::iconResource() const
+{
+    return mIconResource;
+}
+
+// ---------------------------------------------------------------------------
+// launchService
+// ---------------------------------------------------------------------------
+//
+void VideoOperatorServicePrivate::launchService()
+{
+    FUNC_LOG;
+    
+    if(!mServiceUri.isEmpty())
+    {
+        INFOQSTR_1("VideoOperatorServicePrivate::launchService() starting url: %S", mServiceUri);
+        QDesktopServices::openUrl(QUrl(mServiceUri));
+    }
+    else
+    {
+        INFO_1("VideoOperatorServicePrivate::launchService() starting application 0x%x", mApplicationUid);
+        TRAPD(err, startApplicationL(TUid::Uid(mApplicationUid)));
+        if(err)
+        {
+            INFO_1("VideoOperatorServicePrivate::launchService() failed to start, error: %d", err);
+        }
+    }
+}
+
+// ---------------------------------------------------------------------------
+// getApplicationFilenameL
+// ---------------------------------------------------------------------------
+//
+QString VideoOperatorServicePrivate::getApplicationFilenameL(const TUid uid)
+{
+    FUNC_LOG;
+
+    // TApaAppInfo size is greater then 1024 bytes
+    // so its instances should not be created on the stack.
+    TApaAppInfo* appInfo = new (ELeave) TApaAppInfo;
+    CleanupStack::PushL(appInfo);
+    RApaLsSession appArcSession;
+    User::LeaveIfError(appArcSession.Connect());
+    CleanupClosePushL<RApaLsSession>(appArcSession);
+
+    User::LeaveIfError(appArcSession.GetAppInfo(*appInfo, uid));
+
+    QString fullName((QChar*)appInfo->iFullName.Ptr(), appInfo->iFullName.Length()); 
+    
+    CleanupStack::PopAndDestroy(&appArcSession);
+    CleanupStack::PopAndDestroy(appInfo);
+    
+    return fullName;
+}
+
+// ---------------------------------------------------------------------------
+// bringApplicationToForeground
+// ---------------------------------------------------------------------------
+//
+bool VideoOperatorServicePrivate::bringApplicationToForeground(const TUid uid)
+{
+    FUNC_LOG;
+    
+    CCoeEnv* coe = CCoeEnv::Static();
+    bool ret = false;
+    if(coe)
+    {
+        TApaTaskList taskList(coe->WsSession());
+        TApaTask task(taskList.FindApp(uid));
+        
+        if(task.Exists())
+        {
+            INFO("VideoOperatorServicePrivate::processFinished() task found.");
+            task.BringToForeground();
+            ret = true;
+        }
+    }
+    return ret;
+}
+
+// ---------------------------------------------------------------------------
+// startApplicationL
+// ---------------------------------------------------------------------------
+//
+void VideoOperatorServicePrivate::startApplicationL(const TUid uid)
+{
+    FUNC_LOG;
+    
+    // Process handle already exists, try to bring app to foreground.
+    if(mProcess)
+    {
+        if(bringApplicationToForeground(uid))
+        {
+            // App brought to foreground, all done.
+            return;
+        }
+        // Application is not running, cleanup previous process.
+        disconnect(mProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
+                this, SLOT(processFinished(int, QProcess::ExitStatus)));
+        
+        disconnect(mProcess, SIGNAL(error(QProcess::ProcessError)), 
+                this, SLOT(processError(QProcess::ProcessError)));
+
+        delete mProcess;
+        mProcess = 0;
+    }
+    
+    // Create new process and start it.
+    mProcess = new QProcess();
+
+    if(!connect(mProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
+            this, SLOT(processFinished(int, QProcess::ExitStatus)), Qt::UniqueConnection) ||
+       !connect(mProcess, SIGNAL(error(QProcess::ProcessError)), 
+            this, SLOT(processError(QProcess::ProcessError)), Qt::UniqueConnection))
+    {
+        INFO("VideoOperatorServicePrivate::startApplicationL() failed to connect signals");
+        User::Leave(KErrGeneral);
+    }
+
+    QString appName = getApplicationFilenameL(uid);
+    if(!appName.isEmpty())
+    {
+        mProcess->start(appName);
+    }
+}
+
+// ---------------------------------------------------------------------------
+// processFinished
+// ---------------------------------------------------------------------------
+//
+void VideoOperatorServicePrivate::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
+{
+    Q_UNUSED(exitCode);
+    Q_UNUSED(exitStatus);
+    INFO_2("VideoOperatorServicePrivate::processFinished() code: %d, status: %d", exitCode, exitStatus);
+}
+
+// ---------------------------------------------------------------------------
+// processError
+// ---------------------------------------------------------------------------
+//
+void VideoOperatorServicePrivate::processError(QProcess::ProcessError error)
+{
+    Q_UNUSED(error);
+    INFO_1("VideoOperatorServicePrivate::processError() error: %d", error);
+}
+
+// End of file.