modules/fxpackager/src/main/native/library/common/MacPlatform.mm
Print this page
*** 36,45 ****
--- 36,47 ----
#ifdef MAC
#include "MacPlatform.h"
#include "Helpers.h"
#include "Package.h"
+ #include "PropertyFile.h"
+ #include "IniFile.h"
#include <sys/sysctl.h>
#include <pthread.h>
#include <vector>
*** 164,177 ****
}
TString MacPlatform::GetBundledJVMLibraryFileName(TString RuntimePath) {
TString result;
! result = FilePath::IncludeTrailingSlash(RuntimePath) + _T("Contents/Home/jre/lib/jli/libjli.dylib");
if (FilePath::FileExists(result) == false) {
! result = FilePath::IncludeTrailingSlash(RuntimePath) + _T("Contents/Home/lib/jli/libjli.dylib");
if (FilePath::FileExists(result) == false) {
result = _T("");
}
}
--- 166,179 ----
}
TString MacPlatform::GetBundledJVMLibraryFileName(TString RuntimePath) {
TString result;
! result = FilePath::IncludeTrailingSeparater(RuntimePath) + _T("Contents/Home/jre/lib/jli/libjli.dylib");
if (FilePath::FileExists(result) == false) {
! result = FilePath::IncludeTrailingSeparater(RuntimePath) + _T("Contents/Home/lib/jli/libjli.dylib");
if (FilePath::FileExists(result) == false) {
result = _T("");
}
}
*** 179,188 ****
--- 181,195 ----
return result;
}
TString MacPlatform::GetSystemJRE() {
+ if (GetAppCDSState() == cdsOn || GetAppCDSState() == cdsGenCache) {
+ //TODO throw exception
+ return _T("");
+ }
+
return _T("/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/jli/libjli.dylib");
}
TString MacPlatform::GetSystemJVMLibraryFileName() {
TString result = GetSystemJRE();
*** 198,280 ****
NSString *appName = [[NSProcessInfo processInfo] processName];
TString result = [appName UTF8String];
return result;
}
! // Convert parts of the info.plist to the INI format the rest of the packager uses unless
! // a packager config file exists.
! PropertyContainer* MacPlatform::GetConfigFile(TString FileName) {
! if (UsePListForConfigFile() == false) {
! return new PropertyFile(FileName);
}
! NSBundle *mainBundle = [NSBundle mainBundle];
! NSDictionary *infoDictionary = [mainBundle infoDictionary];
! std::map<TString, TString> data;
! // Packager options.
! for (id key in [infoDictionary allKeys]) {
! id option = [infoDictionary valueForKey:key];
if ([key isKindOfClass:[NSString class]] && [option isKindOfClass:[NSString class]]) {
TString name = [key UTF8String];
TString value = [option UTF8String];
! data.insert(std::map<TString, TString>::value_type(name, value));
}
}
! // jvmargs
! NSArray *options = [infoDictionary objectForKey:@"JVMOptions"];
! int index = 1;
! for (id option in options) {
! if ([option isKindOfClass:[NSString class]]) {
! TString value = [option UTF8String];
! TString argname = TString(_T("jvmarg.")) + PlatformString(index).toString();
! data.insert(std::map<TString, TString>::value_type(argname, value));
! index++;
}
}
// jvmuserargs
! NSDictionary *defaultOverrides = [infoDictionary objectForKey:@"JVMUserOptions"];
! index = 1;
! for (id key in defaultOverrides) {
! id option = [defaultOverrides valueForKey:key];
! if ([key isKindOfClass:[NSString class]] && [option isKindOfClass:[NSString class]]) {
! TString name = [key UTF8String];
! TString value = [option UTF8String];
! TString prefix = TString(_T("jvmuserarg.")) + PlatformString(index).toString();
! TString argname = prefix + _T(".name");
! TString argvalue = prefix + _T(".value");
! data.insert(std::map<TString, TString>::value_type(argname, name));
! data.insert(std::map<TString, TString>::value_type(argvalue, value));
! index++;
! }
}
! // args
! NSDictionary *args = [infoDictionary objectForKey:@"ArgOptions"];
! index = 1;
! for (id option in args) {
! if ([option isKindOfClass:[NSString class]]) {
! TString value = [option UTF8String];
! TString argname = TString(_T("arg.")) + PlatformString(index).toString();
! data.insert(std::map<TString, TString>::value_type(argname, value));
! index++;
}
}
! return new PropertyFile(data);
}
TString MacPlatform::GetModuleFileName() {
! return "";
}
bool MacPlatform::IsMainThread() {
bool result = (pthread_main_np() == 1);
return result;
--- 205,346 ----
NSString *appName = [[NSProcessInfo processInfo] processName];
TString result = [appName UTF8String];
return result;
}
! void AppendPListArrayToIniFile(NSDictionary *infoDictionary, IniFile *result, TString Section) {
! NSString *sectionKey = [NSString stringWithUTF8String:PlatformString(Section).toMultibyte()];
! NSDictionary *array = [infoDictionary objectForKey:sectionKey];
!
! for (id option in array) {
! if ([option isKindOfClass:[NSString class]]) {
! TString arg = [option UTF8String];
!
! TString name;
! TString value;
!
! if (Helpers::SplitOptionIntoNameValue(arg, name, value) == true) {
! result->Append(Section, name, value);
! }
}
+ }
+ }
! void AppendPListDictionaryToIniFile(NSDictionary *infoDictionary, IniFile *result, TString Section, bool FollowSection = true) {
! NSDictionary *dictionary = NULL;
! if (FollowSection == true) {
! NSString *sectionKey = [NSString stringWithUTF8String:PlatformString(Section).toMultibyte()];
! dictionary = [infoDictionary objectForKey:sectionKey];
! }
! else {
! dictionary = infoDictionary;
! }
! for (id key in dictionary) {
! id option = [dictionary valueForKey:key];
if ([key isKindOfClass:[NSString class]] && [option isKindOfClass:[NSString class]]) {
TString name = [key UTF8String];
TString value = [option UTF8String];
! result->Append(Section, name, value);
}
}
+ }
! // Convert parts of the info.plist to the INI format the rest of the packager uses unless
! // a packager config file exists.
! ISectionalPropertyContainer* MacPlatform::GetConfigFile(TString FileName) {
! IniFile* result = new IniFile();
! if (UsePListForConfigFile() == false) {
! if (result->LoadFromFile(FileName) == false) {
! // New property file format was not found, attempt to load old property file format.
! Helpers::LoadOldConfigFile(FileName, result);
}
}
+ else {
+ NSBundle *mainBundle = [NSBundle mainBundle];
+ NSDictionary *infoDictionary = [mainBundle infoDictionary];
+ std::map<TString, TString> keys = GetKeys();
+
+ // Packager options.
+ AppendPListDictionaryToIniFile(infoDictionary, result, keys[CONFIG_SECTION_APPLICATION], false);
+
+ // jvmargs
+ AppendPListArrayToIniFile(infoDictionary, result, keys[CONFIG_SECTION_JVMOPTIONS]);
// jvmuserargs
! AppendPListDictionaryToIniFile(infoDictionary, result, keys[CONFIG_SECTION_JVMUSEROPTIONS]);
! // Generate AppCDS Cache
! AppendPListDictionaryToIniFile(infoDictionary, result, keys[CONFIG_SECTION_APPCDSJVMOPTIONS]);
! AppendPListDictionaryToIniFile(infoDictionary, result, keys[CONFIG_SECTION_APPCDSGENERATECACHEJVMOPTIONS]);
! // args
! AppendPListArrayToIniFile(infoDictionary, result, keys[CONFIG_SECTION_ARGOPTIONS]);
}
! return result;
! }
! /*
! #include <mach-o/dyld.h>
! #include <mach-o/getsect.h>
! #include <dlfcn.h>
! #include <string>
! std::string GetModuleFileName(const void *module)
! {
! if (!module) { return std::string(); }
! uint32_t count = _dyld_image_count();
! for (uint32_t i = 0; i < count; ++i) {
! const mach_header *header = _dyld_get_image_header(i);
! if (!header) { break; }
! char *code_ptr = NULL;
! if ((header->magic & MH_MAGIC_64) == MH_MAGIC_64) {
! uint64_t size;
! code_ptr = getsectdatafromheader_64((const mach_header_64 *)header, SEG_TEXT, SECT_TEXT, &size);
! } else {
! uint32_t size;
! code_ptr = getsectdatafromheader(header, SEG_TEXT, SECT_TEXT, &size);
! }
! if (!code_ptr) { continue; }
! const uintptr_t slide = _dyld_get_image_vmaddr_slide(i);
! const uintptr_t start = (const uintptr_t)code_ptr + slide;
! Dl_info info;
! if (dladdr((const void *)start, &info)) {
! if (dlopen(info.dli_fname, RTLD_NOW) == module) {
! return std::string(info.dli_fname);
! }
}
}
+ return std::string();
+ }*/
! TString GetModuleFileNameOSX() {
! Dl_info module_info;
! if (dladdr(reinterpret_cast<void*>(GetModuleFileNameOSX), &module_info) == 0) {
! // Failed to find the symbol we asked for.
! return std::string();
! }
! return TString(module_info.dli_fname);
}
+ #include <mach-o/dyld.h>
+
TString MacPlatform::GetModuleFileName() {
! //return GetModuleFileNameOSX();
!
! TString result;
! DynamicBuffer<TCHAR> buffer(MAX_PATH);
! uint32_t size = buffer.GetSize();
!
! if (_NSGetExecutablePath(buffer.GetData(), &size) == 0) {
! result = FileSystemStringToString(buffer.GetData());
! }
!
! return result;
}
bool MacPlatform::IsMainThread() {
bool result = (pthread_main_np() == 1);
return result;
*** 291,309 ****
if (UsePListForConfigFile() == false) {
return GenericPlatform::GetKeys();
}
else {
keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINJAR_KEY, _T("JVMMainJarName")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINCLASSNAME_KEY, _T("JVMMainClassName")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_CLASSPATH_KEY, _T("JVMAppClasspath")));
keys.insert(std::map<TString, TString>::value_type(APP_NAME_KEY, _T("CFBundleName")));
- keys.insert(std::map<TString, TString>::value_type(CONFIG_SPLASH_KEY, _T("app.splash")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_ID_KEY, _T("JVMPreferencesID")));
keys.insert(std::map<TString, TString>::value_type(JVM_RUNTIME_KEY, _T("JVMRuntime")));
keys.insert(std::map<TString, TString>::value_type(PACKAGER_APP_DATA_DIR, _T("CFBundleIdentifier")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_MEMORY, _T("app.memory")));
}
return keys;
}
--- 357,385 ----
if (UsePListForConfigFile() == false) {
return GenericPlatform::GetKeys();
}
else {
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_VERSION, _T("app.version")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINJAR_KEY, _T("JVMMainJarName")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINCLASSNAME_KEY, _T("JVMMainClassName")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_CLASSPATH_KEY, _T("JVMAppClasspath")));
keys.insert(std::map<TString, TString>::value_type(APP_NAME_KEY, _T("CFBundleName")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_ID_KEY, _T("JVMPreferencesID")));
keys.insert(std::map<TString, TString>::value_type(JVM_RUNTIME_KEY, _T("JVMRuntime")));
keys.insert(std::map<TString, TString>::value_type(PACKAGER_APP_DATA_DIR, _T("CFBundleIdentifier")));
+
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SPLASH_KEY, _T("app.splash")));
keys.insert(std::map<TString, TString>::value_type(CONFIG_APP_MEMORY, _T("app.memory")));
+
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SECTION_APPLICATION, _T("Application")));
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SECTION_JVMOPTIONS, _T("JVMOptions")));
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SECTION_JVMUSEROPTIONS, _T("JVMUserOptions")));
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SECTION_JVMUSEROVERRIDESOPTIONS, _T("JVMUserOverrideOptions")));
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SECTION_APPCDSJVMOPTIONS, _T("AppCDSJVMOptions")));
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SECTION_APPCDSGENERATECACHEJVMOPTIONS, _T("AppCDSGenerateCacheJVMOptions")));
+ keys.insert(std::map<TString, TString>::value_type(CONFIG_SECTION_ARGOPTIONS, _T("ArgOptions")));
}
return keys;
}
*** 335,375 ****
//--------------------------------------------------------------------------------------------------
class UserDefaults {
private:
! TOrderedMap FData;
TString FDomainName;
! bool ReadDictionary(NSDictionary *Items, TOrderedMap &Data) {
bool result = false;
- int index = 1;
for (id key in Items) {
id option = [Items valueForKey:key];
if ([key isKindOfClass:[NSString class]] && [option isKindOfClass:[NSString class]]) {
TString name = [key UTF8String];
TString value = [option UTF8String];
if (name.empty() == false) {
! TValueIndex item;
! item.value = value;
! item.index = index;
!
! Data.insert(TOrderedMap::value_type(name, item));
! result = true;
! index++;
}
}
}
return result;
}
// Open and read the defaults file specified by domain.
! bool ReadPreferences(NSDictionary *Defaults, std::list<TString> Keys, TOrderedMap &Data) {
bool result = false;
if (Keys.size() > 0 && Defaults != NULL) {
NSDictionary *node = Defaults;
--- 411,444 ----
//--------------------------------------------------------------------------------------------------
class UserDefaults {
private:
! OrderedMap<TString, TString> FData;
TString FDomainName;
! bool ReadDictionary(NSDictionary *Items, OrderedMap<TString, TString> &Data) {
bool result = false;
for (id key in Items) {
id option = [Items valueForKey:key];
if ([key isKindOfClass:[NSString class]] && [option isKindOfClass:[NSString class]]) {
TString name = [key UTF8String];
TString value = [option UTF8String];
if (name.empty() == false) {
! Data.Append(name, value);
}
}
}
return result;
}
// Open and read the defaults file specified by domain.
! bool ReadPreferences(NSDictionary *Defaults, std::list<TString> Keys, OrderedMap<TString, TString> &Data) {
bool result = false;
if (Keys.size() > 0 && Defaults != NULL) {
NSDictionary *node = Defaults;
*** 415,425 ****
bool Read(std::list<TString> Keys) {
NSDictionary *defaults = LoadPreferences(FDomainName);
return ReadPreferences(defaults, Keys, FData);
}
! TOrderedMap GetData() {
return FData;
}
};
//--------------------------------------------------------------------------------------------------
--- 484,494 ----
bool Read(std::list<TString> Keys) {
NSDictionary *defaults = LoadPreferences(FDomainName);
return ReadPreferences(defaults, Keys, FData);
}
! OrderedMap<TString, TString> GetData() {
return FData;
}
};
//--------------------------------------------------------------------------------------------------