javamanager/javainstaller/installer/src.s60/jadjarmatcher/jadjarmatcher.cpp
branchRCL_3
changeset 14 04becd199f91
child 24 6c158198356e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javainstaller/installer/src.s60/jadjarmatcher/jadjarmatcher.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,246 @@
+/*
+* 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:  The JNI code for Java Installer component
+*                JadJarMatcher.
+*
+*/
+
+
+#include <e32std.h>
+#include <f32file.h>
+
+#include "com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher.h"
+#include "jadjarmatcherscanfrominbox.h"
+#include "javacommonutils.h"
+#include "logger.h"
+
+// NAMESPACE DECLARATION
+using namespace java;
+
+/**
+ * See JNI methods __1findJadFilesFromInbox, __1findJarFilesFromInbox.
+ * This is just internal wrapper method for handling Leaves.
+ */
+jint FindFilesFromInboxL
+(JNIEnv *aEnv, jclass, jstring aStartFilename, jobject aFiles, jobject aHandles, jobject aTimestamps, TBool aJarScan)
+{
+    LOG1(EJavaInstaller, EInfo, "FindFilesFromInboxL: aJarScan %d", aJarScan);
+
+    RArray<RFile> resultArray;
+    CJadJarMatcherScanFromInbox* scanInbox =
+        new(ELeave) CJadJarMatcherScanFromInbox();
+    CleanupStack::PushL(scanInbox);
+
+    // Copy the characters in jstrings to Symbian descriptors so that
+    // they can be used in S60 code.
+    const jchar* startFilename = aEnv->GetStringChars(aStartFilename, 0);
+    if (NULL == startFilename)
+    {
+        ELOG(EJavaInstaller,
+             "Cannot scan Inbox, getting filename failed in JNI");
+        return KErrArgument;
+    }
+    HBufC16* unicodeStartFilename =
+        HBufC16::New(aEnv->GetStringLength(aStartFilename) + 1);
+    if (NULL == unicodeStartFilename)
+    {
+        ELOG(EJavaInstaller,
+             "Cannot scan inbox, filename allocation failed in JNI");
+        return KErrNoMemory;
+    }
+    CleanupStack::PushL(unicodeStartFilename);
+    *unicodeStartFilename = startFilename;
+    aEnv->ReleaseStringChars(aStartFilename, startFilename);
+
+    // Start Inbox scan.
+    TRAPD(err, scanInbox->ScanFromInboxL(
+              unicodeStartFilename, resultArray, aJarScan));
+    if (KErrNone != err)
+    {
+        ELOG1(EJavaInstaller,
+              "FindFilesFromInboxL failed with code %d", err);
+    }
+    else
+    {
+        LOG1(EJavaInstaller, EInfo,
+             "FindFilesFromInboxL returns %d matches", resultArray.Count());
+        jclass classFiles = aEnv->GetObjectClass(aFiles);
+        jmethodID methodFilesAddElement = aEnv->GetMethodID(
+                                              classFiles, "addElement", "(Ljava/lang/Object;)V");
+        jclass classHandles = aEnv->GetObjectClass(aHandles);
+        jmethodID methodHandlesAddElement = aEnv->GetMethodID(
+                                                classHandles, "addElement", "(Ljava/lang/Object;)V");
+        jclass classTimestamps = aEnv->GetObjectClass(aTimestamps);
+        jmethodID methodTimestampsAddElement = aEnv->GetMethodID(
+                                                   classHandles, "addElement", "(Ljava/lang/Object;)V");
+        jclass integerClass = aEnv->FindClass("java/lang/Integer");
+        jmethodID integerConstructor = aEnv->GetMethodID(
+                                           integerClass, "<init>", "(I)V");
+        jclass longClass = aEnv->FindClass("java/lang/Long");
+        jmethodID longConstructor = aEnv->GetMethodID(
+                                        longClass, "<init>", "(J)V");
+        for (TInt i = 0; i < resultArray.Count(); i++)
+        {
+            // Add results to Java side Vector (aFiles parameter).
+            TFileName fileName;
+            resultArray[i].FullName(fileName);
+            jstring jFileName = aEnv->NewString(
+                                    (const unsigned short*)(fileName.Ptr()), fileName.Length());
+            aEnv->CallVoidMethod(aFiles, methodFilesAddElement, jFileName);
+            // Add results to Java side Vector (aHandles parameter).
+            // Caller must close the file handles returned in resultArray.
+            jobject handle = aEnv->NewObject(
+                                 integerClass, integerConstructor, &resultArray[i]);
+            aEnv->CallVoidMethod(aHandles, methodHandlesAddElement, handle);
+            // Add results to Java side Vector (aTimestamps parameter).
+            TInt64 time = 0;
+            TTime ttime;
+            TInt timeErr = resultArray[i].Modified(ttime);
+            if (KErrNone == timeErr)
+            {
+                time = ttime.Int64();
+            }
+            else
+            {
+                ELOG1(EJavaInstaller,
+                      "FindFilesFromInboxL failed to get file timestamp, err=%d",
+                      timeErr);
+            }
+            jobject timestamp = aEnv->NewObject(longClass, longConstructor, time);
+            aEnv->CallVoidMethod(aTimestamps, methodTimestampsAddElement, timestamp);
+        }
+    }
+
+    CleanupStack::PopAndDestroy(unicodeStartFilename);
+    CleanupStack::PopAndDestroy(scanInbox);
+    return err;
+}
+
+/**
+ * See JNI methods __1findJadFilesFromInbox, __1findJarFilesFromInbox.
+ * This is just internal wrapper method for handling Leaves.
+ */
+jint CopyFileL(JNIEnv *aEnv, jclass, jint aHandle, jstring aFilename)
+{
+    __UHEAP_MARK;
+    RFile* file = reinterpret_cast<RFile*>(aHandle);
+
+    // Copy the characters in jstrings to Symbian descriptors so that
+    // they can be used in S60 code.
+    const jchar* filename = aEnv->GetStringChars(aFilename, 0);
+    if (NULL == filename)
+    {
+        ELOG(EJavaInstaller,
+             "JadJarMatcher: Cannot copy file, getting filename failed in JNI");
+        return KErrArgument;
+    }
+    HBufC16* targetFilename =
+        HBufC16::New(aEnv->GetStringLength(aFilename) + 1);
+    if (NULL == targetFilename)
+    {
+        ELOG(EJavaInstaller,
+             "JadJarMatcher: Cannot copy file, filename allocation failed in JNI");
+        return KErrNoMemory;
+    }
+    CleanupStack::PushL(targetFilename);
+    *targetFilename = filename;
+    aEnv->ReleaseStringChars(aFilename, filename);
+
+    //TFileName sourceFilename;
+    //file->FullName( sourceFilename );
+    //LOG1WSTR( EJavaInstaller, EInfo, "Copying file %s",
+    //          (wchar_t *)(sourceFilename.PtrZ()));
+    //LOG1WSTR( EJavaInstaller, EInfo, "to %s",
+    //          (wchar_t *)(targetFilename->Des().PtrZ()));
+
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    CleanupClosePushL(fs);
+    CFileMan* fileMan = CFileMan::NewL(fs);
+    CleanupStack::PushL(fileMan);
+    TInt err = fileMan->Copy(*file, *targetFilename);
+    CleanupStack::PopAndDestroy(fileMan);
+    CleanupStack::PopAndDestroy(&fs);
+
+    CleanupStack::PopAndDestroy(targetFilename);
+    __UHEAP_MARKEND;
+    return err;
+}
+
+/*
+ * Class:     com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher
+ * Method:    _findJadFilesFromInbox
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher__1findJadFilesFromInbox
+(JNIEnv *aEnv, jclass aClass, jstring aJar, jobject aFiles, jobject aHandles, jobject aTimestamps)
+{
+    TInt result = KErrNone;
+    TRAPD(err, result = FindFilesFromInboxL(aEnv, aClass, aJar, aFiles, aHandles, aTimestamps, EFalse));
+    if (KErrNone == err)
+    {
+        err = result;
+    }
+    return err;
+}
+
+/*
+ * Class:     com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher
+ * Method:    _findJarFilesFromInbox
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher__1findJarFilesFromInbox
+(JNIEnv *aEnv, jclass aClass, jstring aJad, jobject aFiles, jobject aHandles, jobject aTimestamps)
+{
+    TInt result = KErrNone;
+    TRAPD(err, result = FindFilesFromInboxL(aEnv, aClass, aJad, aFiles, aHandles, aTimestamps, ETrue));
+    if (KErrNone == err)
+    {
+        err = result;
+    }
+    return err;
+}
+
+/*
+ * Class:     com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher
+ * Method:    _copyFile
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher__1copyFile
+(JNIEnv *aEnv, jclass aClass, jint aHandle, jstring aFilename)
+{
+    TInt result = KErrNone;
+    TRAPD(err, result = CopyFileL(aEnv, aClass, aHandle, aFilename));
+    if (KErrNone == err)
+    {
+        err = result;
+    }
+    return err;
+}
+
+/*
+ * Class:     com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher
+ * Method:    _closeFileHandles
+ */
+JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_installer_jadjarmatcher_JadJarMatcher__1closeFileHandles
+(JNIEnv *aEnv, jclass /*aClass*/, jintArray aHandles)
+{
+    TInt count = aEnv->GetArrayLength(aHandles);
+    jint* handles = aEnv->GetIntArrayElements(aHandles, NULL);
+    for (TInt i = 0; i < count; i++)
+    {
+        RFile* file = reinterpret_cast<RFile*>(handles[i]);
+        file->Close();
+    }
+    aEnv->ReleaseIntArrayElements(aHandles, handles, 0);
+    LOG1(EJavaInstaller, EInfo, "JadJarMatcher: Closed %d Inbox files", count);
+    return KErrNone;
+}