diff -r f5050f1da672 -r 04becd199f91 javamanager/javalauncher/tsrc/testmidletstart/src.s60/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javamanager/javalauncher/tsrc/testmidletstart/src.s60/main.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,499 @@ +/* +* Copyright (c) 2008 - 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: prototyping starting midlet from native applications +*/ + + +#include +#include +#include +#include // for RApaLsSession +#include +#include +#include //CApaCommandLine +#include // RDesWriteStream +#include +#include + +#include "javauids.h" +#include "logger.h" + +_LIT(KJavaLauncherExe, "javalauncher.exe"); + +/** + * + */ +static void startByJavaLauncherSimpleL() +{ + LOG(EJavaConverters, EInfo, + "testmidletstart: startByJavaLauncherSimple: Going to start midlet from 'testmidletstart.txt'"); + + // Read the content of test data file + RFs fs; + TInt err = fs.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherSimple: Cannot connect to RFs, err %d", err); + User::Leave(err); + } + CleanupClosePushL(fs); + RFile testData; + err = testData.Open(fs, _L("E:\\testmidletstart.txt"), EFileRead); + if (KErrNotFound == err) + { + err = testData.Open(fs, _L("C:\\testmidletstart.txt"), EFileRead); + } + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherSimple: Cannot open E: " + "or C:\\testmidletstart.txt, err %d", err); + User::Leave(err); + } + CleanupClosePushL(testData); + TInt testDataSize = 0; + err = testData.Size(testDataSize); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherSimple: Cannot get size of " + "testmidletstart.txt, err %d", err); + User::Leave(err); + } + + HBufC8 *pBuf = HBufC8::NewLC(testDataSize + 8); + TPtr8 buf = pBuf->Des(); + err = testData.Read(buf); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherSimple: Reading " + "testmidletstart.txt failed, err %d", err); + User::Leave(err); + } + + printf("File content was %s", (const char *)(buf.PtrZ())); + + + TInt pos = 0; + // Find LF + TInt end = buf.Locate(0x0A); + if (KErrNotFound == end) + { + end = buf.Length(); + } + else if (buf.Locate(0x0D) == (end - 1)) + { + // If there is CR before LF, it does not belong to cmd line + --end; + } + + // Read one line from buffer, convert it to 16 bit + TPtrC8 oneLine = buf.Mid(pos, end - pos); + + TDesC *pCmdLine = NULL; + TInt res = java::util::S60CommonUtils::ConvertNarrowToWiderL(oneLine, pCmdLine); + + // Create one process using this command line + RProcess rProcess; + // start +// TInt err = rProcess.Create(KJavaLauncherExe, _L("midlet-uid=0x1014e720;midlet-args=startMode=startFromCmdLine;sound=ON;landscapeMode=true;")); // OK +// TInt err = rProcess.Create(KJavaLauncherExe, _L("midlet-name=%E6%98%9F%E5%A4%A2%E7%BE%8E%E5%B0%91%E5%A5%B3%E7%A0%8C%E5%9C%96")); +// TInt err = rProcess.Create(KJavaLauncherExe, _L("midlet-name=%C3%80%C3%80NEST%C3%80.EXE")); +// err = rProcess.Create(KJavaLauncherExe, _L("midlet-name=SPtesti;midlet-args=mode=nativestart;sounds=ON;difficulty=medium;wizard_mode")); + + err = rProcess.Create(KJavaLauncherExe, *pCmdLine); + if (KErrNone == err) + { + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherSimple calling Rendezvous"); + // This call will wait until midlet exits (or panics) + TRequestStatus status; + rProcess.Logon(status); + + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherSimple calling Resume"); + rProcess.Resume(); + + // now wait until javalauncher exits + User::WaitForRequest(status); + if (status.Int() != KErrNone) + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherSimple javalauncher exited with error %d", + status.Int()); + } + } + else + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherSimple Cannot start midlet, error %d", err); + } + + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherSimple calling RProcess::Close"); + + delete pCmdLine; + rProcess.Close(); + + // free resources before returning + CleanupStack::PopAndDestroy(3); +} + + +/** + * + */ +static void startByAppArcL() +{ + RApaLsSession apaSession; + + TInt err = apaSession.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::startByAppArcL RApaLsSession Connect error %d", err); + User::Leave(err); + } + CleanupClosePushL(apaSession); + + CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); + + // Drive letter must be correct + cmdLine->SetExecutableNameL(_L("C:\\269712461.fakeapp")); + cmdLine->SetCommandL(EApaCommandRun); + cmdLine->SetTailEndL(_L8(" midletparam1 -param2 -param3=no")); + + LOG(EJavaConverters, EInfo, "testmidletstart: startByAppArcL: Going to start midlet SystemProperties"); + + err = apaSession.StartApp(*cmdLine); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::startByAppArcL StartApp error %d", err); + } + + CleanupStack::PopAndDestroy(cmdLine); + CleanupStack::PopAndDestroy(); // apaSession +} + + +/** + * Start javalauncher.exe that will start midlet + */ +static void startByJavaLauncherL() +{ + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherL: Going to start midlet SystemProperties"); + + RProcess rProcess; + // Build command line used to pass all necessary info + CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); + + cmdLine->SetExecutableNameL(KJavaLauncherExe); + cmdLine->SetCommandL(EApaCommandRun); + + cmdLine->SetDocumentNameL(_L("C:/data/my_own_doc.kwi")); + + // The midlet to be started can be specified by using opaque data like here or + // by specifying midlet name and vendor in command line + TBuf8<4> opaqueData; // opaque data will contain one signed 32-bit int + RDesWriteStream writeStream(opaqueData); + writeStream.WriteInt32L(0x10137c4d); // midlet application Uid + writeStream.CommitL(); + cmdLine->SetOpaqueDataL(opaqueData); + + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherL: Create process"); + + // start + TInt err = rProcess.Create(KJavaLauncherExe, _L("midlet-uid=0x10137c4d;midlet-args=startMode=strangeStart")); + if (KErrNone == err) + { + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherL: Set process commandline"); + + cmdLine->SetProcessEnvironmentL(rProcess); + + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherL calling Logon"); + // This call will wait until javalauncher exits (or panics) + TRequestStatus status; + rProcess.Logon(status); + + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherL calling Resume"); + rProcess.Resume(); + + // now wait until javalauncher exits + User::WaitForRequest(status); + if (status.Int() != KErrNone) + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherL javalauncher exited with error %d", + status.Int()); + } + } + else + { + ELOG1(EJavaConverters, + "testmidletstart: startByJavaLauncherL Cannot start midlet, error %d", err); + } + + LOG(EJavaConverters, EInfo, "testmidletstart: startByJavaLauncherL calling RProcess::Close"); + // free resources before returning + CleanupStack::PopAndDestroy(cmdLine); + rProcess.Close(); +} + + +/** + * Read all midlets from AppArc. + * Log midlet Uid, Midlet name, installation drive, + * group name and icon file path name + */ +static void readMidletsFromAppArcL() +{ + TInt retryCounter = 10; + TUid appTypeUid; + TApaAppInfo info; + RApaLsSession apaSession; + + TBuf8<512> midletDesc; + + + TInt err = apaSession.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::readMidletsFromAppArcL RApaLsSession Connect error %d", err); + User::Leave(err); + } + CleanupClosePushL(apaSession); + + // Get the process of getting the list of all non native applications + // (mostly java applications) + err = + apaSession.GetFilteredApps( + TApaAppCapability::ENonNative, TApaAppCapability::ENonNative); + + TFullName logBuf; + + do + { + err = apaSession.GetNextApp(info); + if (RApaLsSession::EAppListInvalid == err) + { + // Application list has not yet been populated, + // try again after a short delay + retryCounter--; + if (retryCounter > 0) + { + User::After(500000); + continue; + } + else + { + ELOG(EJavaConverters, + "testmidletstart::readMidletsFromAppArcL RApaLsSession " + "GetNext returned EAppListInvalid for 10 times, error"); + User::Leave(err); + } + } + else if (KErrNone == err) + { + // Info contains valid app info. Now check whether it is java app + err = apaSession.GetAppType(appTypeUid, info.iUid); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::readMidletsFromAppArcL RApaLsSession " + "GetAppType returned error %d", err); + User::Leave(err); + } + if (appTypeUid.iUid == KMidletApplicationTypeUid) + { + // This is java application. Log info + LOG1(EJavaConverters, EInfo, "testmidletstart: readMidletsFromAppArcL: midlet uid %x", info.iUid); + + logBuf = info.iCaption; + LOG1WSTR(EJavaConverters, EInfo, "testmidletstart: readMidletsFromAppArcL: midlet name %s", + (wchar_t *)(logBuf.PtrZ())); + + logBuf = info.iFullName; + LOG1WSTR(EJavaConverters, EInfo, "testmidletstart: readMidletsFromAppArcL: midlet path %s", + (wchar_t *)(logBuf.PtrZ())); + + } + } + + } + while (KErrNone == err); + + if (RApaLsSession::ENoMoreAppsInList != err) + { + ELOG1(EJavaConverters, + "testmidletstart:readMidletsFromAppArcL: RApaLsSession GetNext returned error %d", err); + User::Leave(err); + } + + CleanupStack::PopAndDestroy(); // apaSession +} + + +/** + * + */ +static void registerAsMimeHandlerL() +{ + TInt retryCounter = 10; + TUid appTypeUid; + TApaAppInfo info; + RApaLsSession apaSession; + + + TInt err = apaSession.Connect(); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::registerAsMimeHandlerL RApaLsSession Connect error %d", err); + User::Leave(err); + } + CleanupClosePushL(apaSession); + + // Get current handler for file e:\tif.tif + TUid handlerUid; + TDataType mimeType; + err = apaSession.AppForDocument(_L("e:\\tif.tif"), handlerUid, mimeType); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::registerAsMimeHandlerL AppForDocument error %d", err); + User::Leave(err); + } + + TBuf8<256> mimeTypeName; + mimeTypeName = mimeType.Des8(); + mimeTypeName.Append('\0'); + LOG1(EJavaConverters, EInfo, + "testmidletstart::registerAsMimeHandlerL file MIME type is %s", &(mimeTypeName[0])); + LOG1(EJavaConverters, EInfo, + "testmidletstart::registerAsMimeHandlerL handler for it is %x", handlerUid.iUid); + + TUid midletUid; + midletUid.iUid = 0x10137c4d; + TDataTypePriority priority(100); + err = apaSession.InsertDataMapping(mimeType, priority, midletUid); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::registerAsMimeHandlerL InsertDataMapping error %d", err); + User::Leave(err); + } + + TUid newHandlerUid; + err = apaSession.AppForDocument(_L("e:\\tif.tif"), newHandlerUid, mimeType); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::registerAsMimeHandlerL AppForDocument2 error %d", err); + User::Leave(err); + } + LOG1(EJavaConverters, EInfo, + "testmidletstart::registerAsMimeHandlerL NOW handler is %x", newHandlerUid.iUid); + + + + // Restore old handler + TDataTypePriority oldHandlerPriority(300); + TUid originalHandlerUid; + originalHandlerUid.iUid = 0x1000599d; + err = apaSession.InsertDataMapping(mimeType, oldHandlerPriority, originalHandlerUid); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::registerAsMimeHandlerL InsertDataMapping (restore old handler) error %d", err); + User::Leave(err); + } + + /* + // Restore old handler + TDataTypePriority oldHandlerPriority(300); + TUid originalHandlerUid; + originalHandlerUid.iUid = 0x101f4d90; + err = apaSession.InsertDataMapping(mimeType, oldHandlerPriority, originalHandlerUid); + if (KErrNone != err) + { + ELOG1(EJavaConverters, + "testmidletstart::registerAsMimeHandlerL InsertDataMapping (restore old handler) error %d", err); + User::Leave(err); + } + */ + + CleanupStack::PopAndDestroy(); // apaSession +} + + +/** + * Create cleanup stack and run the cleaner code inside TRAP harness + * to log unexpected leaves. + */ +TInt E32Main() +{ +// __UHEAP_MARK; + CTrapCleanup* cleanupStack = CTrapCleanup::New(); + + TRAPD(err, readMidletsFromAppArcL()); + if (KErrNone != err) + { + ELOG1(EJavaConverters, "testmidletstart: readMidletsFromAppArcL leaved with err %d", err); + } + + // Wait for a moment + User::After(500000); + + TRAP(err, startByJavaLauncherSimpleL()); + if (KErrNone != err) + { + ELOG1(EJavaConverters, "testmidletstart: startByJavaLauncherSimple leaved with err %d", err); + } + + // Wait for a moment + User::After(500000); + + /* + TRAP(err, startByAppArcL()); + if (KErrNone != err) + { + ELOG1(EJavaConverters, "testmidletstart: startByAppArcL leaved with err %d", err); + } + + // Wait for a moment + User::After(500000); + + TRAP(err, startByJavaLauncherL()); + if (KErrNone != err) + { + ELOG1(EJavaConverters, "testmidletstart: startByJavaLauncherL leaved with err %d", err); + } + + + // Wait for a moment + User::After(500000); + + TRAP(err, registerAsMimeHandlerL()); + if (KErrNone != err) + { + ELOG1(EJavaConverters, "testmidletstart: registerAsMimeHandlerL leaved with err %d", err); + } + */ + + delete cleanupStack; +// __UHEAP_MARKEND; + return KErrNone; +} +// eof