Merge with develop

--HG--
branch : compatibility-develop
This commit is contained in:
kervala 2015-11-07 18:34:25 +01:00
commit 6fa9131bf8
5 changed files with 94 additions and 99 deletions

View file

@ -2140,7 +2140,8 @@ namespace NLGUI
std::string typeName = "???"; std::string typeName = "???";
if (_ChildrenGroups[k]) if (_ChildrenGroups[k])
{ {
const type_info &ti = typeid(*_ChildrenGroups[k]); NLGUI::CInterfaceGroup *group = _ChildrenGroups[k];
const type_info &ti = typeid(*group);
typeName = ti.name(); typeName = ti.name();
} }
nlinfo("Group %d, name = %s, type=%s", k, _ChildrenGroups[k] ? _ChildrenGroups[k]->getId().c_str() : "???", typeName.c_str()); nlinfo("Group %d, name = %s, type=%s", k, _ChildrenGroups[k] ? _ChildrenGroups[k]->getId().c_str() : "???", typeName.c_str());
@ -2156,7 +2157,8 @@ namespace NLGUI
std::string typeName = "???"; std::string typeName = "???";
if (_ChildrenGroups[k]) if (_ChildrenGroups[k])
{ {
const type_info &ti = typeid(*_EltOrder[k]); NLGUI::CViewBase *view = _EltOrder[k];
const type_info &ti = typeid(*view);
typeName = ti.name(); typeName = ti.name();
} }
CInterfaceElement *el = _EltOrder[k]; CInterfaceElement *el = _EltOrder[k];

View file

@ -440,7 +440,7 @@ NLMISC_CATEGORISED_COMMAND(nel,hrtob, "Convert a human readable number into a by
string secondsToHumanReadable (uint32 time) string secondsToHumanReadable (uint32 time)
{ {
static const char *divTable[] = { "s", "mn", "h", "d" }; static const char *divTable[] = { "s", "mn", "h", "d" };
static uint divCoef[] = { 60, 60, 24 }; static uint divCoef[] = { 60, 60, 24 };
uint div = 0; uint div = 0;
uint32 res = time; uint32 res = time;
uint32 newres = res; uint32 newres = res;
@ -671,13 +671,13 @@ bool launchProgram(const std::string &programName, const std::string &arguments,
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
STARTUPINFOA si; STARTUPINFOA si;
PROCESS_INFORMATION pi; PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(si)); memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi)); memset(&pi, 0, sizeof(pi));
si.cb = sizeof(si); si.cb = sizeof(si);
/* SECURITY_ATTRIBUTES sa; /* SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof (sa); sa.nLength = sizeof (sa);
@ -781,7 +781,7 @@ bool launchProgram(const std::string &programName, const std::string &arguments,
nlwarning("LAUNCH: Failed launched '%s' with arg '%s' err %d: '%s'", programName.c_str(), arguments.c_str(), errno, err); nlwarning("LAUNCH: Failed launched '%s' with arg '%s' err %d: '%s'", programName.c_str(), arguments.c_str(), errno, err);
} }
else if (status == 0) else if (status == 0)
{ {
// Exec (the only allowed instruction after vfork) // Exec (the only allowed instruction after vfork)
status = execvp(programName.c_str(), &argv.front()); status = execvp(programName.c_str(), &argv.front());
@ -1009,50 +1009,87 @@ NLMISC_CATEGORISED_COMMAND(nel, killProgram, "kill a program given the pid", "<p
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
LONG GetRegKey(HKEY key, LPCSTR subkey, LPSTR retdata) LONG GetRegKey(HKEY key, LPCSTR subkey, LPSTR retdata)
{ {
HKEY hkey; HKEY hkey;
LONG retval = RegOpenKeyExA(key, subkey, 0, KEY_QUERY_VALUE, &hkey); LONG retval = RegOpenKeyExA(key, subkey, 0, KEY_QUERY_VALUE, &hkey);
if (retval == ERROR_SUCCESS) if (retval == ERROR_SUCCESS)
{ {
long datasize = MAX_PATH; long datasize = MAX_PATH;
char data[MAX_PATH]; char data[MAX_PATH];
RegQueryValueA(hkey, NULL, data, &datasize); RegQueryValueA(hkey, NULL, data, &datasize);
lstrcpyA(retdata,data); lstrcpyA(retdata,data);
RegCloseKey(hkey); RegCloseKey(hkey);
} }
return retval; return retval;
} }
#endif // NL_OS_WINDOWS #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) bool openURL (const char *url)
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
char key[1024]; return openDocWithExtension(url, "htm");
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);
}
}
#elif defined(NL_OS_MAC) #elif defined(NL_OS_MAC)
return launchProgram("open", url); return launchProgram("open", url);
#elif defined(NL_OS_UNIX) #elif defined(NL_OS_UNIX)
@ -1060,53 +1097,17 @@ bool openURL (const char *url)
#else #else
nlwarning("openURL() is not implemented for this OS"); nlwarning("openURL() is not implemented for this OS");
#endif // NL_OS_WINDOWS #endif // NL_OS_WINDOWS
return false; return false;
} }
bool openDoc (const char *document) bool openDoc (const char *document)
{ {
#ifdef NL_OS_WINDOWS // get extension from document fullpath
string ext = CFile::getExtension (document); string ext = CFile::getExtension(document);
char key[MAX_PATH + MAX_PATH];
// First try ShellExecute() // try to open document
HINSTANCE result = ShellExecuteA(NULL, "open", document, NULL,NULL, SW_SHOWDEFAULT); return openDocWithExtension(document, ext.c_str());
// 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;
} }
} // NLMISC } // NLMISC

View file

@ -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", "<url>") NLMISC_COMMAND (url, "launch a browser to the specified url", "<url>")
{ {
if (args.size () != 1) if (args.size () != 1)
return false; return false;
HINSTANCE result = ShellExecute(NULL, "open", args[0].c_str(), NULL,NULL, SW_SHOW); return openURL(args[0].c_str());
if ((intptr_t)result > 32)
return true;
else
{
log.displayNL ("ShellExecute failed %d", (uint32)(intptr_t)result);
return false;
}
} }
NLMISC_COMMAND( reconnect, "Reconnect to the same shard (self Far TP)", "") 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; return true;
} }
#endif // !FINAL_VERSION
struct CItemSheetSort struct CItemSheetSort
{ {
const CItemSheet *IS; const CItemSheet *IS;

View file

@ -2488,7 +2488,8 @@ void CInterfaceManager::dumpUI(bool /* indent */)
if (ig->getViews()[k]) if (ig->getViews()[k])
{ {
info += id; info += id;
info += toString(", type = %s, address=0x%p", typeid(*ig->getViews()[k]).name(), ig->getViews()[k]); NLGUI::CViewBase *view = ig->getViews()[k];
info += toString(", type = %s, address=0x%p", typeid(*view).name(), view);
} }
else else
{ {
@ -2504,7 +2505,8 @@ void CInterfaceManager::dumpUI(bool /* indent */)
if (ig->getControls()[k]) if (ig->getControls()[k])
{ {
info += id; info += id;
info += toString(", type = %s, address=0x%p", typeid(*ig->getControls()[k]).name(), ig->getControls()[k]); NLGUI::CCtrlBase *control = ig->getControls()[k];
info += toString(", type = %s, address=0x%p", typeid(*control).name(), control);
} }
else else
{ {

View file

@ -1922,7 +1922,7 @@ class CAHOpenURL : public IActionHandler
url += "language=" + ClientCfg.LanguageCode; url += "language=" + ClientCfg.LanguageCode;
openURL(url.c_str()); openURL(url.c_str());
nlinfo("openURL %s",url.c_str()); nlinfo("openURL %s", url.c_str());
} }
}; };
REGISTER_ACTION_HANDLER (CAHOpenURL, "open_url"); REGISTER_ACTION_HANDLER (CAHOpenURL, "open_url");