CocoaShare/Classes/TinyGrab/MGMTinyGrabPlugIn.m

213 lines
9.4 KiB
Mathematica
Raw Normal View History

//
// MGMTinyGrabPlugIn.m
// CocoaShare
//
// Created by James on 1/31/11.
// Copyright (c) 2011 Mr. Gecko's Media (James Coleman). All rights reserved. http://mrgeckosmedia.com/
//
#import "MGMTinyGrabPlugIn.h"
#import "MGMController.h"
#import "MGMAddons.h"
#import <MGMUsers/MGMUsers.h>
NSString * const MGMTinyGrabPostMethod = @"POST";
NSString * const MGMTinyGrabURLForm = @"application/x-www-form-urlencoded";
NSString * const MGMTinyGrabContentType = @"content-type";
NSString * const MGMTinyGrabAPI = @"http://tinygrab.com/api/v3.php?m=%@";
NSString * const MGMTinyGrabAPIVerify = @"user/verify";
NSString * const MGMTinyGrabAPIUpload = @"grab/upload";
NSString * const MGMTinyGrabAPIRError = @"X-Error-Text";
NSString * const MGMTinyGrabAPIRErrorCode = @"X-Error-Code";
NSString * const MGMTinyGrabAPIREmail = @"X-User-Email";
NSString * const MGMTinyGrabAPIRJoinDate = @"X-User-Joindate";
NSString * const MGMTinyGrabAPIRName = @"X-User-Name";
NSString * const MGMTinyGrabAPIRPaid = @"X-User-Paid";
NSString * const MGMTinyGrabAPIRDate = @"X-Grab-Date";
NSString * const MGMTinyGrabAPIRID = @"X-Grab-Id";
NSString * const MGMTinyGrabAPIRURL = @"X-Grab-Url";
NSString * const MGMTinyGrabEmail = @"MGMTinyGrabEmail";
NSString * const MGMTinyGrabType = @"MGMTinyGrabType";
const BOOL MGMTinyGrabResponseInvisible = YES;
@implementation MGMTinyGrabPlugIn
- (void)dealloc {
[self releaseView];
[super dealloc];
}
- (BOOL)isAccountPlugIn {
return YES;
}
- (NSString *)plugInName {
return @"TinyGrab";
}
- (NSView *)plugInView {
if (view==nil) {
if (![NSBundle loadNibNamed:@"TinyGrabAccountPane" owner:self]) {
NSLog(@"Unable to load TinyGrab Account Pane");
} else {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *email = [defaults objectForKey:MGMTinyGrabEmail];
if (email!=nil)
[emailField setStringValue:email];
NSString *password = [[MGMController sharedController] password];
if (password!=nil)
[passwordField setStringValue:password];
NSString *type = [defaults objectForKey:MGMTinyGrabType];
if (type!=nil)
[typeField setStringValue:[[type capitalizedString] localizedFor:self]];
}
}
return view;
}
- (void)releaseView {
[view release];
view = nil;
emailField = nil;
passwordField = nil;
loginButton = nil;
}
- (NSArray *)allowedExtensions {
return [NSArray arrayWithObjects:@"png", @"jpg", nil];
}
- (void)setCurrentPlugIn:(BOOL)isCurrent {
if (!isCurrent) {
[[[MGMController sharedController] connectionManager] cancelAll];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:MGMTinyGrabEmail];
}
}
- (void)lockLogin {
[emailField setEnabled:NO];
[passwordField setEnabled:NO];
[loginButton setEnabled:NO];
[loginButton setTitle:[@"Logging In" localizedFor:self]];
}
- (void)unlockLogin {
[emailField setEnabled:YES];
[passwordField setEnabled:YES];
[loginButton setEnabled:YES];
[loginButton setTitle:[@"Login" localizedFor:self]];
}
- (IBAction)login:(id)sender {
if ([[emailField stringValue] isEqual:@""]) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Email Required" localizedFor:self]];
[alert setInformativeText:[@"Please enter your email." localizedFor:self]];
[alert runModal];
} else {
[[MGMController sharedController] setPassword:[passwordField stringValue]];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[emailField stringValue] forKey:MGMTinyGrabEmail];
[typeField setStringValue:[@"Unknown" localizedFor:self]];
[self lockLogin];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:MGMTinyGrabAPI, MGMTinyGrabAPIVerify]]];
[request setHTTPMethod:MGMTinyGrabPostMethod];
[request setValue:MGMTinyGrabURLForm forHTTPHeaderField:MGMTinyGrabContentType];
[request setHTTPBody:[[NSString stringWithFormat:@"email=%@&passwordhash=%@", [[defaults objectForKey:MGMTinyGrabEmail] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [[[MGMController sharedController] password] MD5]] dataUsingEncoding:NSUTF8StringEncoding]];
MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:request delegate:self];
[handler setFailWithError:@selector(check:didFailWithError:)];
[handler setFinish:@selector(checkDidFinish:)];
[handler setInvisible:MGMTinyGrabResponseInvisible];
[[[MGMController sharedController] connectionManager] addHandler:handler];
}
}
- (IBAction)registerAccount:(id)sender {
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"http://tinygrab.com/register"]];
}
- (void)check:(MGMURLBasicHandler *)theHandler didFailWithError:(NSError *)theError {
NSLog(@"HTTP Error: %@", theError);
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Account Error" localizedFor:self]];
[alert setInformativeText:[theError localizedDescription]];
[alert runModal];
[self unlockLogin];
}
- (void)checkDidFinish:(MGMURLBasicHandler *)theHandler {
NSDictionary *headers = [[theHandler response] allHeaderFields];
if ([headers objectForKey:MGMTinyGrabAPIRError]!=nil) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Account Error" localizedFor:self]];
[alert setInformativeText:[headers objectForKey:MGMTinyGrabAPIRError]];
[alert runModal];
[self unlockLogin];
} else {
NSString *type = [headers objectForKey:MGMTinyGrabAPIRPaid];
if (type==nil || [type isEqual:@"free"]) {
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Account Error" localizedFor:self]];
[alert setInformativeText:[@"Only paid users are allowed to use TinyGrab in CocoaShare, sorry." localizedFor:self]];
[alert runModal];
[self unlockLogin];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:MGMTinyGrabEmail];
} else {
[typeField setStringValue:[[type capitalizedString] localizedFor:self]];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:type forKey:MGMTinyGrabType];
NSAlert *alert = [[NSAlert new] autorelease];
[alert setMessageText:[@"Login Successful" localizedFor:self]];
[alert setInformativeText:[@"You have sucessfully logged into your account." localizedFor:self]];
[alert runModal];
[self unlockLogin];
}
}
}
- (void)sendFileAtPath:(NSString *)thePath withName:(NSString *)theName {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:MGMTinyGrabEmail]==nil || [defaults objectForKey:MGMTinyGrabType]==nil) {
NSError *error = [NSError errorWithDomain:[[NSBundle bundleForClass:[self class]] bundleIdentifier] code:5 userInfo:[NSDictionary dictionaryWithObject:[@"Account is not logged in." localizedFor:self] forKey:NSLocalizedDescriptionKey]];
[[MGMController sharedController] upload:thePath receivedError:error];
return;
}
srandomdev();
NSString *boundary = [NSString stringWithFormat:@"----Boundary+%d", random()%100000];
NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:MGMTinyGrabAPI, MGMTinyGrabAPIUpload]] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:120.0];
[postRequest setHTTPMethod:MGMTinyGrabPostMethod];
[postRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary, nil] forHTTPHeaderField:@"Content-Type"];
NSMutableDictionary *data = [NSMutableDictionary dictionary];
[data setObject:[defaults objectForKey:MGMTinyGrabEmail] forKey:@"email"];
[data setObject:[[[MGMController sharedController] password] MD5] forKey:@"passwordhash"];
[data setObject:[NSDictionary dictionaryWithObjectsAndKeys:thePath, MGMMPFPath, theName, MGMMPFName, nil] forKey:@"upload"];
[postRequest setHTTPBody:[data buildMultiPartBodyWithBoundary:boundary]];
MGMURLBasicHandler *handler = [MGMURLBasicHandler handlerWithRequest:postRequest delegate:self];
[handler setFailWithError:@selector(upload:didFailWithError:)];
[handler setFinish:@selector(uploadDidFinish:)];
[handler setInvisible:MGMTinyGrabResponseInvisible];
[handler setObject:thePath];
[[[MGMController sharedController] connectionManager] addHandler:handler];
}
- (void)upload:(MGMURLBasicHandler *)theHandler didFailWithError:(NSError *)theError {
[[MGMController sharedController] upload:[theHandler object] receivedError:theError];
}
- (void)uploadDidFinish:(MGMURLBasicHandler *)theHandler {
NSDictionary *headers = [[theHandler response] allHeaderFields];
if ([headers objectForKey:MGMTinyGrabAPIRError]!=nil) {
NSError *error = [NSError errorWithDomain:[[NSBundle bundleForClass:[self class]] bundleIdentifier] code:[[headers objectForKey:MGMTinyGrabAPIRErrorCode] intValue] userInfo:[NSDictionary dictionaryWithObject:[headers objectForKey:MGMTinyGrabAPIRError] forKey:NSLocalizedDescriptionKey]];
[[MGMController sharedController] upload:[theHandler object] receivedError:error];
} else {
if ([headers objectForKey:MGMTinyGrabAPIRURL]!=nil) {
[[MGMController sharedController] uploadFinished:[theHandler object] url:[NSURL URLWithString:[headers objectForKey:MGMTinyGrabAPIRURL]]];
} else {
NSError *error = [NSError errorWithDomain:[[NSBundle bundleForClass:[self class]] bundleIdentifier] code:4 userInfo:[NSDictionary dictionaryWithObject:[@"Unable to receive url." localizedFor:self] forKey:NSLocalizedDescriptionKey]];
[[MGMController sharedController] upload:[theHandler object] receivedError:error];
}
}
}
@end