javaruntimes/starterutils/src/jvmstarterimpl.h
author srilekhas <srilekhas@symbian.org>
Mon, 23 Aug 2010 16:38:44 +0100
branchRCL_3
changeset 63 d1278d87b01e
parent 19 04becd199f91
permissions -rw-r--r--
Merge RCL_3 fixes with latest delivery.

/*
* 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:  a Base class for starting the JVM.
*
*/


#ifndef JVMSTARTERIMPL_H
#define JVMSTARTERIMPL_H

#include "jvmstarter.h"

#include <algorithm>
#include <string.h>
#include <string>
#include <list>

namespace java // codescanner::namespace
{

namespace runtime // codescanner::namespace
{

/**
 * This class implements partially the interface JvmStarter. The class mainly
 * contains argument storing and modifying features. The static instance
 * getters and virtual JVM starting methods are left to be implemented by
 * the JVM specific starter which will be inherited from this class.
 */


OS_NONSHARABLE_CLASS(JvmStarterImpl) : public JvmStarter
{
public:

    /**
     * Destructor of the JvmStarterImpl.
     */
    virtual ~JvmStarterImpl();

    /**
     * @see jvmstarter.h
     */
    virtual void appendClassPath(const std::wstring& file);

    /**
     * @see jvmstarter.h
     */
    virtual void appendBootClassPath(const std::wstring& file);

    /**
     * @see jvmstarter.h
     */
    virtual void prependBootClassPath(const std::wstring& file);

    /**
     * @see jvmstarter.h
     */
    virtual void appendExtensionPath(const std::wstring& extensionPath);

    /**
     * @see jvmstarter.h
     */
    virtual void setMainClass(const std::wstring& mainClass);

    /**
     * @see jvmstarter.h
     */
    virtual void appendApplicationArgument(const std::wstring& argument);

    /**
     * @see jvmstarter.h
     */
    virtual void appendSystemProperty(const std::wstring& systemproperty);

    /**
     * @see jvmstarter.h
     */
    virtual void appendRawJvmArgument(const std::wstring& argument);

    /**
     * @see jvmstarter.h
     */
    virtual void disableJit();

    /**
     * @see jvmstarter.h
     */
    virtual void enableThreadDumping();

protected: // Definitions

    /**
     * Clears all the std string & Lists.
     */
    virtual void clear();

    typedef std::list<std::wstring> JvmArgs_t;

    // A simple class for storing char* array that is deleted automatically
    // when going out of scope.
    class ScopedCharPointerArray
    {
    public:

        ScopedCharPointerArray(int size) : mBuffer(0), mSize(size)
        {
            mBuffer = new char* [size];
            memset(mBuffer, 0, mSize * sizeof(char*));
        }

        ~ScopedCharPointerArray()
        {
            for (int i = 0; i < mSize; i++)
            {
                delete[] mBuffer[i];
            }
            delete[] mBuffer;
        }

        char** get()
        {
            return mBuffer;
        }

    private:

        /*
         * No copy constructor allowed.
         */
        ScopedCharPointerArray(const ScopedCharPointerArray&);

        /*
         * No Assignment operator allowed.
         */
        ScopedCharPointerArray& operator= (const ScopedCharPointerArray&);

    private:
        char** mBuffer;
        int    mSize;
    };

    // A simple class for storing char* pointers that is deleted automatically
    // when going out of scope.
    class ScopedCharPointer
    {
    public:

        ScopedCharPointer()
        {
        }

        ScopedCharPointer(char* ptr) : mBuffer(ptr)
        {
        }

        ~ScopedCharPointer()
        {
            delete[] mBuffer;
        }

        void set(char* ptr)
        {
            mBuffer = ptr;
        }

        char* get()
        {
            return mBuffer;
        }

    private:

        /*
         * No copy constructor allowed.
         */
        ScopedCharPointer(const ScopedCharPointer&);

        /*
         * No Assignment operator allowed.
         */
        ScopedCharPointer& operator= (const ScopedCharPointer&);

    private:
        char* mBuffer;
    };


protected: //Methods
    JvmStarterImpl();   // Default constructor allowed for inherited classes

    /**
     * Appends the given source path to the given destination path. If there
     * already exists a path a platform specific classpath separator is added
     * before doing the appending Converts the path separtors to platform
     * specifc ones.
     * @param source The source path to be appended.
     * @param destination The destination path where to be appended.
     */
    void appendAndConvertClassPath(const std::wstring& source,
                                   std::wstring& destination);


protected: // Members

    std::wstring      mIdentifier;        // For identifying the runtime.
    std::wstring      mClassPath;         // The classpath of the application
    std::wstring      mBootClassPathAppend;  // The appended boot classpath
    std::wstring      mBootClassPathPrepend; // The prepended boot classpath
    std::wstring      mExtensionPath;     // The extension path to be used
    std::wstring      mMainClass;         // The main class of the application
    bool              mJitDisabled;       // Is the JIT disabled
    bool              mTheadDumpEnabled;  // Is the thread dump feature enabled
    Configuration     mConfiguration;     // CLDC or CDC
    JvmArgs_t         mJvmArgs;           // A list containing Jvm arguments.
    // This doesn't contain such
    // that has dedicated member variable
    // like the classpath
    JvmArgs_t         mAppAndArgs;        // A list containing application
    // class and arguments for the
    // application

private: // Methods
    /**
     * No copy constructor allowed
     */
    JvmStarterImpl(const JvmStarterImpl&);

    /**
     * No Assignment operator allowed
     */
    JvmStarterImpl& operator= (const JvmStarterImpl&);

};

} // end namespace runtime
} // end namespace java


#endif // JVMSTARTERIMPL_H