VoiceMac/Classes/VoiceBase/MGMInbox.m

562 lines
29 KiB
Objective-C

//
// MGMInbox.m
// VoiceBase
//
// Created by Mr. Gecko on 8/15/10.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). http://mrgeckosmedia.com/
//
// Permission to use, copy, modify, and/or distribute this software for any purpose
// with or without fee is hereby granted, provided that the above copyright notice
// and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
// OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
// DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
// ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//
#import "MGMInbox.h"
#import "MGMDelegateInfo.h"
#import "MGMInstance.h"
#import "MGMAddons.h"
#import "MGMXML.h"
#import <MGMUsers/MGMUsers.h>
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:@"<div class=\"gc-message-sms-more\">"]) {
[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:@"<span class=\"gc-message-sms-from\">"];
if (range.location!=NSNotFound) {
NSString *string = [theHTML substringFromIndex:range.location+range.length];
range = [string rangeOfString:@"</span>"];
if (range.location==NSNotFound) NSLog(@"failed 0010");
[message setObject:[NSNumber numberWithBool:[[string substringWithRange:NSMakeRange(0, range.location)] containsString:@"Me:"]] forKey:MGMIYou];
}
range = [theHTML rangeOfString:@"<span class=\"gc-message-sms-text\">"];
if (range.location!=NSNotFound) {
NSString *string = [theHTML substringFromIndex:range.location + range.length];
range = [string rangeOfString:@"</span>"];
if (range.location==NSNotFound) NSLog(@"failed 0011");
NSString *messageText = [[string substringWithRange:NSMakeRange(0, range.location)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
messageText = [messageText replace:@"\n" with:@"<br />"];
messageText = [messageText replace:@"\r" with:@""];
[message setObject:messageText forKey:MGMIText];
}
range = [theHTML rangeOfString:@"<span class=\"gc-message-sms-time\">"];
if (range.location!=NSNotFound) {
NSString *string = [theHTML substringFromIndex:range.location+range.length];
range = [string rangeOfString:@"</span>"];
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