/* * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ #ifndef PLATFORM_H #define PLATFORM_H #include "PlatformDefs.h" #include "Properties.h" #include "OrderedMap.h" #include "Library.h" #include #include #include #include #include #include #include #include using namespace std; // Config file sections #define CONFIG_SECTION_APPLICATION _T("CONFIG_SECTION_APPLICATION") #define CONFIG_SECTION_JAVAOPTIONS _T("CONFIG_SECTION_JAVAOPTIONS") #define CONFIG_SECTION_APPCDSJAVAOPTIONS _T("CONFIG_SECTION_APPCDSJAVAOPTIONS") #define CONFIG_SECTION_ARGOPTIONS _T("CONFIG_SECTION_ARGOPTIONS") #define CONFIG_SECTION_APPCDSGENERATECACHEJAVAOPTIONS \ _T("CONFIG_SECTION_APPCDSGENERATECACHEJAVAOPTIONS") // Config file keys. #define CONFIG_VERSION _T("CONFIG_VERSION") #define CONFIG_MAINJAR_KEY _T("CONFIG_MAINJAR_KEY") #define CONFIG_MAINMODULE_KEY _T("CONFIG_MAINMODULE_KEY") #define CONFIG_MAINCLASSNAME_KEY _T("CONFIG_MAINCLASSNAME_KEY") #define CONFIG_CLASSPATH_KEY _T("CONFIG_CLASSPATH_KEY") #define CONFIG_MODULEPATH_KEY _T("CONFIG_MODULEPATH_KEY") #define APP_NAME_KEY _T("APP_NAME_KEY") #define CONFIG_SPLASH_KEY _T("CONFIG_SPLASH_KEY") #define CONFIG_APP_MEMORY _T("CONFIG_APP_MEMORY") #define CONFIG_APP_DEBUG _T("CONFIG_APP_DEBUG") #define CONFIG_APPLICATION_INSTANCE _T("CONFIG_APPLICATION_INSTANCE") #define JAVA_RUNTIME_KEY _T("JAVA_RUNTIME_KEY") #define JPACKAGE_APP_DATA_DIR _T("CONFIG_APP_IDENTIFIER") struct WideString { size_t length; wchar_t* data; WideString() { length = 0; data = NULL; } }; struct MultibyteString { size_t length; char* data; MultibyteString() { length = 0; data = NULL; } }; class Process { protected: std::list FOutput; public: Process() { Output.SetInstance(this); Input.SetInstance(this); } virtual ~Process() {} virtual bool IsRunning() = 0; virtual bool Terminate() = 0; virtual bool Execute(const TString Application, const std::vector Arguments, bool AWait = false) = 0; virtual bool Wait() = 0; virtual TProcessID GetProcessID() = 0; virtual std::list GetOutput() { return FOutput; } virtual void SetInput(TString Value) = 0; ReadProperty, &Process::GetOutput> Output; WriteProperty Input; }; template class AutoFreePtr { private: T* FObject; public: AutoFreePtr() { FObject = NULL; } AutoFreePtr(T* Value) { FObject = Value; } ~AutoFreePtr() { if (FObject != NULL) { delete FObject; } } operator T* () const { return FObject; } T& operator* () const { return *FObject; } T* operator->() const { return FObject; } T** operator&() { return &FObject; } T* operator=(const T * rhs) { FObject = rhs; return FObject; } }; enum DebugState {dsNone, dsNative, dsJava}; enum MessageResponse {mrOK, mrCancel}; enum AppCDSState {cdsUninitialized, cdsDisabled, cdsEnabled, cdsAuto, cdsGenCache}; class Platform { private: AppCDSState FAppCDSState; protected: Platform(void): FAppCDSState(cdsUninitialized) { } public: AppCDSState GetAppCDSState() { return FAppCDSState; } void SetAppCDSState(AppCDSState Value) { FAppCDSState = Value; } static Platform& GetInstance(); virtual ~Platform(void) {} public: virtual void ShowMessage(TString title, TString description) = 0; virtual void ShowMessage(TString description) = 0; virtual MessageResponse ShowResponseMessage(TString title, TString description) = 0; // Caller must free result using delete[]. virtual TCHAR* ConvertStringToFileSystemString(TCHAR* Source, bool &release) = 0; // Caller must free result using delete[]. virtual TCHAR* ConvertFileSystemStringToString(TCHAR* Source, bool &release) = 0; // Returns: // Windows=C:\Users\\AppData\Local // Linux=~/.local // Mac=~/Library/Application Support virtual TString GetAppDataDirectory() = 0; virtual TString GetPackageAppDirectory() = 0; virtual TString GetPackageLauncherDirectory() = 0; virtual TString GetPackageRuntimeBinDirectory() = 0; virtual TString GetAppName() = 0; virtual TString GetConfigFileName(); virtual TString GetBundledJavaLibraryFileName(TString RuntimePath) = 0; // Caller must free result. virtual ISectionalPropertyContainer* GetConfigFile(TString FileName) = 0; virtual TString GetModuleFileName() = 0; virtual TString GetPackageRootDirectory() = 0; virtual Module LoadLibrary(TString FileName) = 0; virtual void FreeLibrary(Module Module) = 0; virtual Procedure GetProcAddress(Module Module, std::string MethodName) = 0; // Caller must free result. virtual Process* CreateProcess() = 0; virtual bool IsMainThread() = 0; // Returns megabytes. virtual TPlatformNumber GetMemorySize() = 0; virtual std::map GetKeys(); virtual void InitStreamLocale(wios *stream) = 0; virtual std::list LoadFromFile(TString FileName); virtual void SaveToFile(TString FileName, std::list Contents, bool ownerOnly); virtual TString GetTempDirectory() = 0; virtual void addPlatformDependencies(JavaLibrary *pJavaLibrary) = 0; public: // String helpers // Caller must free result using delete[]. static void CopyString(char *Destination, size_t NumberOfElements, const char *Source); // Caller must free result using delete[]. static void CopyString(wchar_t *Destination, size_t NumberOfElements, const wchar_t *Source); static WideString MultibyteStringToWideString(const char* value); static MultibyteString WideStringToMultibyteString(const wchar_t* value); }; class Exception: public std::exception { private: TString FMessage; protected: void SetMessage(const TString Message) { FMessage = Message; } public: explicit Exception() : exception() {} explicit Exception(const TString Message) : exception() { SetMessage(Message); } virtual ~Exception() throw() {} TString GetMessage() { return FMessage; } }; #endif // PLATFORM_H