MegaGlest/source/shared_lib/include/platform/sdl/platform_util.h

148 lines
4.2 KiB
C++

// ==============================================================
// This file is part of Glest Shared Library (www.glest.org)
//
// Copyright (C) 2005 Matthias Braun <matze@braunis.de>
//
// You can redistribute this code and/or modify it under
// the terms of the GNU General Public License as published
// by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version
// ==============================================================
#ifndef _SHARED_PLATFORM_PLATFORMUTIL_H_
#define _SHARED_PLATFORM_PLATFORMUTIL_H_
#ifdef WIN32
#include <windows.h>
#endif
#include <string>
#include <stdexcept>
#include "platform_common.h"
#include "leak_dumper.h"
using namespace Shared::PlatformCommon;
using std::string;
using std::exception;
namespace Shared { namespace Platform {
class megaglest_runtime_error : public runtime_error {
protected:
bool noStackTrace;
public:
megaglest_runtime_error(const string& __arg,bool noStackTrace=false);
bool wantStackTrace() const { return !noStackTrace; }
};
#ifndef WIN32
// =====================================================
// class PlatformExceptionHandler
// =====================================================
class PlatformExceptionHandler {
public:
static string application_binary;
static bool disableBacktrace;
static string getStackTrace();
virtual ~PlatformExceptionHandler() {}
void install(string dumpFileName) {}
virtual void handle()=0;
#if defined(__WIN32__) && !defined(__GNUC__)
virtual void handle(LPEXCEPTION_POINTERS pointers)=0;
#endif
};
// =====================================================
// Misc
// =====================================================
void message(const string &message,bool isNonGraphicalModeEnabled, const string &writepath);
void exceptionMessage(const exception &excp);
string getCommandLine();
// WINDOWS
#else
// =====================================================
// class PlatformExceptionHandler
// =====================================================
class PlatformExceptionHandler {
private:
static PlatformExceptionHandler *thisPointer;
private:
static LONG WINAPI handler(LPEXCEPTION_POINTERS pointers);
string dumpFileName;
public:
static string application_binary;
static bool disableBacktrace;
static string getStackTrace();
void install(string dumpFileName);
virtual void handle()=0;
#if !defined(__GNUC__)
virtual void handle(LPEXCEPTION_POINTERS pointers)=0;
#endif
static string codeToStr(DWORD code);
};
LONG WINAPI UnhandledExceptionFilter2(struct _EXCEPTION_POINTERS *ExceptionInfo);
// =====================================================
// Misc
// =====================================================
LPWSTR Ansi2WideString(LPCSTR lpaszString);
std::string utf8_encode(const std::wstring &wstr);
std::wstring utf8_decode(const std::string &str);
std::string getRegKey(const std::string& location, const std::string& name);
void message(string message, bool isNonGraphicalModeEnabled,const string &writepath);
void exceptionMessage(const exception &excp);
string getCommandLine();
void init_win32();
void done_win32();
void ontop_win32(int width, int height);
void CheckPacketThrottling();
// The following is used for stacking tracing for windows based exceptions
#if !defined(_DEBUG) && !defined(__GNUC__)
// easy safe strings
#define MAXSTRLEN 260
typedef char stringType[MAXSTRLEN];
inline void vformatstring(char *d, const char *fmt, va_list v, int len = MAXSTRLEN) { _vsnprintf(d, len, fmt, v); d[len-1] = 0; }
inline char *copystring(char *d, const char *s, size_t len = MAXSTRLEN) { strncpy(d, s, len); d[len-1] = 0; return d; }
inline char *concatstring(char *d, const char *s, size_t len = MAXSTRLEN) { size_t used = strlen(d); return used < len ? copystring(d+used, s, len-used) : d; }
struct stringformatter {
char *buf;
stringformatter(char *buf): buf((char *)buf) {}
void operator()(const char *fmt, ...) {
va_list v;
va_start(v, fmt);
vformatstring(buf, fmt, v);
va_end(v);
}
};
#define formatstring(d) stringformatter((char *)d)
#define defformatstring(d) stringType d; formatstring(d)
#define defvformatstring(d,last,fmt) stringType d; { va_list ap; va_start(ap, last); vformatstring(d, fmt, ap); va_end(ap); }
#endif
#endif
}}//end namespace
#endif