#include <cstdlib> #include <cstring> #include <cstdio> #ifdef WIN #include <shlobj.h> #include <shlwapi.h> #include <windows.h> #else #include <unistd.h> #include <time.h> #include <sys/time.h> #endif #ifdef MACOSX #include <mach-o/dyld.h> #endif #include "Platform.h" #include "Misc.h" namespace Platform { char *ExecutableName(void) { #if defined(WIN) char *name = (char *)malloc(64); DWORD max = 64, res; while ((res = GetModuleFileName(NULL, name, max)) >= max) { #elif defined MACOSX char *fn = (char*)malloc(64),*name = (char*)malloc(PATH_MAX); uint32_t max = 64, res; if (_NSGetExecutablePath(fn, &max) != 0) { fn = (char*)realloc(fn, max); _NSGetExecutablePath(fn, &max); } if (realpath(fn, name) == NULL) { free(fn); free(name); return NULL; } res = 1; #else char fn[64], *name = (char *)malloc(64); size_t max = 64, res; sprintf(fn, "/proc/self/exe"); memset(name, 0, max); while ((res = readlink(fn, name, max)) >= max-1) { #endif #ifndef MACOSX max *= 2; name = (char *)realloc(name, max); memset(name, 0, max); } #endif if (res <= 0) { free(name); return NULL; } return name; } void DoRestart() { char *exename = ExecutableName(); if (exename) { #ifdef WIN ShellExecute(NULL, "open", exename, NULL, NULL, SW_SHOWNORMAL); #elif defined(LIN) || defined(MACOSX) execl(exename, "powder", NULL); #endif free(exename); } exit(-1); } void OpenURI(std::string uri) { #if defined(WIN) ShellExecute(0, "OPEN", uri.c_str(), NULL, NULL, 0); #elif defined(MACOSX) char *cmd = (char*)malloc(7+uri.length()); strcpy(cmd, "open "); strappend(cmd, (char*)uri.c_str()); system(cmd); #elif defined(LIN) char *cmd = (char*)malloc(11+uri.length()); strcpy(cmd, "xdg-open "); strappend(cmd, (char*)uri.c_str()); system(cmd); #else printf("Cannot open browser\n"); #endif } void Millisleep(long int t) { #ifdef WIN Sleep(t); #else struct timespec s; s.tv_sec = t / 1000; s.tv_nsec = (t % 1000) * 10000000; nanosleep(&s, NULL); #endif } long unsigned int GetTime() { #ifdef WIN return GetTickCount(); #elif defined(MACOSX) struct timeval s; gettimeofday(&s, NULL); return (unsigned int)(s.tv_sec * 1000 + s.tv_usec / 1000); #else struct timespec s; clock_gettime(CLOCK_MONOTONIC, &s); return s.tv_sec * 1000 + s.tv_nsec / 1000000; #endif } }