javamanager/preinstaller/src.s60/preinstallcommsserver.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/preinstaller/src.s60/preinstallcommsserver.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,185 @@
+/*
+* 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:  Comms server, part of OMJ S60 preinstaller process
+ *
+*/
+
+
+#include <iostream>
+#include <unistd.h>
+
+#include "comms.h"
+#include "logger.h"
+#include "javasymbianoslayer.h"
+#include "preinstallcommsserver.h"
+
+using namespace java::comms;
+using namespace std;
+
+PreinstallCommsServer::PreinstallCommsServer() : mRunning(0)
+{
+}
+
+PreinstallCommsServer::~PreinstallCommsServer()
+{
+    mJadFiles.clear();
+}
+
+void PreinstallCommsServer::setJadFiles(RPointerArray<HBufC> &aJadFiles)
+{
+    JELOG2(EJavaPreinstaller);
+
+    // jad index will contain the number of valid jad file urls
+    mJadIndex = 0;
+    // clear the old jad file paths if any
+    mJadFiles.clear();
+
+    int nPointers = aJadFiles.Count();
+    mJadFiles.reserve(nPointers);
+
+    // index is decremented because mJadIndex will also be decremented when
+    // installing -> total effect is that jad files will be given to
+    // Java Installer in the original order
+    for (int i = nPointers - 1; i > -1; i--)
+    {
+        HBufC* pBuf = aJadFiles[i];
+
+        if (NULL == pBuf)
+        {
+            // skip this NULL pointer
+            continue;
+        }
+
+        TPtr16 ptrName(pBuf->Des());
+        // Convert each HBufC to std:wstring before adding to mJadFiles
+        mJadFiles.push_back(std::wstring(desToWstring(ptrName)));
+        mJadIndex++;
+    }
+
+    LOG1(EJavaPreinstaller, EInfo, "PreinstallCommsServer: number of Jad files = %d", mJadIndex);
+}
+
+int PreinstallCommsServer::start()
+{
+    LOG(EJavaPreinstaller, EInfo,
+        "PreinstallCommsServer:start called");
+
+    if (mRunning == 0)
+    {
+        mRunning = 1;
+        mComms.registerDefaultListener(this);
+        return mComms.start(IPC_ADDRESS_JAVA_PREINSTALLER_C);
+    }
+    else
+    {
+        WLOG(EJavaPreinstaller,
+             "PreinstallCommsServer:start called but server is already running");
+        return 0;
+    }
+}
+
+int PreinstallCommsServer::stop()
+{
+    if (mRunning > 0)
+    {
+        mRunning = 0;
+        mComms.unregisterDefaultListener(this);
+        return mComms.stop();
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+/**
+ * Communicates with Java Installer. The following messages are used.
+ *
+ * Message Name        Id      Contents
+ *
+ * Get Next Operation  500     None
+ *
+ * Operation           501     int operation   (install = 0, uninstall = 1, exit = 2)
+ *                             String url      (present if operation = install)
+ *                             String uid      (present if operation = uninstall)
+ *
+ * Operation Result    502     int operation   (install = 0, uninstall = 1, exit = 2)
+ *                             int result      (ok = 0, error codes are negative)
+ *                             int uidCount    (present if operation = install, value = uids.length)
+ *                             String[] uids   (present if operation = install)
+ */
+void PreinstallCommsServer::processMessage(CommsMessage& aMessage)
+{
+    LOG1(EJavaPreinstaller, EInfo, "processMessage, sender    = %d", aMessage.getSender());
+    LOG1(EJavaPreinstaller, EInfo, "processMessage, messageId = %d", aMessage.getMessageId());
+    LOG1(EJavaPreinstaller, EInfo, "processMessage, messageRef= %d", aMessage.getMessageRef());
+
+    switch (aMessage.getMessageId())
+    {
+    case GET_NEXT_OPERATION_MESSAGE_ID:
+    {
+        // Java Installer asks for the next install operation.
+        // Reply with 'Operation' message.
+
+        CommsMessage reply;
+        reply.replyTo(aMessage);
+
+        reply.setMessageId(OPERATION_MESSAGE_ID);
+
+        mJadIndex--;
+        if (mJadIndex <= -1)
+        {
+            // all Jad files have been handled, ask Java Installer to exit
+            reply << EXIT_OPERATION;
+
+            // Java Installer sends reply to 'exit' message and then
+            // it exits which causes the completion of the CSilentMIDletInstall active object
+        }
+        else
+        {
+            // ask Java Installer to install next
+            reply << INSTALL_OPERATION << mJadFiles[mJadIndex];
+        }
+
+        // Ignore possible error code returned by send() because Comms
+        // logs the error situations
+        mComms.send(reply);
+    }
+    break;
+
+    case OPERATION_RESULT_MESSAGE_ID:
+    {
+        // Log the result of the operation. Preinstaller does not need
+        // the Uids of the installed Java Applications so they are not
+        // parsed.
+        int operation;
+        int result;
+
+        aMessage >> operation >> result;
+
+        LOG2(EJavaPreinstaller, EInfo,
+             "PreinstallCommsServer: operation = %d, result = %d", operation, result);
+    }
+    break;
+
+    default:
+    {
+        // Unknown message. Ignore it.
+        WLOG1(EJavaPreinstaller,
+              "PreinstallCommsServer: Unknown message received. Msg Id = %d",
+              aMessage.getMessageId());
+    }
+    break;
+    }
+}