diff --git a/Classes/ApplicationDelegate.h b/Classes/ApplicationDelegate.h new file mode 100644 index 0000000..af19ee3 --- /dev/null +++ b/Classes/ApplicationDelegate.h @@ -0,0 +1,23 @@ +// +// ApplicationDelegate.h +// PushMeBaby +// +// Created by Stefan Hafeneger on 07.04.09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import + +#import "ioSock.h" + +@interface ApplicationDelegate : NSObject { + NSString *_deviceToken, *_payload, *_certificate; + otSocket socket; + SSLContextRef context; + SecKeychainRef keychain; + SecCertificateRef certificate; + SecIdentityRef identity; +} +#pragma mark IBAction +- (IBAction)push:(id)sender; +@end diff --git a/Classes/ApplicationDelegate.m b/Classes/ApplicationDelegate.m new file mode 100644 index 0000000..15235fe --- /dev/null +++ b/Classes/ApplicationDelegate.m @@ -0,0 +1,200 @@ +// +// ApplicationDelegate.m +// PushMeBaby +// +// Created by Stefan Hafeneger on 07.04.09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import "ApplicationDelegate.h" + +@interface ApplicationDelegate () +#pragma mark Properties +@property(nonatomic, retain) NSString *deviceToken, *payload, *certificate; +#pragma mark Private +- (void)connect; +- (void)disconnect; +@end + +@implementation ApplicationDelegate + +#pragma mark Allocation + +- (id)init { + self = [super init]; + if(self != nil) { + self.deviceToken = @""; + self.payload = @"{\"aps\":{\"alert\":\"This is some fany message.\",\"badge\":1}}"; + self.certificate = [[NSBundle mainBundle] pathForResource:@"apns" ofType:@"cer"]; + } + return self; +} + +- (void)dealloc { + + // Release objects. + self.deviceToken = nil; + self.payload = nil; + self.certificate = nil; + + // Call super. + [super dealloc]; + +} + + +#pragma mark Properties + +@synthesize deviceToken = _deviceToken; +@synthesize payload = _payload; +@synthesize certificate = _certificate; + +#pragma mark Inherent + +- (void)applicationDidFinishLaunching:(NSNotification *)notification { + [self connect]; +} + +- (void)applicationWillTerminate:(NSNotification *)notification { + [self disconnect]; +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)application { + return YES; +} + +#pragma mark Private + +- (void)connect { + + if(self.certificate == nil) { + return; + } + + // Define result variable. + OSStatus result; + + // Establish connection to server. + PeerSpec peer; + result = MakeServerConnection("gateway.sandbox.push.apple.com", 2195, &socket, &peer);// NSLog(@"MakeServerConnection(): %d", result); + + // Create new SSL context. + result = SSLNewContext(false, &context);// NSLog(@"SSLNewContext(): %d", result); + + // Set callback functions for SSL context. + result = SSLSetIOFuncs(context, SocketRead, SocketWrite);// NSLog(@"SSLSetIOFuncs(): %d", result); + + // Set SSL context connection. + result = SSLSetConnection(context, socket);// NSLog(@"SSLSetConnection(): %d", result); + + // Set server domain name. + result = SSLSetPeerDomainName(context, "gateway.sandbox.push.apple.com", 30);// NSLog(@"SSLSetPeerDomainName(): %d", result); + + // Open keychain. + result = SecKeychainCopyDefault(&keychain);// NSLog(@"SecKeychainOpen(): %d", result); + + // Create certificate. + NSData *certificateData = [NSData dataWithContentsOfFile:self.certificate]; + CSSM_DATA data; + data.Data = (uint8 *)[certificateData bytes]; + data.Length = [certificateData length]; + result = SecCertificateCreateFromData(&data, CSSM_CERT_X_509v3, CSSM_CERT_ENCODING_BER, &certificate);// NSLog(@"SecCertificateCreateFromData(): %d", result); + + // Create identity. + result = SecIdentityCreateWithCertificate(keychain, certificate, &identity);// NSLog(@"SecIdentityCreateWithCertificate(): %d", result); + + // Set client certificate. + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)&identity, 1, NULL); + result = SSLSetCertificate(context, certificates);// NSLog(@"SSLSetCertificate(): %d", result); + CFRelease(certificates); + + // Perform SSL handshake. + do { + result = SSLHandshake(context);// NSLog(@"SSLHandshake(): %d", result); + } while(result == errSSLWouldBlock); + +} + +- (void)disconnect { + + if(self.certificate == nil) { + return; + } + + // Define result variable. + OSStatus result; + + // Close SSL session. + result = SSLClose(context);// NSLog(@"SSLClose(): %d", result); + + // Release identity. + CFRelease(identity); + + // Release certificate. + CFRelease(certificate); + + // Release keychain. + CFRelease(keychain); + + // Close connection to server. + close((int)socket); + + // Delete SSL context. + result = SSLDisposeContext(context);// NSLog(@"SSLDisposeContext(): %d", result); + +} + +#pragma mark IBAction + +- (IBAction)push:(id)sender { + + if(self.certificate == nil) { + return; + } + + // Validate input. + if(self.deviceToken == nil || self.payload == nil) { + return; + } + + // Convert string into device token data. + NSMutableData *deviceToken = [NSMutableData data]; + unsigned value; + NSScanner *scanner = [NSScanner scannerWithString:self.deviceToken]; + while(![scanner isAtEnd]) { + [scanner scanHexInt:&value]; + value = htonl(value); + [deviceToken appendBytes:&value length:sizeof(value)]; + } + + // Create C input variables. + char *deviceTokenBinary = (char *)[deviceToken bytes]; + char *payloadBinary = (char *)[self.payload UTF8String]; + size_t payloadLength = strlen(payloadBinary); + + // Define some variables. + uint8_t command = 0; + char message[293]; + char *pointer = message; + uint16_t networkTokenLength = htons(32); + uint16_t networkPayloadLength = htons(payloadLength); + + // Compose message. + memcpy(pointer, &command, sizeof(uint8_t)); + pointer += sizeof(uint8_t); + memcpy(pointer, &networkTokenLength, sizeof(uint16_t)); + pointer += sizeof(uint16_t); + memcpy(pointer, deviceTokenBinary, 32); + pointer += 32; + memcpy(pointer, &networkPayloadLength, sizeof(uint16_t)); + pointer += sizeof(uint16_t); + memcpy(pointer, payloadBinary, payloadLength); + pointer += payloadLength; + + // Send message over SSL. + size_t processed = 0; + OSStatus result = SSLWrite(context, &message, (pointer - message), &processed);// NSLog(@"SSLWrite(): %d %d", result, processed); + +} + +@end diff --git a/Classes/ioSock.c b/Classes/ioSock.c new file mode 100755 index 0000000..53f52ac --- /dev/null +++ b/Classes/ioSock.c @@ -0,0 +1,453 @@ +/* + File: ioSock.h + + Contains: SecureTransport sample I/O module, X sockets version + + Copyright: © Copyright 2002 Apple Computer, Inc. All rights reserved. + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Change History (most recent first): + 11/4/02 1.0d1 + +*/ + + +#include "ioSock.h" +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/* debugging for this module */ +#define SSL_OT_DEBUG 1 + +/* log errors to stdout */ +#define SSL_OT_ERRLOG 1 + +/* trace all low-level network I/O */ +#define SSL_OT_IO_TRACE 0 + +/* if SSL_OT_IO_TRACE, only log non-zero length transfers */ +#define SSL_OT_IO_TRACE_NZ 1 + +/* pause after each I/O (only meaningful if SSL_OT_IO_TRACE == 1) */ +#define SSL_OT_IO_PAUSE 0 + +/* print a stream of dots while I/O pending */ +#define SSL_OT_DOT 1 + +/* dump some bytes of each I/O (only meaningful if SSL_OT_IO_TRACE == 1) */ +#define SSL_OT_IO_DUMP 0 +#define SSL_OT_IO_DUMP_SIZE 256 + +/* general, not-too-verbose debugging */ +#if SSL_OT_DEBUG +#define dprintf(s) printf s +#else +#define dprintf(s) +#endif + +/* errors --> stdout */ +#if SSL_OT_ERRLOG +#define eprintf(s) printf s +#else +#define eprintf(s) +#endif + +/* enable nonblocking I/O - maybe should be an arg to MakeServerConnection() */ +#define NON_BLOCKING 0 + +/* trace completion of every r/w */ +#if SSL_OT_IO_TRACE +static void tprintf( + const char *str, + UInt32 req, + UInt32 act, + const UInt8 *buf) +{ + #if SSL_OT_IO_TRACE_NZ + if(act == 0) { + return; + } + #endif + printf("%s(%d): moved (%d) bytes\n", str, req, act); + #if SSL_OT_IO_DUMP + { + int i; + + for(i=0; i= (SSL_OT_IO_DUMP_SIZE - 1)) { + break; + } + } + printf("\n"); + } + #endif + #if SSL_OT_IO_PAUSE + { + char instr[20]; + printf("CR to continue: "); + gets(instr); + } + #endif +} + +#else +#define tprintf(str, req, act, buf) +#endif /* SSL_OT_IO_TRACE */ + +/* + * If SSL_OT_DOT, output a '.' every so often while waiting for + * connection. This gives user a chance to do something else with the + * UI. + */ + +#if SSL_OT_DOT + +static time_t lastTime = (time_t)0; +#define TIME_INTERVAL 3 + +static void outputDot() +{ + time_t thisTime = time(0); + + if((thisTime - lastTime) >= TIME_INTERVAL) { + printf("."); fflush(stdout); + lastTime = thisTime; + } +} +#else +#define outputDot() +#endif + + +/* + * One-time only init. + */ +void initSslOt() +{ + +} + +/* + * Connect to server. + */ +OSStatus MakeServerConnection( + const char *hostName, + int port, + otSocket *socketNo, // RETURNED + PeerSpec *peer) // RETURNED +{ + struct sockaddr_in addr; + struct hostent *ent; + struct in_addr host; + int sock = 0; + + *socketNo = NULL; + if (hostName[0] >= '0' && hostName[0] <= '9') + { + host.s_addr = inet_addr(hostName); + } + else + { ent = gethostbyname(hostName); + if (!ent) + { printf("gethostbyname failed\n"); + return ioErr; + } + memcpy(&host, ent->h_addr, sizeof(struct in_addr)); + } + sock = socket(AF_INET, SOCK_STREAM, 0); + addr.sin_addr = host; + addr.sin_port = htons((u_short)port); + + addr.sin_family = AF_INET; + if (connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) != 0) + { printf("connect returned error\n"); + return ioErr; + } + + #if NON_BLOCKING + /* OK to do this after connect? */ + { + int rtn = fcntl(sock, F_SETFL, O_NONBLOCK); + if(rtn == -1) { + perror("fctnl(O_NONBLOCK)"); + return ioErr; + } + } + #endif /* NON_BLOCKING*/ + + peer->ipAddr = addr.sin_addr.s_addr; + peer->port = htons((u_short)port); + *socketNo = (otSocket)sock; + return noErr; +} + +/* + * Set up an otSocket to listen for client connections. Call once, then + * use multiple AcceptClientConnection calls. + */ +OSStatus ListenForClients( + int port, + otSocket *socketNo) // RETURNED +{ + struct sockaddr_in addr; + struct hostent *ent; + int len; + int sock; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if(sock < 1) { + perror("socket"); + return ioErr; + } + + ent = gethostbyname("localhost"); + if (!ent) { + perror("gethostbyname"); + return ioErr; + } + memcpy(&addr.sin_addr, ent->h_addr, sizeof(struct in_addr)); + + addr.sin_port = htons((u_short)port); + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_family = AF_INET; + len = sizeof(struct sockaddr_in); + if (bind(sock, (struct sockaddr *) &addr, len)) { + perror("bind"); + return ioErr; + } + if (listen(sock, 1)) { + perror("listen"); + return ioErr; + } + *socketNo = (otSocket)sock; + return noErr; +} + +/* + * Accept a client connection. + */ + +/* + * Currently we always get back a different peer port number on successive + * connections, no matter what the client is doing. To test for resumable + * session support, force peer port = 0. + */ +#define FORCE_ACCEPT_PEER_PORT_ZERO 1 + +OSStatus AcceptClientConnection( + otSocket listenSock, // obtained from ListenForClients + otSocket *acceptSock, // RETURNED + PeerSpec *peer) // RETURNED +{ + struct sockaddr_in addr; + int sock; + int len; + + len = sizeof(struct sockaddr_in); + sock = accept((int)listenSock, (struct sockaddr *) &addr, &len); + if (sock < 0) { + perror("accept"); + return ioErr; + } + *acceptSock = (otSocket)sock; + peer->ipAddr = addr.sin_addr.s_addr; + #if FORCE_ACCEPT_PEER_PORT_ZERO + peer->port = 0; + #else + peer->port = ntohs(addr.sin_port); + #endif + return noErr; +} + +/* + * Shut down a connection. + */ +void endpointShutdown( + otSocket socket) +{ + close((int)socket); +} + +/* + * R/W. Called out from SSL. + */ +OSStatus SocketRead( + SSLConnectionRef connection, + void *data, /* owned by + * caller, data + * RETURNED */ + size_t *dataLength) /* IN/OUT */ +{ + UInt32 bytesToGo = *dataLength; + UInt32 initLen = bytesToGo; + UInt8 *currData = (UInt8 *)data; + int sock = (int)connection; + OSStatus rtn = noErr; + UInt32 bytesRead; + int rrtn; + + *dataLength = 0; + + for(;;) { + bytesRead = 0; + rrtn = read(sock, currData, bytesToGo); + if (rrtn <= 0) { + /* this is guesswork... */ + int theErr = errno; + dprintf(("SocketRead: read(%d) error %d\n", (int)bytesToGo, theErr)); + #if !NON_BLOCKING + if((rrtn == 0) && (theErr == 0)) { + /* try fix for iSync */ + rtn = errSSLClosedGraceful; + //rtn = errSSLClosedAbort; + } + else /* do the switch */ + #endif + switch(theErr) { + case ENOENT: + /* connection closed */ + rtn = errSSLClosedGraceful; + break; + case ECONNRESET: + rtn = errSSLClosedAbort; + break; + #if NON_BLOCKING + case EAGAIN: + #else + case 0: /* ??? */ + #endif + rtn = errSSLWouldBlock; + break; + default: + dprintf(("SocketRead: read(%d) error %d\n", + (int)bytesToGo, theErr)); + rtn = ioErr; + break; + } + break; + } + else { + bytesRead = rrtn; + } + bytesToGo -= bytesRead; + currData += bytesRead; + + if(bytesToGo == 0) { + /* filled buffer with incoming data, done */ + break; + } + } + *dataLength = initLen - bytesToGo; + tprintf("SocketRead", initLen, *dataLength, (UInt8 *)data); + + #if SSL_OT_DOT || (SSL_OT_DEBUG && !SSL_OT_IO_TRACE) + if((rtn == 0) && (*dataLength == 0)) { + /* keep UI alive */ + outputDot(); + } + #endif + return rtn; +} + +int oneAtATime = 0; + +OSStatus SocketWrite( + SSLConnectionRef connection, + const void *data, + size_t *dataLength) /* IN/OUT */ +{ + UInt32 bytesSent = 0; + int sock = (int)connection; + int length; + UInt32 dataLen = *dataLength; + const UInt8 *dataPtr = (UInt8 *)data; + OSStatus ortn; + + if(oneAtATime && (*dataLength > 1)) { + UInt32 i; + UInt32 outLen; + UInt32 thisMove; + + outLen = 0; + for(i=0; i 0) && + ( (bytesSent += length) < dataLen) ); + + if(length <= 0) { + if(errno == EAGAIN) { + ortn = errSSLWouldBlock; + } + else { + ortn = ioErr; + } + } + else { + ortn = noErr; + } + tprintf("SocketWrite", dataLen, bytesSent, dataPtr); + *dataLength = bytesSent; + return ortn; +} diff --git a/Classes/ioSock.h b/Classes/ioSock.h new file mode 100755 index 0000000..8dd742d --- /dev/null +++ b/Classes/ioSock.h @@ -0,0 +1,130 @@ +/* + File: ioSock.h + + Contains: socket-based I/O routines for SecureTransport tests + + Copyright: © Copyright 2002 Apple Computer, Inc. All rights reserved. + + Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. + ("Apple") in consideration of your agreement to the following terms, and your + use, installation, modification or redistribution of this Apple software + constitutes acceptance of these terms. If you do not agree with these terms, + please do not use, install, modify or redistribute this Apple software. + + In consideration of your agreement to abide by the following terms, and subject + to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs + copyrights in this original Apple software (the "Apple Software"), to use, + reproduce, modify and redistribute the Apple Software, with or without + modifications, in source and/or binary forms; provided that if you redistribute + the Apple Software in its entirety and without modifications, you must retain + this notice and the following text and disclaimers in all such redistributions of + the Apple Software. Neither the name, trademarks, service marks or logos of + Apple Computer, Inc. may be used to endorse or promote products derived from the + Apple Software without specific prior written permission from Apple. Except as + expressly stated in this notice, no other rights or licenses, express or implied, + are granted by Apple herein, including but not limited to any patent rights that + may be infringed by your derivative works or by other works in which the Apple + Software may be incorporated. + + The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO + WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN + COMBINATION WITH YOUR PRODUCTS. + + IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION + OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT + (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Change History (most recent first): + 11/4/02 1.0d1 + +*/ + + +#ifndef _IO_SOCK_H_ +#define _IO_SOCK_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Opaque reference to an Open Transport connection. + */ +typedef void *otSocket; + +/* + * info about a peer returned from MakeServerConnection() and + * AcceptClientConnection(). + */ +typedef struct +{ UInt32 ipAddr; + int port; +} PeerSpec; + +/* + * Ont-time only init. + */ +void initSslOt(); + +/* + * Connect to server. + */ +extern OSStatus MakeServerConnection( + const char *hostName, + int port, + otSocket *socketNo, // RETURNED + PeerSpec *peer); // RETURNED + +/* + * Set up an otSocket to listen for client connections. Call once, then + * use multiple AcceptClientConnection calls. + */ +OSStatus ListenForClients( + int port, + otSocket *socketNo); // RETURNED + +/* + * Accept a client connection. Call endpointShutdown() for each successful; + * return from this function. + */ +OSStatus AcceptClientConnection( + otSocket listenSock, // obtained from ListenForClients + otSocket *acceptSock, // RETURNED + PeerSpec *peer); // RETURNED + +/* + * Shut down a connection. + */ +void endpointShutdown( + otSocket socket); + +/* + * R/W. Called out from SSL. + */ +OSStatus SocketRead( + SSLConnectionRef connection, + void *data, /* owned by + * caller, data + * RETURNED */ + size_t *dataLength); /* IN/OUT */ + +OSStatus SocketWrite( + SSLConnectionRef connection, + const void *data, + size_t *dataLength); /* IN/OUT */ + +#ifdef __cplusplus +} +#endif + +#endif /* _IO_SOCK_H_ */ diff --git a/English.lproj/InfoPlist.strings b/English.lproj/InfoPlist.strings new file mode 100644 index 0000000..c174e17 Binary files /dev/null and b/English.lproj/InfoPlist.strings differ diff --git a/English.lproj/MainMenu.xib b/English.lproj/MainMenu.xib new file mode 100644 index 0000000..1605e6a --- /dev/null +++ b/English.lproj/MainMenu.xib @@ -0,0 +1,2345 @@ + + + + 1050 + 9G55 + 677 + 949.43 + 353.00 + + YES + + + + YES + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + YES + + + YES + + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + YES + + + NewApplication + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + NewApplication + + YES + + + About PushMeBaby + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + UHJlZmVyZW5jZXPigKY + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide PushMeBaby + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit PushMeBaby + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + YES + + + New + n + 1048576 + 2147483647 + + + + + + T3BlbuKApg + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + YES + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + U2F2ZSBBc+KApg + S + 1179648 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + UHJpbnTigKY + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + YES + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + YES + + + RmluZOKApg + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + YES + + + U2hvdyBTcGVsbGluZ+KApg + : + 1048576 + 2147483647 + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + YES + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + YES + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + YES + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Q3VzdG9taXplIFRvb2xiYXLigKY + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + YES + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + Help + + YES + + + PushMeBaby Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + 15 + 2 + {{335, 661}, {477, 89}} + 1946157056 + PushMeBaby + NSWindow + + {1000, 89} + {477, 89} + + + 256 + + YES + + + 266 + {{115, 50}, {342, 22}} + + YES + + -1804468671 + 272630784 + + + LucidaGrande + 1.300000e+01 + 1044 + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + 3 + MAA + + + + + + + 266 + {{115, 18}, {250, 22}} + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 265 + {{367, 12}, {96, 32}} + + YES + + 67239424 + 134217728 + Push + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{17, 52}, {93, 17}} + + YES + + 68288064 + 272630784 + Device Token: + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2OQA + + + + 6 + System + controlTextColor + + + + + + + 268 + {{53, 20}, {57, 17}} + + YES + + 68288064 + 272630784 + Payload: + + + + + + + + {477, 89} + + + {{0, 0}, {1440, 878}} + {477, 111} + {1000, 111} + + + ApplicationDelegate + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + showHelp: + + + + 360 + + + + saveDocument: + + + + 362 + + + + saveDocumentAs: + + + + 363 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + terminate: + + + + 449 + + + + delegate + + + + 451 + + + + push: + + + + 462 + + + + value: deviceToken + + + + + + value: deviceToken + value + deviceToken + + NSContinuouslyUpdatesValue + + + 2 + + + 464 + + + + value: payload + + + + + + value: payload + value + payload + + NSContinuouslyUpdatesValue + + + 2 + + + 466 + + + + + YES + + 0 + + YES + + + + + + -2 + + + RmlsZSdzIE93bmVyA + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + YES + + + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 56 + + + YES + + + + + + 103 + + + YES + + + + 1 + + + 217 + + + YES + + + + + + 83 + + + YES + + + + + + 81 + + + YES + + + + + + + + + + + + + + + + 75 + + + 3 + + + 80 + + + 8 + + + 78 + + + 6 + + + 72 + + + + + 82 + + + 9 + + + 124 + + + YES + + + + + + 77 + + + 5 + + + 73 + + + 1 + + + 79 + + + 7 + + + 112 + + + 10 + + + 74 + + + 2 + + + 125 + + + YES + + + + + + 126 + + + + + 205 + + + YES + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + YES + + + + + + 216 + + + YES + + + + + + 200 + + + YES + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + YES + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 106 + + + YES + + + + 2 + + + 111 + + + + + 57 + + + YES + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + 1111 + + + 144 + + + + + 129 + + + 121 + + + 143 + + + + + 236 + + + + + 131 + + + YES + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + YES + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + YES + + + + + + 296 + + + YES + + + + + + + 297 + + + + + 298 + + + + + 211 + + + YES + + + + + + 212 + + + YES + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + YES + + + + + + 349 + + + YES + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + YES + + + + + + 372 + + + YES + + + + + + + + + + 450 + + + + + 452 + + + YES + + + + + + 453 + + + + + 454 + + + YES + + + + + + 455 + + + + + 456 + + + YES + + + + + + 457 + + + + + 458 + + + YES + + + + + + 459 + + + + + 460 + + + YES + + + + + + 461 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 103.IBPluginDependency + 103.ImportedFromIB2 + 106.IBEditorWindowLastContentRect + 106.IBPluginDependency + 106.ImportedFromIB2 + 106.editorWindowContentRectSynchronizationRect + 111.IBPluginDependency + 111.ImportedFromIB2 + 112.IBPluginDependency + 112.ImportedFromIB2 + 124.IBPluginDependency + 124.ImportedFromIB2 + 125.IBPluginDependency + 125.ImportedFromIB2 + 125.editorWindowContentRectSynchronizationRect + 126.IBPluginDependency + 126.ImportedFromIB2 + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 130.editorWindowContentRectSynchronizationRect + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 195.IBPluginDependency + 195.ImportedFromIB2 + 196.IBPluginDependency + 196.ImportedFromIB2 + 197.IBPluginDependency + 197.ImportedFromIB2 + 198.IBPluginDependency + 198.ImportedFromIB2 + 199.IBPluginDependency + 199.ImportedFromIB2 + 200.IBPluginDependency + 200.ImportedFromIB2 + 200.editorWindowContentRectSynchronizationRect + 201.IBPluginDependency + 201.ImportedFromIB2 + 202.IBPluginDependency + 202.ImportedFromIB2 + 203.IBPluginDependency + 203.ImportedFromIB2 + 204.IBPluginDependency + 204.ImportedFromIB2 + 205.IBEditorWindowLastContentRect + 205.IBPluginDependency + 205.ImportedFromIB2 + 205.editorWindowContentRectSynchronizationRect + 206.IBPluginDependency + 206.ImportedFromIB2 + 207.IBPluginDependency + 207.ImportedFromIB2 + 208.IBPluginDependency + 208.ImportedFromIB2 + 209.IBPluginDependency + 209.ImportedFromIB2 + 210.IBPluginDependency + 210.ImportedFromIB2 + 211.IBPluginDependency + 211.ImportedFromIB2 + 212.IBPluginDependency + 212.ImportedFromIB2 + 212.editorWindowContentRectSynchronizationRect + 213.IBPluginDependency + 213.ImportedFromIB2 + 214.IBPluginDependency + 214.ImportedFromIB2 + 215.IBPluginDependency + 215.ImportedFromIB2 + 216.IBPluginDependency + 216.ImportedFromIB2 + 217.IBPluginDependency + 217.ImportedFromIB2 + 218.IBPluginDependency + 218.ImportedFromIB2 + 219.IBPluginDependency + 219.ImportedFromIB2 + 220.IBPluginDependency + 220.ImportedFromIB2 + 220.editorWindowContentRectSynchronizationRect + 221.IBPluginDependency + 221.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 239.IBPluginDependency + 239.ImportedFromIB2 + 24.IBEditorWindowLastContentRect + 24.IBPluginDependency + 24.ImportedFromIB2 + 24.editorWindowContentRectSynchronizationRect + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 29.WindowOrigin + 29.editorWindowContentRectSynchronizationRect + 295.IBPluginDependency + 296.IBEditorWindowLastContentRect + 296.IBPluginDependency + 296.editorWindowContentRectSynchronizationRect + 297.IBPluginDependency + 298.IBPluginDependency + 346.IBPluginDependency + 346.ImportedFromIB2 + 348.IBPluginDependency + 348.ImportedFromIB2 + 349.IBPluginDependency + 349.ImportedFromIB2 + 349.editorWindowContentRectSynchronizationRect + 350.IBPluginDependency + 350.ImportedFromIB2 + 351.IBPluginDependency + 351.ImportedFromIB2 + 354.IBPluginDependency + 354.ImportedFromIB2 + 371.IBEditorWindowLastContentRect + 371.IBWindowTemplateEditedContentRect + 371.NSWindowTemplate.visibleAtLaunch + 371.editorWindowContentRectSynchronizationRect + 371.windowTemplate.hasMaxSize + 371.windowTemplate.hasMinSize + 371.windowTemplate.maxSize + 371.windowTemplate.minSize + 372.IBPluginDependency + 450.IBPluginDependency + 452.IBPluginDependency + 453.IBPluginDependency + 454.IBPluginDependency + 455.IBPluginDependency + 456.IBPluginDependency + 457.IBPluginDependency + 458.IBPluginDependency + 459.IBPluginDependency + 460.IBPluginDependency + 461.IBPluginDependency + 5.IBPluginDependency + 5.ImportedFromIB2 + 56.IBPluginDependency + 56.ImportedFromIB2 + 57.IBEditorWindowLastContentRect + 57.IBPluginDependency + 57.ImportedFromIB2 + 57.editorWindowContentRectSynchronizationRect + 58.IBPluginDependency + 58.ImportedFromIB2 + 72.IBPluginDependency + 72.ImportedFromIB2 + 73.IBPluginDependency + 73.ImportedFromIB2 + 74.IBPluginDependency + 74.ImportedFromIB2 + 75.IBPluginDependency + 75.ImportedFromIB2 + 77.IBPluginDependency + 77.ImportedFromIB2 + 78.IBPluginDependency + 78.ImportedFromIB2 + 79.IBPluginDependency + 79.ImportedFromIB2 + 80.IBPluginDependency + 80.ImportedFromIB2 + 81.IBEditorWindowLastContentRect + 81.IBPluginDependency + 81.ImportedFromIB2 + 81.editorWindowContentRectSynchronizationRect + 82.IBPluginDependency + 82.ImportedFromIB2 + 83.IBPluginDependency + 83.ImportedFromIB2 + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilder.CocoaPlugin + + {{558, 262}, {194, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{596, 852}, {216, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{522, 812}, {146, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{436, 809}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {275, 83}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{393, 42}, {243, 243}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{187, 434}, {243, 243}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {167, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {241, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{487, 212}, {197, 73}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{525, 802}, {197, 73}} + {{207, 285}, {412, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + {74, 862} + {{6, 978}, {478, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + {{437, 242}, {234, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + {{475, 832}, {234, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{608, 612}, {215, 63}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{110, 335}, {477, 89}} + {{110, 335}, {477, 89}} + + {{33, 99}, {480, 360}} + + + {1000, 89} + {477, 89} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{219, 102}, {223, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{23, 794}, {245, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{351, 82}, {199, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{145, 474}, {199, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 466 + + + + YES + + ApplicationDelegate + NSObject + + push: + id + + + IBProjectSource + ApplicationDelegate.h + + + + + 0 + ../PushMeBaby.xcodeproj + 3 + + diff --git a/Info.plist b/Info.plist new file mode 100644 index 0000000..409128b --- /dev/null +++ b/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleGetInfoString + 1.0, Copyright © 2009 Stefan Hafeneger. + CFBundleIconFile + + CFBundleIdentifier + name.hafeneger.stefan.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 42 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/PushMeBaby.xcodeproj/TemplateIcon.icns b/PushMeBaby.xcodeproj/TemplateIcon.icns new file mode 100644 index 0000000..62cb701 Binary files /dev/null and b/PushMeBaby.xcodeproj/TemplateIcon.icns differ diff --git a/PushMeBaby.xcodeproj/project.pbxproj b/PushMeBaby.xcodeproj/project.pbxproj new file mode 100644 index 0000000..96efb4d --- /dev/null +++ b/PushMeBaby.xcodeproj/project.pbxproj @@ -0,0 +1,292 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; + 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + A690E0150F8BA56300CEA7C7 /* ApplicationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A690E0140F8BA56300CEA7C7 /* ApplicationDelegate.m */; }; + A690E01D0F8BA57E00CEA7C7 /* ioSock.c in Sources */ = {isa = PBXBuildFile; fileRef = A690E01C0F8BA57E00CEA7C7 /* ioSock.c */; }; + A690E05D0F8BA8C800CEA7C7 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A690E05C0F8BA8C800CEA7C7 /* Security.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 32CA4F630368D1EE00C91783 /* PushMeBaby_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PushMeBaby_Prefix.pch; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8D1107320486CEB800E47090 /* PushMeBaby.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PushMeBaby.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A690E0130F8BA56300CEA7C7 /* ApplicationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ApplicationDelegate.h; path = Classes/ApplicationDelegate.h; sourceTree = ""; }; + A690E0140F8BA56300CEA7C7 /* ApplicationDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ApplicationDelegate.m; path = Classes/ApplicationDelegate.m; sourceTree = ""; }; + A690E01B0F8BA57E00CEA7C7 /* ioSock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ioSock.h; path = Classes/ioSock.h; sourceTree = ""; }; + A690E01C0F8BA57E00CEA7C7 /* ioSock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioSock.c; path = Classes/ioSock.c; sourceTree = ""; }; + A690E05C0F8BA8C800CEA7C7 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D11072E0486CEB800E47090 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + A690E05D0F8BA8C800CEA7C7 /* Security.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + A690E0130F8BA56300CEA7C7 /* ApplicationDelegate.h */, + A690E0140F8BA56300CEA7C7 /* ApplicationDelegate.m */, + A690E01B0F8BA57E00CEA7C7 /* ioSock.h */, + A690E01C0F8BA57E00CEA7C7 /* ioSock.c */, + ); + name = Classes; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + A690E05C0F8BA8C800CEA7C7 /* Security.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D1107320486CEB800E47090 /* PushMeBaby.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* PushMeBaby */ = { + isa = PBXGroup; + children = ( + 080E96DDFE201D6D7F000001 /* Classes */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = PushMeBaby; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + 32CA4F630368D1EE00C91783 /* PushMeBaby_Prefix.pch */, + 29B97316FDCFA39411CA2CEA /* main.m */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 8D1107310486CEB800E47090 /* Info.plist */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + 1DDD58140DA1D0A300B32029 /* MainMenu.xib */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D1107260486CEB800E47090 /* PushMeBaby */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "PushMeBaby" */; + buildPhases = ( + 8D1107290486CEB800E47090 /* Resources */, + 8D11072C0486CEB800E47090 /* Sources */, + 8D11072E0486CEB800E47090 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PushMeBaby; + productInstallPath = "$(HOME)/Applications"; + productName = PushMeBaby; + productReference = 8D1107320486CEB800E47090 /* PushMeBaby.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "PushMeBaby" */; + compatibilityVersion = "Xcode 3.1"; + hasScannedForEncodings = 1; + mainGroup = 29B97314FDCFA39411CA2CEA /* PushMeBaby */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D1107260486CEB800E47090 /* PushMeBaby */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, + 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D11072C0486CEB800E47090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072D0486CEB800E47090 /* main.m in Sources */, + A690E0150F8BA56300CEA7C7 /* ApplicationDelegate.m in Sources */, + A690E01D0F8BA57E00CEA7C7 /* ioSock.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 1DDD58150DA1D0A300B32029 /* English */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = PushMeBaby_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = PushMeBaby; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = PushMeBaby_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = PushMeBaby; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + PREBINDING = NO; + SDKROOT = macosx10.5; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = macosx10.5; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "PushMeBaby" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "PushMeBaby" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/PushMeBaby_Prefix.pch b/PushMeBaby_Prefix.pch new file mode 100644 index 0000000..29a9af1 --- /dev/null +++ b/PushMeBaby_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'PushMeBaby' target in the 'PushMeBaby' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/README b/README new file mode 100644 index 0000000..9a370a8 --- /dev/null +++ b/README @@ -0,0 +1 @@ +You can use this app during iOS Push Notification development to push notifications on your device from your Mac. \ No newline at end of file diff --git a/main.m b/main.m new file mode 100644 index 0000000..4b4cf29 --- /dev/null +++ b/main.m @@ -0,0 +1,14 @@ +// +// main.m +// PushMeBaby +// +// Created by Stefan Hafeneger on 07.04.09. +// Copyright __MyCompanyName__ 2009. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} diff --git a/version.plist b/version.plist new file mode 100644 index 0000000..4824d28 --- /dev/null +++ b/version.plist @@ -0,0 +1,14 @@ + + + + + BuildVersion + 2 + CFBundleVersion + 1.0 + ProjectName + DevToolsWizardTemplates + SourceVersion + 11600000 + +