macOS: Add initialization of breakpad crash reporter
authorMarvin Scholz <epirat07@gmail.com>
Tue, 14 Feb 2017 22:50:29 +0000 (23:50 +0100)
committerMarvin Scholz <epirat07@gmail.com>
Fri, 17 Feb 2017 20:18:13 +0000 (21:18 +0100)
bin/darwinvlc.m
modules/gui/macosx/Resources/Info.plist.in

index 93314c8..981d7a9 100644 (file)
 #import <CoreFoundation/CoreFoundation.h>
 #import <Cocoa/Cocoa.h>
 
+#ifdef HAVE_BREAKPAD
+#import <Breakpad/Breakpad.h>
+#endif
+
 
 /**
  * Handler called when VLC asks to terminate the program.
@@ -75,6 +79,36 @@ static void vlc_terminate(void *data)
     });
 }
 
+#ifdef HAVE_BREAKPAD
+BreakpadRef initBreakpad()
+{
+    BreakpadRef bp = nil;
+
+    /* Create caches directory in case it does not exist */
+    NSFileManager *fileManager = [NSFileManager defaultManager];
+    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
+    NSString *bundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
+    NSString *cacheAppPath = [cachePath stringByAppendingPathComponent:bundleName];
+    if (![fileManager fileExistsAtPath:cacheAppPath]) {
+        [fileManager createDirectoryAtPath:cacheAppPath withIntermediateDirectories:NO attributes:nil error:nil];
+    }
+
+    /* Get Info.plist config */
+    NSMutableDictionary *breakpad_config = [[[NSBundle mainBundle] infoDictionary] mutableCopy];
+
+    /* Use in-process reporting */
+    [breakpad_config setObject:[NSNumber numberWithBool:YES]
+                        forKey:@BREAKPAD_IN_PROCESS];
+
+    /* Set dump location */
+    [breakpad_config setObject:cacheAppPath
+                        forKey:@BREAKPAD_DUMP_DIRECTORY];
+
+    bp = BreakpadCreate(breakpad_config);
+    return bp;
+}
+#endif
+
 /*****************************************************************************
  * main: parse command line, start interface and spawn threads.
  *****************************************************************************/
@@ -259,6 +293,10 @@ int main(int i_argc, const char *ppsz_argv[])
      * runloop is used. Otherwise, [NSApp run] needs to be called, which setups more stuff
      * before actually starting the loop.
      */
+#ifdef HAVE_BREAKPAD
+    BreakpadRef breakpad;
+    breakpad = initBreakpad();
+#endif
     @autoreleasepool {
         if(NSApp == nil) {
             CFRunLoopRun();
@@ -277,5 +315,9 @@ out:
 
     libvlc_release(vlc);
 
+#ifdef HAVE_BREAKPAD
+    BreakpadRelease(breakpad);
+#endif
+
     return ret;
 }
index 28e6738..31535d3 100644 (file)
        <string>@VERSION@</string>
        <key>CFBundleSignature</key>
        <string>VLC#</string>
+       <key>BreakpadProduct</key>
+       <string>VLC-macOS</string>
+       <key>BreakpadVendor</key>
+       <string>VideoLAN</string>
+       <key>BreakpadRequestComments</key>
+       <string>1</string>
+       <key>BreakpadURL</key>
+       <string>https://crashes.videolan.org/crashreports</string>
        <key>CFBundleURLTypes</key>
        <array>
                <dict>