--- /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;
+}