// // MGMInbox.m // VoiceBase // // Created by Mr. Gecko on 8/15/10. // Copyright (c) 2010 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/ // #import "MGMInbox.h" #import "MGMDelegateInfo.h" #import "MGMInstance.h" #import "MGMAddons.h" #import "MGMXML.h" #import NSString * const MGMIInboxURL = @"https://www.google.com/voice/inbox/recent/"; NSString * const MGMIStarredURL = @"https://www.google.com/voice/inbox/recent/starred/"; NSString * const MGMIStarURL = @"https://www.google.com/voice/inbox/star/"; NSString * const MGMISpamURL = @"https://www.google.com/voice/inbox/recent/spam/"; NSString * const MGMITrashURL = @"https://www.google.com/voice/inbox/recent/trash/"; NSString * const MGMIVoiceMailURL = @"https://www.google.com/voice/inbox/recent/voicemail/"; NSString * const MGMIVoiceMailDownloadURL = @"https://www.google.com/voice/media/send_voicemail/%@"; NSString * const MGMISMSURL = @"https://www.google.com/voice/inbox/recent/sms/"; NSString * const MGMISMSSendURL = @"https://www.google.com/voice/sms/send/"; NSString * const MGMIRecordedURL = @"https://www.google.com/voice/inbox/recent/recorded/"; NSString * const MGMIPlacedURL = @"https://www.google.com/voice/inbox/recent/placed/"; NSString * const MGMIReceivedURL = @"https://www.google.com/voice/inbox/recent/received/"; NSString * const MGMIMissedURL = @"https://www.google.com/voice/inbox/recent/missed/"; NSString * const MGMIMarkURL = @"https://www.google.com/voice/inbox/mark/"; NSString * const MGMIDeleteURL = @"https://www.google.com/voice/inbox/deleteMessages/"; NSString * const MGMIDeleteForeverURL = @"https://www.google.com/voice/inbox/deleteForeverMessages/"; NSString * const MGMIReportURL = @"https://www.google.com/voice/inbox/spam/"; NSString * const MGMIPhoneNumber = @"phoneNumber"; NSString * const MGMIID = @"id"; NSString * const MGMIUniqueId = @"uniqueId"; NSString * const MGMIText = @"text"; NSString * const MGMIYou = @"you"; NSString * const MGMITime = @"time"; NSString * const MGMIStartTime = @"startTime"; NSString * const MGMIInfo = @"info"; NSString * const MGMIMessages = @"messages"; NSString * const MGMIUseful = @"useful"; NSString * const MGMIRead = @"isRead"; NSString * const MGMIType = @"type"; NSString * const MGMIStarred = @"star"; NSString * const MGMISpam = @"isSpam"; NSString * const MGMITrash = @"isTrash"; const int MGMIMissedType = 0; const int MGMIReceivedType = 1; const int MGMIVoicemailType = 2; const int MGMIRecordedType = 4; const int MGMIPlacedType = 8; const int MGMISMSInType = 10; const int MGMISMSOutType = 11; NSString * const MGMIPage = @"%@?page=p%d"; const BOOL MGMInboxInvisible = YES; @implementation MGMInbox + (id)inboxWithInstance:(MGMInstance *)theInstance { return [[[self alloc] initWithInstance:theInstance] autorelease]; } - (id)initWithInstance:(MGMInstance *)theInstance { if ((self = [super init])) { instance = theInstance; connectionManager = [[MGMURLConnectionManager managerWithCookieStorage:[theInstance cookieStorage]] retain]; } return self; } - (void)dealloc { [connectionManager cancelAll]; [connectionManager release]; [super dealloc]; } - (void)stop { [connectionManager cancelAll]; } - (void)getInboxForPage:(int)thePage delegate:(id)theDelegate { [self getInboxForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getInboxForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMIInboxURL page:thePage info:info]; } - (void)getStarredForPage:(int)thePage delegate:(id)theDelegate { [self getStarredForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getStarredForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMIStarredURL page:thePage info:info]; } - (void)getSpamForPage:(int)thePage delegate:(id)theDelegate { [self getSpamForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getSpamForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMISpamURL page:thePage info:info]; } - (void)getTrashForPage:(int)thePage delegate:(id)theDelegate { [self getTrashForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getTrashForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMITrashURL page:thePage info:info]; } - (void)getVoicemailForPage:(int)thePage delegate:(id)theDelegate { [self getVoicemailForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getVoicemailForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMIVoiceMailURL page:thePage info:info]; } - (void)getSMSForPage:(int)thePage delegate:(id)theDelegate { [self getSMSForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getSMSForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMISMSURL page:thePage info:info]; } - (void)getRecordedCallsForPage:(int)thePage delegate:(id)theDelegate { [self getRecordedCallsForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getRecordedCallsForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMIRecordedURL page:thePage info:info]; } - (void)getPlacedCallsForPage:(int)thePage delegate:(id)theDelegate { [self getPlacedCallsForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getPlacedCallsForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMIPlacedURL page:thePage info:info]; } - (void)getReceivedCallsForPage:(int)thePage delegate:(id)theDelegate { [self getPlacedCallsForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getReceivedCallsForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMIReceivedURL page:thePage info:info]; } - (void)getMissedCallsForPage:(int)thePage delegate:(id)theDelegate { [self getPlacedCallsForPage:thePage delegate:theDelegate didFailWithError:@selector(inbox:didFailWithError:instance:) didReceiveInfo:@selector(inboxGotInfo:instance:)]; } - (void)getMissedCallsForPage:(int)thePage delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didReceiveInfo:(SEL)didReceiveInfo { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setReceiveInfo:didReceiveInfo]; [info setFailWithError:didFailWithError]; [self retrieveURL:MGMIMissedURL page:thePage info:info]; } - (void)retrieveURL:(NSString *)theURL page:(int)thePage info:(MGMDelegateInfo *)theInfo { NSString *url = nil; if (thePage<=1) url = theURL; else url = [NSString stringWithFormat:MGMIPage, theURL, thePage]; #if MGMInboxDebug NSLog(@"MGMInbox Will load %@", url); #endif MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]] delegate:self]; [handler setInvisible:MGMInboxInvisible]; [handler setObject:theInfo]; [connectionManager addHandler:handler]; } - (void)handler:(MGMURLBasicHandler *)theHandler didFailWithError:(NSError *)theError { MGMDelegateInfo *info = [theHandler object]; BOOL displayError = YES; if ([info failWithError]!=nil) { NSMethodSignature *signature = [[info delegate] methodSignatureForSelector:[info failWithError]]; if (signature!=nil) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setSelector:[info failWithError]]; [invocation setArgument:&info atIndex:2]; [invocation setArgument:&theError atIndex:3]; [invocation setArgument:&instance atIndex:4]; [invocation invokeWithTarget:[info delegate]]; displayError = NO; } } if (displayError) NSLog(@"MGMInbox Error: %@", theError); } - (void)handlerDidFinish:(MGMURLBasicHandler *)theHandler { MGMXMLElement *XML = [(MGMXMLDocument *)[[[MGMXMLDocument alloc] initWithData:[theHandler data] options:MGMXMLDocumentTidyXML error:nil] autorelease] rootElement]; NSDictionary *infoDic = [[[[XML elementsForName:@"json"] objectAtIndex:0] stringValue] parseJSON]; NSDictionary *messagesInfo = [infoDic objectForKey:@"messages"]; NSArray *messagesInfoKeys = [messagesInfo allKeys]; MGMXMLElement *html = [(MGMXMLDocument *)[[[MGMXMLDocument alloc] initWithXMLString:[[[XML elementsForName:@"html"] objectAtIndex:0] stringValue] options:MGMXMLDocumentTidyHTML error:nil] autorelease] rootElement]; NSArray *messages = [(MGMXMLElement *)[html childAtIndex:0] elementsForName:@"div"]; NSMutableArray *info = [NSMutableArray array]; for (unsigned int i=0; i<[messages count]; i++) { MGMXMLElement *message = [messages objectAtIndex:i]; NSString *messageID = [[message attributeForName:MGMIID] stringValue]; if (messageID) { for (unsigned int m=0; m<[messagesInfoKeys count]; m++) { NSDictionary *messageInfo = [messagesInfo objectForKey:[messagesInfoKeys objectAtIndex:m]]; if ([[messageInfo objectForKey:MGMIID] isEqualToString:messageID]) { NSMutableDictionary *thisInfo = [NSMutableDictionary dictionary]; [thisInfo setObject:[[messageInfo objectForKey:MGMIPhoneNumber] phoneFormatWithAreaCode:[instance userAreaCode]] forKey:MGMIPhoneNumber]; [thisInfo setObject:messageID forKey:MGMIID]; [thisInfo setObject:[NSDate dateWithTimeIntervalSince1970:[[NSDecimalNumber decimalNumberWithString:[messageInfo objectForKey:MGMIStartTime]] longLongValue]/1000] forKey:MGMITime]; [thisInfo setObject:[messageInfo objectForKey:MGMIRead] forKey:MGMIRead]; [thisInfo setObject:[messageInfo objectForKey:MGMIStarred] forKey:MGMIStarred]; [thisInfo setObject:[messageInfo objectForKey:MGMISpam] forKey:MGMISpam]; [thisInfo setObject:[messageInfo objectForKey:MGMITrash] forKey:MGMITrash]; [thisInfo setObject:[messageInfo objectForKey:MGMIType] forKey:MGMIType]; int type = [[thisInfo objectForKey:MGMIType] intValue]; if (type==MGMIVoicemailType) { [thisInfo setObject:[NSNumber numberWithBool:[[message XMLString] containsString:@"gc-message-transcript-rate-up-active"]] forKey:MGMIUseful]; NSMutableString *transcript = [NSMutableString string]; NSArray *words = [[[[message childAtIndex:0] nodesForXPath:[NSString stringWithFormat:@"/html[1]/body[1]/div[%d]/div[1]/div[2]/table[1]/tr[1]/td[3]/div[1]/table[1]/tr[2]/td[2]/table[1]/tr[2]/td[1]/div[1]/div[1]/table[1]/tr[1]/td[2]/div[1]/div[1]/table[1]/tr[1]/td[1]/div[1]", i+1] error:nil] objectAtIndex:0] elementsForName:@"span"]; for (unsigned int w=0; w<[words count]; w++) { if (w==0) [transcript appendString:[[words objectAtIndex:w] stringValue]]; else [transcript appendFormat:@" %@", [[words objectAtIndex:w] stringValue]]; } [thisInfo setObject:transcript forKey:MGMIText]; } else if (type==MGMISMSInType || type==MGMISMSOutType) { NSArray *messagesXML = [[message childAtIndex:0] nodesForXPath:[NSString stringWithFormat:@"/html[1]/body[1]/div[%d]/div[1]/div[2]/table[1]/tr[1]/td[3]/div[1]/table[1]/tr[2]/td[2]/table[1]/tr[2]/td[1]/div[1]/div[1]/table[1]/tr[1]/td[2]/div[1]/div[1]/div[1]/div", i+1] error:nil]; NSMutableArray *messagesArray = [NSMutableArray array]; for (unsigned int m=0; m<[messagesXML count]; m++) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *messageString = [[messagesXML objectAtIndex:m] XMLString]; if (![messageString hasPrefix:@"
"]) { [messagesArray addObject:[self parseMessageWithHTML:messageString info:thisInfo]]; } else { m++; NSArray *moreMessages = [(MGMXMLElement *)[messagesXML objectAtIndex:m] elementsForName:@"div"]; for (unsigned int ms=0; ms<[moreMessages count]; ms++) { NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSString *messageString = [[moreMessages objectAtIndex:ms] XMLString]; [messagesArray addObject:[self parseMessageWithHTML:messageString info:thisInfo]]; [pool drain]; } } [pool drain]; } [thisInfo setObject:messagesArray forKey:MGMIMessages]; } [info addObject:thisInfo]; break; } } } } [info sortUsingFunction:dateSort context:nil]; MGMDelegateInfo *thisInfo = [theHandler object]; BOOL displayInfo = YES; if ([thisInfo receiveInfo]!=nil) { NSMethodSignature *signature = [[thisInfo delegate] methodSignatureForSelector:[thisInfo receiveInfo]]; if (signature!=nil) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setSelector:[thisInfo receiveInfo]]; [invocation setArgument:&info atIndex:2]; [invocation setArgument:&instance atIndex:3]; [invocation invokeWithTarget:[thisInfo delegate]]; displayInfo = NO; } } if (displayInfo) NSLog(@"MGMInbox Info: %@", info); } - (NSDictionary *)parseMessageWithHTML:(NSString *)theHTML info:(NSDictionary *)theInfo { NSMutableDictionary *message = [NSMutableDictionary dictionary]; NSRange range; range = [theHTML rangeOfString:@""]; if (range.location!=NSNotFound) { NSString *string = [theHTML substringFromIndex:range.location+range.length]; range = [string rangeOfString:@""]; if (range.location==NSNotFound) NSLog(@"failed 0010"); [message setObject:[NSNumber numberWithBool:[[string substringWithRange:NSMakeRange(0, range.location)] containsString:@"Me:"]] forKey:MGMIYou]; } range = [theHTML rangeOfString:@""]; if (range.location!=NSNotFound) { NSString *string = [theHTML substringFromIndex:range.location + range.length]; range = [string rangeOfString:@""]; if (range.location==NSNotFound) NSLog(@"failed 0011"); NSString *messageText = [[string substringWithRange:NSMakeRange(0, range.location)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; messageText = [messageText replace:@"\n" with:@"
"]; messageText = [messageText replace:@"\r" with:@""]; [message setObject:messageText forKey:MGMIText]; } range = [theHTML rangeOfString:@""]; if (range.location!=NSNotFound) { NSString *string = [theHTML substringFromIndex:range.location+range.length]; range = [string rangeOfString:@""]; if (range.location==NSNotFound) NSLog(@"failed 0012"); [message setObject:[[string substringWithRange:NSMakeRange(0, range.location)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] forKey:MGMITime]; } return message; } - (void)deleteEntriesForever:(NSArray *)theEntries delegate:(id)theDelegate { [self deleteEntriesForever:theEntries delegate:theDelegate didFailWithError:@selector(delete:didFailWithError:instance:) didFinish:@selector(deleteDidFinish:instance:)]; } - (void)deleteEntriesForever:(NSArray *)theEntries delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didFinish:(SEL)didFinish { #if MGMInboxDebug NSLog(@"MGMInbox Will delete %@", theEntries); #endif MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setFinish:didFinish]; [info setFailWithError:didFailWithError]; [info setEntries:theEntries]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:MGMIDeleteForeverURL]]; [request setHTTPMethod:MGMPostMethod]; [request setValue:MGMURLForm forHTTPHeaderField:MGMContentType]; NSMutableString *body = [NSMutableString string]; for (int i=0; i<[theEntries count]; i++) { [body appendFormat:@"messages=%@&", [theEntries objectAtIndex:i]]; } [body appendFormat:@"_rnr_se=%@", [instance rnr_se]]; [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:request delegate:self]; [handler setFailWithError:@selector(send:didFailWithError:)]; [handler setFinish:@selector(sendDidFinish:)]; [handler setInvisible:MGMInboxInvisible]; [handler setObject:info]; [connectionManager addHandler:handler]; } - (void)deleteEntries:(NSArray *)theEntries delegate:(id)theDelegate { [self deleteEntries:theEntries delegate:theDelegate didFailWithError:@selector(delete:didFailWithError:instance:) didFinish:@selector(deleteDidFinish:instance:)]; } - (void)deleteEntries:(NSArray *)theEntries delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didFinish:(SEL)didFinish { #if MGMInboxDebug NSLog(@"MGMInbox Will delete %@", theEntries); #endif MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setFinish:didFinish]; [info setFailWithError:didFailWithError]; [info setEntries:theEntries]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:MGMIDeleteURL]]; [request setHTTPMethod:MGMPostMethod]; [request setValue:MGMURLForm forHTTPHeaderField:MGMContentType]; NSMutableString *body = [NSMutableString string]; for (int i=0; i<[theEntries count]; i++) { [body appendFormat:@"messages=%@&", [theEntries objectAtIndex:i]]; } [body appendFormat:@"trash=1&_rnr_se=%@", [instance rnr_se]]; [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:request delegate:self]; [handler setFailWithError:@selector(send:didFailWithError:)]; [handler setFinish:@selector(sendDidFinish:)]; [handler setInvisible:MGMInboxInvisible]; [handler setObject:info]; [connectionManager addHandler:handler]; } - (void)markEntries:(NSArray *)theEntries read:(BOOL)isRead delegate:(id)theDelegate { [self markEntries:theEntries read:isRead delegate:theDelegate didFailWithError:@selector(mark:didFailWithError:instance:) didFinish:@selector(markDidFinish:instance:)]; } - (void)markEntries:(NSArray *)theEntries read:(BOOL)isRead delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didFinish:(SEL)didFinish { #if MGMInboxDebug NSLog(@"MGMInbox Will delete %@", theEntries); #endif MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setFinish:didFinish]; [info setFailWithError:didFailWithError]; [info setEntries:theEntries]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:MGMIMarkURL]]; [request setHTTPMethod:MGMPostMethod]; [request setValue:MGMURLForm forHTTPHeaderField:MGMContentType]; NSMutableString *body = [NSMutableString string]; for (int i=0; i<[theEntries count]; i++) { [body appendFormat:@"messages=%@&", [theEntries objectAtIndex:i]]; } [body appendFormat:@"read=%d&_rnr_se=%@", (isRead ? 1 : 0), [instance rnr_se]]; [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:request delegate:self]; [handler setFailWithError:@selector(send:didFailWithError:)]; [handler setFinish:@selector(sendDidFinish:)]; [handler setInvisible:MGMInboxInvisible]; [handler setObject:info]; [connectionManager addHandler:handler]; } - (void)reportEntries:(NSArray *)theEntries delegate:(id)theDelegate { [self reportEntries:theEntries delegate:theDelegate didFailWithError:@selector(report:didFailWithError:instance:) didFinish:@selector(reportDidFinish:instance:)]; } - (void)reportEntries:(NSArray *)theEntries delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didFinish:(SEL)didFinish { #if MGMInboxDebug NSLog(@"MGMInbox Will delete %@", theEntries); #endif MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setFinish:didFinish]; [info setFailWithError:didFailWithError]; [info setEntries:theEntries]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:MGMIReportURL]]; [request setHTTPMethod:MGMPostMethod]; [request setValue:MGMURLForm forHTTPHeaderField:MGMContentType]; NSMutableString *body = [NSMutableString string]; for (int i=0; i<[theEntries count]; i++) { [body appendFormat:@"messages=%@&", [theEntries objectAtIndex:i]]; } [body appendFormat:@"spam=1&_rnr_se=%@", [instance rnr_se]]; [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:request delegate:self]; [handler setFailWithError:@selector(send:didFailWithError:)]; [handler setFinish:@selector(sendDidFinish:)]; [handler setInvisible:MGMInboxInvisible]; [handler setObject:info]; [connectionManager addHandler:handler]; } - (void)starEntries:(NSArray *)theEntries starred:(BOOL)isStarred delegate:(id)theDelegate { [self starEntries:theEntries starred:isStarred delegate:theDelegate didFailWithError:@selector(star:didFailWithError:instance:) didFinish:@selector(starDidFinish:instance:)]; } - (void)starEntries:(NSArray *)theEntries starred:(BOOL)isStarred delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didFinish:(SEL)didFinish { #if MGMInboxDebug NSLog(@"MGMInbox Will delete %@", theEntries); #endif MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setFinish:didFinish]; [info setFailWithError:didFailWithError]; [info setEntries:theEntries]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:MGMIStarURL]]; [request setHTTPMethod:MGMPostMethod]; [request setValue:MGMURLForm forHTTPHeaderField:MGMContentType]; NSMutableString *body = [NSMutableString string]; for (int i=0; i<[theEntries count]; i++) { [body appendFormat:@"messages=%@&", [theEntries objectAtIndex:i]]; } [body appendFormat:@"star=%d&_rnr_se=%@", (isStarred ? 1 : 0), [instance rnr_se]]; [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:request delegate:self]; [handler setFailWithError:@selector(send:didFailWithError:)]; [handler setFinish:@selector(sendDidFinish:)]; [handler setInvisible:MGMInboxInvisible]; [handler setObject:info]; [connectionManager addHandler:handler]; } - (void)sendMessage:(NSString *)theMessage phoneNumbers:(NSArray *)thePhoneNumbers smsID:(NSString *)theID delegate:(id)theDelegate { [self sendMessage:theMessage phoneNumbers:thePhoneNumbers smsID:theID delegate:theDelegate didFailWithError:@selector(message:didFailWithError:instance:) didFinish:@selector(messageDidFinish:instance:)]; } - (void)sendMessage:(NSString *)theMessage phoneNumbers:(NSArray *)thePhoneNumbers smsID:(NSString *)theID delegate:(id)theDelegate didFailWithError:(SEL)didFailWithError didFinish:(SEL)didFinish { MGMDelegateInfo *info = [MGMDelegateInfo infoWithDelegate:theDelegate]; [info setFinish:didFinish]; [info setFailWithError:didFailWithError]; [info setMessage:theMessage]; [info setPhoneNumbers:thePhoneNumbers]; if (theID==nil) theID = @""; [info setIdentifier:theID]; if (thePhoneNumbers==nil || [thePhoneNumbers count]==0 || theMessage==nil || [theMessage isEqual:@""]) { NSMethodSignature *signature = [theDelegate methodSignatureForSelector:didFailWithError]; if (signature!=nil) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setSelector:didFailWithError]; [invocation setArgument:&info atIndex:2]; NSError *error = [NSError errorWithDomain:@"com.MrGeckosMedia.MGMInbox.SendMessage" code:1 userInfo:nil]; [invocation setArgument:&error atIndex:3]; [invocation invokeWithTarget:theDelegate]; } return; } NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:MGMISMSSendURL]]; [request setHTTPMethod:MGMPostMethod]; [request setValue:MGMURLForm forHTTPHeaderField:MGMContentType]; NSMutableString *body = [NSMutableString stringWithFormat:@"id=%@&phoneNumber=", theID]; for (int i=0; i<[thePhoneNumbers count]; i++) { if ([thePhoneNumbers count]!=1) [body appendFormat:@"%@%%2C%%20", [[thePhoneNumbers objectAtIndex:i] addPercentEscapes]]; else [body appendString:[[thePhoneNumbers objectAtIndex:i] addPercentEscapes]]; } [body appendFormat:@"&text=%@&sendErrorSms=0&_rnr_se=%@", [theMessage addPercentEscapes], [instance rnr_se]]; [request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:request delegate:self]; [handler setFailWithError:@selector(send:didFailWithError:)]; [handler setFinish:@selector(sendDidFinish:)]; [handler setInvisible:MGMInboxInvisible]; [handler setObject:info]; [connectionManager addHandler:handler]; } - (void)send:(MGMURLBasicHandler *)theHandler didFailWithError:(NSError *)theError { MGMDelegateInfo *info = [theHandler object]; if ([info failWithError]!=nil) { NSMethodSignature *signature = [[info delegate] methodSignatureForSelector:[info failWithError]]; if (signature!=nil) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setSelector:[info failWithError]]; [invocation setArgument:&info atIndex:2]; [invocation setArgument:&theError atIndex:3]; [invocation setArgument:&instance atIndex:4]; [invocation invokeWithTarget:[info delegate]]; } else { NSLog(@"MGMInbox Send Request Error: %@", theError); } } else { NSLog(@"MGMInbox Send Request Error: %@", theError); } } - (void)sendDidFinish:(MGMURLBasicHandler *)theHandler { #if MGMInboxDebug NSLog(@"MGMInbox Did Send Request %@", [theHandler string]); #endif MGMDelegateInfo *thisInfo = [theHandler object]; if ([thisInfo finish]!=nil) { NSMethodSignature *signature = [[thisInfo delegate] methodSignatureForSelector:[thisInfo finish]]; if (signature!=nil) { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; [invocation setSelector:[thisInfo finish]]; [invocation setArgument:&thisInfo atIndex:2]; [invocation setArgument:&instance atIndex:3]; [invocation invokeWithTarget:[thisInfo delegate]]; } } } @end