From d0a4c993ffa9eb120fbad3745d99135a35a39077 Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 7 Nov 2015 18:31:58 +0100 Subject: [PATCH] Fixed: Use ShellExecute to open a document or URL as primary method, because second one doesn't work everytime --- code/nel/src/misc/common.cpp | 133 +++++++++++++++-------------- code/ryzom/client/src/commands.cpp | 12 +-- code/ryzom/client/src/login.cpp | 2 +- 3 files changed, 69 insertions(+), 78 deletions(-) diff --git a/code/nel/src/misc/common.cpp b/code/nel/src/misc/common.cpp index 8183430f1..112bc1ac0 100644 --- a/code/nel/src/misc/common.cpp +++ b/code/nel/src/misc/common.cpp @@ -1025,34 +1025,71 @@ LONG GetRegKey(HKEY key, LPCSTR subkey, LPSTR retdata) } #endif // NL_OS_WINDOWS +static bool openDocWithExtension (const char *document, const char *ext) +{ +#ifdef NL_OS_WINDOWS + // First try ShellExecute() + HINSTANCE result = ShellExecuteA(NULL, "open", document, NULL, NULL, SW_SHOWDEFAULT); + + // If it failed, get the .htm regkey and lookup the program + if ((uintptr_t)result <= HINSTANCE_ERROR) + { + char key[MAX_PATH + MAX_PATH]; + + if (GetRegKey(HKEY_CLASSES_ROOT, ext, key) == ERROR_SUCCESS) + { + lstrcatA(key, "\\shell\\open\\command"); + + if (GetRegKey(HKEY_CLASSES_ROOT, key, key) == ERROR_SUCCESS) + { + char *pos = strstr(key, "\"%1\""); + + if (pos == NULL) + { + // No quotes found + // Check for %1, without quotes + pos = strstr(key, "%1"); + + if (pos == NULL) + { + // No parameter at all... + pos = key+lstrlenA(key)-1; + } + else + { + // Remove the parameter + *pos = '\0'; + } + } + else + { + // Remove the parameter + *pos = '\0'; + } + + lstrcatA(pos, " "); + lstrcatA(pos, document); + int res = WinExec(key, SW_SHOWDEFAULT); + return (res>31); + } + } + } + else + { + return true; + } +#else + // TODO: implement for Linux and Mac OS X + nlunreferenced(document); +#endif // NL_OS_WINDOWS + + return false; +} + bool openURL (const char *url) { #ifdef NL_OS_WINDOWS - char key[1024]; - if (GetRegKey(HKEY_CLASSES_ROOT, ".html", key) == ERROR_SUCCESS) - { - lstrcatA(key, "\\shell\\open\\command"); - - if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) - { - char *pos; - pos = strstr(key, "\"%1\""); - if (pos == NULL) { // No quotes found - pos = strstr(key, "%1"); // Check for %1, without quotes - if (pos == NULL) // No parameter at all... - pos = key+lstrlenA(key)-1; - else - *pos = '\0'; // Remove the parameter - } - else - *pos = '\0'; // Remove the parameter - - lstrcatA(pos, " "); - lstrcatA(pos, url); - int res = WinExec(key,SW_SHOWDEFAULT); - return (res>31); - } - } + return openDocWithExtension(url, "htm"); #elif defined(NL_OS_MAC) return launchProgram("open", url); #elif defined(NL_OS_UNIX) @@ -1060,53 +1097,17 @@ bool openURL (const char *url) #else nlwarning("openURL() is not implemented for this OS"); #endif // NL_OS_WINDOWS + return false; } bool openDoc (const char *document) { -#ifdef NL_OS_WINDOWS - string ext = CFile::getExtension (document); - char key[MAX_PATH + MAX_PATH]; + // get extension from document fullpath + string ext = CFile::getExtension(document); - // First try ShellExecute() - HINSTANCE result = ShellExecuteA(NULL, "open", document, NULL,NULL, SW_SHOWDEFAULT); - - // If it failed, get the .htm regkey and lookup the program - if ((uintptr_t)result <= HINSTANCE_ERROR) - { - if (GetRegKey(HKEY_CLASSES_ROOT, ext.c_str(), key) == ERROR_SUCCESS) - { - lstrcatA(key, "\\shell\\open\\command"); - - if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) - { - char *pos; - pos = strstr(key, "\"%1\""); - if (pos == NULL) { // No quotes found - pos = strstr(key, "%1"); // Check for %1, without quotes - if (pos == NULL) // No parameter at all... - pos = key+lstrlenA(key)-1; - else - *pos = '\0'; // Remove the parameter - } - else - *pos = '\0'; // Remove the parameter - - lstrcatA(pos, " "); - lstrcatA(pos, document); - int res = WinExec(key,SW_SHOWDEFAULT); - return (res>31); - } - } - } - else - return true; -#else - // TODO: implement for Linux and Mac OS X - nlunreferenced(document); -#endif // NL_OS_WINDOWS - return false; + // try to open document + return openDocWithExtension(document, ext.c_str()); } } // NLMISC diff --git a/code/ryzom/client/src/commands.cpp b/code/ryzom/client/src/commands.cpp index 90287955d..e60146c3f 100644 --- a/code/ryzom/client/src/commands.cpp +++ b/code/ryzom/client/src/commands.cpp @@ -3913,20 +3913,12 @@ NLMISC_COMMAND(displayActionCounter, "display the action counters", "") } -#if defined(NL_OS_WINDOWS) NLMISC_COMMAND (url, "launch a browser to the specified url", "") { if (args.size () != 1) return false; - HINSTANCE result = ShellExecute(NULL, "open", args[0].c_str(), NULL,NULL, SW_SHOW); - if ((intptr_t)result > 32) - return true; - else - { - log.displayNL ("ShellExecute failed %d", (uint32)(intptr_t)result); - return false; - } + return openURL(args[0].c_str()); } NLMISC_COMMAND( reconnect, "Reconnect to the same shard (self Far TP)", "") @@ -3949,8 +3941,6 @@ NLMISC_COMMAND( reconnect, "Reconnect to the same shard (self Far TP)", "") return true; } -#endif // !FINAL_VERSION - struct CItemSheetSort { const CItemSheet *IS; diff --git a/code/ryzom/client/src/login.cpp b/code/ryzom/client/src/login.cpp index 8d98d9fb6..2dda3bf6a 100644 --- a/code/ryzom/client/src/login.cpp +++ b/code/ryzom/client/src/login.cpp @@ -1922,7 +1922,7 @@ class CAHOpenURL : public IActionHandler url += "language=" + ClientCfg.LanguageCode; openURL(url.c_str()); - nlinfo("openURL %s",url.c_str()); + nlinfo("openURL %s", url.c_str()); } }; REGISTER_ACTION_HANDLER (CAHOpenURL, "open_url");