File: c_bpwrapper.cpp

package info (click to toggle)
seafile 9.0.15-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 4,200 kB
  • sloc: ansic: 44,863; python: 6,601; sh: 272; makefile: 268; cpp: 93
file content (101 lines) | stat: -rw-r--r-- 2,878 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifdef ENABLE_BREAKPAD

#if defined(WIN32)
#include <client/windows/handler/exception_handler.h>
#endif
#include <stdio.h>
#include <string>

#include "c_bpwrapper.h"

wchar_t *utf8ToWString(const std::string &src)
{
    wchar_t dst[4096];
    int len;

    len = MultiByteToWideChar
        (CP_UTF8,                        /* multibyte code page */
         0,                              /* flags */
         src.c_str(),                    /* src */
         -1,                             /* src len, -1 for all includes \0 */
         dst,                            /* dst */
         sizeof(dst) / sizeof(wchar_t)); /* dst buf len */

    if (len <= 0) {
        return NULL;
    }

    return _wcsdup(dst);
}

std::string wStringToUtf8(const wchar_t *src)
{
    char dst[4096];
    int len;

    len = WideCharToMultiByte
        (CP_UTF8,               /* multibyte code page */
         0,                     /* flags */
         src,                   /* src */
         -1,                    /* src len, -1 for all includes \0 */
         dst,                   /* dst */
         sizeof(dst),           /* dst buf len */
         NULL,                  /* default char */
         NULL);                 /* BOOL flag indicates default char is used */

    if (len <= 0) {
        return "";
    }

    return dst;
}

std::string wStringToLocale(const wchar_t *src)
{
    char dst[4096];
    int len;

    len = WideCharToMultiByte
        (CP_ACP,        /* multibyte code page */
         0,             /* flags */
         src,           /* src */
         -1,            /* src len, -1 for all includes \0 */
         dst,           /* dst */
         sizeof(dst),   /* dst buf len */
         NULL,          /* default char */
         NULL);         /* BOOL flag indicates default char is used */

    if (len <= 0) {
        return "";
    }

    return dst;
}

bool DumpCallback(const wchar_t *dump_path,
                  const wchar_t *minidump_id,
                  void *context,
                  EXCEPTION_POINTERS *exinfo,
                  MDRawAssertionInfo *assertion,
                  bool succeeded)
{
    printf("program dump %s\n", succeeded ? "succeeded" : "failed");
    printf("program crashed, you can find the minidump in %s\n", wStringToLocale(dump_path).c_str());
    printf("minidump id: %s\n", wStringToLocale(minidump_id).c_str());
    return succeeded;
}


extern "C" {
    CBPWrapperExceptionHandler newCBPWrapperExceptionHandler(const char *dump_dir)
    {
        printf("initializing crash reporter\n");
        std::wstring path = utf8ToWString(dump_dir);
        return reinterpret_cast<void *>(new google_breakpad::ExceptionHandler(
            path, NULL,
            (google_breakpad::ExceptionHandler::MinidumpCallback)DumpCallback, NULL,
            google_breakpad::ExceptionHandler::HANDLER_ALL));
    }
}

#endif