adium 5677:b4b45a4ae764: merge adium-1.6 into default
commits at adium.im
commits at adium.im
Wed Aug 7 21:24:29 UTC 2013
details: http://hg.adium.im/adium/rev/b4b45a4ae764
revision: 5677:b4b45a4ae764
branch: (none)
author: Frank Dowsett <wixardy at adium.im>
date: Tue Aug 06 15:33:58 2013 -0400
merge adium-1.6 into default
diffs (truncated from 15888 to 1000 lines):
diff -r b998e327b5fd -r b4b45a4ae764 Adium.xcodeproj/project.pbxproj
--- a/Adium.xcodeproj/project.pbxproj Sat Jul 13 13:01:04 2013 -0400
+++ b/Adium.xcodeproj/project.pbxproj Tue Aug 06 15:33:58 2013 -0400
@@ -1017,6 +1017,9 @@
5A1E3A1214DCE60400724574 /* Preferences-Xtras.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5A1E3A1114DCE60400724574 /* Preferences-Xtras.xib */; };
5A22D6E214834F44004E15F7 /* AIFacebookXMPPAccountView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5A22D6E014834F44004E15F7 /* AIFacebookXMPPAccountView.xib */; };
5A27FA7E14A272330063489D /* pref-messagestyle.png in Resources */ = {isa = PBXBuildFile; fileRef = 5A27FA7A14A272330063489D /* pref-messagestyle.png */; };
+ 5A2FF9B81797336100C2EF12 /* crashDuck.icns in Resources */ = {isa = PBXBuildFile; fileRef = 5A72C1A117013D9400075BBA /* crashDuck.icns */; };
+ 5A2FF9BC1797337200C2EF12 /* CrashReporter.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5A72C1A517013D9400075BBA /* CrashReporter.xib */; };
+ 5A2FF9BD1797351500C2EF12 /* AICrashReporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A72C1AD17013D9400075BBA /* AICrashReporter.m */; };
5A3B4D7916D878AC00903E40 /* NSString+STTwitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A3B4D6C16D878AB00903E40 /* NSString+STTwitter.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
5A3B4D7A16D878AC00903E40 /* STTwitterAPIWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A3B4D6E16D878AB00903E40 /* STTwitterAPIWrapper.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
5A3B4D7C16D878AC00903E40 /* STTwitterOAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A3B4D7216D878AB00903E40 /* STTwitterOAuth.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
@@ -3914,6 +3917,14 @@
5A5F8BBB12D560E400019727 /* AIDockNameOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIDockNameOverlay.h; path = "Plugins/Dock Icon Badging/AIDockNameOverlay.h"; sourceTree = "<group>"; };
5A5F8BBC12D560E400019727 /* AIDockNameOverlay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIDockNameOverlay.m; path = "Plugins/Dock Icon Badging/AIDockNameOverlay.m"; sourceTree = "<group>"; };
5A675E8D13C00AEA006192C5 /* Preferences-General.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "Preferences-General.xib"; path = "Resources/Preferences-General.xib"; sourceTree = "<group>"; };
+ 5A72C1A117013D9400075BBA /* crashDuck.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = crashDuck.icns; sourceTree = "<group>"; };
+ 5A72C1A217013D9400075BBA /* crashDuck.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = crashDuck.png; sourceTree = "<group>"; };
+ 5A72C1A617013D9400075BBA /* cs */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = cs; path = cs.lproj/CrashReporter.xib; sourceTree = "<group>"; };
+ 5A72C1A817013D9400075BBA /* de */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = de; path = de.lproj/CrashReporter.xib; sourceTree = "<group>"; };
+ 5A72C1AA17013D9400075BBA /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/CrashReporter.xib; sourceTree = "<group>"; };
+ 5A72C1AC17013D9400075BBA /* fr */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = fr; path = fr.lproj/CrashReporter.xib; sourceTree = "<group>"; };
+ 5A72C1AD17013D9400075BBA /* AICrashReporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AICrashReporter.m; path = "Other/Adium Crash Reporter/AICrashReporter.m"; sourceTree = "<group>"; };
+ 5A72C1AE17013D9400075BBA /* AICrashReporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AICrashReporter.h; path = "Other/Adium Crash Reporter/AICrashReporter.h"; sourceTree = "<group>"; };
5A7642A811E044B900E5E0AF /* sk */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xib; name = sk; path = Resources/sk.lproj/AccountProxy.xib; sourceTree = "<group>"; };
5A7642A911E044B900E5E0AF /* sk */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xib; name = sk; path = Resources/sk.lproj/AIAdvancedInspectorPane.xib; sourceTree = "<group>"; };
5A7642AB11E044B900E5E0AF /* sk */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sk; path = Resources/sk.lproj/Buttons.strings; sourceTree = "<group>"; };
@@ -7073,6 +7084,7 @@
4BCAC53407B59F9C006641B9 /* Other */ = {
isa = PBXGroup;
children = (
+ 5A72C19C17013B1A00075BBA /* Crash Reporter */,
11BE28E30FCC7DA8000E6A10 /* Image Uploading */,
34FDD6E305632BFD00F5B30F /* ESFileTransferController.h */,
34FDD6E405632BFD00F5B30F /* ESFileTransferController.m */,
@@ -7351,6 +7363,27 @@
name = Vendor;
sourceTree = "<group>";
};
+ 5A72C19C17013B1A00075BBA /* Crash Reporter */ = {
+ isa = PBXGroup;
+ children = (
+ 5A72C1A017013D9400075BBA /* Resources */,
+ 5A72C1AD17013D9400075BBA /* AICrashReporter.m */,
+ 5A72C1AE17013D9400075BBA /* AICrashReporter.h */,
+ );
+ name = "Crash Reporter";
+ sourceTree = "<group>";
+ };
+ 5A72C1A017013D9400075BBA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 5A72C1A117013D9400075BBA /* crashDuck.icns */,
+ 5A72C1A217013D9400075BBA /* crashDuck.png */,
+ 5A72C1A517013D9400075BBA /* CrashReporter.xib */,
+ );
+ name = Resources;
+ path = "Other/Adium Crash Reporter/Resources";
+ sourceTree = "<group>";
+ };
5A8A6A46124456B1004965A8 /* Segmented control with menu popup */ = {
isa = PBXGroup;
children = (
@@ -9760,6 +9793,7 @@
110763FA08676D05005987A5 /* BlockEditorWindow.xib in Resources */,
EE147A6D0896B18800A21377 /* ABSearch.png in Resources */,
EE147A790896B32400A21377 /* ABSearch.xib in Resources */,
+ 5A2FF9BC1797337200C2EF12 /* CrashReporter.xib in Resources */,
63C120750910A0DD00C9DB57 /* DefaultXtraReadme.rtf in Resources */,
348F579E0936FA6D00288E41 /* EditStatusGroup.xib in Resources */,
6333699409497DB000970871 /* EmoticonPreviewView.xib in Resources */,
@@ -9824,6 +9858,7 @@
317D83680E89F40500298BDB /* msg-bookmark-chat.tiff in Resources */,
11BD73D30F5A54BB007D438A /* twitter-small.png in Resources */,
11BD73D40F5A54BB007D438A /* twitter.png in Resources */,
+ 5A2FF9B81797336100C2EF12 /* crashDuck.icns in Resources */,
1109634C0F61C1D00064CA0E /* AITwitterReplyWindow.xib in Resources */,
113892270F6B70CA00A7D7DC /* laconica-small.png in Resources */,
113892280F6B70CA00A7D7DC /* laconica.png in Resources */,
@@ -10474,6 +10509,7 @@
34DC88410A7EEE2E003E1636 /* AdiumPreferredAccounts.m in Sources */,
34DC88430A7EEE2E003E1636 /* AdiumServices.m in Sources */,
34DC88450A7EEE2E003E1636 /* AdiumApplescriptRunner.m in Sources */,
+ 5A2FF9BD1797351500C2EF12 /* AICrashReporter.m in Sources */,
34DC884C0A7EEE2E003E1636 /* AdiumContentFiltering.m in Sources */,
34DC884E0A7EEE2E003E1636 /* AdiumFormatting.m in Sources */,
34DC88510A7EEE2E003E1636 /* AdiumTyping.m in Sources */,
@@ -12265,6 +12301,17 @@
name = SearchTerms.plist;
sourceTree = "<group>";
};
+ 5A72C1A517013D9400075BBA /* CrashReporter.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 5A72C1A617013D9400075BBA /* cs */,
+ 5A72C1A817013D9400075BBA /* de */,
+ 5A72C1AA17013D9400075BBA /* en */,
+ 5A72C1AC17013D9400075BBA /* fr */,
+ );
+ name = CrashReporter.xib;
+ sourceTree = "<group>";
+ };
633D50ED0F9D31BD004F491E /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
diff -r b998e327b5fd -r b4b45a4ae764 Other/Adium Crash Reporter/AICrashReporter.h
--- a/Other/Adium Crash Reporter/AICrashReporter.h Sat Jul 13 13:01:04 2013 -0400
+++ b/Other/Adium Crash Reporter/AICrashReporter.h Tue Aug 06 15:33:58 2013 -0400
@@ -14,50 +14,27 @@
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#define RELATIVE_PATH_TO_CRASH_REPORTER @"/Contents/Resources/Adium Crash Reporter.app"
-#define EXCEPTIONS_PATH [@"~/Library/Logs/CrashReporter/Adium.exception.log" stringByExpandingTildeInPath]
-#define CRASHES_PATH [[NSString stringWithFormat:@"~/Library/Logs/CrashReporter/%@.crash.log", \
- [[NSProcessInfo processInfo] processName]] stringByExpandingTildeInPath]
+ at class AIAutoScrollView, AITextViewWithPlaceholder;
- at class AIAutoScrollView, AITextViewWithPlaceholder, SUStatusChecker;
- at protocol SUStatusCheckerDelegate;
+ at interface AICrashReporter : NSWindowController <NSWindowDelegate> {
+ IBOutlet AIAutoScrollView *scrollView_details;
+ IBOutlet AITextViewWithPlaceholder *textView_details;
- at interface AICrashReporter : NSObject <SUStatusCheckerDelegate> {
- IBOutlet NSWindow *window_MainWindow;
- IBOutlet NSTextField *textField_emailAddress;
- IBOutlet NSTextField *textField_accountIM;
- IBOutlet NSTextField *textField_description;
-
- IBOutlet AIAutoScrollView *scrollView_details;
- IBOutlet AITextViewWithPlaceholder *textView_details;
-
- IBOutlet NSProgressIndicator *progress_sending;
IBOutlet NSButton *button_close;
IBOutlet NSPanel *panel_privacySheet;
IBOutlet NSTextView *textView_crashLog;
- NSString *crashLog; //Current crash log
-
- NSDate *buildDate;
- NSString *buildNumber, *buildUser;
- NSAppleScript *slayerScript;
-
- NSString *adiumPath;
- SUStatusChecker *statusChecker;
-
- BOOL sentCrashLog;
+ NSString *crashLog;
}
-- (void)awakeFromNib;
+ at property (retain) NSString *crashLog;
+
++ (void)checkForCrash;
- (IBAction)showPrivacyDetails:(id)sender;
- (IBAction)closePrivacyDetails:(id)sender;
-- (BOOL)reportCrashForLogAtPath:(NSString *)inPath;
-- (void)sendReport:(NSDictionary *)crashReport;
- (IBAction)send:(id)sender;
-- (void)_loadBuildInformation;
-
@end
diff -r b998e327b5fd -r b4b45a4ae764 Other/Adium Crash Reporter/AICrashReporter.m
--- a/Other/Adium Crash Reporter/AICrashReporter.m Sat Jul 13 13:01:04 2013 -0400
+++ b/Other/Adium Crash Reporter/AICrashReporter.m Tue Aug 06 15:33:58 2013 -0400
@@ -1,4 +1,4 @@
-/*
+/*
* Adium is the legal property of its developers, whose names are listed in the copyright file included
* with this source distribution.
*
@@ -20,180 +20,90 @@
#import <AIUtilities/AIFileManagerAdditions.h>
#import <AIUtilities/AIApplicationAdditions.h>
#import <AIUtilities/AIAutoScrollView.h>
-#import <Sparkle/Sparkle.h>
+#import <sys/sysctl.h>
-#define CRASH_REPORT_URL @"http://www.visualdistortion.org/crash/post.jsp"
-#define KEY_CRASH_EMAIL_ADDRESS @"AdiumCrashReporterEmailAddress"
-#define KEY_CRASH_AIM_ACCOUNT @"AdiumCrashReporterAIMAccount"
+#define CRASH_REPORT_URL @"https://sdk.hockeyapp.net/"
+#define HOCKEY_APP_ID @"a703119f260a58377333db4a07fecadb"
-#define CRASH_REPORT_SLAY_ATTEMPTS 100
-#define CRASH_REPORT_SLAY_INTERVAL 0.1
-
-#define CRASH_LOG_WAIT_ATTEMPTS 100
-#define CRASH_LOG_WAIT_INTERVAL 0.2
-
-#define ADIUM_UPDATE_URL @"http://download.adiumx.com/"
-#define ADIUM_UPDATE_BETA_URL @"http://beta.adiumx.com/"
+#define LAST_CRASH_DATE @"lastKnownCrashDate"
+#define CRASH_LOG_DIRECTORY [@"~/Library/Logs/DiagnosticReports" stringByStandardizingPath]
#define UNABLE_TO_SEND AILocalizedString(@"Unable to send crash report",nil)
- at interface AICrashReporter (PRIVATE)
-- (void)performVersionChecking;
- at end
+ at implementation AICrashReporter
+ at synthesize crashLog;
+static AICrashReporter *reporter;
- at implementation AICrashReporter
-
-//
-- (id)init
++ (void)checkForCrash
{
- if ((self = [super init])) {
- slayerScript = [[NSAppleScript alloc] initWithSource:@"tell application \"UserNotificationCenter\" to quit"];
- }
-
- return self;
-}
-
-//
-- (void)dealloc
-{
- [buildUser release];
- [buildDate release];
- [buildNumber release];
- [crashLog release];
- [slayerScript release];
- [adiumPath release];
- [statusChecker release];
-
- [super dealloc];
+ reporter = [[AICrashReporter alloc] init];
+ [reporter _checkForCrash];
}
-//
-- (void)awakeFromNib
+- (void)_checkForCrash
{
- [textView_details setPlaceholderString:AILocalizedString(@"A detailed explanation of what you were doing when Adium crashed (optional)",nil)];
-
- [scrollView_details setAlwaysDrawFocusRingIfFocused:YES];
+ // get a list of files beginning with 'Adium' from the crash reporter folder
+ NSFileManager *fm = [[NSFileManager alloc] init];
+ NSArray *files = [fm contentsOfDirectoryAtPath:CRASH_LOG_DIRECTORY error:nil];
+ NSArray *filteredFiles = [files filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF BEGINSWITH[c] 'Adium'"]];
- //Search for an exception log
- if ([[NSFileManager defaultManager] fileExistsAtPath:EXCEPTIONS_PATH]) {
- [self reportCrashForLogAtPath:EXCEPTIONS_PATH];
- } else {
- //Kill the apple crash reporter
- [NSTimer scheduledTimerWithTimeInterval:CRASH_REPORT_SLAY_INTERVAL
- target:self
- selector:@selector(appleCrashReportSlayer:)
- userInfo:nil
- repeats:YES];
-
- //Wait for a valid crash log to appear
- [NSTimer scheduledTimerWithTimeInterval:CRASH_LOG_WAIT_INTERVAL
- target:self
- selector:@selector(delayedCrashLogDiscovery:)
- userInfo:nil
- repeats:YES];
- }
+ NSDate *mostRecentCrashDate = [NSDate distantPast];
+ // Enumerate crash files to find most recent crash report
+ for (NSString *file in filteredFiles) {
+ NSDate *date = [[fm attributesOfItemAtPath:[CRASH_LOG_DIRECTORY stringByAppendingPathComponent:file] error:nil] objectForKey:NSFileCreationDate];
+ if ([date compare:mostRecentCrashDate] == NSOrderedDescending) {
+ mostRecentCrashDate = date;
+ [self setCrashLog:file];
+ }
+ [self setCrashLog:file];
+ }
- if ([progress_sending respondsToSelector:@selector(setHidden:)]) {
- [progress_sending setHidden:YES];
+ // obtain the last known crash date from the prefs
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ NSDate *lastKnownCrashDate = [defaults objectForKey:LAST_CRASH_DATE];
+
+ // check to see if Adium crashed since the last crash (there's a newer crash report)
+ if (mostRecentCrashDate && (!lastKnownCrashDate || [mostRecentCrashDate compare:lastKnownCrashDate] == NSOrderedDescending)) {
+ [NSBundle loadNibNamed:@"CrashReporter" owner:self];
+
+ // save last crash date
+ [defaults setObject:mostRecentCrashDate forKey:LAST_CRASH_DATE];
}
}
-- (BOOL)application:(NSApplication *)app openFile:(NSString *)path {
- [adiumPath release];
- adiumPath = [path retain];
- return YES;
+- (void)awakeFromNib
+{
+ [textView_details setPlaceholderString:AILocalizedString(@"A detailed explanation of what you were doing when Adium crashed (optional)", nil)];
+ [scrollView_details setAlwaysDrawFocusRingIfFocused:YES];
+ [self.window makeKeyAndOrderFront:self];
}
-//Actively tries to kill Apple's "Report this crash" dialog
-- (void)appleCrashReportSlayer:(NSTimer *)inTimer
+- (void)windowWillClose:(id)sender
{
- static int countdown = CRASH_REPORT_SLAY_ATTEMPTS;
-
- //Kill the notification app if it's open
- if (countdown-- == 0 || ![[slayerScript executeAndReturnError:nil] booleanValue]) {
- [inTimer invalidate];
- }
-}
-
-#pragma mark Crash log loading
-//Waits for a crash log to be written
-- (void)delayedCrashLogDiscovery:(NSTimer *)inTimer
-{
- static int countdown = CRASH_LOG_WAIT_ATTEMPTS;
-
- //Kill the notification app if it's open
- if (countdown-- == 0 ||
- [self reportCrashForLogAtPath:[@"~/Library/Logs/CrashReporter/Adium.real.crash.log" stringByExpandingTildeInPath]] ||
- [self reportCrashForLogAtPath:[@"~/Library/Logs/CrashReporter/Adium.crash.log" stringByExpandingTildeInPath]]) {
- [inTimer invalidate];
- }
-}
-
-//Display the report crash window for the passed log
-- (BOOL)reportCrashForLogAtPath:(NSString *)inPath
-{
- NSString *emailAddress, *aimAccount;
- NSRange binaryRange;
-
- if ([[NSFileManager defaultManager] fileExistsAtPath:inPath]) {
- NSString *newLog = [NSString stringWithContentsOfFile:inPath];
- if (newLog && [newLog length]) {
- //Hang onto and delete the log
- crashLog = [newLog retain];
- [[NSFileManager defaultManager] trashFileAtPath:inPath];
-
- //Strip off PPC thread state and binary descriptions.. we don't need to send all that
- binaryRange = [crashLog rangeOfString:@"PPC Thread State:"];
- if (binaryRange.location != NSNotFound) {
- NSString *shortLog = [crashLog substringToIndex:binaryRange.location];
- [crashLog release]; crashLog = [shortLog retain];
- }
-
- //Restore the user's email address and account if they've entered it previously
- if ((emailAddress = [[NSUserDefaults standardUserDefaults] objectForKey:KEY_CRASH_EMAIL_ADDRESS])) {
- [textField_emailAddress setStringValue:emailAddress];
- }
- if ((aimAccount = [[NSUserDefaults standardUserDefaults] objectForKey:KEY_CRASH_AIM_ACCOUNT])) {
- [textField_accountIM setStringValue:aimAccount];
- }
-
- //Highlight the existing details text
- [textView_details setSelectedRange:NSMakeRange(0, [[textView_details textStorage] length])
- affinity:NSSelectionAffinityUpstream
- stillSelecting:NO];
-
- //Open our window
- [window_MainWindow makeKeyAndOrderFront:nil];
-
- return YES;
- }
- }
-
- return NO;
+ reporter = nil;
}
#pragma mark Privacy Details
//Display privacy information sheet
- (IBAction)showPrivacyDetails:(id)sender
{
- if (crashLog) {
- NSDictionary *attributes = [NSDictionary dictionaryWithObject:[NSFont systemFontOfSize:11]
- forKey:NSFontAttributeName];
- NSAttributedString *attrLogString = [[[NSAttributedString alloc] initWithString:crashLog
- attributes:attributes] autorelease];
-
- //Fill in crash log
- [[textView_crashLog textStorage] setAttributedString:attrLogString];
-
- //Display the sheet
- [NSApp beginSheet:panel_privacySheet
- modalForWindow:window_MainWindow
- modalDelegate:nil
- didEndSelector:nil
- contextInfo:nil];
- } else {
- NSBeep();
- }
+ NSDictionary *attributes = [NSDictionary dictionaryWithObject:[NSFont systemFontOfSize:11]
+ forKey:NSFontAttributeName];
+
+ NSString *file = [NSString stringWithContentsOfFile:[CRASH_LOG_DIRECTORY stringByAppendingPathComponent:self.crashLog]
+ encoding:NSUTF8StringEncoding error:nil];
+ NSAttributedString *attrLogString = [[NSAttributedString alloc] initWithString:file
+ attributes:attributes];
+
+ //Fill in crash log
+ [[textView_crashLog textStorage] setAttributedString:attrLogString];
+
+ //Display the sheet
+ [NSApp beginSheet:panel_privacySheet
+ modalForWindow:self.window
+ modalDelegate:nil
+ didEndSelector:nil
+ contextInfo:nil];
}
//Close the privacy details sheet
@@ -204,284 +114,150 @@
}
#pragma mark Report sending
-
-/*!
- * @brief Disable the close button and begin spinning the indeterminate progress indicator
- */
-- (void)activateProgressIndicator
-{
- [button_close setHidden:YES];
-
- //Display immediately since we need it for this run loop.
- [[button_close superview] display];
-
- [progress_sending setHidden:NO];
-
- //start the progress spinner (using multi-threading)
- [progress_sending setUsesThreadedAnimation:YES];
- [progress_sending startAnimation:nil];
-}
-
/*!
* @brief User wants to send the report
*/
- (IBAction)send:(id)sender
{
- if ([[textField_emailAddress stringValue] isEqualToString:@""] &&
- [[textField_accountIM stringValue] isEqualToString:@""]) {
- NSBeginCriticalAlertSheet(AILocalizedString(@"Contact Information Required",nil),
- @"OK", nil, nil, window_MainWindow, nil, nil, nil, NULL,
- AILocalizedString(@"Please provide either your email address or IM name in case we need to contact you for additional information (or to suggest a solution).",nil));
- } else {
- //Begin showing progress
- [self activateProgressIndicator];
-
- //Load the build information
- [self _loadBuildInformation];
-
- //Perform version checking; when it is complete or fails, the submission process wil continue
- [self performVersionChecking];
- }
-}
-
-/*!
- * @brief Build the crash report and associated information, then pass it to sendReport:
- */
-- (void)buildAndSendReport
-{
- //If we already sent the crash log, do nothing and just return
- if (sentCrashLog) return;
-
- NSString *shortDescription = [textField_description stringValue];
+ [self.window orderOut:nil];
- //Truncate description field to 300 characters
- if ([shortDescription length] > 300) {
- shortDescription = [shortDescription substringToIndex:300];
- }
-
- //Build the report
- NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] initWithDateFormat:@"%m-%d"
- allowNaturalLanguage:NO] autorelease];
- NSString *buildDateAndInfo = [NSString stringWithFormat:@"%@ (%@)",
- [dateFormatter stringForObjectValue:buildDate],
- (buildUser ? [NSString stringWithFormat:@"%@.%@",buildNumber,buildUser] : buildNumber)];
-
- NSDictionary *crashReport = [NSDictionary dictionaryWithObjectsAndKeys:
- buildDateAndInfo, @"build",
- [textField_emailAddress stringValue], @"email",
- [textField_accountIM stringValue], @"service_name",
- shortDescription, @"short_desc",
- [textView_details string], @"desc",
- crashLog, @"log",
- nil];
-
- //Send
- [self sendReport:crashReport];
+ [self sendReport];
+ [self.window close];
}
/*!
* @brief Send a crash report to the crash reporter web site
*/
-- (void)sendReport:(NSDictionary *)crashReport
+- (void)sendReport
{
- NSMutableString *reportString = [[[NSMutableString alloc] init] autorelease];
- NSEnumerator *enumerator;
- NSString *key;
- NSData *data = nil;
-
- //Compact the fields of the report into a long URL string
- enumerator = [[crashReport allKeys] objectEnumerator];
- while ((key = [enumerator nextObject])) {
- if ([reportString length] != 0) [reportString appendString:@"&"];
- [reportString appendFormat:@"%@=%@", key, [[crashReport objectForKey:key] stringByEncodingURLEscapes]];
- }
+ NSString *reportString = [NSString stringWithContentsOfFile:[CRASH_LOG_DIRECTORY stringByAppendingPathComponent:self.crashLog]
+ encoding:NSUTF8StringEncoding error:nil];
+
+ NSXMLDocument *doc = [[NSXMLDocument alloc] initWithRootElement:[NSXMLElement elementWithName:@"crashes"]];
+ NSXMLElement *crash = [NSXMLElement elementWithName:@"crash"];
+ [crash addChild:[NSXMLElement elementWithName:@"applicationname" stringValue:[self applicationName]]];
+ [crash addChild:[NSXMLElement elementWithName:@"bundleidentifier" stringValue:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]]];
+ [crash addChild:[NSXMLElement elementWithName:@"systemversion" stringValue:[self OSVersion]]];
+ [crash addChild:[NSXMLElement elementWithName:@"senderversion" stringValue:[self applicationVersion]]];
+ [crash addChild:[NSXMLElement elementWithName:@"version" stringValue:[self applicationVersion]]];
+ [crash addChild:[NSXMLElement elementWithName:@"platform" stringValue:[self modelVersion]]];
+ [crash addChild:[NSXMLElement elementWithName:@"description" stringValue:[textView_details string]]];
+ [crash addChild:[NSXMLElement elementWithName:@"log" stringValue:reportString]];
+ [[doc rootElement] addChild:crash];
+
+ NSMutableURLRequest *request = nil;
+ NSString *boundary = @"----FOO";
+
+ NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@api/2/apps/%@/crashes?sdk=%@&sdk_version=%@&feedbackEnabled=no",
+ CRASH_REPORT_URL,
+ [HOCKEY_APP_ID stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
+ @"Adium",
+ @"1.0"
+ ]];
+ request = [NSMutableURLRequest requestWithURL:url];
+
+ [request setValue:@"Adium" forHTTPHeaderField:@"User-Agent"];
+ [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
+ [request setTimeoutInterval:15];
+ [request setHTTPMethod:@"POST"];
+ NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
+ [request setValue:contentType forHTTPHeaderField:@"Content-type"];
+
+ NSMutableData *postBody = [NSMutableData data];
+ [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
+ [postBody appendData:[@"Content-Disposition: form-data; name=\"xml\"; filename=\"crash.xml\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
+ [postBody appendData:[[NSString stringWithFormat:@"Content-Type: text/xml\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
- //
- while (!data || [data length] == 0) {
- NSError *error;
- NSURLResponse *reply;
- NSMutableURLRequest *request;
-
- //Build the URL request
- request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:CRASH_REPORT_URL]
- cachePolicy:NSURLRequestReloadIgnoringCacheData
- timeoutInterval:120];
- [request addValue:@"Adium 2.0a" forHTTPHeaderField:@"X-Adium-Bug-Report"];
- [request setHTTPMethod:@"POST"];
- [request setHTTPBody:[reportString dataUsingEncoding:NSUTF8StringEncoding]];
-
- //Attempt to send report
- data = [NSURLConnection sendSynchronousRequest:request returningResponse:&reply error:&error];
-
- //stop the progress spinner
- [progress_sending stopAnimation:nil];
-
- //Alert on failure, and offer the option to quit or retry
- if (!data || [data length] == 0) {
- if (NSRunAlertPanel(UNABLE_TO_SEND,
- [error localizedDescription],
- AILocalizedString(@"Try Again",nil),
- AILocalizedString(@"Quit",nil),
- nil) == NSAlertAlternateReturn) {
- break;
- }
- } else {
- sentCrashLog = YES;
+ [postBody appendData:[doc XMLData]];
+ [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
+ [request setHTTPBody:postBody];
+
+ NSHTTPURLResponse *response = nil;
+ NSError *error = nil;
+ [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
+
+ //Check for success and offer to try once more if there was an error sending
+ if ([response statusCode] != 201) {
+ NSString *reason = [NSString stringWithFormat:@"%lu: %@\n%@", response.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], [error localizedDescription] ?: @""];
+ if (NSRunAlertPanel(UNABLE_TO_SEND,
+ reason,
+ AILocalizedString(@"Try Again", nil),
+ AILocalizedString(@"Close", nil),
+ nil) == NSAlertDefaultReturn) {
+ [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
+ if ([response statusCode] != 201) {
+ reason = [NSString stringWithFormat:@"%lu: %@\n%@", response.statusCode, [NSHTTPURLResponse localizedStringForStatusCode:response.statusCode], [error localizedDescription] ?: @""];
+ NSRunAlertPanel(UNABLE_TO_SEND, reason, nil, nil, nil);
+ }
}
- }
+ }
}
-#pragma mark Closing behavior
-//Save some of the information for next time on quit
-- (void)windowWillClose:(id)sender
-{
- //Remember the user's email address, account name
- [[NSUserDefaults standardUserDefaults] setObject:[textField_emailAddress stringValue]
- forKey:KEY_CRASH_EMAIL_ADDRESS];
- [[NSUserDefaults standardUserDefaults] setObject:[textField_accountIM stringValue]
- forKey:KEY_CRASH_AIM_ACCOUNT];
+#pragma mark - System/Application Information
+
+- (NSString *) applicationName {
+ NSString *applicationName = [[[NSBundle mainBundle] localizedInfoDictionary] valueForKey: @"CFBundleExecutable"];
+
+ if (!applicationName)
+ applicationName = [[[NSBundle mainBundle] infoDictionary] valueForKey: @"CFBundleExecutable"];
+
+ return applicationName;
}
-//Terminate if our window is closed
-- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
-{
- return YES;
+
+- (NSString*) applicationVersionString {
+ NSString* string = [[[NSBundle mainBundle] localizedInfoDictionary] valueForKey: @"CFBundleShortVersionString"];
+
+ if (!string)
+ string = [[[NSBundle mainBundle] infoDictionary] valueForKey: @"CFBundleShortVersionString"];
+
+ return string;
}
-#pragma mark Build information
-//Load the current build date and our svn revision
-- (void)_loadBuildInformation
-{
- //Grab the info from our buildnum script
- char *path, unixDate[256], num[256],whoami[256];
- FILE *f;
- if ((path = (char *)[[[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/../../../buildnum"] fileSystemRepresentation]) &&
- ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:path]]) &&
- (f= fopen(path, "r"))) {
- if (f) {
- fscanf(f, "%s | %s | %s", num, unixDate, whoami);
- fclose(f);
- }
+- (NSString *) applicationVersion {
+ NSString* string = [[[NSBundle mainBundle] localizedInfoDictionary] valueForKey: @"CFBundleVersion"];
+
+ if (!string)
+ string = [[[NSBundle mainBundle] infoDictionary] valueForKey: @"CFBundleVersion"];
+
+ return string;
+}
+
+- (NSString *) OSVersion {
+ SInt32 versionMajor, versionMinor, versionBugFix;
+ if (Gestalt(gestaltSystemVersionMajor, &versionMajor) != noErr) versionMajor = 0;
+ if (Gestalt(gestaltSystemVersionMinor, &versionMinor) != noErr) versionMinor= 0;
+ if (Gestalt(gestaltSystemVersionBugFix, &versionBugFix) != noErr) versionBugFix = 0;
+
+ return [NSString stringWithFormat:@"%i.%i.%i", versionMajor, versionMinor, versionBugFix];
+}
+
+- (NSString *) modelVersion {
+ NSString * modelString = nil;
+ int modelInfo[2] = { CTL_HW, HW_MODEL };
+ size_t modelSize;
+
+ if (sysctl(modelInfo,
+ 2,
+ NULL,
+ &modelSize,
+ NULL, 0) == 0) {
+ void * modelData = malloc(modelSize);
- if (*num) {
- buildNumber = [[NSString stringWithFormat:@"%s", num] retain];
- }
-
- if (*unixDate) {
- buildDate = [[NSDate dateWithTimeIntervalSince1970:[[NSString stringWithCString:unixDate] doubleValue]] retain];
- }
-
- if (*whoami) {
- //If the application was built by one of these people, we assume that it is a release, which means we should not show their username in the crash log.
- //Otherwise, this is somebody's custom build, and including the username marks it as such.
- buildUser = [[NSString stringWithFormat:@"%s", whoami] retain];
- if ([buildUser isEqualToString:@"adamiser"] ||
- [buildUser isEqualToString:@"evands"] ||
- [buildUser isEqualToString:@"jmelloy"] ||
- [buildUser isEqualToString:@"durin"] ||
- [buildUser isEqualToString:@"rfackler"] ||
- [buildUser isEqualToString:@"david"]) {
- [buildUser release];
- buildUser = nil;
+ if (modelData) {
+ if (sysctl(modelInfo,
+ 2,
+ modelData,
+ &modelSize,
+ NULL, 0) == 0) {
+ modelString = [NSString stringWithUTF8String:modelData];
}
- }
-
- } else {
- NSLog(@"Unable to open the buildnum file.");
- }
-
- //Default to empty strings if something goes wrong
- if (!buildDate) buildDate = [@"" retain];
- if (!buildNumber) buildNumber = [@"" retain];
-}
-
-/*!
- * @brief Invoked when version information is received
- */
-- (void)finishWithAcceptableVersion:(BOOL)allowReport newVersionString:(NSString *)versionString
-{
- BOOL shouldRelaunchAdium = YES;
-
- if (allowReport) {
- [self buildAndSendReport];
-
- } else {
- if (NSRunAlertPanel(UNABLE_TO_SEND,
- [NSString stringWithFormat:AILocalizedString(@"Your version of Adium is out of date, so crash reporting has been disabled. Your version is %@; the current version is %@. Please update to the latest version, as your crash may have already been fixed.",nil),
- [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"],
- versionString],
- AILocalizedString(@"Update Now",nil),
- AILocalizedString(@"Cancel",nil),
- nil) == NSAlertDefaultReturn) {
- shouldRelaunchAdium = NO;
-#ifdef BETA_RELEASE
- [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:ADIUM_UPDATE_BETA_URL]];
-#else
- [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:ADIUM_UPDATE_URL]];
-#endif
- }
- }
-
- //Relaunch Adium if appropriate
- if (shouldRelaunchAdium) {
- if (adiumPath) {
- [[NSWorkspace sharedWorkspace] openFile:adiumPath];
- } else {
- [[NSWorkspace sharedWorkspace] launchApplication:@"Adium"];
+ free(modelData);
}
}
- //Close our window to terminate
- [window_MainWindow performClose:nil];
-}
-
-
-- (void)versionCheckingTimedOut
-{
- [self statusChecker:nil foundVersion:nil isNewVersion:NO];
-}
-
-/*!
- * @brief Returns the date of the most recent Adium build (contacts adiumx.com asynchronously)
- */
-- (void)performVersionChecking
-{
- statusChecker = [[SUStatusChecker statusCheckerForDelegate:self] retain];
- [self performSelector:@selector(versionCheckingTimedOut)
- withObject:nil
- afterDelay:10.0];
-}
-
-- (void)statusChecker:(SUStatusChecker *)statusChecker foundVersion:(NSString *)versionString isNewVersion:(BOOL)isNewVersion
-{
- //Only send the report if there is not a new version
- if (!versionString) {
- NSLog(@"Adium Crash Reporter warning: Could not retrieve version information from the server. Perhaps it is blocked? Allowing the crash reporter anyways.");
- isNewVersion = NO;
- }
-
- [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(versionCheckingTimedOut) object:nil];
- [self finishWithAcceptableVersion:!isNewVersion newVersionString:versionString];
-}
-
-#ifdef BETA_RELEASE
-#define UPDATE_TYPE_DICT [NSDictionary dictionaryWithObjectsAndKeys:@"type", @"key", @"Update Type", @"visibleKey", @"beta", @"value", @"Beta or Release Versions", @"visibleValue", nil]
-#else
-#define UPDATE_TYPE_DICT [NSDictionary dictionaryWithObjectsAndKeys:@"type", @"key", @"Update Type", @"visibleKey", @"release", @"value", @"Release Versions Only", @"visibleValue", nil]
-#endif
-
-/* This method gives the delegate the opportunity to customize the information that will
-* be included with update checks. Add or remove items from the dictionary as desired.
-* Each entry in profileInfo is an NSDictionary with the following keys:
-* key: The key to be used when reporting data to the server
-* visibleKey: Alternate version of key to be used in UI displays of profile information
-* value: Value to be used when reporting data to the server
-* visibleValue: Alternate version of value to be used in UI displays of profile information.
-*/
-- (NSMutableArray *)updaterCustomizeProfileInfo:(NSMutableArray *)profileInfo
-{
- return [NSMutableArray arrayWithObject:UPDATE_TYPE_DICT];
+ return modelString;
}
@end
diff -r b998e327b5fd -r b4b45a4ae764 Other/Adium Crash Reporter/Resources/crashDuck.icns
Binary file Other/Adium Crash Reporter/Resources/crashDuck.icns has changed
diff -r b998e327b5fd -r b4b45a4ae764 Other/Adium Crash Reporter/Resources/crashDuck.png
Binary file Other/Adium Crash Reporter/Resources/crashDuck.png has changed
diff -r b998e327b5fd -r b4b45a4ae764 Other/Adium Crash Reporter/Resources/cs.lproj/CrashReporter.xib
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Other/Adium Crash Reporter/Resources/cs.lproj/CrashReporter.xib Tue Aug 06 15:33:58 2013 -0400
@@ -0,0 +1,1135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1060</int>
+ <string key="IBDocument.SystemVersion">12E55</string>
+ <string key="IBDocument.InterfaceBuilderVersion">4471.1</string>
+ <string key="IBDocument.AppKitVersion">1187.39</string>
+ <string key="IBDocument.HIToolboxVersion">626.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">4471.1</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>NSButton</string>
+ <string>NSButtonCell</string>
+ <string>NSCustomObject</string>
+ <string>NSImageCell</string>
+ <string>NSImageView</string>
+ <string>NSScrollView</string>
+ <string>NSScroller</string>
+ <string>NSTextField</string>
+ <string>NSTextFieldCell</string>
+ <string>NSTextView</string>
+ <string>NSView</string>
+ <string>NSWindowTemplate</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="204579367">
+ <object class="NSCustomObject" id="731211617">
+ <string key="NSClassName">AICrashReporter</string>
+ </object>
+ <object class="NSCustomObject" id="668670629">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="629848424">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="755315200">
+ <int key="NSWindowStyleMask">7</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{224, 464}, {600, 354}}</string>
+ <int key="NSWTFlags">1886912512</int>
+ <string key="NSWindowTitle">Záznamník havárií Adium</string>
+ <string key="NSWindowClass">NSWindow</string>
+ <nil key="NSViewClass"/>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <string key="NSWindowContentMaxSize">{800, 600}</string>
+ <string key="NSWindowContentMinSize">{595, 412}</string>
+ <object class="NSView" key="NSWindowView" id="342982453">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">1581</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSImageView" id="315765071">
+ <reference key="NSNextResponder" ref="342982453"/>
+ <int key="NSvFlags">1801</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <set class="NSMutableSet" key="NSDragTypes">
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ </set>
+ <string key="NSFrame">{{452, 206}, {128, 128}}</string>
+ <reference key="NSSuperview" ref="342982453"/>
+ <reference key="NSNextKeyView" ref="1014266329"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSImageCell" key="NSCell" id="673217008">
+ <int key="NSCellFlags">0</int>
+ <int key="NSCellFlags2">33554432</int>
+ <object class="NSCustomResource" key="NSContents">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">crashDuck</string>
+ </object>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">0</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">NO</bool>
+ </object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ <bool key="NSEditable">YES</bool>
+ </object>
+ <object class="NSImageView" id="305254059">
+ <reference key="NSNextResponder" ref="342982453"/>
+ <int key="NSvFlags">1792</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <set class="NSMutableSet" key="NSDragTypes">
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ </set>
+ <string key="NSFrame">{{694, 127}, {141, 87}}</string>
+ <reference key="NSSuperview" ref="342982453"/>
+ <reference key="NSNextKeyView" ref="289810910"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSImageCell" key="NSCell" id="973923688">
+ <int key="NSCellFlags">0</int>
+ <int key="NSCellFlags2">33554432</int>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">0</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">NO</bool>
+ </object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ <bool key="NSEditable">YES</bool>
+ </object>
+ <object class="NSButton" id="554896697">
+ <reference key="NSNextResponder" ref="342982453"/>
+ <int key="NSvFlags">1825</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{469, 13}, {117, 32}}</string>
+ <reference key="NSSuperview" ref="342982453"/>
+ <string key="NSHuggingPriority">{250, 750}</string>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="367160686">
+ <int key="NSCellFlags">67108864</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Send Report</string>
+ <object class="NSFont" key="NSSupport" id="615657296">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="554896697"/>
+ <int key="NSButtonFlags">-2038284288</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage" id="987097254">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ </object>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ </object>
+ <object class="NSTextField" id="360495998">
+ <reference key="NSNextResponder" ref="342982453"/>
+ <int key="NSvFlags">1804</int>
+ <object class="NSPSMatrix" key="NSFrameMatrix"/>
+ <string key="NSFrame">{{17, 317}, {317, 17}}</string>
+ <reference key="NSSuperview" ref="342982453"/>
+ <reference key="NSNextKeyView" ref="487936377"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="564204706">
+ <int key="NSCellFlags">67108864</int>
+ <int key="NSCellFlags2">4194304</int>
+ <string key="NSContents">Adium quit unexpectedly</string>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande-Bold</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">2072</int>
+ </object>
+ <reference key="NSControlView" ref="360495998"/>
+ <object class="NSColor" key="NSBackgroundColor" id="729523111">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="653415164">
More information about the commits
mailing list