-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathQSNetworkLocationSource.m
155 lines (125 loc) · 5.88 KB
/
QSNetworkLocationSource.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
#import "QSNetworkLocationSource.h"
#import <QSCore/QSCore.h>
#import <QSCore/QSNotifyMediator.h>
NSDictionary *getNetworkLocations(NSString **currentLocation){
NSString *string=nil;
if ( (bool)getenv("USERBREAK")){
NSLog(@"Skipping Network Locations");
return nil;
}else{
NSTask *getNetTask=[[[NSTask alloc] init]autorelease];
NSPipe *helpPipe=[NSPipe pipe];
[getNetTask setStandardError:helpPipe];
[getNetTask setStandardOutput:[NSPipe pipe]];
[getNetTask setLaunchPath:@"/usr/sbin/scselect"];
[getNetTask launch];
// NSLog(@"launch");
// [getNetTask waitUntilExit];
NSDate *startDate=[NSDate date];
while ([getNetTask isRunning]){
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; // *** this should be done better
if ([[NSDate date]timeIntervalSinceDate:startDate]>1){
NSLog(@"Giving up on network locations");
return nil;
}
}
// NSLog(@"exit");
NSFileHandle *output=[helpPipe fileHandleForReading];
string=[[[NSString alloc] initWithData:[output availableData] encoding:NSUTF8StringEncoding]autorelease];
}
string=@"";
NSString *networkIdentifier=nil;
NSString *name=nil;
NSString *prefixString=nil;
NSScanner *locationScanner=[NSScanner scannerWithString:string];
NSCharacterSet *spaceAndAsterixSet=[NSCharacterSet characterSetWithCharactersInString:@" *"];
NSMutableDictionary *locationDictionary=[NSMutableDictionary dictionaryWithCapacity:1];
[locationScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"\r\n"] intoString:&name];
while(![locationScanner isAtEnd]){
// NSLog(@"while");
[locationScanner scanCharactersFromSet:spaceAndAsterixSet intoString:&prefixString];
[locationScanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:&networkIdentifier];
[locationScanner scanUpToCharactersFromSet:[NSCharacterSet whitespaceAndNewlineCharacterSet] intoString:&name];
// NSLog(@"ScannedLocation (%@) (%@) (%@)",prefixString,networkIdentifier,name);
if ([name length]>2)
name=[name substringWithRange:NSMakeRange(1,[name length]-2)];
if (name && networkIdentifier)
[locationDictionary setObject:name forKey:networkIdentifier];
}
return locationDictionary;
}
void setNetworkLocation(NSString *location){
NSTask *setNetTask=[[[NSTask alloc] init]autorelease];
// NSPipe *helpPipe=[NSPipe pipe];
[setNetTask setLaunchPath:@"/usr/sbin/scselect"];
[setNetTask setArguments:[NSArray arrayWithObject:location]];
[setNetTask launch];
[setNetTask waitUntilExit];
}
@implementation QSNetworkLocationObjectSource
- (id)init{
if (self=[super init]){
[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange:) name:@"com.apple.system.config.network_change" object:nil];
}
return self;
}
- (void)networkChange:(NSNotification *)notif{
NSLog(@"Network Change");
}
- (BOOL)indexIsValidFromDate:(NSDate *)indexDate forEntry:(NSDictionary *)theEntry{
NSDate *modDate=[[[NSFileManager defaultManager] fileAttributesAtPath:@"/Library/Preferences/SystemConfiguration/preferences.plist" traverseLink:YES]fileModificationDate];
return [modDate compare:indexDate]==NSOrderedAscending;
}
- (NSImage *) iconForEntry:(NSDictionary *)dict{
return [QSResourceManager imageNamed:@"GenericNetworkIcon"];
}
- (NSString *)identifierForObject:(id <QSObject>)object{
return [@"[Network Location]:"stringByAppendingString:[object objectForType:QSNetworkLocationPasteboardType]];
}
- (NSArray *) objectsForEntry:(NSDictionary *)theEntry{
NSMutableArray *objects=[NSMutableArray arrayWithCapacity:1];
QSObject *newObject;
// NSDictionary *networkLocations=getNetworkLocations(nil); // *** could also get this from a plist. this might mess up international stuff
NSDictionary *networkLocations=[[NSDictionary dictionaryWithContentsOfFile:@"/Library/Preferences/SystemConfiguration/preferences.plist"]objectForKey:@"Sets"];
NSString *key;
NSEnumerator *networkEnumerator=[networkLocations keyEnumerator];
while(key=[networkEnumerator nextObject]){
newObject=[QSObject objectWithName:[NSString stringWithFormat:@"%@ Network Location",[[networkLocations objectForKey:key]objectForKey:@"UserDefinedName"]]];
[newObject setObject:key forType:QSNetworkLocationPasteboardType];
[newObject setPrimaryType:QSNetworkLocationPasteboardType];
[objects addObject:newObject];
}
return objects;
}
- (void)setQuickIconForObject:(QSObject *)object{
[object setIcon:[QSResourceManager imageNamed:@"GenericNetworkIcon"]];
}
@end
#define kQSNetworkLocationSelectAction @"QSNetworkLocationSelectAction"
@implementation QSNetworkLocationActionProvider
//- (NSArray *) types{
// return [NSArray arrayWithObject:QSNetworkLocationPasteboardType];
//}
//- (NSArray *) actions{
// QSAction *action=[QSAction actionWithIdentifier:kQSNetworkLocationSelectAction];
// [action setIcon:[QSResourceManager imageNamed:@"GenericNetworkIcon"]];
// [action setProvider:self];
// [action setAction:@selector(selectNetwork:)];
// [action setArgumentCount:1];
// return [NSArray arrayWithObject:action];
//}
//
//- (NSArray *)validActionsForDirectObject:(QSObject *)dObject indirectObject:(QSObject *)iObject{
// return [NSArray arrayWithObject:kQSNetworkLocationSelectAction];
//}
- (QSObject *) selectNetwork:(QSObject *)dObject{
setNetworkLocation([dObject objectForType:QSNetworkLocationPasteboardType]);
QSShowNotifierWithAttributes([NSDictionary dictionaryWithObjectsAndKeys:
@"QSiTunesTrackChangeNotification",QSNotifierType,
@"Network Changed",QSNotifierTitle,
[dObject name],QSNotifierText,
[QSResourceManager imageNamed:@"GenericNetworkIcon"], QSNotifierIcon,
nil]);
return nil;
}
@end