1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
//
// FixMyStreetAppDelegate.m
// FixMyStreet
//
// Created by Matthew on 25/09/2008.
// Copyright 2008 UK Citizens Online Democracy. All rights reserved.
//
#import "FixMyStreetAppDelegate.h"
#import "InputTableViewController.h"
#import "Reachability.h"
@implementation FixMyStreetAppDelegate
@synthesize window, navigationController; //, viewController;
@synthesize image, latitude, longitude, subject, name, email, phone;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
InputTableViewController *inputTableViewController = [[InputTableViewController alloc] initWithNibName:@"MainViewController" bundle:[NSBundle mainBundle]];
// InputTableViewController *inputTableViewController = [[InputTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
//RootViewController *rootViewController = [[RootViewController alloc] i
// So we had our root view in a nib file, but we're creating our navigation controller programmatically. Ah well.
UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:inputTableViewController];
// UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.navigationController = aNavigationController;
[aNavigationController release];
[inputTableViewController release];
// [rootViewController release];
// NSMutableArray *tempMutableCopy = [[[NSUserDefaults standardUserDefaults] objectForKey:kRestoreLocationKey] mutableCopy];
name = [[NSUserDefaults standardUserDefaults] stringForKey:@"Name"];
email = [[NSUserDefaults standardUserDefaults] stringForKey:@"Email"];
phone = [[NSUserDefaults standardUserDefaults] stringForKey:@"Phone"];
subject = [[NSUserDefaults standardUserDefaults] stringForKey:@"Subject"];
image = [[NSUserDefaults standardUserDefaults] objectForKey:@"Image"];
// NSData *imageData = [[[NSUserDefaults standardUserDefaults] objectForKey:@"Image"] mutableCopy];
// if (imageData != nil)
// image = (UIImage *)[NSKeyedUnarchiver unarchiveObjectWithData:imageData];
// [imageData release];
latitude = [[NSUserDefaults standardUserDefaults] stringForKey:@"Latitude"];
longitude = [[NSUserDefaults standardUserDefaults] stringForKey:@"Longitude"];
// NSData *locationData = [[NSUserDefaults standardUserDefaults] objectForKey:@"Location"];
// if (locationData != nil)
// location = (CLLocation *)[NSUnarchiver unarchiveObjectWithData:locationData];
// [locationData release];
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
// NSArray *keys = [NSArray arrayWithObjects:@"Name", @"Email", @"Phone", nil];
// NSArray *values = [NSArray arrayWithObjects:name, email, phone, nil];
// NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:values forKeys:keys];
// [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
// [[NSUserDefaults standardUserDefaults] synchronize];
// [keys release];
// [values release];
// [dictionary release];
}
- (void)dealloc {
[window release];
[navigationController release];
// [viewController release];
[image release];
[latitude release];
[longitude release];
[subject release];
[name release];
[email release];
[phone release];
[super dealloc];
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Save state in case they're just in the middle of a phone call...
[[NSUserDefaults standardUserDefaults] setObject:name forKey:@"Name"];
[[NSUserDefaults standardUserDefaults] setObject:email forKey:@"Email"];
[[NSUserDefaults standardUserDefaults] setObject:phone forKey:@"Phone"];
[[NSUserDefaults standardUserDefaults] setObject:subject forKey:@"Subject"];
// XXX image crashes (restarting app. still has image showing?! and then quitting crashes, either way)
// Location just doesn't seem to work
// if (image) {
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *imageFile = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"saved.image"];
// [NSKeyedArchiver archiveRootObject:image toFile:imageFile];
// }
// NSData *imageData = [NSKeyedArchiver archivedDataWithRootObject:image];
// [[NSUserDefaults standardUserDefaults] setObject:imageData forKey:@"Image"];
// [imageData release];
[[NSUserDefaults standardUserDefaults] setObject:image forKey:@"Image"];
[[NSUserDefaults standardUserDefaults] setObject:latitude forKey:@"Latitude"];
[[NSUserDefaults standardUserDefaults] setObject:longitude forKey:@"Longitude"];
// NSData *locationData = [NSKeyedArchiver archivedDataWithRootObject:location];
// [[NSUserDefaults standardUserDefaults] setObject:locationData forKey:@"Location"];
// [locationData release];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// Report stuff
-(void)uploadReport {
// Check internet connection status
NetworkStatus internetConnectionStatus = [[Reachability sharedReachability] internetConnectionStatus];
if (internetConnectionStatus == NotReachable) {
UIAlertView *v = [[UIAlertView alloc] initWithTitle:@"Reporting failed" message:@"You need to be connected to the internet to report a problem." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[v show];
[v release];
return;
}
[[MyCLController sharedInstance] stopUpdatingLocation];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
uploading = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
UIColor *bg = [[UIColor alloc] initWithRed:0 green:0 blue:0 alpha:0.5];
uploading.backgroundColor = bg;
[bg release];
UIActivityIndicatorView *spinny = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
spinny.center = CGPointMake(160, 160);
[uploading addSubview:spinny];
[spinny startAnimating];
[self.navigationController.view addSubview:uploading];
[spinny release];
// Get the phone's unique ID
UIDevice *dev = [UIDevice currentDevice];
NSString *uniqueId = dev.uniqueIdentifier;
NSString *urlString = @"http://matthew.fixmystreet.com/import";
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString: urlString]];
[request setHTTPMethod: @"POST"];
NSString *stringBoundary = @"0xMyLovelyBoundary";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
//setting up the body:
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"service\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[@"iPhone" dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"phone_id\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[uniqueId dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"subject\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[subject dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"name\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[name dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"email\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[email dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"phone\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[phone dataUsingEncoding:NSASCIIStringEncoding]];
if (latitude) {
// NSString* latitude = [NSString stringWithFormat:@"%f", location.coordinates.latitude];
// NSString* longitude = [NSString stringWithFormat:@"%f", location.coordinates.longitude];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"lat\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[latitude dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"lon\"\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[longitude dataUsingEncoding:NSASCIIStringEncoding]];
}
if (image) {
// NSData *imageData = UIImageJPEGRepresentation(image, 0.8);
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"photo\"; filename=\"from_phone.jpeg\"\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Transfer-Encoding: binary\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
[postBody appendData:image];
}
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSASCIIStringEncoding]];
[request setHTTPBody: postBody];
returnData = [[NSMutableData alloc] init];
[NSURLConnection connectionWithRequest:request delegate:self];
// NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[returnData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[uploading removeFromSuperview];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding];
if ([returnString isEqualToString:@"SUCCESS"]) {
subject = nil;
latitude = nil;
longitude = nil;
self.image = nil;
[(InputTableViewController*)self.navigationController.visibleViewController reportUploaded:YES];
UIAlertView *v = [[UIAlertView alloc] initWithTitle:@"Your report has been received" message:@"Check your email for the next step" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[v show];
[v release];
} else {
// Pop up alert box with return error(s)
NSArray *errors = [returnString componentsSeparatedByString:@"ERROR:"];
NSString *errorString = [[NSString alloc] init];
for (int i=1; i<[errors count]; i++) {
NSString *error = [errors objectAtIndex:i];
errorString = [errorString stringByAppendingFormat:@"\xE2\x80\xA2 %@", error];
}
UIAlertView *v = [[UIAlertView alloc] initWithTitle:@"Upload failed" message:errorString delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[v show];
[v release];
}
}
@end
|