-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdateCheck.m
More file actions
181 lines (159 loc) · 5.18 KB
/
updateCheck.m
File metadata and controls
181 lines (159 loc) · 5.18 KB
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
//
// updateCheck.m
//
//
// Created by Fredrik Wallner on 2008-03-31.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import "updateCheck.h"
@implementation updateCheck
- (IBAction)checkForUpdate:(id)sender
{
NSBundle *mainBundleForInfo = [NSBundle mainBundle];
NSURL *checkURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.wallner.nu/fredrik/software/update.php?program=%@&build=%@", [mainBundleForInfo objectForInfoDictionaryKey:@"CFBundleExecutable"], [mainBundleForInfo objectForInfoDictionaryKey:@"CFBundleVersion"]]];
if([[NSUserDefaults standardUserDefaults] valueForKey:@"Debug"])
NSLog([checkURL description]);
NSXMLDocument *xmlDoc;
NSError *err=nil;
if (!checkURL) {
[self updateError:@"Can't create the NSURL" sender:sender];
return;
}
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:checkURL
options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA)
error:&err];
if (xmlDoc == nil)
{
xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:checkURL
options:NSXMLDocumentTidyXML
error:&err];
}
if (xmlDoc == nil)
{
[self updateError:err
sender:sender];
return;
}
NSString *available = [self getStringAtXPath:@".//available"
from:xmlDoc];
if([available isEqualToString:@"yes"])
{
NSMutableString *updateText = [NSMutableString stringWithFormat:@"<center><h2>Version: %@ (%@)</h2>Release date: %@</center><br>", [self getStringAtXPath:@"./update/version" from:xmlDoc], [self getStringAtXPath:@"./update/build" from:xmlDoc], [self getStringAtXPath:@"./update/date" from:xmlDoc]];
[updateText appendString:@"<br><table><th>Release notes:</th>"];
NSArray *releases = [xmlDoc nodesForXPath:@".//releaseNotes/release"
error:&err];
if (err)
{
[self updateError:err
sender:sender];
return;
}
NSEnumerator *releaseEnum = [releases objectEnumerator];
NSXMLNode *releaseNode;
while(releaseNode = [releaseEnum nextObject])
{
[updateText appendFormat:@"<tr><td width=50 valign=top>%@</td><td><ul>", [self getStringAtXPath:@"./version" from:releaseNode]];
NSArray *notes = [releaseNode nodesForXPath:@"./note" error:&err];
if (err)
{
[self updateError:err
sender:sender];
return;
}
if ([notes count] > 0)
{
NSEnumerator *notesEnum = [notes objectEnumerator];
NSXMLNode *note;
while(note = [notesEnum nextObject])
[updateText appendFormat:@"<li>%@</li>", [note stringValue]];
}
[updateText appendString:@"</ul></td</tr>"];
}
[updateText appendString:@"</table>"];
downloadURL = [self getStringAtXPath:@".//link"
from:xmlDoc];
[downloadURL retain];
NSDictionary *docAttr;
NSMutableAttributedString *updateTextFormatted = [[NSAttributedString alloc] initWithHTML:[updateText dataUsingEncoding:NSUTF8StringEncoding]
documentAttributes:&docAttr];
[updateWindow makeKeyAndOrderFront:self];
[updateWindow setLevel:NSFloatingWindowLevel];
[[updateDetails textStorage] setAttributedString:updateTextFormatted];
[updateTextFormatted release], updateTextFormatted = nil;
[xmlDoc release], xmlDoc = nil;
}
else
if([sender isEqualTo:self])
NSLog(@"No update available");
else
[[NSAlert alertWithMessageText:@"No update available"
defaultButton:nil
alternateButton:nil
otherButton:nil
informativeTextWithFormat:@"You allready have the most recent version."] runModal];
}
- (void)updateError:(id)err sender:(id)sender
{
if(err)
{
if([sender isEqualTo:self])
NSLog(@"Error while checking for update: %@", [err description]);
else
[[NSAlert alertWithMessageText:@"Error"
defaultButton:nil
alternateButton:nil
otherButton:nil
informativeTextWithFormat:@"Error while checking for update: %@", [err description]] runModal];
}
}
- (NSString *)getStringAtXPath:(NSString *)path from:(id)xml
{
NSError *err;
NSArray *tempArray = [xml nodesForXPath:path
error:&err];
if (err) {
NSLog([err description]);
return nil;
}
if ([tempArray count] > 0)
return [[tempArray objectAtIndex:0] stringValue];
return nil;
}
- (IBAction)download:(id)sender;
{
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:downloadURL]];
[updateWindow close];
}
- (IBAction)toggleUpdateCheck:(id)sender;
{
if([[NSUserDefaults standardUserDefaults] boolForKey:@"disableUpdateCheck"])
{
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:FALSE]
forKey:@"disableUpdateCheck"];
[updateToggle setState:NSOffState];
}
else
{
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:TRUE]
forKey:@"disableUpdateCheck"];
[updateToggle setState:NSOnState];
}
}
/**
Implementation of dealloc, to release the retained variables.
*/
- (void) dealloc {
[downloadURL release], downloadURL = nil;
[super dealloc];
}
- (void)initialize;
{
if([[NSUserDefaults standardUserDefaults] boolForKey:@"disableUpdateCheck"])
[updateToggle setState:NSOnState];
else
{
[updateToggle setState:NSOffState];
[self checkForUpdate:self];
}
}
@end