-
Notifications
You must be signed in to change notification settings - Fork 0
/
JPICloudStatus.m
162 lines (137 loc) · 6.27 KB
/
JPICloudStatus.m
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
//
// JPICloudStatus.m
// iCloudStatus
//
// Created by Julien Poissonnier on 12/14/12.
// Copyright (c) 2012 Julien Poissonnier. All rights reserved.
//
#import "JPICloudStatus.h"
NSString * const JPStatusURL = @"http://www.apple.com/support/systemstatus/data/system_status_en_US.js";
NSString * const JPStatusUpdatedNotification = @"JPStatusUpdatedNotification";
@implementation JPEvent
- (NSString *)description
{
return [NSString stringWithFormat:@"JPEvent<%p: %@>", self, self.title];
}
@end
@implementation JPServiceStatus
- (NSString *)description
{
return [NSString stringWithFormat:@"JPServiceStatus<%p: %@, %@>", self, self.service, self.events];
}
@end
@interface JPICloudStatus ()
@property (nonatomic, strong) NSDictionary *statuses;
@property (nonatomic, strong) NSArray *events;
@end
@implementation JPICloudStatus
+ (JPICloudStatus *)sharedICloudStatus
{
static dispatch_once_t onceToken;
static JPICloudStatus *_sharedInstance;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
- (void)update
{
[self fetchStatus:^(NSDictionary *json, NSError *error) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"MM/dd/yyyy HH:mm z";
if (json) {
NSArray *eventsJson = json[@"detailedTimeline"];
NSMutableArray *events = [[NSMutableArray alloc] init];
for (NSDictionary *eventJson in eventsJson) {
JPEvent *event = [[JPEvent alloc] init];
event.title = eventJson[@"messageTitle"];
event.message = [eventJson[@"message"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
event.messageId = [eventJson[@"messageId"] integerValue];
event.usersAffected = eventJson[@"usersAffected"];
event.statusType = eventJson[@"statusType"];
event.startDate = [dateFormatter dateFromString:eventJson[@"startDate"]];
if (eventJson[@"endDate"] != [NSNull null]) {
event.endDate = [dateFormatter dateFromString:eventJson[@"endDate"]];
}
[events addObject:event];
}
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDate" ascending:YES];
[events sortUsingDescriptors:@[ descriptor ]];
self.events = events;
NSArray *serviceNames = [json[@"dashboard"] allKeys];
NSMutableDictionary *statusesDictionary = [[NSMutableDictionary alloc] init];
for (NSString *serviceName in serviceNames) {
NSArray *statusNames = [json[@"dashboard"][serviceName] allKeys];
NSMutableArray *statusArray = [[NSMutableArray alloc] init];
for (NSString *statusName in statusNames) {
JPServiceStatus *status = [[JPServiceStatus alloc] init];
status.service = statusName;
NSArray *eventsJson = json[@"dashboard"][serviceName][statusName];
if (eventsJson.count > 0) {
NSMutableArray *events = [[NSMutableArray alloc] init];
for (NSDictionary *eventDictionary in eventsJson) {
NSInteger messageId = [eventDictionary[@"messageId"] integerValue];
NSUInteger index = [self.events indexOfObjectPassingTest:^BOOL(JPEvent *event, NSUInteger idx, BOOL *stop) {
if (event.messageId == messageId) {
return YES;
}
return NO;
}];
[events addObject:self.events[index]];
}
status.events = events;
}
[statusArray addObject:status];
}
[statusArray sortUsingComparator:^NSComparisonResult(JPServiceStatus *stat1, JPServiceStatus *stat2) {
return [stat1.service localizedCaseInsensitiveCompare:stat2.service];
}];
statusesDictionary[serviceName] = statusArray;
}
self.statuses = statusesDictionary;
[[NSNotificationCenter defaultCenter] postNotificationName:JPStatusUpdatedNotification object:self];
} else {
NSLog(@"Error: %@", error);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Unable to retrieve iCloud status"
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}
}];
}
- (void)fetchStatus:(void (^)(NSDictionary *json, NSError *error))completionBlock
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url = [NSURL URLWithString:JPStatusURL];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];
NSURLResponse *response;
NSError *error;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (data) {
//#define DUMMYDATA
#ifdef DUMMYDATA
NSString *path = [[NSBundle mainBundle] pathForResource:@"status_error" ofType:@"json"];
NSData *dummyData = [NSData dataWithContentsOfFile:path];
data = dummyData;
#endif
NSError *jsonError;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (json) {
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(json, nil);
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(nil, jsonError);
});
}
} else {
dispatch_async(dispatch_get_main_queue(), ^{
completionBlock(nil, error);
});
}
});
}
@end