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; } }; //--------------------------------------------------------------------------------------------------