~ubuntuone-ios-client-team/ubuntuone-ios-contacts/trunk

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
//
//  AbstractNetworkOperation.m
//  iSub
//
//  Created by Aaron Brethorst on 5/12/11.
//  Copyright 2011 Canonical. All rights reserved.
//

#import "AbstractNetworkOperation.h"

#import "UONetworkStatusCoordinator.h"


@interface AbstractNetworkOperation ()
- (void)finish;
@end

@implementation AbstractNetworkOperation
@synthesize url = _url;
@synthesize statusCode = _statusCode;
@synthesize error = _error;
@synthesize isExecuting = _isExecuting;
@synthesize isFinished = _isFinished;

- (id)initWithUrl:(NSURL *)url
{
    self = [super init];
    if (self == nil)
        return nil;
    
    _url = [url copy];
    _isExecuting = NO;
    _isFinished = NO;
    
    return self;
}

- (void)dealloc
{
    [_url release];
    [_connection release];
    [_error release];
    [super dealloc];
}

- (BOOL)isConcurrent
{
    return YES;
}

- (void)start
{
    if (![NSThread isMainThread])
    {
        [self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:NO];
        return;
    }
    
    NSLog(@"operation for <%@> started.", _url);
    
    [self willChangeValueForKey:@"isExecuting"];
    _isExecuting = YES;
    [self didChangeValueForKey:@"isExecuting"];
	
    NSURLRequest * request = [NSURLRequest requestWithURL:_url];
    _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
	[UONetworkStatusCoordinator addNetworkActivity];
    if (nil == _connection)
	{
        [self finish];
	}
}

- (void)finish
{
    NSLog(@"operation for <%@> finished. "
          @"status code: %d, error: %@",
          _url, _statusCode, _error);
    
	[UONetworkStatusCoordinator removeNetworkActivity];
	
    [_connection release];
    _connection = nil;
    
    [self willChangeValueForKey:@"isExecuting"];
    [self willChangeValueForKey:@"isFinished"];
	
    _isExecuting = NO;
    _isFinished = YES;
	
    [self didChangeValueForKey:@"isExecuting"];
    [self didChangeValueForKey:@"isFinished"];
}

#pragma mark -
#pragma mark NSURLConnection delegate

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{	
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
    _statusCode = [httpResponse statusCode];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //no-op, subclasses must implement this.
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [self finish];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    _error = [error copy];
    [self finish];
}



@end