diff -r f5050f1da672 -r 04becd199f91 javamanager/preinstaller/src.s60/preinstallcommsserver.cpp --- /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 +#include + +#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 &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; + } +}