javatools/javacaptain_app/src.s60/javacap.cpp
branchRCL_3
changeset 83 26b2b12093af
parent 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatools/javacaptain_app/src.s60/javacap.cpp	Wed Oct 13 14:23:59 2010 +0300
@@ -0,0 +1,685 @@
+/*
+* 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:  JavaCap
+*
+*/
+
+
+#include "comms.h"
+#include "rtcmessages.h"
+#include "coremessages.h"
+
+#include "logger.h"
+
+#include "javacap.h"
+#include "javacap.hrh"
+
+#include "javainifileutils.h"
+
+#include <centralrepository.h>
+#include <SWInstallerInternalCRKeys.h>
+
+#include "javastoragenames.h"                   // Storage constants.
+#include "securitystoragedatadefs.h"
+
+#include <javacap.rsg>
+
+_LIT(KJavaCapYes, "Yes");
+_LIT(KJavaCapNo,  "No");
+_LIT(KUserSecurityMode,  "User");
+_LIT(KNormalSecurityMode,  "Default");
+_LIT(KS60SecurityPolicyName,  "S60");
+_LIT(KMSASecurityPolicyName,  "MSA");
+_LIT(KATTSecurityPolicyName,  "AT&T");
+_LIT(KS60SecurityPolicy,  "s60");
+_LIT(KMSASecurityPolicy,  "msa");
+_LIT(KATTSecurityPolicy,  "att");
+// Java Security Policy Central Repository UID
+static const TUid KCRUidJavaSecurity = { 0x2001B289 };
+// IDs for security folder and file keys
+static const TUint32 KPolicy = 0x03;
+static const TUint32 KSecurityWarnings = 0x04;
+const int KS60SecurityPolicyId = 1;
+const int KMSASecurityPolicyId = 2;
+const int KATTSecurityPolicyId = 3;
+
+using namespace java::storage;
+using namespace std;
+using namespace java::util;
+using namespace java::comms;
+using namespace java::captain;
+
+void CJavaCaptainContainer::ConstructL(const TRect& aRect)
+{
+    JELOG2(EJavaCaptain);
+    mCaptainRunning = true;
+    mPrewarmEnabled = false;
+#if defined(RD_JAVA_PREWARM) && !defined (__WINS__)
+    mPrewarmEnabled = true;
+#endif // RD_JAVA_PREWARM
+    mPrewarmUiEnabled = false;
+    mDebugEnabled = false;
+    mRedirectEnabled = false;
+    iStorage.reset(JavaStorage::createInstance());
+    try
+    {
+        iStorage->open();
+    }
+    catch (JavaStorageException& aJse)
+    {
+        User::Leave(aJse.mStatus);
+    }
+    mUserSecurityModeEnabled = (GetSecurityWarningsMode() == SECURITY_WARNINGS_USER_DEFINED_MODE);
+    mSecurityPolicyId = GetSecurityPolicy();
+    mHeader = _L("Java states:");
+    updateStates();
+    CreateWindowL();
+    SetRect(aRect);
+    ActivateL();
+    mRedirector.reset(new LogRedirector());
+}
+
+CJavaCaptainContainer::~CJavaCaptainContainer()
+{
+    JELOG2(EJavaCaptain);
+}
+
+void CJavaCaptainContainer::Draw(const TRect& /*aRect*/) const
+{
+    JELOG2(EJavaCaptain);
+    CWindowGc& gc = SystemGc();
+    gc.Clear();
+
+    const CFont* usedFont = CEikonEnv::Static()->NormalFont();
+    gc.UseFont(usedFont);
+
+    gc.DrawText(mHeader,TPoint(10,20));
+    int pos = 50;
+    gc.DrawText(mCaptainState,TPoint(20,pos));
+    int gap = 25;
+    pos += gap;
+    gc.DrawText(mPrewarmState,TPoint(20,pos));
+    pos += gap;
+    gc.DrawText(mPrewarmUiState,TPoint(20,pos));
+    pos += gap;
+    gc.DrawText(mDebugState,TPoint(20,pos));
+    pos += gap;
+    gc.DrawText(mSecurityMode,TPoint(20,pos));
+    pos += gap;
+    gc.DrawText(mSecurityPolicy,TPoint(20,pos));
+    pos += gap;
+    gc.DrawText(mRedirectState,TPoint(20,pos));
+
+    gc.DiscardFont();
+}
+
+void CJavaCaptainContainer::updateStates()
+{
+
+    int propertyVal = java::util::JavaIniFileUtils::getProperty(java::util::UI_PREWARM);
+    if (propertyVal != -1)
+    {
+        mPrewarmUiEnabled = propertyVal;
+    }
+
+    mCaptainState = _L("Captain running:               ");
+    if (mCaptainRunning)
+    {
+        mCaptainState.Append(KJavaCapYes);
+    }
+    else
+    {
+        mCaptainState.Append(KJavaCapNo);
+    }
+
+    mPrewarmState = _L("Prewarm enabled:           ");
+    if (mPrewarmEnabled)
+    {
+        mPrewarmState.Append(KJavaCapYes);
+    }
+    else
+    {
+        mPrewarmState.Append(KJavaCapNo);
+    }
+
+    mPrewarmUiState = _L("Prewarm UI enabled:      ");
+    if (mPrewarmUiEnabled)
+    {
+        mPrewarmUiState.Append(KJavaCapYes);
+    }
+    else
+    {
+        mPrewarmUiState.Append(KJavaCapNo);
+    }
+
+    mDebugState = _L("Java Debug enabled:      ");
+    if (mDebugEnabled)
+    {
+        mDebugState.Append(KJavaCapYes);
+    }
+    else
+    {
+        mDebugState.Append(KJavaCapNo);
+    }
+
+    mSecurityMode = _L("Security warnings:      ");
+    if (mUserSecurityModeEnabled)
+    {
+        mSecurityMode.Append(KUserSecurityMode);
+    }
+    else
+    {
+        mSecurityMode.Append(KNormalSecurityMode);
+    }
+
+    mSecurityPolicy = _L("Security policy:      ");
+    switch (mSecurityPolicyId)
+    {
+    case KS60SecurityPolicyId:
+        mSecurityPolicy.Append(KS60SecurityPolicyName);
+        break;
+    case KMSASecurityPolicyId:
+        mSecurityPolicy.Append(KMSASecurityPolicyName);
+        break;
+    case KATTSecurityPolicyId:
+        mSecurityPolicy.Append(KATTSecurityPolicyName);
+        break;
+    default:
+        mSecurityPolicy.Append(KS60SecurityPolicyName);
+    }
+
+    mRedirectState = _L("Redirect logs:                   ");
+    if (mRedirectEnabled)
+    {
+        mRedirectState.Append(KJavaCapYes);
+    }
+    else
+    {
+        mRedirectState.Append(KJavaCapNo);
+    }
+
+    DrawDeferred();
+}
+
+void CJavaCaptainContainer::setCaptainState(bool running)
+{
+    mCaptainRunning = running;
+    updateStates();
+}
+
+
+
+#include "commsmessage.h"
+#include "commsclientendpoint.h"
+
+void CJavaCaptainContainer::handleStateChangeCmd(int cmd)
+{
+    switch (cmd)
+    {
+
+    case ETogglePrewarmEnable:
+    {
+        mPrewarmEnabled = !mPrewarmEnabled;
+        CommsMessage message;
+        message.setModuleId(PLUGIN_ID_JAVACAPTAIN_CORE_C);
+        if (mPrewarmEnabled)
+        {
+            message.setMessageId(CORE_MSG_ID_START_PREWARM);
+        }
+        else
+        {
+            message.setMessageId(CORE_MSG_ID_STOP_PREWARM);
+        }
+        CommsClientEndpoint comms;
+        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
+        comms.send(message);
+        comms.disconnect();
+        break;
+    }
+    case ETogglePrewarmUiEnable:
+        mPrewarmUiEnabled = !mPrewarmUiEnabled;
+        java::util::JavaIniFileUtils::setProperty(java::util::UI_PREWARM, mPrewarmUiEnabled);
+        break;
+
+    case EDebugMode:
+    {
+        mDebugEnabled = !mDebugEnabled;
+
+        CommsMessage message;
+        std::wstring vmArgs = L"";
+        if (mDebugEnabled)
+        {
+            vmArgs = L"-Xrunjdwp:server=y,address=localhost:8000";
+        }
+        setSetExtraArguments(message, vmArgs, L"");
+
+        CommsClientEndpoint comms;
+        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
+        comms.send(message);
+        comms.disconnect();
+    }
+    break;
+
+    case ESecurityMode:
+    {
+        mUserSecurityModeEnabled = !mUserSecurityModeEnabled;
+
+        if (mUserSecurityModeEnabled)
+        {
+            SetSecurityWarningsMode(SECURITY_WARNINGS_USER_DEFINED_MODE);
+        }
+        else
+        {
+            SetSecurityWarningsMode(SECURITY_WARNINGS_DEFAULT_MODE);
+        }
+    }
+    break;
+    case ES60SecurityPolicy:
+        mSecurityPolicyId = KS60SecurityPolicyId;
+        SetSecurityPolicy(mSecurityPolicyId);
+        break;
+    case EMSASecurityPolicy:
+        mSecurityPolicyId = KMSASecurityPolicyId;
+        SetSecurityPolicy(mSecurityPolicyId);
+        break;
+    case EATTSecurityPolicy:
+        mSecurityPolicyId = KATTSecurityPolicyId;
+        SetSecurityPolicy(mSecurityPolicyId);
+        break;
+
+    case ERedirectMode:
+        mRedirectEnabled = !mRedirectEnabled;
+        if (mRedirectEnabled)
+        {
+            mRedirector->start();
+        }
+        else
+        {
+            mRedirector->stop();
+        }
+        break;
+
+    default:
+        break;
+    }
+    updateStates();
+}
+
+std::wstring CJavaCaptainContainer::GetSecurityWarningsMode()
+{
+    try
+    {
+        JavaStorageApplicationEntry_t query;
+        JavaStorageApplicationList_t queryResult;
+        JavaStorageEntry attr;
+        attr.setEntry(ID, L"");
+        query.insert(attr);
+        attr.setEntry(SECURITY_WARNINGS, L"");
+        query.insert(attr);
+        iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
+        JavaStorageApplicationList_t::const_iterator iterator;
+        JavaStorageApplicationList_t domainQueryResult;
+        for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
+        {
+            std::wstring securityWarnings = L"";
+            JavaStorageApplicationEntry_t entry = (*iterator);
+            findColumn(entry, SECURITY_WARNINGS, securityWarnings);
+            if (securityWarnings == SECURITY_WARNINGS_USER_DEFINED_MODE)
+            {
+                // make them all USER
+                SetSecurityWarningsMode(SECURITY_WARNINGS_USER_DEFINED_MODE);
+                return SECURITY_WARNINGS_USER_DEFINED_MODE;
+            }
+        }
+    }
+    catch (JavaStorageException& aJse)
+    {
+    }
+    // one mroe check: central repository
+    std::wstring securityWarningsMode = SECURITY_WARNINGS_DEFAULT_MODE;
+    TRAP_IGNORE(
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        TInt warningsMode;
+        User::LeaveIfError(repository->Get(KSecurityWarnings, warningsMode));
+        switch (warningsMode)
+{
+case 1:
+    securityWarningsMode = SECURITY_WARNINGS_USER_DEFINED_MODE;
+    break;
+case 2:
+    securityWarningsMode = SECURITY_WARNINGS_DEFAULT_MODE;
+    break;
+}
+CleanupStack::PopAndDestroy(repository););
+    return securityWarningsMode;
+}
+
+void CJavaCaptainContainer::SetSecurityWarningsMode(const std::wstring& aSecurityWarningsMode)
+{
+    try
+    {
+        JavaStorageApplicationEntry_t query;
+        JavaStorageApplicationList_t queryResult;
+        JavaStorageEntry attr;
+        attr.setEntry(ID, L"");
+        query.insert(attr);
+        iStorage->search(MIDP_PACKAGE_TABLE, query, queryResult);
+        JavaStorageApplicationList_t::const_iterator iterator;
+        JavaStorageApplicationList_t domainQueryResult;
+        for (iterator = queryResult.begin(); iterator != queryResult.end(); iterator++)
+        {
+            std::wstring uid = L"";
+            JavaStorageApplicationEntry_t entry = (*iterator);
+            findColumn(entry, ID, uid);
+            JavaStorageApplicationEntry_t oldEntry;
+            JavaStorageEntry oldAttr;
+            oldAttr.setEntry(ID, uid);
+            oldEntry.insert(oldAttr);
+            attr.setEntry(SECURITY_WARNINGS, aSecurityWarningsMode);
+            entry.clear();
+            entry.insert(attr);
+            iStorage->update(MIDP_PACKAGE_TABLE, entry, oldEntry);
+        }
+    }
+    catch (JavaStorageException& aJse)
+    {
+    }
+    // set the cenRep key as well
+    TRAP_IGNORE(
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        if (aSecurityWarningsMode == SECURITY_WARNINGS_USER_DEFINED_MODE)
+{
+    repository->Set(KSecurityWarnings, 1);
+    }
+    else
+    {
+        repository->Set(KSecurityWarnings, 2);
+    }
+    CleanupStack::PopAndDestroy(repository);
+    );
+}
+
+void  CJavaCaptainContainer::findColumn(const JavaStorageApplicationEntry_t& aEntry,
+                                        const wstring& aColName, wstring& aColValue)
+{
+    JavaStorageEntry findPattern;
+    findPattern.setEntry(aColName, L"");
+    JavaStorageApplicationEntry_t::const_iterator findIterator =
+        aEntry.find(findPattern);
+    if (findIterator != aEntry.end())
+    {
+        aColValue = findIterator->entryValue();
+    }
+}
+
+
+int CJavaCaptainContainer::GetSecurityPolicy()
+{
+    int securityPolicyId =KS60SecurityPolicyId;
+    TRAP_IGNORE(
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        HBufC* buf = HBufC::NewLC(NCentralRepositoryConstants::KMaxUnicodeStringLength);
+        TPtr policy(buf->Des());
+        User::LeaveIfError(repository->Get(KPolicy, policy));
+        if (policy.Compare(KS60SecurityPolicy) == 0)
+{
+    securityPolicyId = KS60SecurityPolicyId;
+}
+else if (policy.Compare(KMSASecurityPolicy) == 0)
+{
+    securityPolicyId = KMSASecurityPolicyId;
+}
+else if (policy.Compare(KATTSecurityPolicy) == 0)
+{
+    securityPolicyId = KATTSecurityPolicyId;
+}
+CleanupStack::PopAndDestroy(buf);
+CleanupStack::PopAndDestroy(repository););
+    return securityPolicyId;
+}
+
+void CJavaCaptainContainer::SetSecurityPolicy(int aSecurityPolicyId)
+{
+    TRAP_IGNORE(
+        CRepository* repository = CRepository::NewLC(KCRUidJavaSecurity);
+        switch (aSecurityPolicyId)
+{
+case KS60SecurityPolicyId:
+    User::LeaveIfError(repository->Set(KPolicy, KS60SecurityPolicy));
+        break;
+    case KMSASecurityPolicyId:
+        User::LeaveIfError(repository->Set(KPolicy, KMSASecurityPolicy));
+        break;
+    case KATTSecurityPolicyId:
+        User::LeaveIfError(repository->Set(KPolicy, KATTSecurityPolicy));
+        break;
+    }
+    CleanupStack::PopAndDestroy(repository););
+}
+
+//
+// CJavaCaptainAppUi
+//
+CJavaCaptainAppUi::~CJavaCaptainAppUi()
+{
+    JELOG2(EJavaCaptain);
+    RemoveFromStack(iAppView);
+    delete iAppView;
+    delete mPeriodic;
+}
+
+void CJavaCaptainAppUi::ConstructL()
+{
+    JELOG2(EJavaCaptain);
+    BaseConstructL();
+    iAppView=new(ELeave) CJavaCaptainContainer;
+    iAppView->SetMopParent(this);
+    iAppView->ConstructL(ClientRect());
+
+    iCoeEnv->RootWin().EnableFocusChangeEvents();
+    mPeriodic=CPeriodic::NewL(CActive::EPriorityStandard);
+
+    AddToStackL(iAppView);
+
+}
+
+_LIT(KExecutableName, "javacaptain.exe");
+
+void senMsgToSplash(int id)
+{
+    CommsMessage message;
+    message.setModuleId(1);
+    message.setMessageId(id);
+    CommsClientEndpoint comms;
+    comms.connect(10900);
+    comms.send(message);
+    comms.disconnect();
+}
+
+TInt CJavaCaptainAppUi::tick(TAny* appUi)
+{
+    CJavaCaptainAppUi* app = static_cast<CJavaCaptainAppUi*>(appUi);
+//    ELOG1(EJavaCaptain,"mActive: %d", app->mActive);
+    if (app->mActive)
+    {
+        senMsgToSplash(1);
+    }
+    else
+    {
+        senMsgToSplash(2);
+    }
+    app->mActive = !app->mActive;
+    return 0;
+}
+
+void CJavaCaptainAppUi::HandleCommandL(TInt aCommand)
+{
+    JELOG2(EJavaCaptain);
+
+    switch (aCommand)
+    {
+    case EAknSoftkeyExit:
+    case EEikCmdExit:
+        Exit();
+        break;
+    case ECaptainStart:
+    {
+        RProcess proc;
+        int st = proc.Create(KExecutableName, KExecutableName);
+        if (st == KErrNone)
+        {
+            proc.Resume();
+            iAppView->setCaptainState(true);
+        }
+        proc.Close();
+    }
+    break;
+
+    case ECaptainStop:
+    {
+        CommsMessage message;
+        message.setModuleId(PLUGIN_ID_JAVACAPTAIN_CORE_C);
+        message.setMessageId(CORE_MSG_ID_STOP_JAVACAPTAIN);
+        CommsClientEndpoint comms;
+        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
+        comms.send(message);
+        comms.disconnect();
+        iAppView->setCaptainState(false);
+    }
+    break;
+
+    case EThreadDump:
+    {
+        CommsMessage message;
+        message.setModuleId(PLUGIN_ID_JAVACAPTAIN_CORE_C);
+        message.setMessageId(CORE_MSG_ID_DO_THREAD_DUMP);
+        CommsClientEndpoint comms;
+        comms.connect(IPC_ADDRESS_JAVA_CAPTAIN_C);
+        comms.send(message);
+        comms.disconnect();
+    }
+    break;
+
+    case ETogglePrewarmEnable:
+    case ETogglePrewarmUiEnable:
+    case EDebugMode:
+    case ESecurityMode:
+    case ES60SecurityPolicy:
+    case EMSASecurityPolicy:
+    case EATTSecurityPolicy:
+    case ERedirectMode:
+        iAppView->handleStateChangeCmd(aCommand);
+        break;
+
+    default:
+        Exit();
+        break;
+    }
+}
+
+CEikAppUi* CJavaCaptainEikDocument::CreateAppUiL()
+{
+    JELOG2(EJavaCaptain);
+    return(new(ELeave) CJavaCaptainAppUi);
+}
+
+void CJavaCaptainEikDocument::ConstructL()
+{
+    JELOG2(EJavaCaptain);
+}
+
+TUid CJavaCaptainApplication::AppDllUid() const
+{
+    JELOG2(EJavaCaptain);
+    return KUidJavaCaptain;
+}
+
+CApaDocument* CJavaCaptainApplication::CreateDocumentL()
+{
+    JELOG2(EJavaCaptain);
+    CJavaCaptainEikDocument* document=new(ELeave) CJavaCaptainEikDocument(*this);
+    CleanupStack::PushL(document);
+    document->ConstructL();
+    CleanupStack::Pop();
+    return(document);
+}
+
+#include <eikstart.h>
+
+LOCAL_C CApaApplication* NewApplication()
+{
+    JELOG2(EJavaCaptain);
+    return new CJavaCaptainApplication;
+}
+
+
+GLDEF_C TInt E32Main()
+{
+    JELOG2(EJavaCaptain);
+    return EikStart::RunApplication(NewApplication);
+}
+
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+LogRedirector::LogRedirector() : mFd(-1)
+{
+    iJavaDiagnostic.reset(JavaDiagnostic::createInstance());
+}
+
+LogRedirector::~LogRedirector()
+{
+}
+
+void LogRedirector::start()
+{
+    iJavaDiagnostic->setDiagnosticListener(*this);
+    mFd = open("c:\\data\\javaredirect.log", O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
+}
+
+void LogRedirector::stop()
+{
+    iJavaDiagnostic->removeDiagnosticListener();
+    close(mFd);
+    mFd = -1;
+}
+
+void LogRedirector::systemOut(const TDesC8& aData)
+{
+    write(aData);
+}
+
+void LogRedirector::systemErr(const TDesC8& aData)
+{
+    write(aData);
+}
+
+void LogRedirector::log(const TDesC8& aData)
+{
+    write(aData);
+}
+
+void LogRedirector::write(const TDesC8& aData)
+{
+    if (mFd > 0)
+    {
+        ::write(mFd, (const char*)aData.Ptr(), aData.Size());
+    }
+};
+
+
+
+// End of File