Skip to content
Browse files

Adding XMPPAutoTime - Can be used to automatically keep track of the …

…difference between client and server's system clock.
  • Loading branch information...
1 parent e59b9e5 commit d560d0fbd318999936596380cfc78c85a058f8cb @robbiehanson committed Aug 10, 2011
View
98 Extensions/XEP-0202/XMPPAutoTime.h
@@ -0,0 +1,98 @@
+#import "XMPP.h"
+#import "XMPPTime.h"
+
+@class XMPPJID;
+
+/**
+ * The XMPPAutoTime module monitors the time difference between our machine and the target.
+ * The target may simply be the server, or a specific resource.
+ *
+ * The module works by sending time queries to the target, and tracking the responses.
+ * The module will automatically send multiple queuries, and take into account the average RTT.
+ * It will also automatically update itself on a customizable interval, and whenever the machine's clock changes.
+ *
+ * This module is helpful when you are using timestamps from the target.
+ * For example, you may be receiving offline messages from your server.
+ * However, all these offline messages are timestamped from the server's clock.
+ * And the current machine's clock may vary considerably from the server's clock.
+ * Timezone differences don't matter as UTC is always used in XMPP, but clocks can easily differ.
+ * This may cause the user some confusion as server timestamps may reflect a time in the future,
+ * or much longer ago than in reality.
+**/
+@interface XMPPAutoTime : XMPPModule
+{
+ NSTimeInterval recalibrationInterval;
+ XMPPJID *targetJID;
+ NSTimeInterval timeDifference;
+
+ dispatch_time_t lastCalibrationTime;
+ dispatch_source_t recalibrationTimer;
+
+ BOOL awaitingQueryResponse;
+ XMPPTime *xmppTime;
+
+ NSData *lastServerAddress;
+
+ NSDate *systemUptimeChecked;
+ NSTimeInterval systemUptime;
+}
+
+/**
+ * How often to recalibrate the time difference.
+ *
+ * The module will automatically calculate the time difference when it is activated,
+ * or when it first sees the xmppStream become authenticated (whichever occurs first).
+ * After that first calculation, it will update itself according to this interval.
+ *
+ * To temporarily disable recalibration, set the interval to zero.
+ *
+ * The default recalibrationInterval is 24 hours.
+**/
+@property (readwrite) NSTimeInterval recalibrationInterval;
+
+/**
+ * The target to query.
+ *
+ * If the targetJID is nil, this implies the target is the xmpp server we're connected to.
+ * If the targetJID is non-nil, it must be a full JID (user@domain.tld/rsrc).
+ *
+ * The default targetJID is nil.
+**/
+@property (readwrite, retain) XMPPJID *targetJID;
+
+/**
+ * Returns the calculated time difference between our machine and the target.
+ *
+ * This is NOT a reference to the difference in time zones.
+ * Time zone differences generally shouldn't matter as xmpp standards mandate the use of UTC.
+ *
+ * Rather this is the difference between our UTC time, and the remote party's UTC time.
+ * If the two clocks are not synchronized, then the result represents the approximate difference.
+ *
+ * If our clock is earlier than the remote clock, then the value will be negative.
+ * If our clock is ahead of the remote clock, then the value will be positive.
+ *
+ * If you later receive a timestamp from the remote party, you can simply add the diff.
+ * For example:
+ *
+ * myTime = [givenTimeFromRemoteParty dateByAddingTimeInterval:diff];
+**/
+@property (readonly) NSTimeInterval timeDifference;
+
+/**
+ * The last time we've completed a calibration.
+**/
+@property (readonly) dispatch_time_t lastCalibrationTime;
+
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark -
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@protocol XMPPAutoTimeDelegate
+@optional
+
+- (void)xmppAutoTime:(XMPPAutoTime *)sender didUpdateTimeDifference:(NSTimeInterval)timeDifference;
+
+@end
View
429 Extensions/XEP-0202/XMPPAutoTime.m
@@ -0,0 +1,429 @@
+#import "XMPPAutoTime.h"
+#import "XMPP.h"
+#import "XMPPLogging.h"
+
+// Log levels: off, error, warn, info, verbose
+// Log flags: trace
+#if DEBUG
+ static const int xmppLogLevel = XMPP_LOG_LEVEL_WARN | XMPP_LOG_FLAG_TRACE;
+#else
+ static const int xmppLogLevel = XMPP_LOG_LEVEL_WARN;
+#endif
+
+@interface XMPPAutoTime ()
+
+@property (nonatomic, retain) NSData *lastServerAddress;
+@property (nonatomic, retain) NSDate *systemUptimeChecked;
+
+- (void)updateRecalibrationTimer;
+- (void)startRecalibrationTimer;
+- (void)stopRecalibrationTimer;
+@end
+
+#pragma mark -
+
+@implementation XMPPAutoTime
+
+- (id)initWithDispatchQueue:(dispatch_queue_t)queue
+{
+ if ((self = [super initWithDispatchQueue:queue]))
+ {
+ recalibrationInterval = (60 * 60 * 24);
+
+ lastCalibrationTime = DISPATCH_TIME_FOREVER;
+
+ xmppTime = [[XMPPTime alloc] initWithDispatchQueue:queue];
+ xmppTime.respondsToQueries = NO;
+
+ [xmppTime addDelegate:self delegateQueue:moduleQueue];
+ }
+ return self;
+}
+
+- (BOOL)activate:(XMPPStream *)aXmppStream
+{
+ if ([super activate:aXmppStream])
+ {
+ [xmppTime activate:aXmppStream];
+
+ self.systemUptimeChecked = [NSDate date];
+ systemUptime = [[NSProcessInfo processInfo] systemUptime];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(systemClockDidChange:)
+ name:NSSystemClockDidChangeNotification
+ object:nil];
+
+ return YES;
+ }
+
+ return NO;
+}
+
+- (void)deactivate
+{
+ dispatch_block_t block = ^{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ [self stopRecalibrationTimer];
+
+ [xmppTime deactivate];
+ awaitingQueryResponse = NO;
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+
+ [super deactivate];
+ [pool drain];
+ };
+
+ if (dispatch_get_current_queue() == moduleQueue)
+ block();
+ else
+ dispatch_sync(moduleQueue, block);
+}
+
+- (void)dealloc
+{
+ // recalibrationTimer released in [self deactivate]
+
+ [targetJID release];
+
+ [xmppTime removeDelegate:self];
+ [xmppTime release];
+ xmppTime = nil; // Might be referenced via [super dealloc] -> [self deactivate]
+
+ [lastServerAddress release];
+ [systemUptimeChecked release];
+
+ [super dealloc];
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Properties
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+@synthesize lastServerAddress;
+@synthesize systemUptimeChecked;
+
+- (NSTimeInterval)recalibrationInterval
+{
+ if (dispatch_get_current_queue() == moduleQueue)
+ {
+ return recalibrationInterval;
+ }
+ else
+ {
+ __block NSTimeInterval result;
+
+ dispatch_sync(moduleQueue, ^{
+ result = recalibrationInterval;
+ });
+ return result;
+ }
+}
+
+- (void)setRecalibrationInterval:(NSTimeInterval)interval
+{
+ dispatch_block_t block = ^{
+
+ if (recalibrationInterval != interval)
+ {
+ recalibrationInterval = interval;
+
+ // Update the recalibrationTimer.
+ //
+ // Depending on new value and current state of the recalibrationTimer,
+ // this may mean starting, stoping, or simply updating the timer.
+
+ if (recalibrationInterval > 0)
+ {
+ // Remember: Only start the timer after the xmpp stream is up and authenticated
+ if ([xmppStream isAuthenticated])
+ [self startRecalibrationTimer];
+ }
+ else
+ {
+ [self stopRecalibrationTimer];
+ }
+ }
+ };
+
+ if (dispatch_get_current_queue() == moduleQueue)
+ block();
+ else
+ dispatch_async(moduleQueue, block);
+}
+
+- (XMPPJID *)targetJID
+{
+ if (dispatch_get_current_queue() == moduleQueue)
+ {
+ return targetJID;
+ }
+ else
+ {
+ __block XMPPJID *result;
+
+ dispatch_sync(moduleQueue, ^{
+ result = [targetJID retain];
+ });
+ return [result autorelease];
+ }
+}
+
+- (void)setTargetJID:(XMPPJID *)jid
+{
+ dispatch_block_t block = ^{
+
+ if (![targetJID isEqualToJID:jid])
+ {
+ [targetJID release];
+ targetJID = [jid retain];
+ }
+ };
+
+ if (dispatch_get_current_queue() == moduleQueue)
+ block();
+ else
+ dispatch_async(moduleQueue, block);
+}
+
+- (NSTimeInterval)timeDifference
+{
+ if (dispatch_get_current_queue() == moduleQueue)
+ {
+ return timeDifference;
+ }
+ else
+ {
+ __block NSTimeInterval result;
+
+ dispatch_sync(moduleQueue, ^{
+ result = timeDifference;
+ });
+
+ return result;
+ }
+}
+
+- (dispatch_time_t)lastCalibrationTime
+{
+ if (dispatch_get_current_queue() == moduleQueue)
+ {
+ return lastCalibrationTime;
+ }
+ else
+ {
+ __block dispatch_time_t result;
+
+ dispatch_sync(moduleQueue, ^{
+ result = lastCalibrationTime;
+ });
+
+ return result;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Notifications
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)systemClockDidChange:(NSNotification *)notification
+{
+ XMPPLogTrace();
+ XMPPLogVerbose(@"NSSystemClockDidChangeNotification: %@", notification);
+
+ if (lastCalibrationTime == DISPATCH_TIME_FOREVER)
+ {
+ // Doesn't matter, we haven't done a calibration yet.
+ return;
+ }
+
+ // When the system clock changes, this affects our timeDifference.
+ // However, the notification doesn't tell us by how much the system clock has changed.
+ // So here's how we figure it out:
+ //
+ // The systemUptime isn't affected by the system clock.
+ // We previously recorded the system uptime, and simultaneously recoded the system clock time.
+ // We can now grab the current system uptime and current system clock time.
+ // Using the four data points we can calculate how much the system clock has changed.
+
+ NSDate *now = [NSDate date];
+ NSTimeInterval sysUptime = [[NSProcessInfo processInfo] systemUptime];
+
+ dispatch_async(moduleQueue, ^{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ // Calculate system clock change
+
+ NSDate *oldSysTime = systemUptimeChecked;
+ NSDate *newSysTime = now;
+
+ NSTimeInterval oldSysUptime = systemUptime;
+ NSTimeInterval newSysUptime = sysUptime;
+
+ NSTimeInterval sysTimeDiff = [newSysTime timeIntervalSinceDate:oldSysTime];
+ NSTimeInterval sysUptimeDiff = newSysUptime - oldSysUptime;
+
+ NSTimeInterval sysClockChange = sysTimeDiff - sysUptimeDiff;
+
+ // Modify timeDifference & notify delegate
+
+ timeDifference += sysClockChange;
+ [multicastDelegate xmppAutoTime:self didUpdateTimeDifference:timeDifference];
+
+ // Dont forget to update our variables
+
+ self.systemUptimeChecked = now;
+ systemUptime = sysUptime;
+
+ [pool drain];
+ });
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark Recalibration Timer
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)handleRecalibrationTimerFire
+{
+ XMPPLogTrace();
+
+ if (awaitingQueryResponse) return;
+
+ awaitingQueryResponse = YES;
+
+ if (targetJID)
+ [xmppTime sendQueryToJID:targetJID];
+ else
+ [xmppTime sendQueryToServer];
+}
+
+- (void)updateRecalibrationTimer
+{
+ XMPPLogTrace();
+
+ NSAssert(recalibrationTimer != NULL, @"Broken logic (1)");
+ NSAssert(recalibrationInterval > 0, @"Broken logic (2)");
+
+
+ uint64_t interval = (recalibrationInterval * NSEC_PER_SEC);
+ dispatch_time_t tt;
+
+ if (lastCalibrationTime == DISPATCH_TIME_FOREVER)
+ tt = dispatch_time(DISPATCH_TIME_NOW, 0); // First timer fire at (NOW)
+ else
+ tt = dispatch_time(lastCalibrationTime, interval); // First timer fire at (lastCalibrationTime + interval)
+
+ dispatch_source_set_timer(recalibrationTimer, tt, interval, 0);
+}
+
+- (void)startRecalibrationTimer
+{
+ XMPPLogTrace();
+
+ if (recalibrationInterval <= 0)
+ {
+ // Timer is disabled
+ return;
+ }
+
+ BOOL newTimer = NO;
+
+ if (recalibrationTimer == NULL)
+ {
+ newTimer = YES;
+ recalibrationTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, moduleQueue);
+
+ dispatch_source_set_event_handler(recalibrationTimer, ^{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ [self handleRecalibrationTimerFire];
+
+ [pool drain];
+ });
+ }
+
+ [self updateRecalibrationTimer];
+
+ if (newTimer)
+ {
+ dispatch_resume(recalibrationTimer);
+ }
+}
+
+- (void)stopRecalibrationTimer
+{
+ XMPPLogTrace();
+
+ if (recalibrationTimer)
+ {
+ dispatch_release(recalibrationTimer);
+ recalibrationTimer = NULL;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark XMPPTime Delegate
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)xmppTime:(XMPPTime *)sender didReceiveResponse:(XMPPIQ *)iq withRTT:(NSTimeInterval)rtt
+{
+ XMPPLogTrace();
+
+ awaitingQueryResponse = NO;
+
+ lastCalibrationTime = dispatch_time(DISPATCH_TIME_NOW, 0);
+ timeDifference = [XMPPTime approximateTimeDifferenceFromResponse:iq andRTT:rtt];
+
+ [multicastDelegate xmppAutoTime:self didUpdateTimeDifference:timeDifference];
+}
+
+- (void)xmppTime:(XMPPTime *)sender didNotReceiveResponse:(NSString *)queryID dueToTimeout:(NSTimeInterval)timeout
+{
+ XMPPLogTrace();
+
+ awaitingQueryResponse = NO;
+
+ // Nothing to do here really. Most likely the server doesn't support XEP-0202.
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+#pragma mark XMPPStream Delegate
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)xmppStream:(XMPPStream *)sender socketDidConnect:(GCDAsyncSocket *)socket
+{
+ NSData *currentServerAddress = [socket connectedAddress];
+
+ if (lastServerAddress == nil)
+ {
+ self.lastServerAddress = currentServerAddress;
+ }
+ else if (![lastServerAddress isEqualToData:currentServerAddress])
+ {
+ XMPPLogInfo(@"%@: Connected to a different server. Resetting calibration info.", [self class]);
+
+ lastCalibrationTime = DISPATCH_TIME_FOREVER;
+ timeDifference = 0.0;
+
+ self.lastServerAddress = currentServerAddress;
+ }
+}
+
+- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
+{
+ [self startRecalibrationTimer];
+}
+
+- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
+{
+ [self stopRecalibrationTimer];
+
+ awaitingQueryResponse = NO;
+
+ // We do NOT reset the lastCalibrationTime here.
+ // If we reconnect to the same server, the lastCalibrationTime remains valid.
+}
+
+@end
View
582 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest.xcodeproj/project.pbxproj
@@ -0,0 +1,582 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DC41732713F1D34800ED8D43 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC41732613F1D34800ED8D43 /* Cocoa.framework */; };
+ DC41733113F1D34800ED8D43 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DC41732F13F1D34800ED8D43 /* InfoPlist.strings */; };
+ DC41733313F1D34800ED8D43 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41733213F1D34800ED8D43 /* main.m */; };
+ DC41733713F1D34800ED8D43 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = DC41733513F1D34800ED8D43 /* Credits.rtf */; };
+ DC41733A13F1D34800ED8D43 /* AutoTimeTestAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41733913F1D34800ED8D43 /* AutoTimeTestAppDelegate.m */; };
+ DC41733D13F1D34900ED8D43 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = DC41733B13F1D34900ED8D43 /* MainMenu.xib */; };
+ DC41738D13F1D37300ED8D43 /* NSData+XMPP.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41734613F1D37300ED8D43 /* NSData+XMPP.m */; };
+ DC41738E13F1D37300ED8D43 /* NSNumber+XMPP.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41734813F1D37300ED8D43 /* NSNumber+XMPP.m */; };
+ DC41738F13F1D37300ED8D43 /* NSXMLElement+XMPP.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41734A13F1D37300ED8D43 /* NSXMLElement+XMPP.m */; };
+ DC41739013F1D37300ED8D43 /* XMPPElement.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41734E13F1D37300ED8D43 /* XMPPElement.m */; };
+ DC41739113F1D37300ED8D43 /* XMPPIQ.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41735113F1D37300ED8D43 /* XMPPIQ.m */; };
+ DC41739213F1D37300ED8D43 /* XMPPJID.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41735313F1D37300ED8D43 /* XMPPJID.m */; };
+ DC41739313F1D37300ED8D43 /* XMPPMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41735613F1D37300ED8D43 /* XMPPMessage.m */; };
+ DC41739413F1D37300ED8D43 /* XMPPModule.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41735813F1D37300ED8D43 /* XMPPModule.m */; };
+ DC41739513F1D37300ED8D43 /* XMPPParser.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41735A13F1D37300ED8D43 /* XMPPParser.m */; };
+ DC41739613F1D37300ED8D43 /* XMPPPresence.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41735C13F1D37300ED8D43 /* XMPPPresence.m */; };
+ DC41739713F1D37300ED8D43 /* XMPPStream.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41735E13F1D37300ED8D43 /* XMPPStream.m */; };
+ DC41739813F1D37300ED8D43 /* DDList.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41736113F1D37300ED8D43 /* DDList.m */; };
+ DC41739913F1D37300ED8D43 /* GCDMulticastDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41736313F1D37300ED8D43 /* GCDMulticastDelegate.m */; };
+ DC41739A13F1D37300ED8D43 /* LibIDN.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41736513F1D37300ED8D43 /* LibIDN.m */; };
+ DC41739B13F1D37300ED8D43 /* RFImageToDataTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41736713F1D37300ED8D43 /* RFImageToDataTransformer.m */; };
+ DC41739C13F1D37300ED8D43 /* XMPPIDTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41736913F1D37300ED8D43 /* XMPPIDTracker.m */; };
+ DC41739D13F1D37300ED8D43 /* XMPPSRVResolver.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41736B13F1D37300ED8D43 /* XMPPSRVResolver.m */; };
+ DC41739E13F1D37300ED8D43 /* GCDAsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41736F13F1D37300ED8D43 /* GCDAsyncSocket.m */; };
+ DC41739F13F1D37300ED8D43 /* DDAbstractDatabaseLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41737213F1D37300ED8D43 /* DDAbstractDatabaseLogger.m */; };
+ DC4173A013F1D37300ED8D43 /* DDASLLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41737413F1D37300ED8D43 /* DDASLLogger.m */; };
+ DC4173A113F1D37300ED8D43 /* DDFileLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41737613F1D37300ED8D43 /* DDFileLogger.m */; };
+ DC4173A213F1D37300ED8D43 /* DDLog.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41737813F1D37300ED8D43 /* DDLog.m */; };
+ DC4173A313F1D37300ED8D43 /* DDTTYLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = DC41737A13F1D37300ED8D43 /* DDTTYLogger.m */; };
+ DC4173A913F1D37300ED8D43 /* libidn.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DC41738B13F1D37300ED8D43 /* libidn.a */; };
+ DC4173B013F1D3BB00ED8D43 /* XMPPAutoTime.m in Sources */ = {isa = PBXBuildFile; fileRef = DC4173AD13F1D3BB00ED8D43 /* XMPPAutoTime.m */; };
+ DC4173B113F1D3BB00ED8D43 /* XMPPTime.m in Sources */ = {isa = PBXBuildFile; fileRef = DC4173AF13F1D3BB00ED8D43 /* XMPPTime.m */; };
+ DC4173B713F1D3D500ED8D43 /* NSDate+XMPPDateTimeProfiles.m in Sources */ = {isa = PBXBuildFile; fileRef = DC4173B413F1D3D500ED8D43 /* NSDate+XMPPDateTimeProfiles.m */; };
+ DC4173B813F1D3D500ED8D43 /* XMPPDateTimeProfiles.m in Sources */ = {isa = PBXBuildFile; fileRef = DC4173B613F1D3D500ED8D43 /* XMPPDateTimeProfiles.m */; };
+ DC4173BA13F1D3E200ED8D43 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC4173B913F1D3E200ED8D43 /* Security.framework */; };
+ DC4173BC13F1E23B00ED8D43 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DC4173BB13F1E23B00ED8D43 /* libresolv.dylib */; };
+ DC4173BE13F1E24500ED8D43 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = DC4173BD13F1E24500ED8D43 /* libxml2.dylib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DC41732213F1D34800ED8D43 /* AutoTimeTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoTimeTest.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DC41732613F1D34800ED8D43 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ DC41732913F1D34800ED8D43 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+ DC41732A13F1D34800ED8D43 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
+ DC41732B13F1D34800ED8D43 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ DC41732E13F1D34800ED8D43 /* AutoTimeTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "AutoTimeTest-Info.plist"; sourceTree = "<group>"; };
+ DC41733013F1D34800ED8D43 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ DC41733213F1D34800ED8D43 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ DC41733413F1D34800ED8D43 /* AutoTimeTest-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AutoTimeTest-Prefix.pch"; sourceTree = "<group>"; };
+ DC41733613F1D34800ED8D43 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = "<group>"; };
+ DC41733813F1D34800ED8D43 /* AutoTimeTestAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AutoTimeTestAppDelegate.h; sourceTree = "<group>"; };
+ DC41733913F1D34800ED8D43 /* AutoTimeTestAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AutoTimeTestAppDelegate.m; sourceTree = "<group>"; };
+ DC41733C13F1D34900ED8D43 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
+ DC41734513F1D37300ED8D43 /* NSData+XMPP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+XMPP.h"; sourceTree = "<group>"; };
+ DC41734613F1D37300ED8D43 /* NSData+XMPP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+XMPP.m"; sourceTree = "<group>"; };
+ DC41734713F1D37300ED8D43 /* NSNumber+XMPP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+XMPP.h"; sourceTree = "<group>"; };
+ DC41734813F1D37300ED8D43 /* NSNumber+XMPP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSNumber+XMPP.m"; sourceTree = "<group>"; };
+ DC41734913F1D37300ED8D43 /* NSXMLElement+XMPP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSXMLElement+XMPP.h"; sourceTree = "<group>"; };
+ DC41734A13F1D37300ED8D43 /* NSXMLElement+XMPP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSXMLElement+XMPP.m"; sourceTree = "<group>"; };
+ DC41734C13F1D37300ED8D43 /* XMPP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPP.h; sourceTree = "<group>"; };
+ DC41734D13F1D37300ED8D43 /* XMPPElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPElement.h; sourceTree = "<group>"; };
+ DC41734E13F1D37300ED8D43 /* XMPPElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPElement.m; sourceTree = "<group>"; };
+ DC41734F13F1D37300ED8D43 /* XMPPInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPInternal.h; sourceTree = "<group>"; };
+ DC41735013F1D37300ED8D43 /* XMPPIQ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPIQ.h; sourceTree = "<group>"; };
+ DC41735113F1D37300ED8D43 /* XMPPIQ.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPIQ.m; sourceTree = "<group>"; };
+ DC41735213F1D37300ED8D43 /* XMPPJID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPJID.h; sourceTree = "<group>"; };
+ DC41735313F1D37300ED8D43 /* XMPPJID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPJID.m; sourceTree = "<group>"; };
+ DC41735413F1D37300ED8D43 /* XMPPLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPLogging.h; sourceTree = "<group>"; };
+ DC41735513F1D37300ED8D43 /* XMPPMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPMessage.h; sourceTree = "<group>"; };
+ DC41735613F1D37300ED8D43 /* XMPPMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPMessage.m; sourceTree = "<group>"; };
+ DC41735713F1D37300ED8D43 /* XMPPModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPModule.h; sourceTree = "<group>"; };
+ DC41735813F1D37300ED8D43 /* XMPPModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPModule.m; sourceTree = "<group>"; };
+ DC41735913F1D37300ED8D43 /* XMPPParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPParser.h; sourceTree = "<group>"; };
+ DC41735A13F1D37300ED8D43 /* XMPPParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPParser.m; sourceTree = "<group>"; };
+ DC41735B13F1D37300ED8D43 /* XMPPPresence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPPresence.h; sourceTree = "<group>"; };
+ DC41735C13F1D37300ED8D43 /* XMPPPresence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPPresence.m; sourceTree = "<group>"; };
+ DC41735D13F1D37300ED8D43 /* XMPPStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPStream.h; sourceTree = "<group>"; };
+ DC41735E13F1D37300ED8D43 /* XMPPStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPStream.m; sourceTree = "<group>"; };
+ DC41736013F1D37300ED8D43 /* DDList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDList.h; sourceTree = "<group>"; };
+ DC41736113F1D37300ED8D43 /* DDList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDList.m; sourceTree = "<group>"; };
+ DC41736213F1D37300ED8D43 /* GCDMulticastDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDMulticastDelegate.h; sourceTree = "<group>"; };
+ DC41736313F1D37300ED8D43 /* GCDMulticastDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDMulticastDelegate.m; sourceTree = "<group>"; };
+ DC41736413F1D37300ED8D43 /* LibIDN.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LibIDN.h; sourceTree = "<group>"; };
+ DC41736513F1D37300ED8D43 /* LibIDN.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LibIDN.m; sourceTree = "<group>"; };
+ DC41736613F1D37300ED8D43 /* RFImageToDataTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RFImageToDataTransformer.h; sourceTree = "<group>"; };
+ DC41736713F1D37300ED8D43 /* RFImageToDataTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RFImageToDataTransformer.m; sourceTree = "<group>"; };
+ DC41736813F1D37300ED8D43 /* XMPPIDTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPIDTracker.h; sourceTree = "<group>"; };
+ DC41736913F1D37300ED8D43 /* XMPPIDTracker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPIDTracker.m; sourceTree = "<group>"; };
+ DC41736A13F1D37300ED8D43 /* XMPPSRVResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPSRVResolver.h; sourceTree = "<group>"; };
+ DC41736B13F1D37300ED8D43 /* XMPPSRVResolver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPSRVResolver.m; sourceTree = "<group>"; };
+ DC41736E13F1D37300ED8D43 /* GCDAsyncSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDAsyncSocket.h; sourceTree = "<group>"; };
+ DC41736F13F1D37300ED8D43 /* GCDAsyncSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDAsyncSocket.m; sourceTree = "<group>"; };
+ DC41737113F1D37300ED8D43 /* DDAbstractDatabaseLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDAbstractDatabaseLogger.h; sourceTree = "<group>"; };
+ DC41737213F1D37300ED8D43 /* DDAbstractDatabaseLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDAbstractDatabaseLogger.m; sourceTree = "<group>"; };
+ DC41737313F1D37300ED8D43 /* DDASLLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDASLLogger.h; sourceTree = "<group>"; };
+ DC41737413F1D37300ED8D43 /* DDASLLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDASLLogger.m; sourceTree = "<group>"; };
+ DC41737513F1D37300ED8D43 /* DDFileLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDFileLogger.h; sourceTree = "<group>"; };
+ DC41737613F1D37300ED8D43 /* DDFileLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDFileLogger.m; sourceTree = "<group>"; };
+ DC41737713F1D37300ED8D43 /* DDLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDLog.h; sourceTree = "<group>"; };
+ DC41737813F1D37300ED8D43 /* DDLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDLog.m; sourceTree = "<group>"; };
+ DC41737913F1D37300ED8D43 /* DDTTYLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDTTYLogger.h; sourceTree = "<group>"; };
+ DC41737A13F1D37300ED8D43 /* DDTTYLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDTTYLogger.m; sourceTree = "<group>"; };
+ DC41738913F1D37300ED8D43 /* idn-int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "idn-int.h"; sourceTree = "<group>"; };
+ DC41738B13F1D37300ED8D43 /* libidn.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libidn.a; sourceTree = "<group>"; };
+ DC41738C13F1D37300ED8D43 /* stringprep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringprep.h; sourceTree = "<group>"; };
+ DC4173AC13F1D3BB00ED8D43 /* XMPPAutoTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPAutoTime.h; sourceTree = "<group>"; };
+ DC4173AD13F1D3BB00ED8D43 /* XMPPAutoTime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPAutoTime.m; sourceTree = "<group>"; };
+ DC4173AE13F1D3BB00ED8D43 /* XMPPTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPTime.h; sourceTree = "<group>"; };
+ DC4173AF13F1D3BB00ED8D43 /* XMPPTime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPTime.m; sourceTree = "<group>"; };
+ DC4173B313F1D3D500ED8D43 /* NSDate+XMPPDateTimeProfiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+XMPPDateTimeProfiles.h"; sourceTree = "<group>"; };
+ DC4173B413F1D3D500ED8D43 /* NSDate+XMPPDateTimeProfiles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+XMPPDateTimeProfiles.m"; sourceTree = "<group>"; };
+ DC4173B513F1D3D500ED8D43 /* XMPPDateTimeProfiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMPPDateTimeProfiles.h; sourceTree = "<group>"; };
+ DC4173B613F1D3D500ED8D43 /* XMPPDateTimeProfiles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMPPDateTimeProfiles.m; sourceTree = "<group>"; };
+ DC4173B913F1D3E200ED8D43 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
+ DC4173BB13F1E23B00ED8D43 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = usr/lib/libresolv.dylib; sourceTree = SDKROOT; };
+ DC4173BD13F1E24500ED8D43 /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DC41731F13F1D34800ED8D43 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DC4173BE13F1E24500ED8D43 /* libxml2.dylib in Frameworks */,
+ DC4173BC13F1E23B00ED8D43 /* libresolv.dylib in Frameworks */,
+ DC4173BA13F1D3E200ED8D43 /* Security.framework in Frameworks */,
+ DC41732713F1D34800ED8D43 /* Cocoa.framework in Frameworks */,
+ DC4173A913F1D37300ED8D43 /* libidn.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DC41731713F1D34800ED8D43 = {
+ isa = PBXGroup;
+ children = (
+ DC41734313F1D35100ED8D43 /* XMPP */,
+ DC41732C13F1D34800ED8D43 /* AutoTimeTest */,
+ DC41732513F1D34800ED8D43 /* Frameworks */,
+ DC41732313F1D34800ED8D43 /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ DC41732313F1D34800ED8D43 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DC41732213F1D34800ED8D43 /* AutoTimeTest.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ DC41732513F1D34800ED8D43 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ DC41732613F1D34800ED8D43 /* Cocoa.framework */,
+ DC4173B913F1D3E200ED8D43 /* Security.framework */,
+ DC4173BB13F1E23B00ED8D43 /* libresolv.dylib */,
+ DC4173BD13F1E24500ED8D43 /* libxml2.dylib */,
+ DC41732813F1D34800ED8D43 /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ DC41732813F1D34800ED8D43 /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ DC41732913F1D34800ED8D43 /* AppKit.framework */,
+ DC41732A13F1D34800ED8D43 /* CoreData.framework */,
+ DC41732B13F1D34800ED8D43 /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ DC41732C13F1D34800ED8D43 /* AutoTimeTest */ = {
+ isa = PBXGroup;
+ children = (
+ DC41733813F1D34800ED8D43 /* AutoTimeTestAppDelegate.h */,
+ DC41733913F1D34800ED8D43 /* AutoTimeTestAppDelegate.m */,
+ DC41733B13F1D34900ED8D43 /* MainMenu.xib */,
+ DC41732D13F1D34800ED8D43 /* Supporting Files */,
+ );
+ path = AutoTimeTest;
+ sourceTree = "<group>";
+ };
+ DC41732D13F1D34800ED8D43 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ DC41732E13F1D34800ED8D43 /* AutoTimeTest-Info.plist */,
+ DC41732F13F1D34800ED8D43 /* InfoPlist.strings */,
+ DC41733213F1D34800ED8D43 /* main.m */,
+ DC41733413F1D34800ED8D43 /* AutoTimeTest-Prefix.pch */,
+ DC41733513F1D34800ED8D43 /* Credits.rtf */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ DC41734313F1D35100ED8D43 /* XMPP */ = {
+ isa = PBXGroup;
+ children = (
+ DC41734413F1D37300ED8D43 /* Categories */,
+ DC41734B13F1D37300ED8D43 /* Core */,
+ DC4173AA13F1D39700ED8D43 /* Extensions */,
+ DC41735F13F1D37300ED8D43 /* Utilities */,
+ DC41736C13F1D37300ED8D43 /* Vendor */,
+ );
+ name = XMPP;
+ sourceTree = "<group>";
+ };
+ DC41734413F1D37300ED8D43 /* Categories */ = {
+ isa = PBXGroup;
+ children = (
+ DC41734513F1D37300ED8D43 /* NSData+XMPP.h */,
+ DC41734613F1D37300ED8D43 /* NSData+XMPP.m */,
+ DC41734713F1D37300ED8D43 /* NSNumber+XMPP.h */,
+ DC41734813F1D37300ED8D43 /* NSNumber+XMPP.m */,
+ DC41734913F1D37300ED8D43 /* NSXMLElement+XMPP.h */,
+ DC41734A13F1D37300ED8D43 /* NSXMLElement+XMPP.m */,
+ );
+ name = Categories;
+ path = ../../../../../Categories;
+ sourceTree = "<group>";
+ };
+ DC41734B13F1D37300ED8D43 /* Core */ = {
+ isa = PBXGroup;
+ children = (
+ DC41734C13F1D37300ED8D43 /* XMPP.h */,
+ DC41735413F1D37300ED8D43 /* XMPPLogging.h */,
+ DC41734F13F1D37300ED8D43 /* XMPPInternal.h */,
+ DC41735913F1D37300ED8D43 /* XMPPParser.h */,
+ DC41735A13F1D37300ED8D43 /* XMPPParser.m */,
+ DC41735D13F1D37300ED8D43 /* XMPPStream.h */,
+ DC41735E13F1D37300ED8D43 /* XMPPStream.m */,
+ DC41735213F1D37300ED8D43 /* XMPPJID.h */,
+ DC41735313F1D37300ED8D43 /* XMPPJID.m */,
+ DC41734D13F1D37300ED8D43 /* XMPPElement.h */,
+ DC41734E13F1D37300ED8D43 /* XMPPElement.m */,
+ DC41735013F1D37300ED8D43 /* XMPPIQ.h */,
+ DC41735113F1D37300ED8D43 /* XMPPIQ.m */,
+ DC41735513F1D37300ED8D43 /* XMPPMessage.h */,
+ DC41735613F1D37300ED8D43 /* XMPPMessage.m */,
+ DC41735B13F1D37300ED8D43 /* XMPPPresence.h */,
+ DC41735C13F1D37300ED8D43 /* XMPPPresence.m */,
+ DC41735713F1D37300ED8D43 /* XMPPModule.h */,
+ DC41735813F1D37300ED8D43 /* XMPPModule.m */,
+ );
+ name = Core;
+ path = ../../../../../Core;
+ sourceTree = "<group>";
+ };
+ DC41735F13F1D37300ED8D43 /* Utilities */ = {
+ isa = PBXGroup;
+ children = (
+ DC41736013F1D37300ED8D43 /* DDList.h */,
+ DC41736113F1D37300ED8D43 /* DDList.m */,
+ DC41736213F1D37300ED8D43 /* GCDMulticastDelegate.h */,
+ DC41736313F1D37300ED8D43 /* GCDMulticastDelegate.m */,
+ DC41736413F1D37300ED8D43 /* LibIDN.h */,
+ DC41736513F1D37300ED8D43 /* LibIDN.m */,
+ DC41736613F1D37300ED8D43 /* RFImageToDataTransformer.h */,
+ DC41736713F1D37300ED8D43 /* RFImageToDataTransformer.m */,
+ DC41736813F1D37300ED8D43 /* XMPPIDTracker.h */,
+ DC41736913F1D37300ED8D43 /* XMPPIDTracker.m */,
+ DC41736A13F1D37300ED8D43 /* XMPPSRVResolver.h */,
+ DC41736B13F1D37300ED8D43 /* XMPPSRVResolver.m */,
+ );
+ name = Utilities;
+ path = ../../../../../Utilities;
+ sourceTree = "<group>";
+ };
+ DC41736C13F1D37300ED8D43 /* Vendor */ = {
+ isa = PBXGroup;
+ children = (
+ DC41736D13F1D37300ED8D43 /* CocoaAsyncSocket */,
+ DC41737013F1D37300ED8D43 /* CocoaLumberjack */,
+ DC41738813F1D37300ED8D43 /* libidn */,
+ );
+ name = Vendor;
+ path = ../../../../../Vendor;
+ sourceTree = "<group>";
+ };
+ DC41736D13F1D37300ED8D43 /* CocoaAsyncSocket */ = {
+ isa = PBXGroup;
+ children = (
+ DC41736E13F1D37300ED8D43 /* GCDAsyncSocket.h */,
+ DC41736F13F1D37300ED8D43 /* GCDAsyncSocket.m */,
+ );
+ path = CocoaAsyncSocket;
+ sourceTree = "<group>";
+ };
+ DC41737013F1D37300ED8D43 /* CocoaLumberjack */ = {
+ isa = PBXGroup;
+ children = (
+ DC41737113F1D37300ED8D43 /* DDAbstractDatabaseLogger.h */,
+ DC41737213F1D37300ED8D43 /* DDAbstractDatabaseLogger.m */,
+ DC41737313F1D37300ED8D43 /* DDASLLogger.h */,
+ DC41737413F1D37300ED8D43 /* DDASLLogger.m */,
+ DC41737513F1D37300ED8D43 /* DDFileLogger.h */,
+ DC41737613F1D37300ED8D43 /* DDFileLogger.m */,
+ DC41737713F1D37300ED8D43 /* DDLog.h */,
+ DC41737813F1D37300ED8D43 /* DDLog.m */,
+ DC41737913F1D37300ED8D43 /* DDTTYLogger.h */,
+ DC41737A13F1D37300ED8D43 /* DDTTYLogger.m */,
+ );
+ path = CocoaLumberjack;
+ sourceTree = "<group>";
+ };
+ DC41738813F1D37300ED8D43 /* libidn */ = {
+ isa = PBXGroup;
+ children = (
+ DC41738913F1D37300ED8D43 /* idn-int.h */,
+ DC41738B13F1D37300ED8D43 /* libidn.a */,
+ DC41738C13F1D37300ED8D43 /* stringprep.h */,
+ );
+ path = libidn;
+ sourceTree = "<group>";
+ };
+ DC4173AA13F1D39700ED8D43 /* Extensions */ = {
+ isa = PBXGroup;
+ children = (
+ DC4173B213F1D3D400ED8D43 /* XEP-0082 */,
+ DC4173AB13F1D3BB00ED8D43 /* XEP-0202 */,
+ );
+ name = Extensions;
+ sourceTree = "<group>";
+ };
+ DC4173AB13F1D3BB00ED8D43 /* XEP-0202 */ = {
+ isa = PBXGroup;
+ children = (
+ DC4173AC13F1D3BB00ED8D43 /* XMPPAutoTime.h */,
+ DC4173AD13F1D3BB00ED8D43 /* XMPPAutoTime.m */,
+ DC4173AE13F1D3BB00ED8D43 /* XMPPTime.h */,
+ DC4173AF13F1D3BB00ED8D43 /* XMPPTime.m */,
+ );
+ name = "XEP-0202";
+ path = "../../../../../Extensions/XEP-0202";
+ sourceTree = "<group>";
+ };
+ DC4173B213F1D3D400ED8D43 /* XEP-0082 */ = {
+ isa = PBXGroup;
+ children = (
+ DC4173B313F1D3D500ED8D43 /* NSDate+XMPPDateTimeProfiles.h */,
+ DC4173B413F1D3D500ED8D43 /* NSDate+XMPPDateTimeProfiles.m */,
+ DC4173B513F1D3D500ED8D43 /* XMPPDateTimeProfiles.h */,
+ DC4173B613F1D3D500ED8D43 /* XMPPDateTimeProfiles.m */,
+ );
+ name = "XEP-0082";
+ path = "../../../../../Extensions/XEP-0082";
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DC41732113F1D34800ED8D43 /* AutoTimeTest */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DC41734013F1D34900ED8D43 /* Build configuration list for PBXNativeTarget "AutoTimeTest" */;
+ buildPhases = (
+ DC41731E13F1D34800ED8D43 /* Sources */,
+ DC41731F13F1D34800ED8D43 /* Frameworks */,
+ DC41732013F1D34800ED8D43 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = AutoTimeTest;
+ productName = AutoTimeTest;
+ productReference = DC41732213F1D34800ED8D43 /* AutoTimeTest.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DC41731913F1D34800ED8D43 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = DC41731C13F1D34800ED8D43 /* Build configuration list for PBXProject "AutoTimeTest" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ );
+ mainGroup = DC41731713F1D34800ED8D43;
+ productRefGroup = DC41732313F1D34800ED8D43 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DC41732113F1D34800ED8D43 /* AutoTimeTest */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DC41732013F1D34800ED8D43 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DC41733113F1D34800ED8D43 /* InfoPlist.strings in Resources */,
+ DC41733713F1D34800ED8D43 /* Credits.rtf in Resources */,
+ DC41733D13F1D34900ED8D43 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DC41731E13F1D34800ED8D43 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DC41733313F1D34800ED8D43 /* main.m in Sources */,
+ DC41733A13F1D34800ED8D43 /* AutoTimeTestAppDelegate.m in Sources */,
+ DC41738D13F1D37300ED8D43 /* NSData+XMPP.m in Sources */,
+ DC41738E13F1D37300ED8D43 /* NSNumber+XMPP.m in Sources */,
+ DC41738F13F1D37300ED8D43 /* NSXMLElement+XMPP.m in Sources */,
+ DC41739013F1D37300ED8D43 /* XMPPElement.m in Sources */,
+ DC41739113F1D37300ED8D43 /* XMPPIQ.m in Sources */,
+ DC41739213F1D37300ED8D43 /* XMPPJID.m in Sources */,
+ DC41739313F1D37300ED8D43 /* XMPPMessage.m in Sources */,
+ DC41739413F1D37300ED8D43 /* XMPPModule.m in Sources */,
+ DC41739513F1D37300ED8D43 /* XMPPParser.m in Sources */,
+ DC41739613F1D37300ED8D43 /* XMPPPresence.m in Sources */,
+ DC41739713F1D37300ED8D43 /* XMPPStream.m in Sources */,
+ DC41739813F1D37300ED8D43 /* DDList.m in Sources */,
+ DC41739913F1D37300ED8D43 /* GCDMulticastDelegate.m in Sources */,
+ DC41739A13F1D37300ED8D43 /* LibIDN.m in Sources */,
+ DC41739B13F1D37300ED8D43 /* RFImageToDataTransformer.m in Sources */,
+ DC41739C13F1D37300ED8D43 /* XMPPIDTracker.m in Sources */,
+ DC41739D13F1D37300ED8D43 /* XMPPSRVResolver.m in Sources */,
+ DC41739E13F1D37300ED8D43 /* GCDAsyncSocket.m in Sources */,
+ DC41739F13F1D37300ED8D43 /* DDAbstractDatabaseLogger.m in Sources */,
+ DC4173A013F1D37300ED8D43 /* DDASLLogger.m in Sources */,
+ DC4173A113F1D37300ED8D43 /* DDFileLogger.m in Sources */,
+ DC4173A213F1D37300ED8D43 /* DDLog.m in Sources */,
+ DC4173A313F1D37300ED8D43 /* DDTTYLogger.m in Sources */,
+ DC4173B013F1D3BB00ED8D43 /* XMPPAutoTime.m in Sources */,
+ DC4173B113F1D3BB00ED8D43 /* XMPPTime.m in Sources */,
+ DC4173B713F1D3D500ED8D43 /* NSDate+XMPPDateTimeProfiles.m in Sources */,
+ DC4173B813F1D3D500ED8D43 /* XMPPDateTimeProfiles.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DC41732F13F1D34800ED8D43 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DC41733013F1D34800ED8D43 /* en */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ DC41733513F1D34800ED8D43 /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DC41733613F1D34800ED8D43 /* en */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ DC41733B13F1D34900ED8D43 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DC41733C13F1D34900ED8D43 /* en */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DC41733E13F1D34900ED8D43 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = NO;
+ 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_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = /usr/include/libxml2;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ DC41733F13F1D34900ED8D43 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ARCHS = "$(ARCHS_STANDARD_64_BIT)";
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+ GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ HEADER_SEARCH_PATHS = /usr/include/libxml2;
+ MACOSX_DEPLOYMENT_TARGET = 10.7;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+ DC41734113F1D34900ED8D43 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AutoTimeTest/AutoTimeTest-Prefix.pch";
+ INFOPLIST_FILE = "AutoTimeTest/AutoTimeTest-Info.plist";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../../Vendor/libidn\"",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Debug;
+ };
+ DC41734213F1D34900ED8D43 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "AutoTimeTest/AutoTimeTest-Prefix.pch";
+ INFOPLIST_FILE = "AutoTimeTest/AutoTimeTest-Info.plist";
+ LIBRARY_SEARCH_PATHS = (
+ "$(inherited)",
+ "\"$(SRCROOT)/../../../../../Vendor/libidn\"",
+ );
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DC41731C13F1D34800ED8D43 /* Build configuration list for PBXProject "AutoTimeTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC41733E13F1D34900ED8D43 /* Debug */,
+ DC41733F13F1D34900ED8D43 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DC41734013F1D34900ED8D43 /* Build configuration list for PBXNativeTarget "AutoTimeTest" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DC41734113F1D34900ED8D43 /* Debug */,
+ DC41734213F1D34900ED8D43 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = DC41731913F1D34800ED8D43 /* Project object */;
+}
View
7 .../Desktop/AutoTimeTest/AutoTimeTest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:AutoTimeTest.xcodeproj">
+ </FileRef>
+</Workspace>
View
34 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/AutoTimeTest-Info.plist
@@ -0,0 +1,34 @@
+<?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>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.deusty.oss.${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>LSMinimumSystemVersion</key>
+ <string>${MACOSX_DEPLOYMENT_TARGET}</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright © 2011 __MyCompanyName__. All rights reserved.</string>
+ <key>NSMainNibFile</key>
+ <string>MainMenu</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
View
7 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/AutoTimeTest-Prefix.pch
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'AutoTimeTest' target in the 'AutoTimeTest' project
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
View
16 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/AutoTimeTestAppDelegate.h
@@ -0,0 +1,16 @@
+#import <Cocoa/Cocoa.h>
+#import "XMPP.h"
+#import "XMPPAutoTime.h"
+
+
+@interface AutoTimeTestAppDelegate : NSObject <NSApplicationDelegate> {
+@private
+ XMPPStream *xmppStream;
+ XMPPAutoTime *xmppAutoTime;
+
+ NSWindow *window;
+}
+
+@property (assign) IBOutlet NSWindow *window;
+
+@end
View
105 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/AutoTimeTestAppDelegate.m
@@ -0,0 +1,105 @@
+#import "AutoTimeTestAppDelegate.h"
+#import "DDLog.h"
+#import "DDTTYLogger.h"
+
+// Log levels: off, error, warn, info, verbose
+static const int ddLogLevel = LOG_LEVEL_VERBOSE;
+
+#define MY_JID @"user@gmail.com/xmppFramework"
+#define MY_PASSWORD @""
+
+
+@implementation AutoTimeTestAppDelegate
+
+@synthesize window;
+
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
+{
+ [DDLog addLogger:[DDTTYLogger sharedInstance]];
+
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+
+ xmppStream = [[XMPPStream alloc] init];
+ xmppStream.myJID = [XMPPJID jidWithString:MY_JID];
+
+ xmppAutoTime = [[XMPPAutoTime alloc] init];
+ xmppAutoTime.recalibrationInterval = 60;
+ xmppAutoTime.targetJID = nil;
+
+ [xmppAutoTime activate:xmppStream];
+
+ [xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
+ [xmppAutoTime addDelegate:self delegateQueue:dispatch_get_main_queue()];
+
+ NSError *error = nil;
+
+ if (![xmppStream connect:&error])
+ {
+ DDLogError(@"%@: Error connecting: %@", [self class], error);
+ }
+}
+
+- (void)goOnline:(NSTimer *)aTimer
+{
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+
+ [xmppStream sendElement:[XMPPPresence presence]];
+}
+
+- (void)goOffline:(NSTimer *)aTimer
+{
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+
+ [xmppStream sendElement:[XMPPPresence presenceWithType:@"unavailable"]];
+}
+
+- (void)changeAutoTimeInterval:(NSTimer *)aTimer
+{
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+
+ xmppAutoTime.recalibrationInterval = 30;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)xmppStreamDidConnect:(XMPPStream *)sender
+{
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+
+ NSError *error = nil;
+
+ if (![xmppStream authenticateWithPassword:MY_PASSWORD error:&error])
+ {
+ DDLogError(@"%@: Error authenticating: %@", [self class], error);
+ }
+}
+
+- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender
+{
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+
+ [NSTimer scheduledTimerWithTimeInterval:130
+ target:self
+ selector:@selector(changeAutoTimeInterval:)
+ userInfo:nil
+ repeats:NO];
+}
+
+- (void)xmppStream:(XMPPStream *)sender didNotAuthenticate:(NSXMLElement *)error
+{
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+}
+
+- (void)xmppStreamDidDisconnect:(XMPPStream *)sender withError:(NSError *)error
+{
+ DDLogVerbose(@"%@: %@", [self class], THIS_METHOD);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+- (void)xmppAutoTime:(XMPPAutoTime *)sender didUpdateTimeDifference:(NSTimeInterval)timeDifference
+{
+ DDLogVerbose(@"%@: %@ %f <<<<<<<============", [self class], THIS_METHOD, timeDifference);
+}
+
+@end
View
29 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/en.lproj/Credits.rtf
@@ -0,0 +1,29 @@
+{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\paperw9840\paperh8400
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Engineering:
+\b0 \
+ Some people\
+\
+
+\b Human Interface Design:
+\b0 \
+ Some other people\
+\
+
+\b Testing:
+\b0 \
+ Hopefully not nobody\
+\
+
+\b Documentation:
+\b0 \
+ Whoever\
+\
+
+\b With special thanks to:
+\b0 \
+ Mom\
+}
View
2 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Localized versions of Info.plist keys */
+
View
5,627 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/en.lproj/MainMenu.xib
5,627 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
14 Xcode/Testing/AutoTimeTest/Desktop/AutoTimeTest/AutoTimeTest/main.m
@@ -0,0 +1,14 @@
+//
+// main.m
+// AutoTimeTest
+//
+// Created by Robbie Hanson on 8/9/11.
+// Copyright 2011 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, char *argv[])
+{
+ return NSApplicationMain(argc, (const char **)argv);
+}

0 comments on commit d560d0f

Please sign in to comment.
Something went wrong with that request. Please try again.