remote/Utils.cpp (102 lines of code) (raw):
#include "Utils.h"
#include "include/cef_path_util.h"
#include <iostream>
#include <typeinfo>
#include <string>
#if defined(OS_WIN)
#include <tlhelp32.h>
#include <windows.h>
namespace utils {
int GetPid() {
return (int)GetCurrentProcessId();
}
int GetParentPid() {
DWORD pid = GetCurrentProcessId();
int ppid = 0;
HANDLE hProcess;
PROCESSENTRY32 pe32;
hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcess == INVALID_HANDLE_VALUE)
return ppid;
pe32.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hProcess, &pe32)) {
CloseHandle(hProcess);
return ppid;
}
do {
if (pe32.th32ProcessID == pid) {
ppid = (int)pe32.th32ParentProcessID;
break;
}
} while (Process32Next(hProcess, &pe32));
CloseHandle(hProcess);
return ppid;
}
std::string GetTempFile(const std::string& identifer, bool useParentId) {
std::stringstream tmpName;
CefString tmpPath;
if (!CefGetPath(PK_DIR_TEMP, tmpPath)) {
TCHAR lpPathBuffer[MAX_PATH];
GetTempPath(MAX_PATH, lpPathBuffer);
tmpPath.FromWString(lpPathBuffer);
}
tmpName << tmpPath.ToString().c_str() << "\\";
tmpName << "jcef-p" << (useParentId ? GetParentPid() : GetPid());
tmpName << (identifer.empty() ? "" : "_") << identifer.c_str() << ".tmp";
return tmpName.str();
}
// MSVC doesn't need demangling; __FUNCSIG__ often more reliable
std::string demangle(const char* name) {
return std::string(name);
}
} // namespace utils
#else
#include <cxxabi.h>
#include <memory>
namespace utils {
int GetPid() {
return getpid();
}
int GetParentPid() {
return getppid();
}
std::string GetTempFile(const std::string& identifer, bool useParentId) {
std::stringstream tmpName;
CefString tmpPath;
if (!CefGetPath(PK_DIR_TEMP, tmpPath))
tmpPath = "/tmp/";
tmpName << tmpPath.ToString().c_str();
tmpName << "jcef-p" << (useParentId ? GetParentPid() : GetPid());
tmpName << (identifer.empty() ? "" : "_") << identifer.c_str() << ".tmp";
return tmpName.str();
}
std::string demangle(const char* name) {
int status = -1;
std::unique_ptr<char, void(*)(void*)> res{
abi::__cxa_demangle(name, nullptr, nullptr, &status),
std::free
};
return (status == 0) ? std::string(res.get()) : std::string(name);
}
} // namespace utils
#endif // OS_WIN
namespace utils {
bool isFileExist(const char* pathname) {
if (FILE *file = fopen(pathname, "r")) {
fclose(file);
return true;
}
return false;
}
}
bool getBoolEnv(const std::string & envName, bool defaultVal/* = false*/) {
const char* sval = getenv(envName.c_str());
if (sval == nullptr)
return defaultVal;
return strcmp(sval, "1") == 0 || strcmp(sval, "true") == 0;
}
long getLongEnv(const std::string & envName, long defVal) {
const char* sval = getenv(envName.c_str());
if (sval == nullptr)
return defVal;
return atol(sval);
}