--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javaruntimes/starterutils/src.s60/bootclasspath.cpp Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,151 @@
+/*
+* 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: Functionality for reading extended bootclasspath in Symbian env
+*
+*/
+
+#include <centralrepository.h>
+
+#include "javaruntimeprivatecrkeys.h"
+#include "logger.h"
+#include "bootclasspath.h"
+
+
+HBufC* GetCRepClasspathL()
+{
+ _LIT(KAllowedPathPrefix1, "c:\\resource\\");
+ _LIT(KAllowedPathPrefix2, "c:/resource/");
+ const TChar KClasspathSeparator(';');
+
+ JELOG2(EJavaRuntime);
+ CRepository* repository = CRepository::NewL(KCRUidJavaRuntime);
+ CleanupStack::PushL(repository);
+
+ HBufC* path = HBufC::NewL(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+ TPtr ptr = path->Des();
+ TInt err = repository->Get(KJavaRuntimeMIDPClasspath, ptr);
+ CleanupStack::PopAndDestroy(repository);
+
+ if ((err == KErrNotFound) || (ptr.Length() == 0))
+ {
+ LOG(EJavaRuntime, EInfo, "No KJavaRuntimeMIDPClasspath key in Cen Rep");
+ delete path;
+ return 0;
+ }
+ else if (err != KErrNone)
+ {
+ ELOG1(EJavaRuntime, "Cenral Repository error %d", err);
+ delete path;
+ return 0;
+ }
+
+ // Only extensions installed to C:/resource/ are accepted.
+ // If KJavaRuntimeMIDPClasspath contains extensions installed
+ // to some other (unsafe) place, remove them from classpath
+ // and store the pruned classpath back to central repository
+ // The classpath read from central repository may be for example
+ // "C:/resource/java/lib/eswt.jar;;E:/Resource/java/lib/payment.jar
+ // ;c:\\resource\\java\\lib\\mia.jar; "
+
+ TInt cpStart(0); // start position of class path in class paths
+ TInt cpLength(0); // length of of class path in class paths
+ TBool updateCR(EFalse); // ETrue if cen rep must be updated
+
+ // Go through all class paths
+ while (cpStart < ptr.Length() && cpLength < ptr.Length())
+ {
+ // Length of the class path, class paths are separated ';'
+ cpLength = ptr.MidTPtr(cpStart).LocateF(KClasspathSeparator);
+ if (cpLength == KErrNotFound)
+ {
+ // The class path is last one without ';', cpLength is rest from start position to total length
+ cpLength = ptr.Length() - cpStart;
+ }
+ else
+ {
+ // Include ';'
+ cpLength++;
+ }
+
+ // Process class path
+ TPtr tmpPtr = ptr.MidTPtr(cpStart, cpLength);
+
+ if ((tmpPtr.Left(((TDesC)KAllowedPathPrefix1).Length()).CompareF(KAllowedPathPrefix1)) &&
+ (tmpPtr.Left(((TDesC)KAllowedPathPrefix2).Length()).CompareF(KAllowedPathPrefix2)))
+ {
+ // Unsafe class path, delete it
+ ptr.Delete(cpStart, cpLength);
+ // Start of the next class path is start of the current deleted class path
+ cpLength = 0;
+ updateCR = ETrue;
+ }
+ else
+ {
+ // Allowed class path
+ // Start of the next class path is end of the current class path
+ cpStart = cpStart + cpLength;
+ }
+ }
+
+ if (!updateCR)
+ {
+ // Classpath does not contain any dangerous paths
+ return path;
+ }
+
+ // Store the cleaned classpath back to central repository (to optimize
+ // next execution)
+ WLOG(EJavaRuntime,
+ "GetCRepClasspathL: Removing unsafe extension(s) from Cen Rep extension classpath");
+ CleanupStack::PushL(path);
+ repository = CRepository::NewL(KCRUidJavaRuntime);
+ err = repository->Set(KJavaRuntimeMIDPClasspath, ptr);
+ delete repository;
+ if (err != KErrNone)
+ {
+ WLOG1(EJavaRuntime,
+ "GetCRepClasspathL could not store cleaned classpath, err %d", err);
+ }
+
+ if (ptr.Length() > 0)
+ {
+ CleanupStack::Pop(path);
+ return path;
+ }
+ else
+ {
+ WLOG(EJavaRuntime, "Cleaned classpath is empty");
+ // nothing to return
+ CleanupStack::PopAndDestroy(path);
+ return 0;
+ }
+}
+
+void java::runtime::getExtendedBootClassPath(std::wstring& bootClassPath)
+{
+ JELOG2(EJavaRuntime);
+ HBufC* path = 0;
+ TRAP_IGNORE(path = GetCRepClasspathL());
+ if (path != 0)
+ {
+ LOG1(EJavaRuntime, EInfo, " Length of the bcp %d", path->Length());
+ if (path->Length() > 0)
+ {
+ bootClassPath.assign((wchar_t*)path->Ptr(),
+ path->Length());
+ LOG1(EJavaRuntime, EInfo, " bcp '%S'", bootClassPath.c_str());
+ }
+ delete path;
+ }
+}