]> git.sesse.net Git - vlc/commitdiff
macosx: add and deploy QuincyKit for crashlog reporting
authorFelix Paul Kühne <fkuehne@videolan.org>
Fri, 10 Jan 2014 16:48:40 +0000 (17:48 +0100)
committerFelix Paul Kühne <fkuehne@videolan.org>
Fri, 10 Jan 2014 17:24:50 +0000 (18:24 +0100)
This is for evaluation only. We might want to revert to our previous system for the release.

extras/package/macosx/Resources/English.lproj/BWQuincyMain.xib [new file with mode: 0644]
extras/package/macosx/vlc.xcodeproj/project.pbxproj
modules/gui/macosx/BWQuincyManager.h [new file with mode: 0644]
modules/gui/macosx/BWQuincyManager.m [new file with mode: 0644]
modules/gui/macosx/BWQuincyUI.h [new file with mode: 0644]
modules/gui/macosx/BWQuincyUI.m [new file with mode: 0644]
modules/gui/macosx/Modules.am
modules/gui/macosx/intf.m

diff --git a/extras/package/macosx/Resources/English.lproj/BWQuincyMain.xib b/extras/package/macosx/Resources/English.lproj/BWQuincyMain.xib
new file mode 100644 (file)
index 0000000..61be539
--- /dev/null
@@ -0,0 +1,1389 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+  <data>
+    <int key="IBDocument.SystemTarget">1050</int>
+    <string key="IBDocument.SystemVersion">12F45</string>
+    <string key="IBDocument.InterfaceBuilderVersion">851</string>
+    <string key="IBDocument.AppKitVersion">1187.40</string>
+    <string key="IBDocument.HIToolboxVersion">626.00</string>
+    <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+      <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+      <string key="NS.object.0">851</string>
+    </object>
+    <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+      <bool key="EncodedWithXMLCoder">YES</bool>
+    </object>
+    <object class="NSArray" key="IBDocument.PluginDependencies">
+      <bool key="EncodedWithXMLCoder">YES</bool>
+      <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+    </object>
+    <object class="NSMutableDictionary" key="IBDocument.Metadata">
+      <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+      <integer value="1" key="NS.object.0"/>
+    </object>
+    <object class="NSMutableArray" key="IBDocument.RootObjects" id="557403926">
+      <bool key="EncodedWithXMLCoder">YES</bool>
+      <object class="NSCustomObject" id="265051856">
+        <string key="NSClassName">BWQuincyUI</string>
+      </object>
+      <object class="NSCustomObject" id="827796767">
+        <string key="NSClassName">FirstResponder</string>
+      </object>
+      <object class="NSCustomObject" id="582831428">
+        <string key="NSClassName">NSApplication</string>
+      </object>
+      <object class="NSWindowTemplate" id="802234099">
+        <int key="NSWindowStyleMask">1</int>
+        <int key="NSWindowBacking">2</int>
+        <string key="NSWindowRect">{{602, 592}, {571, 587}}</string>
+        <int key="NSWTFlags">1886912512</int>
+        <string key="NSWindowTitle">Crash Reporter</string>
+        <string key="NSWindowClass">NSWindow</string>
+        <object class="NSMutableString" key="NSViewClass">
+          <characters key="NS.bytes">View</characters>
+        </object>
+        <nil key="NSUserInterfaceItemIdentifier"/>
+        <string key="NSWindowContentMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+        <string key="NSWindowContentMinSize">{213, 107}</string>
+        <object class="NSView" key="NSWindowView" id="346017069">
+          <nil key="NSNextResponder"/>
+          <int key="NSvFlags">256</int>
+          <object class="NSMutableArray" key="NSSubviews">
+            <bool key="EncodedWithXMLCoder">YES</bool>
+            <object class="NSBox" id="204457754">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">288</int>
+              <object class="NSMutableArray" key="NSSubviews">
+                <bool key="EncodedWithXMLCoder">YES</bool>
+                <object class="NSView" id="511659880">
+                  <reference key="NSNextResponder" ref="204457754"/>
+                  <int key="NSvFlags">274</int>
+                  <object class="NSMutableArray" key="NSSubviews">
+                    <bool key="EncodedWithXMLCoder">YES</bool>
+                    <object class="NSTextField" id="696397380">
+                      <reference key="NSNextResponder" ref="511659880"/>
+                      <int key="NSvFlags">290</int>
+                      <string key="NSFrame">{{0, 263}, {442, 24}}</string>
+                      <reference key="NSSuperview" ref="511659880"/>
+                      <reference key="NSNextKeyView" ref="217112912"/>
+                      <bool key="NSEnabled">YES</bool>
+                      <object class="NSTextFieldCell" key="NSCell" id="922202055">
+                        <int key="NSCellFlags">67108864</int>
+                        <int key="NSCellFlags2">272629760</int>
+                        <string key="NSContents">Problem details and system configuration</string>
+                        <object class="NSFont" key="NSSupport" id="113673234">
+                          <string key="NSName">LucidaGrande</string>
+                          <double key="NSSize">13</double>
+                          <int key="NSfFlags">1040</int>
+                        </object>
+                        <reference key="NSControlView" ref="696397380"/>
+                        <object class="NSColor" key="NSBackgroundColor" id="370662603">
+                          <int key="NSColorSpace">6</int>
+                          <string key="NSCatalogName">System</string>
+                          <string key="NSColorName">controlColor</string>
+                          <object class="NSColor" key="NSColor" id="536097992">
+                            <int key="NSColorSpace">3</int>
+                            <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+                          </object>
+                        </object>
+                        <object class="NSColor" key="NSTextColor" id="140564637">
+                          <int key="NSColorSpace">6</int>
+                          <string key="NSCatalogName">System</string>
+                          <string key="NSColorName">controlTextColor</string>
+                          <object class="NSColor" key="NSColor" id="824514053">
+                            <int key="NSColorSpace">3</int>
+                            <bytes key="NSWhite">MAA</bytes>
+                          </object>
+                        </object>
+                      </object>
+                      <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+                    </object>
+                    <object class="NSScrollView" id="217112912">
+                      <reference key="NSNextResponder" ref="511659880"/>
+                      <int key="NSvFlags">290</int>
+                      <object class="NSMutableArray" key="NSSubviews">
+                        <bool key="EncodedWithXMLCoder">YES</bool>
+                        <object class="NSClipView" id="238729313">
+                          <reference key="NSNextResponder" ref="217112912"/>
+                          <int key="NSvFlags">2304</int>
+                          <object class="NSMutableArray" key="NSSubviews">
+                            <bool key="EncodedWithXMLCoder">YES</bool>
+                            <object class="NSTextView" id="436407902">
+                              <reference key="NSNextResponder" ref="238729313"/>
+                              <int key="NSvFlags">2322</int>
+                              <object class="NSMutableSet" key="NSDragTypes">
+                                <bool key="EncodedWithXMLCoder">YES</bool>
+                                <object class="NSArray" key="set.sortedObjects">
+                                  <bool key="EncodedWithXMLCoder">YES</bool>
+                                  <string>Apple HTML pasteboard type</string>
+                                  <string>Apple PDF pasteboard type</string>
+                                  <string>Apple PICT pasteboard type</string>
+                                  <string>Apple PNG pasteboard type</string>
+                                  <string>Apple URL pasteboard type</string>
+                                  <string>CorePasteboardFlavorType 0x6D6F6F76</string>
+                                  <string>NSColor pasteboard type</string>
+                                  <string>NSFilenamesPboardType</string>
+                                  <string>NSStringPboardType</string>
+                                  <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+                                  <string>NeXT RTFD pasteboard type</string>
+                                  <string>NeXT Rich Text Format v1.0 pasteboard type</string>
+                                  <string>NeXT TIFF v4.0 pasteboard type</string>
+                                  <string>NeXT font pasteboard type</string>
+                                  <string>NeXT ruler pasteboard type</string>
+                                  <string>WebURLsWithTitlesPboardType</string>
+                                  <string>public.url</string>
+                                </object>
+                              </object>
+                              <string key="NSFrame">{{0, -14}, {437, 253}}</string>
+                              <reference key="NSSuperview" ref="238729313"/>
+                              <reference key="NSNextKeyView" ref="321879571"/>
+                              <object class="NSTextContainer" key="NSTextContainer" id="567359698">
+                                <object class="NSLayoutManager" key="NSLayoutManager">
+                                  <object class="NSTextStorage" key="NSTextStorage">
+                                    <object class="NSMutableString" key="NSString">
+                                      <characters key="NS.bytes"/>
+                                    </object>
+                                    <nil key="NSDelegate"/>
+                                  </object>
+                                  <object class="NSMutableArray" key="NSTextContainers">
+                                    <bool key="EncodedWithXMLCoder">YES</bool>
+                                    <reference ref="567359698"/>
+                                  </object>
+                                  <int key="NSLMFlags">6</int>
+                                  <nil key="NSDelegate"/>
+                                </object>
+                                <reference key="NSTextView" ref="436407902"/>
+                                <double key="NSWidth">437</double>
+                                <int key="NSTCFlags">1</int>
+                              </object>
+                              <object class="NSTextViewSharedData" key="NSSharedData">
+                                <int key="NSFlags">100667363</int>
+                                <int key="NSTextCheckingTypes">0</int>
+                                <nil key="NSMarkedAttributes"/>
+                                <object class="NSColor" key="NSBackgroundColor" id="295167230">
+                                  <int key="NSColorSpace">3</int>
+                                  <bytes key="NSWhite">MQA</bytes>
+                                </object>
+                                <object class="NSDictionary" key="NSSelectedAttributes">
+                                  <bool key="EncodedWithXMLCoder">YES</bool>
+                                  <object class="NSArray" key="dict.sortedKeys">
+                                    <bool key="EncodedWithXMLCoder">YES</bool>
+                                    <string>NSBackgroundColor</string>
+                                    <string>NSColor</string>
+                                  </object>
+                                  <object class="NSMutableArray" key="dict.values">
+                                    <bool key="EncodedWithXMLCoder">YES</bool>
+                                    <object class="NSColor">
+                                      <int key="NSColorSpace">6</int>
+                                      <string key="NSCatalogName">System</string>
+                                      <string key="NSColorName">selectedTextBackgroundColor</string>
+                                      <reference key="NSColor" ref="536097992"/>
+                                    </object>
+                                    <object class="NSColor">
+                                      <int key="NSColorSpace">6</int>
+                                      <string key="NSCatalogName">System</string>
+                                      <string key="NSColorName">selectedTextColor</string>
+                                      <reference key="NSColor" ref="824514053"/>
+                                    </object>
+                                  </object>
+                                </object>
+                                <reference key="NSInsertionColor" ref="824514053"/>
+                                <object class="NSDictionary" key="NSLinkAttributes">
+                                  <bool key="EncodedWithXMLCoder">YES</bool>
+                                  <object class="NSArray" key="dict.sortedKeys">
+                                    <bool key="EncodedWithXMLCoder">YES</bool>
+                                    <string>NSColor</string>
+                                    <string>NSUnderline</string>
+                                  </object>
+                                  <object class="NSMutableArray" key="dict.values">
+                                    <bool key="EncodedWithXMLCoder">YES</bool>
+                                    <object class="NSColor">
+                                      <int key="NSColorSpace">1</int>
+                                      <bytes key="NSRGB">MCAwIDEAA</bytes>
+                                    </object>
+                                    <integer value="1"/>
+                                  </object>
+                                </object>
+                                <nil key="NSDefaultParagraphStyle"/>
+                                <nil key="NSTextFinder"/>
+                                <int key="NSPreferredTextFinderStyle">0</int>
+                              </object>
+                              <int key="NSTVFlags">6</int>
+                              <string key="NSMaxSize">{876, 10000000}</string>
+                              <nil key="NSDelegate"/>
+                            </object>
+                          </object>
+                          <string key="NSFrame">{{1, 1}, {437, 253}}</string>
+                          <reference key="NSSuperview" ref="217112912"/>
+                          <reference key="NSNextKeyView" ref="436407902"/>
+                          <reference key="NSDocView" ref="436407902"/>
+                          <reference key="NSBGColor" ref="295167230"/>
+                          <object class="NSCursor" key="NSCursor">
+                            <string key="NSHotSpot">{4, 5}</string>
+                            <object class="NSImage" key="NSImage">
+                              <int key="NSImageFlags">12582912</int>
+                              <object class="NSMutableArray" key="NSReps">
+                                <bool key="EncodedWithXMLCoder">YES</bool>
+                                <object class="NSArray">
+                                  <bool key="EncodedWithXMLCoder">YES</bool>
+                                  <integer value="0"/>
+                                  <object class="NSBitmapImageRep">
+                                    <object class="NSData" key="NSTIFFRepresentation">
+                                      <bytes key="NS.bytes">TU0AKgAAAHCAFUqgBVKsAAAAwdVQUqwaEQeIRGJRGFlYqwWLQ+JxuOQpVRmEx2RROKwOQyOUQSPyaUym
+SxqWyKXyeYxyZzWbSuJTScRCbz2Nz+gRKhUOfTqeUai0OSxiWTiBQSHSGFquGwekxyAgAAAOAQAAAwAA
+AAEAEAAAAQEAAwAAAAEAEAAAAQIAAwAAAAIACAAIAQMAAwAAAAEABQAAAQYAAwAAAAEAAQAAAREABAAA
+AAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEAAgAAARYAAwAAAAEAEAAAARcABAAAAAEAAABnARwAAwAA
+AAEAAQAAAT0AAwAAAAEAAgAAAVIAAwAAAAEAAQAAAVMAAwAAAAIAAQABAAAAAA</bytes>
+                                    </object>
+                                  </object>
+                                </object>
+                              </object>
+                              <object class="NSColor" key="NSColor">
+                                <int key="NSColorSpace">3</int>
+                                <bytes key="NSWhite">MCAwAA</bytes>
+                              </object>
+                            </object>
+                          </object>
+                          <int key="NScvFlags">4</int>
+                        </object>
+                        <object class="NSScroller" id="194183608">
+                          <reference key="NSNextResponder" ref="217112912"/>
+                          <int key="NSvFlags">-2147483392</int>
+                          <string key="NSFrame">{{-30, 1}, {15, 90}}</string>
+                          <reference key="NSSuperview" ref="217112912"/>
+                          <reference key="NSNextKeyView" ref="238729313"/>
+                          <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+                          <reference key="NSTarget" ref="217112912"/>
+                          <string key="NSAction">_doScroller:</string>
+                          <double key="NSCurValue">1</double>
+                        </object>
+                        <object class="NSScroller" id="321879571">
+                          <reference key="NSNextResponder" ref="217112912"/>
+                          <int key="NSvFlags">-2147483392</int>
+                          <string key="NSFrame">{{-100, -100}, {87, 18}}</string>
+                          <reference key="NSSuperview" ref="217112912"/>
+                          <reference key="NSNextKeyView" ref="194183608"/>
+                          <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+                          <int key="NSsFlags">1</int>
+                          <reference key="NSTarget" ref="217112912"/>
+                          <string key="NSAction">_doScroller:</string>
+                          <double key="NSCurValue">1</double>
+                          <double key="NSPercent">0.94565220000000005</double>
+                        </object>
+                      </object>
+                      <string key="NSFrame">{{0, 8}, {439, 255}}</string>
+                      <reference key="NSSuperview" ref="511659880"/>
+                      <reference key="NSNextKeyView" ref="238729313"/>
+                      <int key="NSsFlags">133650</int>
+                      <reference key="NSVScroller" ref="194183608"/>
+                      <reference key="NSHScroller" ref="321879571"/>
+                      <reference key="NSContentView" ref="238729313"/>
+                      <double key="NSMinMagnification">0.25</double>
+                      <double key="NSMaxMagnification">4</double>
+                      <double key="NSMagnification">1</double>
+                    </object>
+                  </object>
+                  <string key="NSFrameSize">{439, 285}</string>
+                  <reference key="NSSuperview" ref="204457754"/>
+                  <reference key="NSNextKeyView" ref="696397380"/>
+                </object>
+              </object>
+              <string key="NSFrame">{{112, 75}, {439, 285}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="511659880"/>
+              <string key="NSOffsets">{0, 0}</string>
+              <object class="NSTextFieldCell" key="NSTitleCell">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">0</int>
+                <string key="NSContents">Title</string>
+                <object class="NSFont" key="NSSupport">
+                  <string key="NSName">LucidaGrande</string>
+                  <double key="NSSize">11</double>
+                  <int key="NSfFlags">16</int>
+                </object>
+                <object class="NSColor" key="NSBackgroundColor" id="697590463">
+                  <int key="NSColorSpace">6</int>
+                  <string key="NSCatalogName">System</string>
+                  <string key="NSColorName">textBackgroundColor</string>
+                  <reference key="NSColor" ref="295167230"/>
+                </object>
+                <object class="NSColor" key="NSTextColor">
+                  <int key="NSColorSpace">3</int>
+                  <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+                </object>
+              </object>
+              <reference key="NSContentView" ref="511659880"/>
+              <int key="NSBorderType">0</int>
+              <int key="NSBoxType">3</int>
+              <int key="NSTitlePosition">0</int>
+              <bool key="NSTransparent">NO</bool>
+            </object>
+            <object class="NSTextField" id="494776998">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">264</int>
+              <string key="NSFrame">{{112, 368}, {439, 105}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="69401596"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSTextFieldCell" key="NSCell" id="794055832">
+                <int key="NSCellFlags">-1805647871</int>
+                <int key="NSCellFlags2">272629760</int>
+                <string key="NSContents"/>
+                <reference key="NSSupport" ref="113673234"/>
+                <string key="NSPlaceholderString">Placeholder</string>
+                <reference key="NSControlView" ref="494776998"/>
+                <bool key="NSDrawsBackground">YES</bool>
+                <reference key="NSBackgroundColor" ref="697590463"/>
+                <object class="NSColor" key="NSTextColor" id="301634927">
+                  <int key="NSColorSpace">6</int>
+                  <string key="NSCatalogName">System</string>
+                  <string key="NSColorName">textColor</string>
+                  <reference key="NSColor" ref="824514053"/>
+                </object>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSTextField" id="654062154">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">264</int>
+              <string key="NSFrame">{{109, 508}, {445, 59}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="182606009"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSTextFieldCell" key="NSCell" id="154211884">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">272629760</int>
+                <string key="NSContents">%@ unexpectedly quit the last time it was run. Would you like to send a crash report to %@?</string>
+                <reference key="NSSupport" ref="113673234"/>
+                <reference key="NSControlView" ref="654062154"/>
+                <reference key="NSBackgroundColor" ref="370662603"/>
+                <reference key="NSTextColor" ref="140564637"/>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSButton" id="69401596">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">292</int>
+              <string key="NSFrame">{{106, 35}, {119, 32}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="483277688"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSButtonCell" key="NSCell" id="371323797">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">134217728</int>
+                <string key="NSContents">Show Details</string>
+                <reference key="NSSupport" ref="113673234"/>
+                <reference key="NSControlView" ref="69401596"/>
+                <int key="NSButtonFlags">-2038284288</int>
+                <int key="NSButtonFlags2">1</int>
+                <reference key="NSAlternateImage" ref="113673234"/>
+                <string key="NSAlternateContents"/>
+                <string key="NSKeyEquivalent"/>
+                <int key="NSPeriodicDelay">200</int>
+                <int key="NSPeriodicInterval">25</int>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSButton" id="483277688">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">-2147483356</int>
+              <string key="NSFrame">{{106, 35}, {119, 32}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="204457754"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSButtonCell" key="NSCell" id="87187545">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">134217728</int>
+                <string key="NSContents">Hide Details</string>
+                <reference key="NSSupport" ref="113673234"/>
+                <reference key="NSControlView" ref="483277688"/>
+                <int key="NSButtonFlags">-2038284288</int>
+                <int key="NSButtonFlags2">1</int>
+                <reference key="NSAlternateImage" ref="113673234"/>
+                <string key="NSAlternateContents"/>
+                <string key="NSKeyEquivalent"/>
+                <int key="NSPeriodicDelay">200</int>
+                <int key="NSPeriodicInterval">25</int>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSButton" id="640734563">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">289</int>
+              <string key="NSFrame">{{393, 35}, {82, 32}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="154373665"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSButtonCell" key="NSCell" id="151764572">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">134217728</int>
+                <string key="NSContents">Cancel</string>
+                <reference key="NSSupport" ref="113673234"/>
+                <reference key="NSControlView" ref="640734563"/>
+                <int key="NSButtonFlags">-2038284288</int>
+                <int key="NSButtonFlags2">1</int>
+                <reference key="NSAlternateImage" ref="113673234"/>
+                <string key="NSAlternateContents"/>
+                <string type="base64-UTF8" key="NSKeyEquivalent">Gw</string>
+                <int key="NSPeriodicDelay">200</int>
+                <int key="NSPeriodicInterval">25</int>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSButton" id="154373665">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">289</int>
+              <string key="NSFrame">{{475, 35}, {82, 32}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="54059672"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSButtonCell" key="NSCell" id="713846517">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">134217728</int>
+                <string key="NSContents">Send</string>
+                <reference key="NSSupport" ref="113673234"/>
+                <reference key="NSControlView" ref="154373665"/>
+                <int key="NSButtonFlags">-2038284288</int>
+                <int key="NSButtonFlags2">1</int>
+                <reference key="NSAlternateImage" ref="113673234"/>
+                <string key="NSAlternateContents"/>
+                <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
+                <int key="NSPeriodicDelay">200</int>
+                <int key="NSPeriodicInterval">25</int>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSButton" id="182606009">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">268</int>
+              <string key="NSFrame">{{112, 481}, {13, 13}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="101270370"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSButtonCell" key="NSCell" id="717745301">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">0</int>
+                <string key="NSContents"/>
+                <reference key="NSSupport" ref="113673234"/>
+                <reference key="NSControlView" ref="182606009"/>
+                <int key="NSButtonFlags">-1198637056</int>
+                <int key="NSButtonFlags2">5</int>
+                <reference key="NSAlternateImage" ref="113673234"/>
+                <string key="NSAlternateContents"/>
+                <object class="NSMutableString" key="NSKeyEquivalent">
+                  <characters key="NS.bytes"/>
+                </object>
+                <int key="NSPeriodicDelay">200</int>
+                <int key="NSPeriodicInterval">25</int>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSTextField" id="101270370">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">268</int>
+              <string key="NSFrame">{{130, 479}, {115, 18}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="494776998"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSTextFieldCell" key="NSCell" id="881936640">
+                <int key="NSCellFlags">67108864</int>
+                <int key="NSCellFlags2">272629760</int>
+                <string key="NSContents">Comments</string>
+                <reference key="NSSupport" ref="113673234"/>
+                <reference key="NSControlView" ref="101270370"/>
+                <reference key="NSBackgroundColor" ref="370662603"/>
+                <reference key="NSTextColor" ref="140564637"/>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+            <object class="NSImageView" id="828078923">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">268</int>
+              <object class="NSMutableSet" key="NSDragTypes">
+                <bool key="EncodedWithXMLCoder">YES</bool>
+                <object class="NSArray" key="set.sortedObjects">
+                  <bool key="EncodedWithXMLCoder">YES</bool>
+                  <string>Apple PDF pasteboard type</string>
+                  <string>Apple PICT pasteboard type</string>
+                  <string>Apple PNG pasteboard type</string>
+                  <string>NSFilenamesPboardType</string>
+                  <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+                  <string>NeXT TIFF v4.0 pasteboard type</string>
+                </object>
+              </object>
+              <string key="NSFrame">{{20, 503}, {64, 64}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <reference key="NSNextKeyView" ref="654062154"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSImageCell" key="NSCell" id="670809899">
+                <int key="NSCellFlags">0</int>
+                <int key="NSCellFlags2">33554432</int>
+                <object class="NSCustomResource" key="NSContents">
+                  <string key="NSClassName">NSImage</string>
+                  <string key="NSResourceName">NSApplicationIcon</string>
+                </object>
+                <int key="NSAlign">0</int>
+                <int key="NSScale">0</int>
+                <int key="NSStyle">0</int>
+                <bool key="NSAnimates">NO</bool>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+              <bool key="NSEditable">YES</bool>
+            </object>
+            <object class="NSTextField" id="54059672">
+              <reference key="NSNextResponder" ref="346017069"/>
+              <int key="NSvFlags">290</int>
+              <string key="NSFrame">{{109, 20}, {445, 11}}</string>
+              <reference key="NSSuperview" ref="346017069"/>
+              <bool key="NSEnabled">YES</bool>
+              <object class="NSTextFieldCell" key="NSCell" id="131703194">
+                <int key="NSCellFlags">-1541406719</int>
+                <int key="NSCellFlags2">272629760</int>
+                <string key="NSContents"/>
+                <object class="NSFont" key="NSSupport">
+                  <string key="NSName">LucidaGrande</string>
+                  <double key="NSSize">9</double>
+                  <int key="NSfFlags">16</int>
+                </object>
+                <string key="NSPlaceholderString">Note</string>
+                <reference key="NSControlView" ref="54059672"/>
+                <object class="NSColor" key="NSBackgroundColor">
+                  <int key="NSColorSpace">4</int>
+                  <bytes key="NSWhite">MQA</bytes>
+                </object>
+                <reference key="NSTextColor" ref="301634927"/>
+              </object>
+              <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+            </object>
+          </object>
+          <string key="NSFrameSize">{571, 587}</string>
+          <reference key="NSNextKeyView" ref="828078923"/>
+        </object>
+        <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
+        <string key="NSMinSize">{213, 129}</string>
+        <string key="NSMaxSize">{1.7976931348623157e+308, 1.7976931348623157e+308}</string>
+        <bool key="NSWindowIsRestorable">YES</bool>
+      </object>
+      <object class="NSUserDefaultsController" id="561136420">
+        <bool key="NSSharedInstance">YES</bool>
+      </object>
+    </object>
+    <object class="IBObjectContainer" key="IBDocument.Objects">
+      <object class="NSMutableArray" key="connectionRecords">
+        <bool key="EncodedWithXMLCoder">YES</bool>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">initialFirstResponder</string>
+            <reference key="source" ref="802234099"/>
+            <reference key="destination" ref="154373665"/>
+          </object>
+          <int key="connectionID">395</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBActionConnection" key="connection">
+            <string key="label">submitReport:</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="154373665"/>
+          </object>
+          <int key="connectionID">398</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">delegate</string>
+            <reference key="source" ref="802234099"/>
+            <reference key="destination" ref="265051856"/>
+          </object>
+          <int key="connectionID">399</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">window</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="802234099"/>
+          </object>
+          <int key="connectionID">401</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">submitButton</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="154373665"/>
+          </object>
+          <int key="connectionID">402</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">cancelButton</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="640734563"/>
+          </object>
+          <int key="connectionID">406</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">crashLogTextView</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="436407902"/>
+          </object>
+          <int key="connectionID">408</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">hideButton</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="483277688"/>
+          </object>
+          <int key="connectionID">413</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">showButton</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="69401596"/>
+          </object>
+          <int key="connectionID">414</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBActionConnection" key="connection">
+            <string key="label">hideDetails:</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="483277688"/>
+          </object>
+          <int key="connectionID">415</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBActionConnection" key="connection">
+            <string key="label">showDetails:</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="69401596"/>
+          </object>
+          <int key="connectionID">416</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBActionConnection" key="connection">
+            <string key="label">showComments:</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="182606009"/>
+          </object>
+          <int key="connectionID">417</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">value: self</string>
+            <reference key="source" ref="436407902"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector">
+              <reference key="NSSource" ref="436407902"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">value: self</string>
+              <string key="NSBinding">value</string>
+              <string key="NSKeyPath">self</string>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">419</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">value: showComments</string>
+            <reference key="source" ref="182606009"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector">
+              <reference key="NSSource" ref="182606009"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">value: showComments</string>
+              <string key="NSBinding">value</string>
+              <string key="NSKeyPath">showComments</string>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">438</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">hidden: showDetails</string>
+            <reference key="source" ref="204457754"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector">
+              <reference key="NSSource" ref="204457754"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">hidden: showDetails</string>
+              <string key="NSBinding">hidden</string>
+              <string key="NSKeyPath">showDetails</string>
+              <object class="NSDictionary" key="NSOptions">
+                <string key="NS.key.0">NSValueTransformerName</string>
+                <string key="NS.object.0">NSNegateBoolean</string>
+              </object>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">444</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">hidden: showDetails</string>
+            <reference key="source" ref="483277688"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector">
+              <reference key="NSSource" ref="483277688"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">hidden: showDetails</string>
+              <string key="NSBinding">hidden</string>
+              <string key="NSKeyPath">showDetails</string>
+              <object class="NSDictionary" key="NSOptions">
+                <string key="NS.key.0">NSValueTransformerName</string>
+                <string key="NS.object.0">NSNegateBoolean</string>
+              </object>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">452</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">hidden: showDetails</string>
+            <reference key="source" ref="69401596"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector">
+              <reference key="NSSource" ref="69401596"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">hidden: showDetails</string>
+              <string key="NSBinding">hidden</string>
+              <string key="NSKeyPath">showDetails</string>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">453</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBActionConnection" key="connection">
+            <string key="label">cancelReport:</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="640734563"/>
+          </object>
+          <int key="connectionID">454</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">descriptionTextField</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="494776998"/>
+          </object>
+          <int key="connectionID">458</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">noteText</string>
+            <reference key="source" ref="265051856"/>
+            <reference key="destination" ref="54059672"/>
+          </object>
+          <int key="connectionID">479</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">displayPatternValue1: applicationName</string>
+            <reference key="source" ref="654062154"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector" id="485960292">
+              <reference key="NSSource" ref="654062154"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">displayPatternValue1: applicationName</string>
+              <string key="NSBinding">displayPatternValue1</string>
+              <string key="NSKeyPath">applicationName</string>
+              <object class="NSDictionary" key="NSOptions">
+                <string key="NS.key.0">NSDisplayPattern</string>
+                <string key="NS.object.0">%{value1}@ has unexpectedly quit last time it was run. Would you like to send a crash report to %{value2}@?</string>
+              </object>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">480</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">displayPatternValue2: companyName</string>
+            <reference key="source" ref="654062154"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector">
+              <reference key="NSSource" ref="654062154"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">displayPatternValue2: companyName</string>
+              <string key="NSBinding">displayPatternValue2</string>
+              <string key="NSKeyPath">companyName</string>
+              <object class="NSDictionary" key="NSOptions">
+                <string key="NS.key.0">NSDisplayPattern</string>
+                <string key="NS.object.0">%{value1}@ has unexpectedly quit last time it was run. Would you like to send a crash report to %{value2}@?</string>
+              </object>
+              <reference key="NSPreviousConnector" ref="485960292"/>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">481</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBBindingConnection" key="connection">
+            <string key="label">hidden: showComments</string>
+            <reference key="source" ref="494776998"/>
+            <reference key="destination" ref="265051856"/>
+            <object class="NSNibBindingConnector" key="connector">
+              <reference key="NSSource" ref="494776998"/>
+              <reference key="NSDestination" ref="265051856"/>
+              <string key="NSLabel">hidden: showComments</string>
+              <string key="NSBinding">hidden</string>
+              <string key="NSKeyPath">showComments</string>
+              <object class="NSDictionary" key="NSOptions">
+                <string key="NS.key.0">NSValueTransformerName</string>
+                <string key="NS.object.0">NSNegateBoolean</string>
+              </object>
+              <int key="NSNibBindingConnectorVersion">2</int>
+            </object>
+          </object>
+          <int key="connectionID">485</int>
+        </object>
+        <object class="IBConnectionRecord">
+          <object class="IBOutletConnection" key="connection">
+            <string key="label">delegate</string>
+            <reference key="source" ref="494776998"/>
+            <reference key="destination" ref="265051856"/>
+          </object>
+          <int key="connectionID">486</int>
+        </object>
+      </object>
+      <object class="IBMutableOrderedSet" key="objectRecords">
+        <object class="NSArray" key="orderedObjects">
+          <bool key="EncodedWithXMLCoder">YES</bool>
+          <object class="IBObjectRecord">
+            <int key="objectID">0</int>
+            <object class="NSArray" key="object" id="0">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+            </object>
+            <reference key="children" ref="557403926"/>
+            <nil key="parent"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">-2</int>
+            <reference key="object" ref="265051856"/>
+            <reference key="parent" ref="0"/>
+            <string key="objectName">File's Owner</string>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">-1</int>
+            <reference key="object" ref="827796767"/>
+            <reference key="parent" ref="0"/>
+            <string key="objectName">First Responder</string>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">-3</int>
+            <reference key="object" ref="582831428"/>
+            <reference key="parent" ref="0"/>
+            <string key="objectName">Application</string>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">361</int>
+            <reference key="object" ref="802234099"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="346017069"/>
+            </object>
+            <reference key="parent" ref="0"/>
+            <string key="objectName">Window</string>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">362</int>
+            <reference key="object" ref="346017069"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="828078923"/>
+              <reference ref="101270370"/>
+              <reference ref="182606009"/>
+              <reference ref="154373665"/>
+              <reference ref="654062154"/>
+              <reference ref="483277688"/>
+              <reference ref="494776998"/>
+              <reference ref="54059672"/>
+              <reference ref="640734563"/>
+              <reference ref="204457754"/>
+              <reference ref="69401596"/>
+            </object>
+            <reference key="parent" ref="802234099"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">364</int>
+            <reference key="object" ref="204457754"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="696397380"/>
+              <reference ref="217112912"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">365</int>
+            <reference key="object" ref="828078923"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="670809899"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">366</int>
+            <reference key="object" ref="101270370"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="881936640"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">367</int>
+            <reference key="object" ref="182606009"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="717745301"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">369</int>
+            <reference key="object" ref="154373665"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="713846517"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">370</int>
+            <reference key="object" ref="654062154"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="154211884"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">371</int>
+            <reference key="object" ref="154211884"/>
+            <reference key="parent" ref="654062154"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">372</int>
+            <reference key="object" ref="713846517"/>
+            <reference key="parent" ref="154373665"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">374</int>
+            <reference key="object" ref="717745301"/>
+            <reference key="parent" ref="182606009"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">375</int>
+            <reference key="object" ref="881936640"/>
+            <reference key="parent" ref="101270370"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">376</int>
+            <reference key="object" ref="670809899"/>
+            <reference key="parent" ref="828078923"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">396</int>
+            <reference key="object" ref="69401596"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="371323797"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">397</int>
+            <reference key="object" ref="371323797"/>
+            <reference key="parent" ref="69401596"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">411</int>
+            <reference key="object" ref="483277688"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="87187545"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">412</int>
+            <reference key="object" ref="87187545"/>
+            <reference key="parent" ref="483277688"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">440</int>
+            <reference key="object" ref="561136420"/>
+            <reference key="parent" ref="0"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">455</int>
+            <reference key="object" ref="494776998"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="794055832"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">456</int>
+            <reference key="object" ref="794055832"/>
+            <reference key="parent" ref="494776998"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">477</int>
+            <reference key="object" ref="54059672"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="131703194"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">478</int>
+            <reference key="object" ref="131703194"/>
+            <reference key="parent" ref="54059672"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">368</int>
+            <reference key="object" ref="640734563"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="151764572"/>
+            </object>
+            <reference key="parent" ref="346017069"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">373</int>
+            <reference key="object" ref="151764572"/>
+            <reference key="parent" ref="640734563"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">377</int>
+            <reference key="object" ref="696397380"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="922202055"/>
+            </object>
+            <reference key="parent" ref="204457754"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">394</int>
+            <reference key="object" ref="922202055"/>
+            <reference key="parent" ref="696397380"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">378</int>
+            <reference key="object" ref="217112912"/>
+            <object class="NSMutableArray" key="children">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <reference ref="321879571"/>
+              <reference ref="194183608"/>
+              <reference ref="436407902"/>
+            </object>
+            <reference key="parent" ref="204457754"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">393</int>
+            <reference key="object" ref="321879571"/>
+            <reference key="parent" ref="217112912"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">392</int>
+            <reference key="object" ref="194183608"/>
+            <reference key="parent" ref="217112912"/>
+          </object>
+          <object class="IBObjectRecord">
+            <int key="objectID">391</int>
+            <reference key="object" ref="436407902"/>
+            <reference key="parent" ref="217112912"/>
+          </object>
+        </object>
+      </object>
+      <object class="NSMutableDictionary" key="flattenedProperties">
+        <bool key="EncodedWithXMLCoder">YES</bool>
+        <object class="NSArray" key="dict.sortedKeys">
+          <bool key="EncodedWithXMLCoder">YES</bool>
+          <string>-1.IBPluginDependency</string>
+          <string>-2.IBPluginDependency</string>
+          <string>-3.IBPluginDependency</string>
+          <string>361.IBPluginDependency</string>
+          <string>361.IBWindowTemplateEditedContentRect</string>
+          <string>361.windowTemplate.hasMinSize</string>
+          <string>361.windowTemplate.minSize</string>
+          <string>362.IBPluginDependency</string>
+          <string>364.IBPluginDependency</string>
+          <string>365.IBPluginDependency</string>
+          <string>366.IBPluginDependency</string>
+          <string>367.IBPluginDependency</string>
+          <string>368.IBPluginDependency</string>
+          <string>369.IBPluginDependency</string>
+          <string>370.IBPluginDependency</string>
+          <string>371.IBPluginDependency</string>
+          <string>372.IBPluginDependency</string>
+          <string>373.IBPluginDependency</string>
+          <string>374.IBPluginDependency</string>
+          <string>375.IBPluginDependency</string>
+          <string>376.IBPluginDependency</string>
+          <string>377.IBPluginDependency</string>
+          <string>378.IBPluginDependency</string>
+          <string>391.IBAttributePlaceholdersKey</string>
+          <string>391.IBPluginDependency</string>
+          <string>392.IBPluginDependency</string>
+          <string>392.IBShouldRemoveOnLegacySave</string>
+          <string>393.IBPluginDependency</string>
+          <string>393.IBShouldRemoveOnLegacySave</string>
+          <string>394.IBPluginDependency</string>
+          <string>396.IBPluginDependency</string>
+          <string>397.IBPluginDependency</string>
+          <string>411.IBPluginDependency</string>
+          <string>412.IBPluginDependency</string>
+          <string>440.IBPluginDependency</string>
+          <string>455.IBPluginDependency</string>
+          <string>456.IBPluginDependency</string>
+          <string>477.IBPluginDependency</string>
+          <string>478.IBPluginDependency</string>
+        </object>
+        <object class="NSMutableArray" key="dict.values">
+          <bool key="EncodedWithXMLCoder">YES</bool>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>{{406, 702}, {571, 294}}</string>
+          <boolean value="YES"/>
+          <string>{213, 107}</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <object class="NSMutableDictionary">
+            <bool key="EncodedWithXMLCoder">YES</bool>
+            <object class="NSArray" key="dict.sortedKeys">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <string>AccessibilityDescription</string>
+              <string>AccessibilityHelp</string>
+              <string>ToolTip</string>
+            </object>
+            <object class="NSMutableArray" key="dict.values">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <object class="IBAccessibilityAttribute">
+                <string key="name">AccessibilityDescription</string>
+                <reference key="object" ref="436407902"/>
+                <string key="accessibilityValue">Please describe any steps needed to trigger the problem</string>
+              </object>
+              <object class="IBAccessibilityAttribute">
+                <string key="name">AccessibilityHelp</string>
+                <reference key="object" ref="436407902"/>
+                <string key="accessibilityValue">Please describe any steps needed to trigger the problem</string>
+              </object>
+              <object class="IBToolTipAttribute">
+                <string key="name">ToolTip</string>
+                <reference key="object" ref="436407902"/>
+                <string key="toolTip">Please describe any steps needed to trigger the problem</string>
+              </object>
+            </object>
+          </object>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <boolean value="YES"/>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <boolean value="YES"/>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+          <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+        </object>
+      </object>
+      <object class="NSMutableDictionary" key="unlocalizedProperties">
+        <bool key="EncodedWithXMLCoder">YES</bool>
+        <reference key="dict.sortedKeys" ref="0"/>
+        <object class="NSMutableArray" key="dict.values">
+          <bool key="EncodedWithXMLCoder">YES</bool>
+        </object>
+      </object>
+      <nil key="activeLocalization"/>
+      <object class="NSMutableDictionary" key="localizations">
+        <bool key="EncodedWithXMLCoder">YES</bool>
+        <reference key="dict.sortedKeys" ref="0"/>
+        <object class="NSMutableArray" key="dict.values">
+          <bool key="EncodedWithXMLCoder">YES</bool>
+        </object>
+      </object>
+      <nil key="sourceID"/>
+      <int key="maxID">486</int>
+    </object>
+    <object class="IBClassDescriber" key="IBDocument.Classes">
+      <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+        <bool key="EncodedWithXMLCoder">YES</bool>
+        <object class="IBPartialClassDescription">
+          <string key="className">BWQuincyUI</string>
+          <string key="superclassName">NSWindowController</string>
+          <object class="NSMutableDictionary" key="actions">
+            <bool key="EncodedWithXMLCoder">YES</bool>
+            <object class="NSArray" key="dict.sortedKeys">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <string>cancelReport:</string>
+              <string>hideDetails:</string>
+              <string>showComments:</string>
+              <string>showDetails:</string>
+              <string>submitReport:</string>
+            </object>
+            <object class="NSMutableArray" key="dict.values">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <string>id</string>
+              <string>id</string>
+              <string>id</string>
+              <string>id</string>
+              <string>id</string>
+            </object>
+          </object>
+          <object class="NSMutableDictionary" key="actionInfosByName">
+            <bool key="EncodedWithXMLCoder">YES</bool>
+            <object class="NSArray" key="dict.sortedKeys">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <string>cancelReport:</string>
+              <string>hideDetails:</string>
+              <string>showComments:</string>
+              <string>showDetails:</string>
+              <string>submitReport:</string>
+            </object>
+            <object class="NSMutableArray" key="dict.values">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <object class="IBActionInfo">
+                <string key="name">cancelReport:</string>
+                <string key="candidateClassName">id</string>
+              </object>
+              <object class="IBActionInfo">
+                <string key="name">hideDetails:</string>
+                <string key="candidateClassName">id</string>
+              </object>
+              <object class="IBActionInfo">
+                <string key="name">showComments:</string>
+                <string key="candidateClassName">id</string>
+              </object>
+              <object class="IBActionInfo">
+                <string key="name">showDetails:</string>
+                <string key="candidateClassName">id</string>
+              </object>
+              <object class="IBActionInfo">
+                <string key="name">submitReport:</string>
+                <string key="candidateClassName">id</string>
+              </object>
+            </object>
+          </object>
+          <object class="NSMutableDictionary" key="outlets">
+            <bool key="EncodedWithXMLCoder">YES</bool>
+            <object class="NSArray" key="dict.sortedKeys">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <string>cancelButton</string>
+              <string>crashLogTextView</string>
+              <string>descriptionTextField</string>
+              <string>hideButton</string>
+              <string>noteText</string>
+              <string>showButton</string>
+              <string>submitButton</string>
+            </object>
+            <object class="NSMutableArray" key="dict.values">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <string>NSButton</string>
+              <string>NSTextView</string>
+              <string>NSTextField</string>
+              <string>NSButton</string>
+              <string>NSTextField</string>
+              <string>NSButton</string>
+              <string>NSButton</string>
+            </object>
+          </object>
+          <object class="NSMutableDictionary" key="toOneOutletInfosByName">
+            <bool key="EncodedWithXMLCoder">YES</bool>
+            <object class="NSArray" key="dict.sortedKeys">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <string>cancelButton</string>
+              <string>crashLogTextView</string>
+              <string>descriptionTextField</string>
+              <string>hideButton</string>
+              <string>noteText</string>
+              <string>showButton</string>
+              <string>submitButton</string>
+            </object>
+            <object class="NSMutableArray" key="dict.values">
+              <bool key="EncodedWithXMLCoder">YES</bool>
+              <object class="IBToOneOutletInfo">
+                <string key="name">cancelButton</string>
+                <string key="candidateClassName">NSButton</string>
+              </object>
+              <object class="IBToOneOutletInfo">
+                <string key="name">crashLogTextView</string>
+                <string key="candidateClassName">NSTextView</string>
+              </object>
+              <object class="IBToOneOutletInfo">
+                <string key="name">descriptionTextField</string>
+                <string key="candidateClassName">NSTextField</string>
+              </object>
+              <object class="IBToOneOutletInfo">
+                <string key="name">hideButton</string>
+                <string key="candidateClassName">NSButton</string>
+              </object>
+              <object class="IBToOneOutletInfo">
+                <string key="name">noteText</string>
+                <string key="candidateClassName">NSTextField</string>
+              </object>
+              <object class="IBToOneOutletInfo">
+                <string key="name">showButton</string>
+                <string key="candidateClassName">NSButton</string>
+              </object>
+              <object class="IBToOneOutletInfo">
+                <string key="name">submitButton</string>
+                <string key="candidateClassName">NSButton</string>
+              </object>
+            </object>
+          </object>
+          <object class="IBClassDescriptionSource" key="sourceIdentifier">
+            <string key="majorKey">IBProjectSource</string>
+            <string key="minorKey">./Classes/BWQuincyUI.h</string>
+          </object>
+        </object>
+      </object>
+    </object>
+    <int key="IBDocument.localizationMode">0</int>
+    <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+    <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+      <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+      <real value="1050" key="NS.object.0"/>
+    </object>
+    <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+      <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+      <integer value="3000" key="NS.object.0"/>
+    </object>
+    <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+    <nil key="IBDocument.LastKnownRelativeProjectPath"/>
+    <int key="IBDocument.defaultPropertyAccessControl">3</int>
+    <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+      <string key="NS.key.0">NSApplicationIcon</string>
+      <string key="NS.object.0">{128, 128}</string>
+    </object>
+  </data>
+</archive>
index 0c61ded66fdebac856125f42f7b061934b5758a6..e363d63f9e0edd0c7ce9c11a9389c7fdced9947c 100644 (file)
@@ -7,6 +7,7 @@
        objects = {
 
 /* Begin PBXBuildFile section */
+               7D3F6525188051F2005776C4 /* BWQuincyMain.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D3F6523188051F2005776C4 /* BWQuincyMain.xib */; };
                7D8BB0B71830311300FAE9B7 /* DebugMessageVisualizer.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D8BB0B51830311300FAE9B7 /* DebugMessageVisualizer.xib */; };
                7D8BB0BA1830367200FAE9B7 /* PlaylistMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D8BB0B81830367200FAE9B7 /* PlaylistMenu.xib */; };
                7D8BB0C01830393300FAE9B7 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D8BB0BE1830393300FAE9B7 /* MainWindow.xib */; };
                5CCED71314C0D4A90057F8D1 /* ExtensionsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ExtensionsManager.m; path = ../../../modules/gui/macosx/ExtensionsManager.m; sourceTree = SOURCE_ROOT; };
                5CCED71414C0D4A90057F8D1 /* VLCUIWidgets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCUIWidgets.h; path = ../../../modules/gui/macosx/VLCUIWidgets.h; sourceTree = SOURCE_ROOT; };
                5CCED71514C0D4A90057F8D1 /* VLCUIWidgets.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCUIWidgets.m; path = ../../../modules/gui/macosx/VLCUIWidgets.m; sourceTree = SOURCE_ROOT; };
+               7D3F6524188051F2005776C4 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/BWQuincyMain.xib; sourceTree = "<group>"; };
+               7D3F652618805297005776C4 /* BWQuincyManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BWQuincyManager.h; path = ../../../modules/gui/macosx/BWQuincyManager.h; sourceTree = "<group>"; };
+               7D3F652718805297005776C4 /* BWQuincyManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BWQuincyManager.m; path = ../../../modules/gui/macosx/BWQuincyManager.m; sourceTree = "<group>"; };
+               7D3F652818805297005776C4 /* BWQuincyUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = BWQuincyUI.h; path = ../../../modules/gui/macosx/BWQuincyUI.h; sourceTree = "<group>"; };
+               7D3F652918805297005776C4 /* BWQuincyUI.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = BWQuincyUI.m; path = ../../../modules/gui/macosx/BWQuincyUI.m; sourceTree = "<group>"; };
                7D7DC2CA182E86D9008C9E3E /* darwinvlc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = darwinvlc.c; path = ../../../bin/darwinvlc.c; sourceTree = "<group>"; };
                7D8BB0B318302AC000FAE9B7 /* DebugMessageVisualizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DebugMessageVisualizer.h; path = ../../../modules/gui/macosx/DebugMessageVisualizer.h; sourceTree = "<group>"; };
                7D8BB0B418302AC000FAE9B7 /* DebugMessageVisualizer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = DebugMessageVisualizer.m; path = ../../../modules/gui/macosx/DebugMessageVisualizer.m; sourceTree = "<group>"; };
                        name = Products;
                        sourceTree = "<group>";
                };
+               7D3F652A1880529C005776C4 /* QuincyKit */ = {
+                       isa = PBXGroup;
+                       children = (
+                               7D3F652618805297005776C4 /* BWQuincyManager.h */,
+                               7D3F652718805297005776C4 /* BWQuincyManager.m */,
+                               7D3F652818805297005776C4 /* BWQuincyUI.h */,
+                               7D3F652918805297005776C4 /* BWQuincyUI.m */,
+                       );
+                       name = QuincyKit;
+                       sourceTree = "<group>";
+               };
                8E445F86047289E50059A3A7 /* fileicons */ = {
                        isa = PBXGroup;
                        children = (
                CC0CD0E513DE0FC600B0D90D /* Imported Code */ = {
                        isa = PBXGroup;
                        children = (
+                               7D3F652A1880529C005776C4 /* QuincyKit */,
                                CC6D8D9C0A878DED006F2BBE /* AppleRemote.h */,
                                CC6D8D9D0A878DED006F2BBE /* AppleRemote.m */,
                                CC0CD0E413DE0EB500B0D90D /* PXSourceList */,
                                7D8BB0B81830367200FAE9B7 /* PlaylistMenu.xib */,
                                7D8BB0BE1830393300FAE9B7 /* MainWindow.xib */,
                                7DE88F281831396A00CD9DA2 /* PlaylistAccessoryView.xib */,
+                               7D3F6523188051F2005776C4 /* BWQuincyMain.xib */,
                        );
                        name = xibs;
                        sourceTree = "<group>";
                                CC402EB90E00ABBB006A4BA4 /* vlc.scriptSuite in Resources */,
                                CC402EBA0E00ABBB006A4BA4 /* vlc.scriptTerminology in Resources */,
                                CC402EBB0E00ABBB006A4BA4 /* README.MacOSX.rtf in Resources */,
+                               7D3F6525188051F2005776C4 /* BWQuincyMain.xib in Resources */,
                                CC402F3C0E00ABBB006A4BA4 /* noart.png in Resources */,
                                CC04323D13B246DF00D7D52E /* effects-double-buttons_dark.png in Resources */,
                                CC04323E13B246DF00D7D52E /* effects-double-buttons-blue_dark.png in Resources */,
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXVariantGroup section */
+               7D3F6523188051F2005776C4 /* BWQuincyMain.xib */ = {
+                       isa = PBXVariantGroup;
+                       children = (
+                               7D3F6524188051F2005776C4 /* English */,
+                       );
+                       name = BWQuincyMain.xib;
+                       sourceTree = "<group>";
+               };
                7D8BB0B51830311300FAE9B7 /* DebugMessageVisualizer.xib */ = {
                        isa = PBXVariantGroup;
                        children = (
diff --git a/modules/gui/macosx/BWQuincyManager.h b/modules/gui/macosx/BWQuincyManager.h
new file mode 100644 (file)
index 0000000..82f6769
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * Author: Andreas Linde <mail@andreaslinde.de>
+ *         Kent Sutherland
+ *
+ * Copyright (c) 2011 Andreas Linde & Kent Sutherland.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+typedef enum CrashAlertType {
+  CrashAlertTypeSend = 0,
+  CrashAlertTypeFeedback = 1,
+} CrashAlertType;
+
+typedef enum CrashReportStatus {
+  // This app version is set to discontinued, no new crash reports accepted by the server
+  CrashReportStatusFailureVersionDiscontinued = -30,
+
+  // XML: Sender ersion string contains not allowed characters, only alphanumberical including space and . are allowed
+  CrashReportStatusFailureXMLSenderVersionNotAllowed = -21,
+
+  // XML: Version string contains not allowed characters, only alphanumberical including space and . are allowed
+  CrashReportStatusFailureXMLVersionNotAllowed = -20,
+
+  // SQL for adding a symoblicate todo entry in the database failed
+  CrashReportStatusFailureSQLAddSymbolicateTodo = -18,
+
+  // SQL for adding crash log in the database failed
+  CrashReportStatusFailureSQLAddCrashlog = -17,
+
+  // SQL for adding a new version in the database failed
+  CrashReportStatusFailureSQLAddVersion = -16,
+
+  // SQL for checking if the version is already added in the database failed
+  CrashReportStatusFailureSQLCheckVersionExists = -15,
+
+  // SQL for creating a new pattern for this bug and set amount of occurrances to 1 in the database failed
+  CrashReportStatusFailureSQLAddPattern = -14,
+
+  // SQL for checking the status of the bugfix version in the database failed
+  CrashReportStatusFailureSQLCheckBugfixStatus = -13,
+
+  // SQL for updating the occurances of this pattern in the database failed
+  CrashReportStatusFailureSQLUpdatePatternOccurances = -12,
+
+  // SQL for getting all the known bug patterns for the current app version in the database failed
+  CrashReportStatusFailureSQLFindKnownPatterns = -11,
+
+  // SQL for finding the bundle identifier in the database failed
+  CrashReportStatusFailureSQLSearchAppName = -10,
+
+  // the post request didn't contain valid data
+  CrashReportStatusFailureInvalidPostData = -3,
+
+  // incoming data may not be added, because e.g. bundle identifier wasn't found
+  CrashReportStatusFailureInvalidIncomingData = -2,
+
+  // database cannot be accessed, check hostname, username, password and database name settings in config.php
+  CrashReportStatusFailureDatabaseNotAvailable = -1,
+
+  CrashReportStatusUnknown = 0,
+
+  CrashReportStatusAssigned = 1,
+
+  CrashReportStatusSubmitted = 2,
+
+  CrashReportStatusAvailable = 3,
+} CrashReportStatus;
+
+
+@class BWQuincyUI;
+
+@protocol BWQuincyManagerDelegate <NSObject>
+
+@required
+
+// Invoked once the modal sheets are gone
+- (void) showMainApplicationWindow;
+
+@optional
+
+// Return the description the crashreport should contain, empty by default. The string will automatically be wrapped into <[DATA[ ]]>, so make sure you don't do that in your string.
+-(NSString *) crashReportDescription;
+
+// Return the userid the crashreport should contain, empty by default
+-(NSString *) crashReportUserID;
+
+// Return the contact value (e.g. email) the crashreport should contain, empty by default
+-(NSString *) crashReportContact;
+@end
+
+
+@interface BWQuincyManager : NSObject 
+#if defined(MAC_OS_X_VERSION_10_6) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6) 
+ <NSXMLParserDelegate> 
+#endif
+{
+  CrashReportStatus _serverResult;
+  NSInteger         _statusCode;
+
+  NSMutableString   *_contentOfProperty;
+
+  id<BWQuincyManagerDelegate> _delegate;
+
+  NSString   *_submissionURL;
+  NSString   *_companyName;
+  NSString   *_appIdentifier;
+  BOOL       _autoSubmitCrashReport;
+
+  NSString   *_crashFile;
+
+  BWQuincyUI *_quincyUI;
+}
+
+- (NSString*) modelVersion;
+
++ (BWQuincyManager *)sharedQuincyManager;
+
+// submission URL defines where to send the crash reports to (required)
+@property (nonatomic, retain) NSString *submissionURL;
+
+// defines the company name to be shown in the crash reporting dialog
+@property (nonatomic, retain) NSString *companyName;
+
+// delegate is required
+@property (nonatomic, assign) id <BWQuincyManagerDelegate> delegate;
+
+// if YES, the crash report will be submitted without asking the user
+// if NO, the user will be asked if the crash report can be submitted (default)
+@property (nonatomic, assign, getter=isAutoSubmitCrashReport) BOOL autoSubmitCrashReport;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// settings
+
+// If you want to use HockeyApp instead of your own server, this is required
+@property (nonatomic, retain) NSString *appIdentifier;
+
+
+- (void) cancelReport;
+- (void) sendReportCrash:(NSString*)crashContent
+             description:(NSString*)description;
+
+- (NSString *) applicationName;
+- (NSString *) applicationVersionString;
+- (NSString *) applicationVersion;
+
+@end
diff --git a/modules/gui/macosx/BWQuincyManager.m b/modules/gui/macosx/BWQuincyManager.m
new file mode 100644 (file)
index 0000000..ecfbed1
--- /dev/null
@@ -0,0 +1,434 @@
+/*
+ * Author: Andreas Linde <mail@andreaslinde.de>
+ *         Kent Sutherland
+ *
+ * Copyright (c) 2011 Andreas Linde & Kent Sutherland.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#import "BWQuincyManager.h"
+#import "BWQuincyUI.h"
+#import <sys/sysctl.h>
+
+#define SDK_NAME @"Quincy"
+#define SDK_VERSION @"2.1.6"
+
+@interface BWQuincyManager(private)
+- (void) startManager;
+
+- (void) _postXML:(NSString*)xml toURL:(NSURL*)url;
+- (void) searchCrashLogFile:(NSString *)path;
+- (BOOL) hasPendingCrashReport;
+- (void) returnToMainApplication;
+@end
+
+
+@implementation BWQuincyManager
+
+@synthesize delegate = _delegate;
+@synthesize submissionURL = _submissionURL;
+@synthesize companyName = _companyName;
+@synthesize appIdentifier = _appIdentifier;
+@synthesize autoSubmitCrashReport = _autoSubmitCrashReport;
+
++ (BWQuincyManager *)sharedQuincyManager {
+  static BWQuincyManager *quincyManager = nil;
+
+  if (quincyManager == nil) {
+    quincyManager = [[BWQuincyManager alloc] init];
+  }
+
+  return quincyManager;
+}
+
+- (id) init {
+  if ((self = [super init])) {
+    _serverResult = CrashReportStatusFailureDatabaseNotAvailable;
+    _quincyUI = nil;
+
+    _submissionURL = nil;
+    _appIdentifier = nil;
+
+    _crashFile = nil;
+
+    self.delegate = nil;
+    self.companyName = @"";
+  }
+  return self;
+}
+
+- (void)dealloc {
+  _companyName = nil;
+  _delegate = nil;
+  _submissionURL = nil;
+  _appIdentifier = nil;
+
+  [_crashFile release];
+  [_quincyUI release];
+
+  [super dealloc];
+}
+
+- (void) searchCrashLogFile:(NSString *)path {
+  NSFileManager* fman = [NSFileManager defaultManager];
+
+  NSError* error;
+  NSMutableArray* filesWithModificationDate = [NSMutableArray array];
+  NSArray* crashLogFiles = [fman contentsOfDirectoryAtPath:path error:&error];
+  NSEnumerator* filesEnumerator = [crashLogFiles objectEnumerator];
+  NSString* crashFile;
+  while((crashFile = [filesEnumerator nextObject])) {
+    NSString* crashLogPath = [path stringByAppendingPathComponent:crashFile];
+    NSDate* modDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:crashLogPath error:&error] fileModificationDate];
+    [filesWithModificationDate addObject:[NSDictionary dictionaryWithObjectsAndKeys:crashFile,@"name",crashLogPath,@"path",modDate,@"modDate",nil]];
+  }
+
+  NSSortDescriptor* dateSortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"modDate" ascending:YES] autorelease];
+  NSArray* sortedFiles = [filesWithModificationDate sortedArrayUsingDescriptors:[NSArray arrayWithObject:dateSortDescriptor]];
+
+  NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@", [self applicationName]];
+  NSArray* filteredFiles = [sortedFiles filteredArrayUsingPredicate:filterPredicate];
+
+  _crashFile = [[[filteredFiles valueForKeyPath:@"path"] lastObject] copy];
+}
+
+#pragma mark -
+#pragma mark setter
+- (void)setSubmissionURL:(NSString *)anSubmissionURL {
+  if (_submissionURL != anSubmissionURL) {
+    [_submissionURL release];
+    _submissionURL = [anSubmissionURL copy];
+  }
+
+  [self performSelector:@selector(startManager) withObject:nil afterDelay:0.1f];
+}
+
+- (void)setAppIdentifier:(NSString *)anAppIdentifier {
+  if (_appIdentifier != anAppIdentifier) {
+    [_appIdentifier release];
+    _appIdentifier = [anAppIdentifier copy];
+  }
+
+  [self setSubmissionURL:@"https://rink.hockeyapp.net/"];
+}
+
+- (void)storeLastCrashDate:(NSDate *) date {
+  [[NSUserDefaults standardUserDefaults] setValue:date forKey:@"CrashReportSender.lastCrashDate"];
+  [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
+- (NSDate *)loadLastCrashDate {
+  NSDate *date = [[NSUserDefaults standardUserDefaults] valueForKey:@"CrashReportSender.lastCrashDate"];
+  return date ?: [NSDate distantPast];
+}
+
+- (void)storeAppVersion:(NSString *) version {
+  [[NSUserDefaults standardUserDefaults] setValue:version forKey:@"CrashReportSender.appVersion"];
+  [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
+- (NSString *)loadAppVersion {
+  NSString *appVersion = [[NSUserDefaults standardUserDefaults] valueForKey:@"CrashReportSender.appVersion"];
+  return appVersion ?: nil;
+}
+
+#pragma mark -
+#pragma mark GetCrashData
+
+- (BOOL) hasPendingCrashReport {
+  BOOL returnValue = NO;
+
+  NSString *appVersion = [self loadAppVersion];
+  NSDate *lastCrashDate = [self loadLastCrashDate];
+
+  if (!appVersion || ![appVersion isEqualToString:[self applicationVersion]] || [lastCrashDate isEqualToDate:[NSDate distantPast]]) {
+    [self storeAppVersion:[self applicationVersion]];
+    [self storeLastCrashDate:[NSDate date]];
+    return NO;
+  }
+
+  NSArray* libraryDirectories = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, TRUE);
+  // Snow Leopard is having the log files in another location
+  [self searchCrashLogFile:[[libraryDirectories lastObject] stringByAppendingPathComponent:@"Logs/DiagnosticReports"]];
+  if (_crashFile == nil) {
+    [self searchCrashLogFile:[[libraryDirectories lastObject] stringByAppendingPathComponent:@"Logs/CrashReporter"]];
+    if (_crashFile == nil) {
+      NSString *sandboxFolder = [NSString stringWithFormat:@"/Containers/%@/Data/Library", [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]];
+      if ([[libraryDirectories lastObject] rangeOfString:sandboxFolder].location != NSNotFound) {
+        NSString *libFolderName = [[libraryDirectories lastObject] stringByReplacingOccurrencesOfString:sandboxFolder withString:@""];
+        [self searchCrashLogFile:[libFolderName stringByAppendingPathComponent:@"Logs/DiagnosticReports"]];
+      }
+    }
+    // Search machine diagnostic reports directory
+    if (_crashFile == nil) {
+      NSArray* libraryDirectories = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSLocalDomainMask, TRUE);
+      [self searchCrashLogFile:[[libraryDirectories lastObject] stringByAppendingPathComponent:@"Logs/DiagnosticReports"]];
+      if (_crashFile == nil) {
+          [self searchCrashLogFile:[[libraryDirectories lastObject] stringByAppendingPathComponent:@"Logs/CrashReporter"]];
+      }
+    }
+  }
+
+  if (_crashFile) {
+    NSError* error;
+
+    NSDate *crashLogModificationDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:_crashFile error:&error] fileModificationDate];
+    unsigned long long crashLogFileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:_crashFile error:&error] fileSize];
+    if ([crashLogModificationDate compare: lastCrashDate] == NSOrderedDescending && crashLogFileSize > 0) {
+      [self storeLastCrashDate:crashLogModificationDate];
+      returnValue = YES;
+    }
+  }
+
+  return returnValue;
+}
+
+- (void) returnToMainApplication {
+  if ( self.delegate != nil && [self.delegate respondsToSelector:@selector(showMainApplicationWindow)])
+    [self.delegate showMainApplicationWindow];
+}
+
+- (void) startManager {
+  if ([self hasPendingCrashReport]) {
+    if (!self.autoSubmitCrashReport) {
+      _quincyUI = [[BWQuincyUI alloc] initWithManager:self crashFile:_crashFile companyName:_companyName applicationName:[self applicationName]];
+      [_quincyUI askCrashReportDetails];
+    } else {
+      NSError* error = nil;
+      NSString *crashLogs = [NSString stringWithContentsOfFile:_crashFile encoding:NSUTF8StringEncoding error:&error];
+      if (!error) {
+        NSString *lastCrash = [[crashLogs componentsSeparatedByString: @"**********\n\n"] lastObject];
+
+        NSString* description = @"";
+
+        if (_delegate && [_delegate respondsToSelector:@selector(crashReportDescription)]) {
+          description = [_delegate crashReportDescription];
+        }
+
+        [self sendReportCrash:lastCrash description:description];
+      } else {
+        [self returnToMainApplication];
+      }
+    }
+  } else {
+    [self returnToMainApplication];
+  }
+}
+
+- (NSString*) modelVersion {
+  NSString * modelString  = nil;
+  int        modelInfo[2] = { CTL_HW, HW_MODEL };
+  size_t     modelSize;
+
+  if (sysctl(modelInfo,
+             2,
+             NULL,
+             &modelSize,
+             NULL, 0) == 0) {
+    void * modelData = malloc(modelSize);
+
+    if (modelData) {
+      if (sysctl(modelInfo,
+                 2,
+                 modelData,
+                 &modelSize,
+                 NULL, 0) == 0) {
+        modelString = [NSString stringWithUTF8String:modelData];
+      }
+
+      free(modelData);
+    }
+  }
+
+  return modelString;
+}
+
+
+
+- (void) cancelReport {
+  [self returnToMainApplication];
+}
+
+
+- (void) sendReportCrash:(NSString*)crashContent
+             description:(NSString*)notes
+{
+  NSString *userid = @"";
+  NSString *contact = @"";
+
+  SInt32 versionMajor, versionMinor, versionBugFix;
+  if (Gestalt(gestaltSystemVersionMajor, &versionMajor) != noErr) versionMajor = 0;
+  if (Gestalt(gestaltSystemVersionMinor, &versionMinor) != noErr)  versionMinor= 0;
+  if (Gestalt(gestaltSystemVersionBugFix, &versionBugFix) != noErr) versionBugFix = 0;
+
+  NSString* xml = [NSString stringWithFormat:@"<crash><applicationname>%s</applicationname><bundleidentifier>%s</bundleidentifier><systemversion>%@</systemversion><senderversion>%@</senderversion><version>%@</version><platform>%@</platform><userid>%@</userid><contact>%@</contact><description><![CDATA[%@]]></description><log><![CDATA[%@]]></log></crash>",
+                   [[self applicationName] UTF8String],
+                   [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"] UTF8String],
+                   [NSString stringWithFormat:@"%i.%i.%i", versionMajor, versionMinor, versionBugFix],
+                   [self applicationVersion],
+                   [self applicationVersion],
+                   [self modelVersion],
+                   userid,
+                   contact,
+                   notes,
+                   crashContent
+                   ];
+
+
+    [self returnToMainApplication];
+
+    [self _postXML:[NSString stringWithFormat:@"<crashes>%@</crashes>", xml] toURL:[NSURL URLWithString:self.submissionURL]];
+}
+
+- (void)_postXML:(NSString*)xml toURL:(NSURL*)url {
+  NSMutableURLRequest *request = nil;
+  NSString *boundary = @"----FOO";
+
+  if (self.appIdentifier) {
+    request = [NSMutableURLRequest requestWithURL:
+               [NSURL URLWithString:[NSString stringWithFormat:@"%@api/2/apps/%@/crashes?sdk=%@&sdk_version=%@",
+                                     self.submissionURL,
+                                     [self.appIdentifier stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
+                                     SDK_NAME,
+                                     SDK_VERSION
+                                     ]
+                ]];
+  } else {
+    request = [NSMutableURLRequest requestWithURL:url];
+  }
+
+  [request setValue:@"Quincy/Mac" forHTTPHeaderField:@"User-Agent"];
+  [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
+  [request setTimeoutInterval: 15];
+  [request setHTTPMethod:@"POST"];
+  NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
+  [request setValue:contentType forHTTPHeaderField:@"Content-type"];
+
+  NSMutableData *postBody =  [NSMutableData data];
+  [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
+  if (self.appIdentifier) {
+    [postBody appendData:[@"Content-Disposition: form-data; name=\"xml\"; filename=\"crash.xml\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
+    [postBody appendData:[[NSString stringWithFormat:@"Content-Type: text/xml\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
+  } else {
+    [postBody appendData:[@"Content-Disposition: form-data; name=\"xmlstring\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
+  }
+  [postBody appendData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
+  [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
+  [request setHTTPBody:postBody];
+
+  _serverResult = CrashReportStatusUnknown;
+  _statusCode = 200;
+
+  NSHTTPURLResponse *response = nil;
+  NSError *error = nil;
+
+  NSData *responseData = nil;
+  responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
+  _statusCode = [response statusCode];
+
+  if (responseData != nil) {
+    if (_statusCode >= 200 && _statusCode < 400) {
+      NSXMLParser *parser = [[NSXMLParser alloc] initWithData:responseData];
+      // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
+      [parser setDelegate:self];
+      // Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
+      [parser setShouldProcessNamespaces:NO];
+      [parser setShouldReportNamespacePrefixes:NO];
+      [parser setShouldResolveExternalEntities:NO];
+
+      [parser parse];
+
+      [parser release];
+    }
+  }
+}
+
+
+#pragma mark NSXMLParser
+
+- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
+  if (qName) {
+    elementName = qName;
+  }
+
+  if ([elementName isEqualToString:@"result"]) {
+    _contentOfProperty = [NSMutableString string];
+  }
+}
+
+- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
+  if (qName) {
+    elementName = qName;
+  }
+
+  if ([elementName isEqualToString:@"result"]) {
+    if ([_contentOfProperty intValue] > _serverResult) {
+      _serverResult = [_contentOfProperty intValue];
+    }
+  }
+}
+
+
+- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
+  if (_contentOfProperty) {
+    // If the current element is one whose content we care about, append 'string'
+    // to the property that holds the content of the current element.
+    if (string != nil) {
+      [_contentOfProperty appendString:string];
+    }
+  }
+}
+
+
+#pragma mark GetterSetter
+
+- (NSString *) applicationName {
+  NSString *applicationName = [[[NSBundle mainBundle] localizedInfoDictionary] valueForKey: @"CFBundleExecutable"];
+
+  if (!applicationName)
+    applicationName = [[[NSBundle mainBundle] infoDictionary] valueForKey: @"CFBundleExecutable"];
+
+  return applicationName;
+}
+
+
+- (NSString*) applicationVersionString {
+  NSString* string = [[[NSBundle mainBundle] localizedInfoDictionary] valueForKey: @"CFBundleShortVersionString"];
+
+  if (!string)
+    string = [[[NSBundle mainBundle] infoDictionary] valueForKey: @"CFBundleShortVersionString"];
+
+  return string;
+}
+
+- (NSString *) applicationVersion {
+  NSString* string = [[[NSBundle mainBundle] localizedInfoDictionary] valueForKey: @"CFBundleVersion"];
+
+  if (!string)
+    string = [[[NSBundle mainBundle] infoDictionary] valueForKey: @"CFBundleVersion"];
+
+  return string;
+}
+
+@end
diff --git a/modules/gui/macosx/BWQuincyUI.h b/modules/gui/macosx/BWQuincyUI.h
new file mode 100644 (file)
index 0000000..cad732f
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Author: Andreas Linde <mail@andreaslinde.de>
+ *         Kent Sutherland
+ *
+ * Copyright (c) 2011 Andreas Linde & Kent Sutherland.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+@class BWQuincyManager;
+
+@interface BWQuincyUI : NSWindowController {
+  IBOutlet NSTextField  *descriptionTextField;
+  IBOutlet NSTextView   *crashLogTextView;
+
+  IBOutlet NSTextField  *noteText;
+
+  IBOutlet NSButton   *showButton;
+  IBOutlet NSButton   *hideButton;
+  IBOutlet NSButton   *cancelButton;
+  IBOutlet NSButton   *submitButton;
+
+  BWQuincyManager   *_quincyManager;
+
+  NSString      *_xml;
+
+  NSString      *_crashFile;
+  NSString      *_companyName;
+  NSString      *_applicationName;
+
+  NSMutableString   *_consoleContent;
+  NSString      *_crashLogContent;
+
+  BOOL showComments;
+  BOOL showDetails;
+}
+
+- (id)initWithManager:(BWQuincyManager *)quincyManager crashFile:(NSString *)crashFile companyName:(NSString *)companyName applicationName:(NSString *)applicationName;
+
+- (void) askCrashReportDetails;
+
+- (IBAction) cancelReport:(id)sender;
+- (IBAction) submitReport:(id)sender;
+- (IBAction) showDetails:(id)sender;
+- (IBAction) hideDetails:(id)sender;
+- (IBAction) showComments:(id)sender;
+
+- (BOOL)showComments;
+- (void)setShowComments:(BOOL)value;
+
+- (BOOL)showDetails;
+- (void)setShowDetails:(BOOL)value;
+
+@end
\ No newline at end of file
diff --git a/modules/gui/macosx/BWQuincyUI.m b/modules/gui/macosx/BWQuincyUI.m
new file mode 100644 (file)
index 0000000..beeba74
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * Author: Andreas Linde <mail@andreaslinde.de>
+ *         Kent Sutherland
+ *
+ * Copyright (c) 2011 Andreas Linde & Kent Sutherland.
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#import "BWQuincyUI.h"
+#import "BWQuincyManager.h"
+#import <sys/sysctl.h>
+
+#define CRASHREPORTSENDER_MAX_CONSOLE_SIZE 50000
+
+@interface BWQuincyUI(private)
+- (void) askCrashReportDetails;
+- (void) endCrashReporter;
+@end
+
+const CGFloat kCommentsHeight = 105;
+const CGFloat kDetailsHeight = 285;
+
+@implementation BWQuincyUI
+
+- (id)initWithManager:(BWQuincyManager *)quincyManager crashFile:(NSString *)crashFile companyName:(NSString *)companyName applicationName:(NSString *)applicationName {
+
+  self = [super initWithWindowNibName: @"BWQuincyMain"];
+
+  if ( self != nil) {
+    _xml = nil;
+    _quincyManager = quincyManager;
+    _crashFile = crashFile;
+    _companyName = companyName;
+    _applicationName = applicationName;
+    [self setShowComments: YES];
+    [self setShowDetails: NO];
+
+    NSRect windowFrame = [[self window] frame];
+    windowFrame.size = NSMakeSize(windowFrame.size.width, windowFrame.size.height - kDetailsHeight);
+    windowFrame.origin.y -= kDetailsHeight;
+    [[self window] setFrame: windowFrame
+                    display: YES
+                    animate: NO];
+
+  }
+  return self;
+}
+
+
+- (void)awakeFromNib
+{
+       crashLogTextView.editable = NO;
+       crashLogTextView.selectable = NO;
+       crashLogTextView.automaticSpellingCorrectionEnabled = NO;
+}
+
+
+- (void) endCrashReporter {
+  [self close];
+}
+
+
+- (IBAction) showComments: (id) sender {
+  NSRect windowFrame = [[self window] frame];
+
+  if ([sender intValue]) {
+    [self setShowComments: NO];
+
+    windowFrame.size = NSMakeSize(windowFrame.size.width, windowFrame.size.height + kCommentsHeight);
+    windowFrame.origin.y -= kCommentsHeight;
+    [[self window] setFrame: windowFrame
+                    display: YES
+                    animate: YES];
+
+    [self setShowComments: YES];
+  } else {
+    [self setShowComments: NO];
+
+    windowFrame.size = NSMakeSize(windowFrame.size.width, windowFrame.size.height - kCommentsHeight);
+    windowFrame.origin.y += kCommentsHeight;
+    [[self window] setFrame: windowFrame
+                    display: YES
+                    animate: YES];
+  }
+}
+
+
+- (IBAction) showDetails:(id)sender {
+  NSRect windowFrame = [[self window] frame];
+
+  windowFrame.size = NSMakeSize(windowFrame.size.width, windowFrame.size.height + kDetailsHeight);
+  windowFrame.origin.y -= kDetailsHeight;
+  [[self window] setFrame: windowFrame
+                  display: YES
+                  animate: YES];
+
+  [self setShowDetails:YES];
+
+}
+
+
+- (IBAction) hideDetails:(id)sender {
+  NSRect windowFrame = [[self window] frame];
+
+  [self setShowDetails:NO];
+
+  windowFrame.size = NSMakeSize(windowFrame.size.width, windowFrame.size.height - kDetailsHeight);
+  windowFrame.origin.y += kDetailsHeight;
+  [[self window] setFrame: windowFrame
+                  display: YES
+                  animate: YES];
+}
+
+
+- (IBAction) cancelReport:(id)sender {
+  [self endCrashReporter];
+  [NSApp stopModal];
+
+  [_quincyManager cancelReport];
+}
+
+- (void) _sendReportAfterDelay {
+  NSString *notes = [NSString stringWithFormat:@"Comments:\n%@\n\nConsole:\n%@", [descriptionTextField stringValue], _consoleContent];
+
+  [_quincyManager sendReportCrash:_crashLogContent description:notes];
+  [_crashLogContent release];
+  _crashLogContent = nil;
+}
+
+- (IBAction) submitReport:(id)sender {
+  [submitButton setEnabled:NO];
+
+  [[self window] makeFirstResponder: nil];
+
+  [self performSelector:@selector(_sendReportAfterDelay) withObject:nil afterDelay:0.01];
+
+  [self endCrashReporter];
+  [NSApp stopModal];
+}
+
+
+- (void) askCrashReportDetails {
+  NSError *error;
+
+  [[self window] setTitle:[NSString stringWithFormat:NSLocalizedString(@"Problem Report for %@", @"Window title"), _applicationName]];
+
+  [[descriptionTextField cell] setPlaceholderString:NSLocalizedString(@"Please describe any steps needed to trigger the problem", @"User description placeholder")];
+  [noteText setStringValue:NSLocalizedString(@"No personal information will be sent with this report.", @"Note text")];
+
+  // get the crash log
+  NSString *crashLogs = [NSString stringWithContentsOfFile:_crashFile encoding:NSUTF8StringEncoding error:&error];
+  NSString *lastCrash = [[crashLogs componentsSeparatedByString: @"**********\n\n"] lastObject];
+
+  _crashLogContent = [lastCrash retain];
+
+  // get the console log
+  NSEnumerator *theEnum = [[[NSString stringWithContentsOfFile:@"/private/var/log/system.log" encoding:NSUTF8StringEncoding error:&error] componentsSeparatedByString: @"\n"] objectEnumerator];
+  NSString* currentObject;
+  NSMutableArray* applicationStrings = [NSMutableArray array];
+
+  NSString* searchString = [_applicationName stringByAppendingString:@"["];
+  while ( (currentObject = [theEnum nextObject]) ) {
+    if ([currentObject rangeOfString:searchString].location != NSNotFound)
+      [applicationStrings addObject: currentObject];
+  }
+
+  _consoleContent = [[NSMutableString alloc] initWithString:@""];
+
+  NSInteger i;
+  for(i = ((NSInteger)[applicationStrings count])-1; (i>=0 && i>((NSInteger)[applicationStrings count])-100); i--) {
+    [_consoleContent appendString:[applicationStrings objectAtIndex:i]];
+    [_consoleContent appendString:@"\n"];
+  }
+
+  // Now limit the content to CRASHREPORTSENDER_MAX_CONSOLE_SIZE (default: 50kByte)
+  if ([_consoleContent length] > CRASHREPORTSENDER_MAX_CONSOLE_SIZE) {
+    _consoleContent = (NSMutableString *)[_consoleContent substringWithRange:NSMakeRange([_consoleContent length]-CRASHREPORTSENDER_MAX_CONSOLE_SIZE-1, CRASHREPORTSENDER_MAX_CONSOLE_SIZE)]; 
+  }
+
+  [crashLogTextView setString:[NSString stringWithFormat:@"%@\n\n%@", _crashLogContent, _consoleContent]];
+
+
+  NSBeep();
+  [NSApp runModalForWindow:[self window]];
+}
+
+
+- (void)dealloc {
+  [_consoleContent release]; _consoleContent = nil;
+  _companyName = nil;
+  _quincyManager = nil;
+
+  [super dealloc];
+}
+
+
+- (BOOL)showComments {
+  return showComments;
+}
+
+
+- (void)setShowComments:(BOOL)value {
+  showComments = value;
+}
+
+
+- (BOOL)showDetails {
+  return showDetails;
+}
+
+
+- (void)setShowDetails:(BOOL)value {
+  showDetails = value;
+}
+
+#pragma mark NSTextField Delegate
+
+- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
+  BOOL commandHandled = NO;
+
+  if (commandSelector == @selector(insertNewline:)) {
+    [textView insertNewlineIgnoringFieldEditor:self];
+    commandHandled = YES;
+  }
+
+  return commandHandled;
+}
+
+@end
+
index 47cc3d7f228d6d3cc25b3b0719451f3cc2d1657b..2b62233741da7dd05b0620723af43820ce04b9d7 100644 (file)
@@ -85,5 +85,9 @@ SOURCES_macosx = \
        VLCVoutWindowController.h \
        DebugMessageVisualizer.m \
        DebugMessageVisualizer.h \
+       BWQuincyManager.h \
+       BWQuincyManager.m \
+       BWQuincyUI.h \
+       BWQuincyUI.m \
        iTunes.h \
        $(NULL)
index 2a22e7965d8303ab45cebddb6b34671f7ebbb829..583bd9aa8ca6587d85a3006a01e0e61a3b833f52 100644 (file)
@@ -64,6 +64,7 @@
 #import "TrackSynchronization.h"
 #import "VLCVoutWindowController.h"
 #import "ExtensionsManager.h"
+#import "BWQuincyManager.h"
 
 #import "VideoEffects.h"
 #import "AudioEffects.h"
@@ -762,6 +763,17 @@ static VLCMain *_o_sharedMainInstance = nil;
     if (!p_intf)
         return;
 
+    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] valueForKey: @"CFBundleVersion"];
+    NSRange endRande = [appVersion rangeOfString:@"-"];
+    if (endRande.location != NSNotFound)
+        appVersion = [appVersion substringToIndex:endRande.location];
+
+    BWQuincyManager *quincyManager = [BWQuincyManager sharedQuincyManager];
+    [quincyManager setApplicationVersion:appVersion];
+    [quincyManager setSubmissionURL:@"http://crash.videolan.org/crash_v200.php"];
+    [quincyManager setDelegate:self];
+    [quincyManager setCompanyName:@"VideoLAN"];
+
     [self updateCurrentlyUsedHotkeys];
 
     /* init media key support */
@@ -780,8 +792,6 @@ static VLCMain *_o_sharedMainInstance = nil;
     [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(computerWillSleep:)
            name:NSWorkspaceWillSleepNotification object:nil];
 
-    [self performSelector:@selector(lookForCrashLog) withObject:nil afterDelay:1.5];
-
     /* we will need this, so let's load it here so the interface appears to be more responsive */
     nib_open_loaded = [NSBundle loadNibNamed:@"Open" owner: NSApp];