diff -r e8e63152f320 -r 2a9601315dfc javamanager/javainstaller/javasifplugin/src/javasifplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javamanager/javainstaller/javasifplugin/src/javasifplugin.cpp Mon May 03 12:27:20 2010 +0300 @@ -0,0 +1,798 @@ +/* +* 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: This file contains the implementation of CJavaSifPlugin +* class member functions. ECOM Plugin for USIF to handle +* install, uninstall, get component info requests. +* +*/ + + +#include +#include +#include +#include +#include +#include + +#include "comms.h" +#include "commsmessage.h" +#include "commsclientendpoint.h" +#include "javasifplugin.h" +#include "javauids.h" +#include "logger.h" +#include "javaoslayer.h" +#include "javaprocessconstants.h" +#include "javasymbianoslayer.h" +#include "runtimeexception.h" + + +using namespace Java::Installer; +using namespace java::util; +using namespace java::comms; + +_LIT(KPrivateDataCage, "\\private\\"); +_LIT(KInboxDataCage, "\\private\\1000484b\\"); +_LIT(KJavaInstallerDataCage, "\\private\\102033e6\\"); +_LIT(KJavaInstallerTmp, "\\private\\102033E6\\installer\\tmp\\"); +_LIT(KAnyExtension, ".*"); + + +// ============================ MEMBER FUNCTIONS =============================== + +CJavaSifPlugin* CJavaSifPlugin::NewL() +{ + CJavaSifPlugin* self = new(ELeave) CJavaSifPlugin(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; +} + +CJavaSifPlugin::~CJavaSifPlugin() +{ + iRFs.Close(); + + TInt nHandles = iHandlesToClose.Count(); + while (nHandles > 0) + { + nHandles--; + iHandlesToClose[nHandles].Close(); + } + iHandlesToClose.Reset(); + + delete iResultsServer; + iResultsServer = NULL; + + delete iDummyResults; + iDummyResults = NULL; + + delete iDummyInfo; + iDummyInfo = NULL; +} + +CJavaSifPlugin::CJavaSifPlugin() +{ +} + +void CJavaSifPlugin::ConstructL() +{ + User::LeaveIfError(iRFs.Connect()); + User::LeaveIfError(iRFs.ShareProtected()); + iResultsServer = NULL; + iDummyResults = COpaqueNamedParams::NewL(); + iDummyInfo = CComponentInfo::NewL(); +} + +void CJavaSifPlugin::GetComponentInfo( + const TDesC& aFileName, + const TSecurityContext& aSecurityContext, + CComponentInfo& aComponentInfo, + TRequestStatus& aStatus) +{ + RFile fileHandle; + TInt err = fileHandle.Open(iRFs, aFileName, EFileShareReadersOnly | EFileRead); + if (KErrNone != err) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin::GetComponentInfo Opening file for reading failed with error %d", + err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + GetComponentInfo(fileHandle, aSecurityContext, aComponentInfo, aStatus); + fileHandle.Close(); +} + +void CJavaSifPlugin::GetComponentInfo( + RFile& aFileHandle, + const TSecurityContext& /* aSecurityContext */, + CComponentInfo& aComponentInfo, + TRequestStatus& aStatus) +{ + RProcess rJavaInstaller; + TFileName fileName; + TBuf<1536> commandLine; + + // Build command line used to pass all necessary info to Java Installer + std::auto_ptr installerStarterDll( + stringToDes(java::runtime::JAVA_INSTALLER_STARTER_DLL)); + commandLine = installerStarterDll->Des(); + commandLine.Append(_L(" componentinfo")); + + // Ask Java Installer to send component info back + // as Comms message. 11000 is IPC_ADDRESS_JAVA_SIF_PLUGIN_C Comms endpoint + // that our ResultsServer will listen to. + commandLine.Append(_L(" -commsresult=11000")); + + TInt err = aFileHandle.FullName(fileName); + + // Java Installer does not have AllFiles capability. + // So if the .jad/.jar file is in the private data cage of + // Remove Application Management system, it must be copied + // to the private data cage of Java Installer in this + // plugin which is executed in process which hopefully has + // AllFiles capability. + TRAP(err, CopyFilesIfNeededL(fileName)); + if (KErrNone != err) + { + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + // Check whether the file is .jad or .jar + RApaLsSession apaSession; + err = apaSession.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin::GetComponentInfo RApaLsSession Connect error %d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + TDataType jadFileMimeType(_L8("text/vnd.sun.j2me.app-descriptor")); + TBool isJad = EFalse; + err = apaSession.RecognizeSpecificData(aFileHandle, jadFileMimeType, isJad); + apaSession.Close(); + if (KErrNone != err) + { + // Just log the error + ELOG1(EJavaInstaller, + "CJavaSifPlugin::GetComponentInfo RApaLsSession RecognizeSpecificData error %d", + err); + } + if (isJad) + { + // Installation should be started from JAD file + commandLine.Append(_L(" -jad=")); + } + else + { + // from JAR file + commandLine.Append(_L(" -jar=")); + } + // Filename parameter must be surrounded in double quotes to + // ensure that spaces in filename are passed correctly. + commandLine.Append(_L("\"")); + commandLine.Append(fileName); + commandLine.Append(_L("\"")); + + // Start JavaInstaller + std::auto_ptr installerProcess( + stringToDes(java::runtime::JAVA_PROCESS)); + err = rJavaInstaller.Create(installerProcess->Des(), commandLine); + if (KErrNone == err) + { + // Destroy old Comms server if it exists + delete iResultsServer; + iResultsServer = NULL; + // Start new Comms server that receives component info and sets it to + // to aComponentInfo. + iResultsServer = new ResultsServer(*iDummyResults, aComponentInfo); + if (NULL == iResultsServer) + { + err = KErrNoMemory; + } + else + { + // Start the server + err = iResultsServer->start(); + } + if (KErrNone != err) + { + // server cannot be started + rJavaInstaller.Close(); + ELOG1(EJavaInstaller, + "CJavaSifPlugin::GetComponentInfo: Cannot start results server, err %d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + // The status of the component info operation == the exit status of Java Installer + // It will be passed to the asynch caller through aStatus + rJavaInstaller.Logon(aStatus); + } + else + { + rJavaInstaller.Close(); + ELOG1(EJavaInstaller, + "CJavaSifPlugin::GetComponentInfo: starting JavaInstaller failed, err=%d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + rJavaInstaller.Resume(); + + // Do NOT close rJavaInstaller now -> the caller gets notification when the + // process actually closes. + iHandlesToClose.Append(rJavaInstaller); +} + +void CJavaSifPlugin::Install( + const TDesC& aFileName, + const TSecurityContext& aSecurityContext, + const COpaqueNamedParams& aArguments, + COpaqueNamedParams& aResults, + TRequestStatus& aStatus) +{ + RFile fileHandle; + TInt err = fileHandle.Open(iRFs, aFileName, EFileShareReadersOnly | EFileRead); + if (KErrNone != err) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin::Install Opening file for reading failed with error %d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + Install(fileHandle, aSecurityContext, aArguments, aResults, aStatus); + fileHandle.Close(); +} + +void CJavaSifPlugin::Install( + RFile& aFileHandle, + const TSecurityContext& aSecurityContext, + const COpaqueNamedParams& aArguments, + COpaqueNamedParams& aResults, + TRequestStatus& aStatus) +{ + RProcess rJavaInstaller; + TFileName fileName; + // Max two path names and some options -> 1536 is enough + TBuf<1536> commandLine; + + // Build command line used to pass all necessary info to Java Installer + std::auto_ptr installerStarterDll( + stringToDes(java::runtime::JAVA_INSTALLER_STARTER_DLL)); + commandLine = installerStarterDll->Des(); + commandLine.Append(_L(" install")); + + // Check whether this is silent installation + TInt silentInstall = 0; + TRAP_IGNORE(aArguments.GetIntByNameL(KSifInParam_InstallSilently, silentInstall)); + if (silentInstall) + { + // Silent installation requires TrustedUI capability + if (!aSecurityContext.HasCapability(ECapabilityTrustedUI)) + { + ELOG(EJavaInstaller, + "CJavaSifPlugin::Install The caller did not have TrustedUI capability"); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, KErrPermissionDenied); + return; + } + + commandLine.Append(_L(" -silent")); + } + + TBool paramFound = EFalse; + TInt intValue = 0; + TDesC desValue = KNullDesC; + + // KSifInParam_Drive -> -drive=install_target_drive (A, B, C, ..., Z) + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_Drive, intValue)); + if (paramFound) + { + // Value 0 is 'A:' drive and value 25 is 'Z:' drive + if ((intValue > -1) && (intValue < 26)) + { + commandLine.Append(_L(" -drive=")); + TChar drive('A'); + drive += intValue; + commandLine.Append(drive); + } + else + { + WLOG1(EJavaInstaller, + "CJavaSifPlugin::Install Ignoring illegal KSifInParam_Drive param (value %d)", + intValue); + } + } + + // KSifInParam_PerformOCSP Yes/No/AskUser -> -ocsp=yes|no + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_PerformOCSP, intValue)); + if (paramFound) + { + if (intValue == 0) // Yes + { + commandLine.Append(_L(" -ocsp=yes")); + } + else if (intValue == 1) // No + { + commandLine.Append(_L(" -ocsp=no")); + } + // AskUser is not supported + } + + // KSifInParam_IgnoreOCSPWarnings Yes/No/AskUser -> -ignore_ocsp_warnings=yes|no + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_IgnoreOCSPWarnings, intValue)); + if (paramFound) + { + if (intValue == 0) // Yes + { + commandLine.Append(_L(" -ignore_ocsp_warnings=yes")); + } + else if (intValue == 1) // No + { + commandLine.Append(_L(" -ignore_ocsp_warnings=no")); + } + // AskUser is not supported + } + + // KSifInParam_AllowUpgrade Yes/No/AskUser -> -upgrade=yes|no + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_AllowUpgrade, intValue)); + if (paramFound) + { + if (intValue == 0) // Yes + { + commandLine.Append(_L(" -upgrade=yes")); + } + else if (intValue == 1) // No + { + commandLine.Append(_L(" -upgrade=no")); + } + // AskUser is not supported + } + + // KSifInParam_AllowUntrusted Yes/No/AskUser -> -untrusted=yes|no + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_AllowUntrusted, intValue)); + if (paramFound) + { + if (intValue == 0) // Yes + { + commandLine.Append(_L(" -untrusted=yes")); + } + else if (intValue == 1) // No + { + commandLine.Append(_L(" -untrusted=no")); + } + // AskUser is not supported + } + + // KSifInParam_AllowOverwrite Yes/No/AskUser -> -overwrite=yes|no + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_AllowOverwrite, intValue)); + if (paramFound) + { + if (intValue == 0) // Yes + { + commandLine.Append(_L(" -overwrite=yes")); + } + else if (intValue == 1) // No + { + commandLine.Append(_L(" -overwrite=no")); + } + // AskUser is not supported + } + + // KSifInParam_AllowDownload Yes/No/AskUser -> -download=yes|no + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_AllowDownload, intValue)); + if (paramFound) + { + if (intValue == 0) // Yes + { + commandLine.Append(_L(" -download=yes")); + } + else if (intValue == 1) // No + { + commandLine.Append(_L(" -download=no")); + } + // AskUser is not supported + } + + // KSifInParam_UserName -> -username=download_username + TRAP_IGNORE(desValue = aArguments.StringByNameL(KSifInParam_UserName)); + if (desValue.Length() > 0) + { + commandLine.Append(_L(" -username=")); + commandLine.Append(desValue); + } + + // KSifInParam_Password -> -password=download_password + TRAP_IGNORE(desValue = aArguments.StringByNameL(KSifInParam_Password)); + if (desValue.Length() > 0) + { + commandLine.Append(_L(" -password=")); + commandLine.Append(desValue); + } + + // KSifInParam_SourceUrl -> -sourceurl=original (HTTP) URL of the JAD or JAR file + TRAP_IGNORE(desValue = aArguments.StringByNameL(KSifInParam_SourceUrl)); + if (desValue.Length() > 0) + { + commandLine.Append(_L(" -sourceurl=")); + commandLine.Append(desValue); + } + + // KSifInParam_IAP -> -iap=IAP_ID (internet access point id) + TRAP_IGNORE(paramFound = aArguments.GetIntByNameL(KSifInParam_IAP, intValue)); + if (paramFound) + { + commandLine.Append(_L(" -iap=")); + commandLine.AppendNum(intValue); + } + + // KSifInParam_Charset -> -charset=Internet-standard character set name + TRAP_IGNORE(desValue = aArguments.StringByNameL(KSifInParam_Charset)); + if (desValue.Length() > 0) + { + commandLine.Append(_L(" -charset=")); + commandLine.Append(desValue); + } + + + // Ask Java Installer to send installation results back + // as Comms message. 11000 is IPC_ADDRESS_JAVA_SIF_PLUGIN_C Comms endpoint + // that our ResultsServer will listen to. + commandLine.Append(_L(" -commsresult=11000")); + + TInt err = aFileHandle.FullName(fileName); + + // Java Installer does not have AllFiles capability. + // So if the .jad/.jar file is in the private data cage of + // Remove Application Management system, it must be copied + // to the private data cage of Java Installer in this + // plugin which is executed in process which hopefully has + // AllFiles capability. + TRAP(err, CopyFilesIfNeededL(fileName)); + if (KErrNone != err) + { + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + // Check whether the file is .jad or .jar + RApaLsSession apaSession; + err = apaSession.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin::Install RApaLsSession Connect error %d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + TDataType jadFileMimeType(_L8("text/vnd.sun.j2me.app-descriptor")); + TBool isJad = EFalse; + err = apaSession.RecognizeSpecificData(aFileHandle, jadFileMimeType, isJad); + apaSession.Close(); + if (KErrNone != err) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin::Install RApaLsSession RecognizeSpecificData error %d", err); + } + if (isJad) + { + // Installation should be started from JAD file + commandLine.Append(_L(" -jad=")); + } + else + { + // from JAR file + commandLine.Append(_L(" -jar=")); + } + // Filename parameter must be surrounded in double quotes to + // ensure that spaces in filename are passed correctly. + commandLine.Append(_L("\"")); + commandLine.Append(fileName); + commandLine.Append(_L("\"")); + + // Start JavaInstaller + std::auto_ptr installerProcess( + stringToDes(java::runtime::JAVA_PROCESS)); + err = rJavaInstaller.Create(installerProcess->Des(), commandLine); + if (KErrNone == err) + { + // Destroy old Comms server if it exists + delete iResultsServer; + iResultsServer = NULL; + // Start new Comms server that receives component ids, sets them + // to aResults. + iResultsServer = new ResultsServer(aResults, *iDummyInfo); + if (NULL == iResultsServer) + { + err = KErrNoMemory; + } + else + { + // Start the server + err = iResultsServer->start(); + } + if (KErrNone != err) + { + // server cannot be started + rJavaInstaller.Close(); + ELOG1(EJavaInstaller, + "CJavaSifPlugin::Install: Cannot start results server, err %d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + // The status of the install operation == the exit status of Java Installer + // It will be passed to the asynch caller through aStatus + rJavaInstaller.Logon(aStatus); + } + else + { + rJavaInstaller.Close(); + ELOG1(EJavaInstaller, + "CJavaSifPlugin::Install: starting JavaInstaller failed, err=%d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + rJavaInstaller.Resume(); + + // Do NOT close rJavaInstaller now -> the caller gets notification when the + // process actually closes. + iHandlesToClose.Append(rJavaInstaller); +} + +void CJavaSifPlugin::Uninstall( + TComponentId aComponentId, + const TSecurityContext& aSecurityContext, + const COpaqueNamedParams& aArguments, + COpaqueNamedParams& /* aResults */, + TRequestStatus& aStatus) +{ + RProcess rJavaInstaller; + TFileName fileName; + // Max one uid and some options -> 256 is enough + TBuf<256> commandLine; + + // Build command line used to pass all necessary info to Java Installer + std::auto_ptr installerStarterDll( + stringToDes(java::runtime::JAVA_INSTALLER_STARTER_DLL)); + commandLine = installerStarterDll->Des(); + commandLine.Append(_L(" uninstall")); + + commandLine.Append(_L(" -cid=")); + commandLine.AppendNum(aComponentId); + + // Check whether this is silent uninstallation + TInt silentInstall = 0; + TRAP_IGNORE(aArguments.GetIntByNameL(KSifInParam_InstallSilently, silentInstall)); + if (silentInstall) + { + // Silent uninstallation requires TrustedUI capability + if (!aSecurityContext.HasCapability(ECapabilityTrustedUI)) + { + ELOG(EJavaInstaller, + "CJavaSifPlugin::Uninstall The caller did not have TrustedUI capability"); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, KErrPermissionDenied); + return; + } + + commandLine.Append(_L(" -silent")); + } + + // No need to start iResultsServer because Uninstall() does not + // return anything usefull in aResults. We could return extended + // error code there. + + // start JavaInstaller + std::auto_ptr installerProcess( + stringToDes(java::runtime::JAVA_PROCESS)); + TInt err = rJavaInstaller.Create(installerProcess->Des(), commandLine); + if (KErrNone == err) + { + // the exit status of Java Installer will be passed to + // the asynch caller through aStatus + rJavaInstaller.Logon(aStatus); + + rJavaInstaller.Resume(); + } + else + { + rJavaInstaller.Close(); + ELOG1(EJavaInstaller, + "CJavaSifPlugin::Uninstall: starting JavaInstaller failed, err=%d", err); + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, err); + return; + } + + // Do NOT close rJavaInstaller now -> the caller gets notification when the + // process actually closes. + iHandlesToClose.Append(rJavaInstaller); +} + +void CJavaSifPlugin::Activate( + TComponentId /* aComponentId */, + const TSecurityContext& /* aSecurityContext */, + TRequestStatus& aStatus) +{ + // java applications are always active + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, KErrNone); + return; +} + +void CJavaSifPlugin::Deactivate( + TComponentId /* aComponentId */, + const TSecurityContext& /* aSecurityContext */, + TRequestStatus& aStatus) +{ + // java applications are always active + TRequestStatus *statusPtr(&aStatus); + User::RequestComplete(statusPtr, KErrNotSupported); + return; +} + +void CJavaSifPlugin::CancelOperation() +{ + // Send cancel message to Java Installer + + // Check whether there is anything to cancel + if (iHandlesToClose.Count() < 1) + { + // No Java Installer process running, do nothing + WLOG(EJavaInstaller, + "CJavaSifPlugin::CancelOperation: Cancel called but there is no operation to cancel"); + return; + } + + try + { + CommsMessage message; + message.setModuleId(PLUGIN_ID_SAMPLE_C); + message.setReceiver(IPC_ADDRESS_JAVA_INSTALLER_SERVER_C); + message.setSender(IPC_ADDRESS_JAVA_SIF_PLUGIN_C); + message.setMessageId(INSTALLER_CANCEL_MESSAGE_ID); + + CommsMessage replyMessage; + int timeout = 10; // 10 seconds + + CommsClientEndpoint comms; + int err = comms.connect(IPC_ADDRESS_JAVA_INSTALLER_SERVER_C); + if (KErrNone == err) + { + err = comms.sendReceive(message, replyMessage, timeout); + } + else + { + // Cannot connect to Java Installer Comms end point, + // for example Java Installer is still starting up or + // already exiting + WLOG1(EJavaInstaller, + "CJavaSifPlugin:CancelOperation: Cannot connect to Java Installer " + "Comms end point, err %d", err); + return; + } + if (err != 0) + { + // Sending message to Java Installer failed. + ELOG1(EJavaInstaller, + "CJavaSifPlugin:CancelOperation: Cannot send message to Java Installer, err %d", + err); + // Ignore possible errors in disconnect + (void)comms.disconnect(); + return; + } + + // Ignore the cancel result returned in replyMessage + // because current SIF API does not return cancel result + + // Ignore possible errors in disconnect + (void)comms.disconnect(); + } + catch (ExceptionBase& e) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin: Send cancel msg failed: ExceptionBase caught: %s ", + e.toString().c_str()); + return; + } + catch (std::exception& e) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin: Send cancel msg failed: Exception %s caught", e.what()); + return; + } + + // It takes some time before Java Installer had really cancelled + // the operation and exited. Wait for it to happen because this function + // must return only after the original asynchronous call is completed. + TRequestStatus status; + // This array contains process handles for all Java Installer processes + // started from this sif plugin. The last handle is the active one. + // Check if it is still running + if (iHandlesToClose[iHandlesToClose.Count()-1].ExitReason() != 0) + { + // Process has already closed + return; + } + // Wait until it exits + iHandlesToClose[iHandlesToClose.Count()-1].Logon(status); + User::WaitForRequest(status); + // Ignore the exit status of Java Installer because current SIF API + // does not return cancel result + + return; +} + +void CJavaSifPlugin::CopyFilesIfNeededL(TFileName &aFileName) +{ + // Check if the file is in the private data cage of some process + TInt idx = aFileName.FindF(KPrivateDataCage); + if ((idx != KErrNotFound) && (idx < 3)) + { + // In case of device Inbox or Java Installer itself do nothing + if ((aFileName.FindF(KInboxDataCage) != KErrNotFound) || + (aFileName.FindF(KJavaInstallerDataCage) != KErrNotFound)) + { + return; + } + + // Copy ALL files with the same base filename as aFileName + // to Java Installer tmp dir so that both .jad file and + // the corresponding .jar file are copied. + // (aFileName is \., copy \.* + // to Java Installer tmp dir.) + TParse fp; + iRFs.Parse(aFileName, fp); + + CFileMan* fm = CFileMan::NewL(iRFs); + TFileName filesToCopy = fp.DriveAndPath(); + filesToCopy.Append(fp.Name()); + filesToCopy.Append(KAnyExtension); + TInt err = fm->Copy(filesToCopy, KJavaInstallerTmp, CFileMan::ERecurse); + delete fm; + if (KErrNone != err) + { + ELOG1(EJavaInstaller, + "CJavaSifPlugin::CopyFilesIfNeededL: copying files " + "to Java Installer data cage failed, err=%d", err); + User::Leave(err); + } + + // aFileName must point to the copy of the file + aFileName = fp.Drive(); + aFileName.Append(KJavaInstallerTmp); + aFileName.Append(fp.NameAndExt()); + } + + return; +} + +// End of File