Adding an application to view plcrash files.

Issue: PLCR-562
This commit is contained in:
Joe Ranieri 2015-03-18 14:23:57 -04:00
Родитель e6d1ac18d7
Коммит 987f8aa209
24 изменённых файлов: 2421 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>QLGenerator</string>
<key>LSItemContentTypes</key>
<array>
<string>org.plcrashreporter.crash</string>
</array>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>coop.plausible.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleShortVersionString</key>
<string>1</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFPlugInDynamicRegisterFunction</key>
<string></string>
<key>CFPlugInDynamicRegistration</key>
<string>NO</string>
<key>CFPlugInFactories</key>
<dict>
<key>152FFDC1-A31F-47EA-9076-0CCAFF6359A1</key>
<string>QuickLookGeneratorPluginFactory</string>
</dict>
<key>CFPlugInTypes</key>
<dict>
<key>5E2D9680-5022-40FA-B806-43349622E5B9</key>
<array>
<string>152FFDC1-A31F-47EA-9076-0CCAFF6359A1</string>
</array>
</dict>
<key>CFPlugInUnloadFunction</key>
<string></string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2015 Plausible Labs Cooperative, Inc. All rights reserved.</string>
<key>QLNeedsToBeRunInMainThread</key>
<false/>
<key>QLPreviewHeight</key>
<real>600</real>
<key>QLPreviewWidth</key>
<real>800</real>
<key>QLSupportsConcurrentRequests</key>
<false/>
<key>QLThumbnailMinimumSize</key>
<real>17</real>
</dict>
</plist>

Просмотреть файл

@ -0,0 +1,6 @@
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//

Просмотреть файл

@ -0,0 +1,37 @@
#include <CoreFoundation/CoreFoundation.h>
#include <CoreServices/CoreServices.h>
#include <QuickLook/QuickLook.h>
#import <CrashReporter/CrashReporter.h>
OSStatus GeneratePreviewForURL (void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options);
void CancelPreviewGeneration (void *thisInterface, QLPreviewRequestRef preview);
/* -----------------------------------------------------------------------------
Generate a preview for file
This function's job is to create preview for designated file
----------------------------------------------------------------------------- */
OSStatus GeneratePreviewForURL (void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options)
{
@autoreleasepool {
NSData *data = [NSData dataWithContentsOfURL: (__bridge NSURL *)url];
if (!data)
return noErr;
PLCrashReport *report = [[PLCrashReport alloc] initWithData: data error: NULL];
if (!report)
return noErr;
NSString *text = [PLCrashReportTextFormatter stringValueForCrashReport: report
withTextFormat: PLCrashReportTextFormatiOS];
NSData *utf8Data = [text dataUsingEncoding: NSUTF8StringEncoding];
QLPreviewRequestSetDataRepresentation(preview, (__bridge CFDataRef)utf8Data, kUTTypePlainText, NULL);
}
return noErr;
}
void CancelPreviewGeneration (void *thisInterface, QLPreviewRequestRef preview)
{
// Implement only if supported
}

Просмотреть файл

@ -0,0 +1,23 @@
#include <CoreFoundation/CoreFoundation.h>
#include <CoreServices/CoreServices.h>
#include <QuickLook/QuickLook.h>
OSStatus GenerateThumbnailForURL (void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize);
void CancelThumbnailGeneration (void *thisInterface, QLThumbnailRequestRef thumbnail);
/* -----------------------------------------------------------------------------
Generate a thumbnail for file
This function's job is to create thumbnail for designated file as fast as possible
----------------------------------------------------------------------------- */
OSStatus GenerateThumbnailForURL (void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize)
{
// To complete your generator please implement the function GenerateThumbnailForURL in GenerateThumbnailForURL.c
return noErr;
}
void CancelThumbnailGeneration (void *thisInterface, QLThumbnailRequestRef thumbnail)
{
// Implement only if supported
}

Просмотреть файл

@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */

Просмотреть файл

@ -0,0 +1,218 @@
//==============================================================================
//
// DO NO MODIFY THE CONTENT OF THIS FILE
//
// This file contains the generic CFPlug-in code necessary for your generator
// To complete your generator implement the function in GenerateThumbnailForURL/GeneratePreviewForURL.c
//
//==============================================================================
#include <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFPlugInCOM.h>
#include <CoreServices/CoreServices.h>
#include <QuickLook/QuickLook.h>
// -----------------------------------------------------------------------------
// constants
// -----------------------------------------------------------------------------
// Don't modify this line
#define PLUGIN_ID "152FFDC1-A31F-47EA-9076-0CCAFF6359A1"
//
// Below is the generic glue code for all plug-ins.
//
// You should not have to modify this code aside from changing
// names if you decide to change the names defined in the Info.plist
//
// -----------------------------------------------------------------------------
// typedefs
// -----------------------------------------------------------------------------
// The thumbnail generation function to be implemented in GenerateThumbnailForURL.c
OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize);
void CancelThumbnailGeneration(void* thisInterface, QLThumbnailRequestRef thumbnail);
// The preview generation function to be implemented in GeneratePreviewForURL.c
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options);
void CancelPreviewGeneration(void *thisInterface, QLPreviewRequestRef preview);
// The layout for an instance of QuickLookGeneratorPlugIn
typedef struct __QuickLookGeneratorPluginType
{
void *conduitInterface;
CFUUIDRef factoryID;
UInt32 refCount;
} QuickLookGeneratorPluginType;
// -----------------------------------------------------------------------------
// prototypes
// -----------------------------------------------------------------------------
// Forward declaration for the IUnknown implementation.
//
QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID);
void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance);
HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv);
void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID);
ULONG QuickLookGeneratorPluginAddRef(void *thisInstance);
ULONG QuickLookGeneratorPluginRelease(void *thisInstance);
// -----------------------------------------------------------------------------
// myInterfaceFtbl definition
// -----------------------------------------------------------------------------
// The QLGeneratorInterfaceStruct function table.
//
static QLGeneratorInterfaceStruct myInterfaceFtbl = {
NULL,
QuickLookGeneratorQueryInterface,
QuickLookGeneratorPluginAddRef,
QuickLookGeneratorPluginRelease,
NULL,
NULL,
NULL,
NULL
};
// -----------------------------------------------------------------------------
// AllocQuickLookGeneratorPluginType
// -----------------------------------------------------------------------------
// Utility function that allocates a new instance.
// You can do some initial setup for the generator here if you wish
// like allocating globals etc...
//
QuickLookGeneratorPluginType *AllocQuickLookGeneratorPluginType(CFUUIDRef inFactoryID)
{
QuickLookGeneratorPluginType *theNewInstance;
theNewInstance = (QuickLookGeneratorPluginType *)malloc(sizeof(QuickLookGeneratorPluginType));
memset(theNewInstance,0,sizeof(QuickLookGeneratorPluginType));
/* Point to the function table Malloc enough to store the stuff and copy the filler from myInterfaceFtbl over */
theNewInstance->conduitInterface = malloc(sizeof(QLGeneratorInterfaceStruct));
memcpy(theNewInstance->conduitInterface,&myInterfaceFtbl,sizeof(QLGeneratorInterfaceStruct));
/* Retain and keep an open instance refcount for each factory. */
theNewInstance->factoryID = CFRetain(inFactoryID);
CFPlugInAddInstanceForFactory(inFactoryID);
/* This function returns the IUnknown interface so set the refCount to one. */
theNewInstance->refCount = 1;
return theNewInstance;
}
// -----------------------------------------------------------------------------
// DeallocQuickLookGeneratorPluginType
// -----------------------------------------------------------------------------
// Utility function that deallocates the instance when
// the refCount goes to zero.
// In the current implementation generator interfaces are never deallocated
// but implement this as this might change in the future
//
void DeallocQuickLookGeneratorPluginType(QuickLookGeneratorPluginType *thisInstance)
{
CFUUIDRef theFactoryID;
theFactoryID = thisInstance->factoryID;
/* Free the conduitInterface table up */
free(thisInstance->conduitInterface);
/* Free the instance structure */
free(thisInstance);
if (theFactoryID){
CFPlugInRemoveInstanceForFactory(theFactoryID);
CFRelease(theFactoryID);
}
}
// -----------------------------------------------------------------------------
// QuickLookGeneratorQueryInterface
// -----------------------------------------------------------------------------
// Implementation of the IUnknown QueryInterface function.
//
HRESULT QuickLookGeneratorQueryInterface(void *thisInstance,REFIID iid,LPVOID *ppv)
{
CFUUIDRef interfaceID;
interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault,iid);
if (CFEqual(interfaceID,kQLGeneratorCallbacksInterfaceID)){
/* If the Right interface was requested, bump the ref count,
* set the ppv parameter equal to the instance, and
* return good status.
*/
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GenerateThumbnailForURL = GenerateThumbnailForURL;
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelThumbnailGeneration = CancelThumbnailGeneration;
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->GeneratePreviewForURL = GeneratePreviewForURL;
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType *)thisInstance)->conduitInterface)->CancelPreviewGeneration = CancelPreviewGeneration;
((QLGeneratorInterfaceStruct *)((QuickLookGeneratorPluginType*)thisInstance)->conduitInterface)->AddRef(thisInstance);
*ppv = thisInstance;
CFRelease(interfaceID);
return S_OK;
}else{
/* Requested interface unknown, bail with error. */
*ppv = NULL;
CFRelease(interfaceID);
return E_NOINTERFACE;
}
}
// -----------------------------------------------------------------------------
// QuickLookGeneratorPluginAddRef
// -----------------------------------------------------------------------------
// Implementation of reference counting for this type. Whenever an interface
// is requested, bump the refCount for the instance. NOTE: returning the
// refcount is a convention but is not required so don't rely on it.
//
ULONG QuickLookGeneratorPluginAddRef(void *thisInstance)
{
((QuickLookGeneratorPluginType *)thisInstance )->refCount += 1;
return ((QuickLookGeneratorPluginType*) thisInstance)->refCount;
}
// -----------------------------------------------------------------------------
// QuickLookGeneratorPluginRelease
// -----------------------------------------------------------------------------
// When an interface is released, decrement the refCount.
// If the refCount goes to zero, deallocate the instance.
//
ULONG QuickLookGeneratorPluginRelease(void *thisInstance)
{
((QuickLookGeneratorPluginType*)thisInstance)->refCount -= 1;
if (((QuickLookGeneratorPluginType*)thisInstance)->refCount == 0){
DeallocQuickLookGeneratorPluginType((QuickLookGeneratorPluginType*)thisInstance );
return 0;
}else{
return ((QuickLookGeneratorPluginType*) thisInstance )->refCount;
}
}
// -----------------------------------------------------------------------------
// QuickLookGeneratorPluginFactory
// -----------------------------------------------------------------------------
void *QuickLookGeneratorPluginFactory(CFAllocatorRef allocator,CFUUIDRef typeID)
{
QuickLookGeneratorPluginType *result;
CFUUIDRef uuid;
/* If correct type is being requested, allocate an
* instance of kQLGeneratorTypeID and return the IUnknown interface.
*/
if (CFEqual(typeID,kQLGeneratorTypeID)){
uuid = CFUUIDCreateFromString(kCFAllocatorDefault,CFSTR(PLUGIN_ID));
result = AllocQuickLookGeneratorPluginType(uuid);
CFRelease(uuid);
return result;
}
/* If the requested type is incorrect, return NULL. */
return NULL;
}

Просмотреть файл

@ -0,0 +1,843 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
D817BBED1AB871E7003B757A /* PLAsyncTask.m in Sources */ = {isa = PBXBuildFile; fileRef = D817BBEC1AB871E7003B757A /* PLAsyncTask.m */; };
D817BBF01AB88C32003B757A /* PLCrashWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = D817BBEF1AB88C32003B757A /* PLCrashWindowController.m */; };
D817BBF41AB89A11003B757A /* PLProgressIndicatorController.m in Sources */ = {isa = PBXBuildFile; fileRef = D817BBF21AB89A11003B757A /* PLProgressIndicatorController.m */; };
D817BBF51AB89A11003B757A /* PLProgressIndicatorController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D817BBF31AB89A11003B757A /* PLProgressIndicatorController.xib */; };
D817BC551AB8EBF5003B757A /* CrashReporter.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D817BC581AB8EC06003B757A /* CrashReporter.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
D817BC591AB8EC65003B757A /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; };
D817BC5A1AB8ECB4003B757A /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */; };
D878135E1AB9F31F00508724 /* PLCrashWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = D878135C1AB9F31F00508724 /* PLCrashWindow.xib */; };
D891CC1A18D0C9510048AC0F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC1918D0C9510048AC0F /* Cocoa.framework */; };
D891CC2418D0C9510048AC0F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D891CC2218D0C9510048AC0F /* InfoPlist.strings */; };
D891CC2618D0C9510048AC0F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D891CC2518D0C9510048AC0F /* main.m */; };
D891CC2A18D0C9510048AC0F /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = D891CC2818D0C9510048AC0F /* Credits.rtf */; };
D891CC2D18D0C9510048AC0F /* PLCrashDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = D891CC2C18D0C9510048AC0F /* PLCrashDocument.m */; };
D891CC3518D0C9510048AC0F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D891CC3418D0C9510048AC0F /* Images.xcassets */; };
D891CC6418D0CC970048AC0F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = D891CC3118D0C9510048AC0F /* MainMenu.xib */; };
D891CC6F18D0D0180048AC0F /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC6E18D0D0180048AC0F /* QuickLook.framework */; };
D891CC7118D0D0180048AC0F /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC7018D0D0180048AC0F /* ApplicationServices.framework */; };
D891CC7318D0D0180048AC0F /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC7218D0D0180048AC0F /* CoreServices.framework */; };
D891CC7518D0D0180048AC0F /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D891CC7418D0D0180048AC0F /* CoreFoundation.framework */; };
D891CC7B18D0D0180048AC0F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D891CC7918D0D0180048AC0F /* InfoPlist.strings */; };
D891CC7D18D0D0180048AC0F /* GenerateThumbnailForURL.c in Sources */ = {isa = PBXBuildFile; fileRef = D891CC7C18D0D0180048AC0F /* GenerateThumbnailForURL.c */; };
D891CC7F18D0D0180048AC0F /* GeneratePreviewForURL.m in Sources */ = {isa = PBXBuildFile; fileRef = D891CC7E18D0D0180048AC0F /* GeneratePreviewForURL.m */; };
D891CC8118D0D0180048AC0F /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = D891CC8018D0D0180048AC0F /* main.c */; };
D891CC8718D0D1D40048AC0F /* CrashReporterQuicklook.qlgenerator in CopyFiles */ = {isa = PBXBuildFile; fileRef = D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
D817BC381AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05E731F30EFA1AAB005EDFB7;
remoteInfo = "CrashReporter-MacOSX-Static";
};
D817BC3A1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 8DC2EF5B0486A6940098B216;
remoteInfo = "CrashReporter-MacOSX";
};
D817BC3C1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 058812B91040582D009128FB;
remoteInfo = "CrashReporter-iOS";
};
D817BC3E1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05CD31520EE936A9000FDE88;
remoteInfo = "CrashReporter-iOS-Device";
};
D817BC401AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05CD31630EE93905000FDE88;
remoteInfo = "CrashReporter-iOS-Simulator";
};
D817BC421AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05E731E30EFA1A3E005EDFB7;
remoteInfo = plcrashutil;
};
D817BC441AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05CD32690EE93DC3000FDE88;
remoteInfo = "Tests-MacOSX";
};
D817BC461AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05CD32A90EE94062000FDE88;
remoteInfo = "Tests-iOS-Simulator";
};
D817BC481AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05CD33240EE94439000FDE88;
remoteInfo = "Tests-iOS-Device";
};
D817BC4A1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 05F40CE70EF7AB80008050CF;
remoteInfo = DemoCrash;
};
D817BC4C1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 052A45CF136353FB00987004;
remoteInfo = "DemoCrash-iOS-Device";
};
D817BC4E1AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 052A464F136355FD00987004;
remoteInfo = "DemoCrash-iOS-Simulator";
};
D817BC501AB8EBAB003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 050DE24D0F61B80B00152ED3;
remoteInfo = "Fuzz Testing";
};
D817BC521AB8EBD5003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
remoteInfo = "CrashReporter-MacOSX";
};
D817BC561AB8EBFE003B757A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
remoteInfo = "CrashReporter-MacOSX";
};
D891CC8818D0D1E10048AC0F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D891CC0E18D0C9510048AC0F /* Project object */;
proxyType = 1;
remoteGlobalIDString = D891CC6C18D0D0180048AC0F;
remoteInfo = CrashReporterQuicklook;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
D891CC6118D0CB950048AC0F /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
D817BC581AB8EC06003B757A /* CrashReporter.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D891CC8618D0D1B20048AC0F /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = Contents/Library/QuickLook;
dstSubfolderSpec = 1;
files = (
D891CC8718D0D1D40048AC0F /* CrashReporterQuicklook.qlgenerator in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D891CC8B18D0D2520048AC0F /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
D817BC551AB8EBF5003B757A /* CrashReporter.framework in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
D817BBEB1AB871E7003B757A /* PLAsyncTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLAsyncTask.h; sourceTree = "<group>"; };
D817BBEC1AB871E7003B757A /* PLAsyncTask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLAsyncTask.m; sourceTree = "<group>"; };
D817BBEE1AB88C32003B757A /* PLCrashWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLCrashWindowController.h; sourceTree = "<group>"; };
D817BBEF1AB88C32003B757A /* PLCrashWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLCrashWindowController.m; sourceTree = "<group>"; };
D817BBF11AB89A11003B757A /* PLProgressIndicatorController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PLProgressIndicatorController.h; sourceTree = "<group>"; };
D817BBF21AB89A11003B757A /* PLProgressIndicatorController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PLProgressIndicatorController.m; sourceTree = "<group>"; };
D817BBF31AB89A11003B757A /* PLProgressIndicatorController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PLProgressIndicatorController.xib; sourceTree = "<group>"; };
D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CrashReporter.xcodeproj; path = ../../CrashReporter.xcodeproj; sourceTree = "<group>"; };
D878135F1AB9F89300508724 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
D87813601AB9F89300508724 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/PLCrashWindow.xib; sourceTree = "<group>"; };
D891CC1618D0C9510048AC0F /* CrashViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CrashViewer.app; sourceTree = BUILT_PRODUCTS_DIR; };
D891CC1918D0C9510048AC0F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
D891CC1C18D0C9510048AC0F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
D891CC1E18D0C9510048AC0F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
D891CC2118D0C9510048AC0F /* CrashViewer-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CrashViewer-Info.plist"; sourceTree = "<group>"; };
D891CC2318D0C9510048AC0F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
D891CC2518D0C9510048AC0F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
D891CC2718D0C9510048AC0F /* CrashViewer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CrashViewer-Prefix.pch"; sourceTree = "<group>"; };
D891CC2918D0C9510048AC0F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
D891CC2B18D0C9510048AC0F /* PLCrashDocument.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PLCrashDocument.h; sourceTree = "<group>"; };
D891CC2C18D0C9510048AC0F /* PLCrashDocument.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PLCrashDocument.m; sourceTree = "<group>"; };
D891CC3418D0C9510048AC0F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CrashReporterQuicklook.qlgenerator; sourceTree = BUILT_PRODUCTS_DIR; };
D891CC6E18D0D0180048AC0F /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; };
D891CC7018D0D0180048AC0F /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = System/Library/Frameworks/ApplicationServices.framework; sourceTree = SDKROOT; };
D891CC7218D0D0180048AC0F /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };
D891CC7418D0D0180048AC0F /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
D891CC7818D0D0180048AC0F /* CrashReporterQuicklook-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "CrashReporterQuicklook-Info.plist"; sourceTree = "<group>"; };
D891CC7A18D0D0180048AC0F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
D891CC7C18D0D0180048AC0F /* GenerateThumbnailForURL.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = GenerateThumbnailForURL.c; sourceTree = "<group>"; };
D891CC7E18D0D0180048AC0F /* GeneratePreviewForURL.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GeneratePreviewForURL.m; sourceTree = "<group>"; };
D891CC8018D0D0180048AC0F /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
D891CC8218D0D0180048AC0F /* CrashReporterQuicklook-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CrashReporterQuicklook-Prefix.pch"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
D891CC1318D0C9510048AC0F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
D891CC1A18D0C9510048AC0F /* Cocoa.framework in Frameworks */,
D817BC591AB8EC65003B757A /* CrashReporter.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D891CC6818D0D0180048AC0F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
D891CC7518D0D0180048AC0F /* CoreFoundation.framework in Frameworks */,
D891CC6F18D0D0180048AC0F /* QuickLook.framework in Frameworks */,
D891CC7318D0D0180048AC0F /* CoreServices.framework in Frameworks */,
D891CC7118D0D0180048AC0F /* ApplicationServices.framework in Frameworks */,
D817BC5A1AB8ECB4003B757A /* CrashReporter.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
D817BC261AB8EBAB003B757A /* Products */ = {
isa = PBXGroup;
children = (
D817BC391AB8EBAB003B757A /* libCrashReporter-MacOSX-Static.a */,
D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */,
D817BC3D1AB8EBAB003B757A /* CrashReporter.framework */,
D817BC3F1AB8EBAB003B757A /* libCrashReporter-iphoneos.a */,
D817BC411AB8EBAB003B757A /* libCrashReporter-iphonesimulator.a */,
D817BC431AB8EBAB003B757A /* plcrashutil */,
D817BC451AB8EBAB003B757A /* Tests-MacOSX.xctest */,
D817BC471AB8EBAB003B757A /* Tests-iOS-Simulator.xctest */,
D817BC491AB8EBAB003B757A /* Tests-iOS-Device.xctest */,
D817BC4B1AB8EBAB003B757A /* DemoCrash.app */,
D817BC4D1AB8EBAB003B757A /* DemoCrash-iOS-Device.app */,
D817BC4F1AB8EBAB003B757A /* DemoCrash-iOS-Simulator.app */,
D817BC511AB8EBAB003B757A /* Fuzz Testing */,
);
name = Products;
sourceTree = "<group>";
};
D891CC0D18D0C9510048AC0F = {
isa = PBXGroup;
children = (
D891CC1F18D0C9510048AC0F /* CrashViewer */,
D891CC7618D0D0180048AC0F /* CrashReporterQuicklook */,
D891CC1818D0C9510048AC0F /* Frameworks */,
D891CC1718D0C9510048AC0F /* Products */,
);
sourceTree = "<group>";
};
D891CC1718D0C9510048AC0F /* Products */ = {
isa = PBXGroup;
children = (
D891CC1618D0C9510048AC0F /* CrashViewer.app */,
D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */,
);
name = Products;
sourceTree = "<group>";
};
D891CC1818D0C9510048AC0F /* Frameworks */ = {
isa = PBXGroup;
children = (
D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */,
D891CC1918D0C9510048AC0F /* Cocoa.framework */,
D891CC6E18D0D0180048AC0F /* QuickLook.framework */,
D891CC7018D0D0180048AC0F /* ApplicationServices.framework */,
D891CC7218D0D0180048AC0F /* CoreServices.framework */,
D891CC7418D0D0180048AC0F /* CoreFoundation.framework */,
D891CC1B18D0C9510048AC0F /* Other Frameworks */,
);
name = Frameworks;
sourceTree = "<group>";
};
D891CC1B18D0C9510048AC0F /* Other Frameworks */ = {
isa = PBXGroup;
children = (
D891CC1C18D0C9510048AC0F /* AppKit.framework */,
D891CC1E18D0C9510048AC0F /* Foundation.framework */,
);
name = "Other Frameworks";
sourceTree = "<group>";
};
D891CC1F18D0C9510048AC0F /* CrashViewer */ = {
isa = PBXGroup;
children = (
D891CC3118D0C9510048AC0F /* MainMenu.xib */,
D817BBEB1AB871E7003B757A /* PLAsyncTask.h */,
D817BBEC1AB871E7003B757A /* PLAsyncTask.m */,
D891CC2B18D0C9510048AC0F /* PLCrashDocument.h */,
D891CC2C18D0C9510048AC0F /* PLCrashDocument.m */,
D878135C1AB9F31F00508724 /* PLCrashWindow.xib */,
D817BBEE1AB88C32003B757A /* PLCrashWindowController.h */,
D817BBEF1AB88C32003B757A /* PLCrashWindowController.m */,
D817BBF11AB89A11003B757A /* PLProgressIndicatorController.h */,
D817BBF21AB89A11003B757A /* PLProgressIndicatorController.m */,
D817BBF31AB89A11003B757A /* PLProgressIndicatorController.xib */,
D891CC3418D0C9510048AC0F /* Images.xcassets */,
D891CC2018D0C9510048AC0F /* Supporting Files */,
);
path = CrashViewer;
sourceTree = "<group>";
};
D891CC2018D0C9510048AC0F /* Supporting Files */ = {
isa = PBXGroup;
children = (
D891CC2118D0C9510048AC0F /* CrashViewer-Info.plist */,
D891CC2218D0C9510048AC0F /* InfoPlist.strings */,
D891CC2518D0C9510048AC0F /* main.m */,
D891CC2718D0C9510048AC0F /* CrashViewer-Prefix.pch */,
D891CC2818D0C9510048AC0F /* Credits.rtf */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
D891CC7618D0D0180048AC0F /* CrashReporterQuicklook */ = {
isa = PBXGroup;
children = (
D891CC7C18D0D0180048AC0F /* GenerateThumbnailForURL.c */,
D891CC7E18D0D0180048AC0F /* GeneratePreviewForURL.m */,
D891CC8018D0D0180048AC0F /* main.c */,
D891CC7718D0D0180048AC0F /* Supporting Files */,
);
path = CrashReporterQuicklook;
sourceTree = "<group>";
};
D891CC7718D0D0180048AC0F /* Supporting Files */ = {
isa = PBXGroup;
children = (
D891CC7818D0D0180048AC0F /* CrashReporterQuicklook-Info.plist */,
D891CC7918D0D0180048AC0F /* InfoPlist.strings */,
D891CC8218D0D0180048AC0F /* CrashReporterQuicklook-Prefix.pch */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
D891CC6918D0D0180048AC0F /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
D891CC1518D0C9510048AC0F /* CrashViewer */ = {
isa = PBXNativeTarget;
buildConfigurationList = D891CC4A18D0C9510048AC0F /* Build configuration list for PBXNativeTarget "CrashViewer" */;
buildPhases = (
D891CC1218D0C9510048AC0F /* Sources */,
D891CC1318D0C9510048AC0F /* Frameworks */,
D891CC1418D0C9510048AC0F /* Resources */,
D891CC6118D0CB950048AC0F /* CopyFiles */,
D891CC8618D0D1B20048AC0F /* CopyFiles */,
);
buildRules = (
);
dependencies = (
D817BC571AB8EBFE003B757A /* PBXTargetDependency */,
D891CC8918D0D1E10048AC0F /* PBXTargetDependency */,
);
name = CrashViewer;
productName = CrashViewer;
productReference = D891CC1618D0C9510048AC0F /* CrashViewer.app */;
productType = "com.apple.product-type.application";
};
D891CC6C18D0D0180048AC0F /* CrashReporterQuicklook */ = {
isa = PBXNativeTarget;
buildConfigurationList = D891CC8318D0D0180048AC0F /* Build configuration list for PBXNativeTarget "CrashReporterQuicklook" */;
buildPhases = (
D891CC6718D0D0180048AC0F /* Sources */,
D891CC6818D0D0180048AC0F /* Frameworks */,
D891CC6918D0D0180048AC0F /* Headers */,
D891CC6A18D0D0180048AC0F /* Resources */,
D891CC8B18D0D2520048AC0F /* CopyFiles */,
);
buildRules = (
);
dependencies = (
D817BC531AB8EBD5003B757A /* PBXTargetDependency */,
);
name = CrashReporterQuicklook;
productName = CrashReporterQuicklook;
productReference = D891CC6D18D0D0180048AC0F /* CrashReporterQuicklook.qlgenerator */;
productType = "com.apple.product-type.bundle";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
D891CC0E18D0C9510048AC0F /* Project object */ = {
isa = PBXProject;
attributes = {
CLASSPREFIX = XOJ;
LastUpgradeCheck = 0510;
ORGANIZATIONNAME = "Xojo, Inc.";
};
buildConfigurationList = D891CC1118D0C9510048AC0F /* Build configuration list for PBXProject "CrashViewer" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = D891CC0D18D0C9510048AC0F;
productRefGroup = D891CC1718D0C9510048AC0F /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = D817BC261AB8EBAB003B757A /* Products */;
ProjectRef = D817BC251AB8EBAB003B757A /* CrashReporter.xcodeproj */;
},
);
projectRoot = "";
targets = (
D891CC1518D0C9510048AC0F /* CrashViewer */,
D891CC6C18D0D0180048AC0F /* CrashReporterQuicklook */,
);
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
D817BC391AB8EBAB003B757A /* libCrashReporter-MacOSX-Static.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libCrashReporter-MacOSX-Static.a";
remoteRef = D817BC381AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC3B1AB8EBAB003B757A /* CrashReporter.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = CrashReporter.framework;
remoteRef = D817BC3A1AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC3D1AB8EBAB003B757A /* CrashReporter.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = CrashReporter.framework;
remoteRef = D817BC3C1AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC3F1AB8EBAB003B757A /* libCrashReporter-iphoneos.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libCrashReporter-iphoneos.a";
remoteRef = D817BC3E1AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC411AB8EBAB003B757A /* libCrashReporter-iphonesimulator.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = "libCrashReporter-iphonesimulator.a";
remoteRef = D817BC401AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC431AB8EBAB003B757A /* plcrashutil */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = plcrashutil;
remoteRef = D817BC421AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC451AB8EBAB003B757A /* Tests-MacOSX.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "Tests-MacOSX.xctest";
remoteRef = D817BC441AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC471AB8EBAB003B757A /* Tests-iOS-Simulator.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "Tests-iOS-Simulator.xctest";
remoteRef = D817BC461AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC491AB8EBAB003B757A /* Tests-iOS-Device.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "Tests-iOS-Device.xctest";
remoteRef = D817BC481AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC4B1AB8EBAB003B757A /* DemoCrash.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = DemoCrash.app;
remoteRef = D817BC4A1AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC4D1AB8EBAB003B757A /* DemoCrash-iOS-Device.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = "DemoCrash-iOS-Device.app";
remoteRef = D817BC4C1AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC4F1AB8EBAB003B757A /* DemoCrash-iOS-Simulator.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = "DemoCrash-iOS-Simulator.app";
remoteRef = D817BC4E1AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
D817BC511AB8EBAB003B757A /* Fuzz Testing */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = "Fuzz Testing";
remoteRef = D817BC501AB8EBAB003B757A /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
D891CC1418D0C9510048AC0F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D891CC2418D0C9510048AC0F /* InfoPlist.strings in Resources */,
D891CC3518D0C9510048AC0F /* Images.xcassets in Resources */,
D891CC2A18D0C9510048AC0F /* Credits.rtf in Resources */,
D878135E1AB9F31F00508724 /* PLCrashWindow.xib in Resources */,
D817BBF51AB89A11003B757A /* PLProgressIndicatorController.xib in Resources */,
D891CC6418D0CC970048AC0F /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D891CC6A18D0D0180048AC0F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D891CC7B18D0D0180048AC0F /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
D891CC1218D0C9510048AC0F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D817BBED1AB871E7003B757A /* PLAsyncTask.m in Sources */,
D891CC2D18D0C9510048AC0F /* PLCrashDocument.m in Sources */,
D817BBF41AB89A11003B757A /* PLProgressIndicatorController.m in Sources */,
D891CC2618D0C9510048AC0F /* main.m in Sources */,
D817BBF01AB88C32003B757A /* PLCrashWindowController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
D891CC6718D0D0180048AC0F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
D891CC7D18D0D0180048AC0F /* GenerateThumbnailForURL.c in Sources */,
D891CC7F18D0D0180048AC0F /* GeneratePreviewForURL.m in Sources */,
D891CC8118D0D0180048AC0F /* main.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
D817BC531AB8EBD5003B757A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = "CrashReporter-MacOSX";
targetProxy = D817BC521AB8EBD5003B757A /* PBXContainerItemProxy */;
};
D817BC571AB8EBFE003B757A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = "CrashReporter-MacOSX";
targetProxy = D817BC561AB8EBFE003B757A /* PBXContainerItemProxy */;
};
D891CC8918D0D1E10048AC0F /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = D891CC6C18D0D0180048AC0F /* CrashReporterQuicklook */;
targetProxy = D891CC8818D0D1E10048AC0F /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
D878135C1AB9F31F00508724 /* PLCrashWindow.xib */ = {
isa = PBXVariantGroup;
children = (
D87813601AB9F89300508724 /* en */,
);
name = PLCrashWindow.xib;
sourceTree = "<group>";
};
D891CC2218D0C9510048AC0F /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
D891CC2318D0C9510048AC0F /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
D891CC2818D0C9510048AC0F /* Credits.rtf */ = {
isa = PBXVariantGroup;
children = (
D891CC2918D0C9510048AC0F /* en */,
);
name = Credits.rtf;
sourceTree = "<group>";
};
D891CC3118D0C9510048AC0F /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
D878135F1AB9F89300508724 /* en */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
D891CC7918D0D0180048AC0F /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
D891CC7A18D0D0180048AC0F /* en */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
D891CC4818D0C9510048AC0F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_ASSIGN_ENUM = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
EFFECTIVE_PLATFORM_NAME = "-MacOSX";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_SHADOW = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.7;
ONLY_ACTIVE_ARCH = YES;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = macosx;
};
name = Debug;
};
D891CC4918D0C9510048AC0F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_ASSIGN_ENUM = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
EFFECTIVE_PLATFORM_NAME = "-MacOSX";
ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_SHADOW = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.7;
RUN_CLANG_STATIC_ANALYZER = YES;
SDKROOT = macosx;
};
name = Release;
};
D891CC4B18D0C9510048AC0F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CrashViewer/CrashViewer-Prefix.pch";
INFOPLIST_FILE = "CrashViewer/CrashViewer-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks/";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
name = Debug;
};
D891CC4C18D0C9510048AC0F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CrashViewer/CrashViewer-Prefix.pch";
INFOPLIST_FILE = "CrashViewer/CrashViewer-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks/";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = app;
};
name = Release;
};
D891CC8418D0D0180048AC0F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CrashReporterQuicklook/CrashReporterQuicklook-Prefix.pch";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = "CrashReporterQuicklook/CrashReporterQuicklook-Info.plist";
INSTALL_PATH = /Library/QuickLook;
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks/";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = qlgenerator;
};
name = Debug;
};
D891CC8518D0D0180048AC0F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COMBINE_HIDPI_IMAGES = YES;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "CrashReporterQuicklook/CrashReporterQuicklook-Prefix.pch";
INFOPLIST_FILE = "CrashReporterQuicklook/CrashReporterQuicklook-Info.plist";
INSTALL_PATH = /Library/QuickLook;
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks/";
PRODUCT_NAME = "$(TARGET_NAME)";
WRAPPER_EXTENSION = qlgenerator;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
D891CC1118D0C9510048AC0F /* Build configuration list for PBXProject "CrashViewer" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D891CC4818D0C9510048AC0F /* Debug */,
D891CC4918D0C9510048AC0F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
D891CC4A18D0C9510048AC0F /* Build configuration list for PBXNativeTarget "CrashViewer" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D891CC4B18D0C9510048AC0F /* Debug */,
D891CC4C18D0C9510048AC0F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
D891CC8318D0D0180048AC0F /* Build configuration list for PBXNativeTarget "CrashReporterQuicklook" */ = {
isa = XCConfigurationList;
buildConfigurations = (
D891CC8418D0D0180048AC0F /* Debug */,
D891CC8518D0D0180048AC0F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = D891CC0E18D0C9510048AC0F /* Project object */;
}

Просмотреть файл

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>plcrash</string>
</array>
<key>CFBundleTypeIconFile</key>
<string>link_code.png</string>
<key>CFBundleTypeName</key>
<string>PLCrash</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSTypeIsPackage</key>
<integer>0</integer>
<key>NSDocumentClass</key>
<string>PLCrashDocument</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>crash</string>
</array>
<key>CFBundleTypeName</key>
<string>Crash Report</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSItemContentTypes</key>
<array>
<string>com.apple.crashreport</string>
</array>
<key>LSTypeIsPackage</key>
<integer>1</integer>
<key>NSDocumentClass</key>
<string>PLCrashDocument</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>txt</string>
</array>
<key>CFBundleTypeName</key>
<string>Text File</string>
<key>CFBundleTypeRole</key>
<string>None</string>
<key>LSItemContentTypes</key>
<array>
<string>public.plain-text</string>
</array>
<key>LSTypeIsPackage</key>
<integer>0</integer>
<key>NSDocumentClass</key>
<string>PLCrashDocument</string>
</dict>
</array>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>coop.plausible.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2015 Plausible Labs Cooperative, Inc. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSSupportsAutomaticTermination</key>
<true/>
<key>NSSupportsSuddenTermination</key>
<true/>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>PLCrashReporter Crash Report</string>
<key>UTTypeIdentifier</key>
<string>org.plcrashreporter.crash</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>plcrash</string>
</array>
</dict>
</dict>
</array>
</dict>
</plist>

Просмотреть файл

@ -0,0 +1,9 @@
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#endif

Просмотреть файл

@ -0,0 +1,58 @@
{
"images" : [
{
"idiom" : "mac",
"size" : "16x16",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "16x16",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "32x32",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "32x32",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "128x128",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "128x128",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "256x256",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "256x256",
"scale" : "2x"
},
{
"idiom" : "mac",
"size" : "512x512",
"scale" : "1x"
},
{
"idiom" : "mac",
"size" : "512x512",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Просмотреть файл

@ -0,0 +1,51 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* Copyright (c) Xojo, Inc.
* 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 <Foundation/Foundation.h>
@interface PLAsyncTask : NSObject {
NSTask *_task;
NSMutableData *_stdinData;
NSMutableData *_stdoutData;
NSMutableData *_stderrData;
NSUInteger _stdinPosition;
void (^_completionHandler)(PLAsyncTask *, NSData *, NSData *);
}
@property(nonatomic, copy) NSString *launchPath;
@property(nonatomic, copy) NSArray *arguments;
@property(nonatomic, copy) NSDictionary *environment;
@property(nonatomic, copy) NSData *stdinData;
@property(nonatomic, readonly) int terminationStatus;
@property(nonatomic, readonly) NSTaskTerminationReason terminationReason;
- (void)terminate;
- (void)launchWithCompletionHandler:(void(^)(PLAsyncTask *, NSData *, NSData *))handler;
@end

Просмотреть файл

@ -0,0 +1,169 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* Copyright (c) Xojo, Inc.
* 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 "PLAsyncTask.h"
/** A wrapper around NSTask that makes asynchronous operations easier. */
@implementation PLAsyncTask
@synthesize stdinData = _stdinData;
- (id) init
{
if ((self = [super init]) == nil)
return nil;
_task = [[NSTask alloc] init];
_stderrData = [[NSMutableData alloc] init];
_stdoutData = [[NSMutableData alloc] init];
return self;
}
- (void) setLaunchPath:(NSString *)launchPath
{
_task.launchPath = launchPath;
}
- (NSString *) launchPath
{
return _task.launchPath;
}
- (void) setArguments: (NSArray *)arguments
{
_task.arguments = arguments;
}
- (NSArray *) arguments
{
return _task.arguments;
}
- (void) setEnvironment: (NSDictionary *)environment
{
_task.environment = environment;
}
- (NSDictionary *) environment
{
return _task.environment;
}
- (int) terminationStatus
{
return _task.terminationStatus;
}
- (NSTaskTerminationReason) terminationReason
{
return _task.terminationReason;
}
- (void) terminate
{
[_task terminate];
}
/**
* Launches the task asynchronously, invoking the handler when the task
* terminates.
*
* @param handler The handler to invoke. The parameters sent to the handler
* are the task, the data from stdout, and the data from stderr.
*/
- (void) launchWithCompletionHandler: (void (^)(PLAsyncTask *, NSData *, NSData *))handler
{
_completionHandler = [handler copy];
NSPipe *stdoutPipe = [NSPipe pipe];
NSFileHandle *stdoutFileHandle = stdoutPipe.fileHandleForReading;
stdoutFileHandle.readabilityHandler = ^(NSFileHandle *handle) {
[self->_stdoutData appendData:handle.availableData];
};
_task.standardOutput = stdoutPipe;
NSPipe *stderrPipe = [NSPipe pipe];
NSFileHandle *stderrFileHandle = stderrPipe.fileHandleForReading;
stderrFileHandle.readabilityHandler = ^(NSFileHandle *handle) {
[self->_stderrData appendData:handle.availableData];
};
_task.standardError = stderrPipe;
if (self.stdinData.length) {
NSPipe *stdinPipe = [NSPipe pipe];
NSFileHandle *stdinFileHandle = stdinPipe.fileHandleForWriting;
fcntl(stdinFileHandle.fileDescriptor, F_SETFL, O_NONBLOCK);
stdinFileHandle.writeabilityHandler = ^(NSFileHandle *handle) {
/* -[NSFileHandle write:] raises exceptions, doesn't tell us how
* much data was written, and ugly in general. Drop down to the
* POSIX level to do this nicer. */
ssize_t result = write(handle.fileDescriptor,
(const char *)self.stdinData.bytes + self->_stdinPosition,
self.stdinData.length - self->_stdinPosition);
if (result > 0) {
self->_stdinPosition += result;
if (self->_stdinPosition == self.stdinData.length) {
handle.writeabilityHandler = nil;
[handle closeFile];
}
} else if (errno != EAGAIN && errno != EINTR) {
/* Something fatal happened. We don't currently have a way to
* report this error back to our caller... */
handle.writeabilityHandler = nil;
}
};
_task.standardInput = stdinPipe;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
_task.terminationHandler = ^(NSTask *task) {
/* We can't set the task's standardOutput/standardError to nil in this
* block because it raises an exception. We at least need to nil out the
* readability handlers though, because otherwise they'll eat 100% CPU.
*/
[task.standardOutput fileHandleForReading].readabilityHandler = nil;
[task.standardError fileHandleForReading].readabilityHandler = nil;
[task.standardInput fileHandleForWriting].writeabilityHandler = nil;
task.terminationHandler = nil;
self->_completionHandler(self, self->_stdoutData, self->_stderrData);
self->_completionHandler = nil;
self->_stdoutData.length = 0;
self->_stderrData.length = 0;
self->_stdinPosition = 0;
};
#pragma clang diagnostic pop
[_task launch];
}
@end

Просмотреть файл

@ -0,0 +1,33 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* 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>
@interface PLCrashDocument : NSDocument
@property(nonatomic, copy) NSString *reportText;
@end

Просмотреть файл

@ -0,0 +1,65 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* 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 "PLCrashDocument.h"
#import <CrashReporter/CrashReporter.h>
#import "PLAsyncTask.h"
#import "PLCrashWindowController.h"
@interface PLCrashDocument ()
@end
@implementation PLCrashDocument
- (void)makeWindowControllers
{
PLCrashWindowController *controller = [[PLCrashWindowController alloc] initWithWindowNibName: @"PLCrashWindow"];
controller.shouldCascadeWindows = YES;
[self addWindowController: controller];
}
- (BOOL) readFromData: (NSData *)data ofType: (NSString *)typeName error: (__autoreleasing NSError **)outError
{
if ([typeName isEqual: @"PLCrash"]) {
PLCrashReport *report = [[PLCrashReport alloc] initWithData: data error: outError];
if (!report)
return NO;
NSString *text = [PLCrashReportTextFormatter stringValueForCrashReport: report
withTextFormat: PLCrashReportTextFormatiOS];
self.reportText = text;
return YES;
} else if ([typeName isEqual: @"com.apple.crashreport"] || [typeName isEqual: @"public.plain-text"]) {
NSString *text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
self.reportText = text;
return text != nil;
}
return NO;
}
@end

Просмотреть файл

@ -0,0 +1,33 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* 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>
@interface PLCrashWindowController : NSWindowController
@end

Просмотреть файл

@ -0,0 +1,176 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* 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 "PLCrashWindowController.h"
#import "PLAsyncTask.h"
#import "PLCrashDocument.h"
#import "PLProgressIndicatorController.h"
@interface PLCrashWindowController ()
/** The currently executing symbolication task, if any. */
@property(nonatomic, retain) PLAsyncTask *symbolicationTask;
/** The progress wheel displayed in the window. Used on pre-10.10 systems. */
@property(nonatomic, retain) NSProgressIndicator *indicator;
/** The progress wheel displayed in the window. Used on 10.10 and higher. */
@property(nonatomic, retain) PLProgressIndicatorController *indicatorController;
/** The text view displaying the crash log. */
@property(nonatomic, assign) IBOutlet NSTextView *textView;
/** Is the window in the process of closing? */
@property(nonatomic) BOOL closing;
/** The alert being displayed if there's an error symbolicating the log. */
@property(nonatomic, retain) NSAlert *alert;
/** The symbolication error alert's accessory view. */
@property(nonatomic, weak) IBOutlet NSView *alertAccessoryView;
/** The error log on the symbolication error alert's accessory view. */
@property(nonatomic, assign) IBOutlet NSTextView *alertTextView;
@end
@implementation PLCrashWindowController
- (void) windowDidLoad
{
[super windowDidLoad];
self.textView.font = [NSFont fontWithName: @"Menlo" size: 12];
self.textView.string = [self.document reportText];
if (self.symbolicationCommand.length) {
[self addProgressIndicator];
[self startSymbolicatingCrash: [self.document reportText]];
}
}
- (void) windowWillClose: (NSNotification *)notification
{
self.closing = YES;
if (self.symbolicationTask)
[self.symbolicationTask terminate];
}
/** The command to execute to symbolicate a crash log. This may be nil. */
- (NSString *) symbolicationCommand
{
return [[NSUserDefaults standardUserDefaults] stringForKey: @"symbolicationCommand"];
}
/**
* Asynchronously executes the user's symbolication command, passing the crash
* report as stdin.
*/
- (void) startSymbolicatingCrash: (NSString *)crashText
{
PLAsyncTask *symbolicationTaks = [[PLAsyncTask alloc] init];
symbolicationTaks.launchPath = @"/bin/sh";
symbolicationTaks.arguments = @[@"-c", self.symbolicationCommand];
symbolicationTaks.stdinData = [crashText dataUsingEncoding: NSUTF8StringEncoding];
[symbolicationTaks launchWithCompletionHandler: ^(PLAsyncTask *task, NSData *stdoutData, NSData *stderrData) {
/* The data arguments aren't guaranteed to be valid after returning from
* this callback, so make our strings immediately. */
NSString *stdoutText = [[NSString alloc] initWithData: stdoutData encoding: NSUTF8StringEncoding];
NSString *stderrText = [[NSString alloc] initWithData: stderrData encoding: NSUTF8StringEncoding];
self.symbolicationTask = nil;
dispatch_async(dispatch_get_main_queue(), ^{
[self removeProgressIndicator];
if (self.closing)
return;
if (task.terminationStatus == 0) {
self.textView.string = stdoutText;
} else if (stderrText.length) {
[self displaySymbolicationError: stderrText];
} else {
[self displaySymbolicationError: stdoutText];
}
});
}];
self.symbolicationTask = symbolicationTaks;
}
/** Displays the error received while invoking the symbolication command. */
- (void) displaySymbolicationError: (NSString *)details
{
NSAlert *alert = [[NSAlert alloc] init];
alert.messageText = @"Symbolication failed";
alert.informativeText = @"The symbolication command returned a non-zero status code.";
alert.accessoryView = self.alertAccessoryView;
self.alertTextView.string = details;
[alert beginSheetModalForWindow: self.window completionHandler: ^(NSModalResponse returnCode) {
/* This dialog is informational only and we have no action to take. */
}];
}
/**
* Adds an indeterminate progress wheel to the top right of the window to
* indicate that symbolication is in progress.
*/
- (void) addProgressIndicator
{
if (NSClassFromString(@"NSTitlebarAccessoryViewController")) {
PLProgressIndicatorController *indicator = [[PLProgressIndicatorController alloc] init];
indicator.layoutAttribute = NSLayoutAttributeRight;
[self.window addTitlebarAccessoryViewController: indicator];
self.indicatorController = indicator;
} else {
NSProgressIndicator *indicator = [[NSProgressIndicator alloc] initWithFrame: NSMakeRect(0, 0, 16, 16)];
indicator.autoresizingMask = NSViewMinYMargin | NSViewMinXMargin;
indicator.style = NSProgressIndicatorSpinningStyle;
indicator.controlSize = NSSmallControlSize;
NSView *themeFrame = [self.window.contentView superview];
NSSize frameSize = themeFrame.frame.size;
[indicator setFrameOrigin: NSMakePoint(frameSize.width - 18, frameSize.height - 18)];
[themeFrame addSubview: indicator];
[indicator startAnimation: nil];
self.indicator = indicator;
}
}
/** Removes the progress wheel added by -addProgressIndicator. */
- (void) removeProgressIndicator
{
if (self.indicatorController) {
[self.indicatorController removeFromParentViewController];
self.indicatorController = nil;
} else {
[self.indicator removeFromSuperview];
self.indicator = nil;
}
}
@end

Просмотреть файл

@ -0,0 +1,33 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* 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>
@interface PLProgressIndicatorController : NSTitlebarAccessoryViewController
@end

Просмотреть файл

@ -0,0 +1,43 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* 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 "PLProgressIndicatorController.h"
@interface PLProgressIndicatorController ()
@property(nonatomic, weak) IBOutlet NSProgressIndicator *indicator;
@end
/** A titlebar accessory view controller containing a progress wheel. */
@implementation PLProgressIndicatorController
- (void)viewDidAppear {
[super viewDidAppear];
[self.indicator startAnimation:nil];
}
@end

Просмотреть файл

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7525" systemVersion="14C1510" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7525"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PLProgressIndicatorController">
<connections>
<outlet property="indicator" destination="vx5-x7-Qic" id="Mnd-0j-aUZ"/>
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="22" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<progressIndicator horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" maxValue="100" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="vx5-x7-Qic">
<rect key="frame" x="2" y="4" width="16" height="16"/>
</progressIndicator>
</subviews>
<point key="canvasLocation" x="147" y="156"/>
</customView>
</objects>
</document>

Просмотреть файл

@ -0,0 +1,15 @@
{\rtf1\ansi\ansicpg1252\cocoartf1344\cocoasubrtf720
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\vieww9600\viewh8400\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720
\f0\b\fs24 \cf0 Engineering:
\b0 \
Joe Ranieri\
\
\b With special thanks to:
\b0 \
Xojo, Inc.\
}

Просмотреть файл

@ -0,0 +1,2 @@
/* Localized versions of Info.plist keys */

Просмотреть файл

@ -0,0 +1,268 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7525" systemVersion="14C1510" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7525"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="CrashViewer" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="CrashViewer" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About CrashViewer" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW">
<connections>
<action selector="makeKeyAndOrderFront:" target="LyG-QI-uvF" id="uy1-vh-2pm"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide CrashViewer" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit CrashViewer" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="printDocument:" target="-1" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="CrashViewer Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<window title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="LyG-QI-uvF">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<rect key="contentRect" x="121" y="123" width="412" height="57"/>
<rect key="screenRect" x="0.0" y="0.0" width="1366" height="745"/>
<view key="contentView" id="gsq-eI-P8p">
<rect key="frame" x="0.0" y="0.0" width="412" height="57"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LTi-YW-zcS">
<rect key="frame" x="20" y="20" width="161" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Symbolication command:" id="NBF-Oi-duo">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AeE-QJ-ZXk">
<rect key="frame" x="187" y="18" width="205" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="nhw-d9-Xvy">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="XBb-ds-Mqg" name="value" keyPath="values.symbolicationCommand" id="9eg-Ib-wS1">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
</subviews>
</view>
<point key="canvasLocation" x="637" y="288.5"/>
</window>
<userDefaultsController id="XBb-ds-Mqg"/>
<progressIndicator horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" id="5Mw-7T-3s8">
<rect key="frame" x="0.0" y="0.0" width="16" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<point key="canvasLocation" x="697" y="387"/>
</progressIndicator>
</objects>
</document>

Просмотреть файл

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="7525" systemVersion="14C1510" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="7525"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PLCrashWindowController">
<connections>
<outlet property="alertAccessoryView" destination="Czw-hl-yrv" id="09z-ve-fzq"/>
<outlet property="alertTextView" destination="5Jj-qz-VkE" id="6vY-lo-kUT"/>
<outlet property="textView" destination="8za-dt-fbM" id="jtV-zC-5UN"/>
<outlet property="window" destination="xOd-HO-29H" id="JDu-Pn-CfA"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="xOd-HO-29H" userLabel="Window">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="133" y="235" width="507" height="413"/>
<rect key="screenRect" x="0.0" y="0.0" width="1366" height="745"/>
<value key="minSize" type="size" width="94" height="86"/>
<view key="contentView" id="gIp-Ho-8D9">
<rect key="frame" x="0.0" y="0.0" width="507" height="413"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8RO-g8-QSL">
<rect key="frame" x="0.0" y="0.0" width="507" height="413"/>
<clipView key="contentView" id="sKV-kg-0sL">
<rect key="frame" x="0.0" y="0.0" width="492" height="413"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView editable="NO" importsGraphics="NO" findStyle="bar" incrementalSearchingEnabled="YES" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" usesFontPanel="YES" verticallyResizable="YES" allowsNonContiguousLayout="YES" quoteSubstitution="YES" dashSubstitution="YES" spellingCorrection="YES" smartInsertDelete="YES" id="8za-dt-fbM">
<rect key="frame" x="0.0" y="0.0" width="492" height="413"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="507" height="413"/>
<size key="maxSize" width="507" height="10000000"/>
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="507" height="413"/>
<size key="maxSize" width="507" height="10000000"/>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="011-6S-BIH">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="Xz8-5V-nJt">
<rect key="frame" x="492" y="0.0" width="15" height="413"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="8RO-g8-QSL" firstAttribute="leading" secondItem="gIp-Ho-8D9" secondAttribute="leading" id="JKi-6H-RTW"/>
<constraint firstItem="8RO-g8-QSL" firstAttribute="top" secondItem="gIp-Ho-8D9" secondAttribute="top" id="aYb-3G-2Xn"/>
<constraint firstAttribute="trailing" secondItem="8RO-g8-QSL" secondAttribute="trailing" id="pMl-vh-dWZ"/>
<constraint firstAttribute="bottom" secondItem="8RO-g8-QSL" secondAttribute="bottom" id="q69-fN-pb1"/>
</constraints>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-x8E"/>
</connections>
</window>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="Czw-hl-yrv">
<rect key="frame" x="0.0" y="0.0" width="427" height="204"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" id="GY3-29-1iC">
<rect key="frame" x="1" y="1" width="223" height="133"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView importsGraphics="NO" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" usesFontPanel="YES" verticallyResizable="YES" allowsNonContiguousLayout="YES" quoteSubstitution="YES" dashSubstitution="YES" spellingCorrection="YES" smartInsertDelete="YES" id="5Jj-qz-VkE">
<rect key="frame" x="0.0" y="0.0" width="223" height="202"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="425" height="202"/>
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="425" height="202"/>
<size key="maxSize" width="463" height="10000000"/>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="nID-es-ae3">
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="0HU-Ps-HNG">
<rect key="frame" x="224" y="1" width="15" height="133"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<point key="canvasLocation" x="188.5" y="700"/>
</scrollView>
</objects>
</document>

Просмотреть файл

@ -0,0 +1,34 @@
/*
* Author: Joe Ranieri <joe@alacatialabs.com>
*
* Copyright (c) 2015 Plausible Labs Cooperative, Inc.
* 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>
int main(int argc, const char * argv[])
{
return NSApplicationMain(argc, argv);
}