forked from quicksilver/Quicksilver
-
Notifications
You must be signed in to change notification settings - Fork 1
/
QSObject_PropertyList.m
111 lines (93 loc) · 3.4 KB
/
QSObject_PropertyList.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
#import "QSObject_PropertyList.h"
#import "QSObject_StringHandling.h"
#import "QSResourceManager.h"
#import "QSTypes.h"
#define kQSObjectClass @"class"
@implementation QSObject (PropertyList)
+ (id)objectWithDictionary:(NSDictionary *)dictionary {
if(dictionary == nil)
return nil;
#ifdef DEBUG
if (DEBUG_UNPACKING && VERBOSE)
NSLog(@"%@ %@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), dictionary);
#endif
id obj = [dictionary objectForKey:kQSObjectClass];
if(obj)
obj = [[NSClassFromString(obj) alloc] initWithDictionary:dictionary];
if(!obj)
obj = [[self alloc] initWithDictionary:dictionary];
#ifdef DEBUG
if (!obj && DEBUG_UNPACKING)
NSLog(@"%@ %@ failed creating object with dict %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), dictionary);
#endif
return [obj autorelease];
}
+ (id)objectWithString:(NSString *)string name:(NSString *)aName type:(NSString *)aType {
return [[[QSObject alloc] initWithString:string name:aName type:aType] autorelease];
}
- (id)initWithString:(NSString *)string name:(NSString *)aName type:(NSString *)aType {
if (self = [self init]) {
[self setName:aName];
[self setPrimaryType:aType];
[data setObject:string forKey:aType];
[data setObject:string forKey:NSStringPboardType];
}
return self;
}
+ (id)objectWithType:(NSString *)type value:(id)value name:(NSString *)newName {
return[[(QSObject *)[QSObject alloc] initWithType:(NSString *)type value:(id)value name:(NSString *)newName] autorelease];
}
- (id)initWithType:(NSString *)type value:(id)value name:(NSString *)newName {
if (self = [self init]) {
[data setObject:value forKey:type];
[self setName:newName];
[self setPrimaryType:type];
}
return self;
}
+ (id)objectsWithDictionaryArray:(NSArray *)dictionaryArray {
NSMutableArray *dictObjectArray = [NSMutableArray arrayWithCapacity:[dictionaryArray count]];
for (id loopItem in dictionaryArray) {
@try {
[dictObjectArray addObject:[self objectWithDictionary:loopItem]];
}
@catch (NSException *e) {
NSLog(@"Bad Object Encountered: \"%@\" => %@", loopItem, e);
}
}
return dictObjectArray;
}
- (void)changeFilesToPaths {
id object = [data objectForKey:QSFilePathType]; //[self arrayForType:];
if (object)
[data setObject:[object valueForKey:@"stringByStandardizingPath"] forKey:QSFilePathType];
}
- (id)initWithDictionary:(NSDictionary *)dictionary {
#ifdef DEBUG
if (DEBUG_UNPACKING && VERBOSE)
NSLog(@"%@ %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
#endif
NSDictionary *dataDict = [dictionary objectForKey:kData];
NSDictionary *metaDict = [dictionary objectForKey:kMeta];
if (!dataDict && !metaDict)
return nil;
if (self = [self init]) {
[data setDictionary:dataDict];
[meta setDictionary:metaDict];
[self extractMetadata];
// ***warning * should this update the name for files?
id dup = [self findDuplicateOrRegisterID];
if (dup) return [dup retain];
if ([self containsType:QSFilePathType])
[self changeFilesToPaths];
}
return self;
}
- (NSDictionary *)dictionaryRepresentation {
return [NSDictionary dictionaryWithObjectsAndKeys:
data, kData,
meta, kMeta,
NSStringFromClass([self class]), kQSObjectClass,
nil];
}
@end