X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=Classes%2FNJMapping.m;h=355dbccdf58951959b52f630ad841665626ccea7;hp=8cc572407945ac02b21a1171123e94e884a16995;hb=93c9d4bc39c6addbab6dbc7878d3684e42bbdc01;hpb=1d9578185de7fb08cf1f4b1e42812e87d8e18040 diff --git a/Classes/NJMapping.m b/Classes/NJMapping.m index 8cc5724..355dbcc 100644 --- a/Classes/NJMapping.m +++ b/Classes/NJMapping.m @@ -10,16 +10,39 @@ #import "NJInput.h" #import "NJOutput.h" -@implementation NJMapping +@implementation NJMapping { + NSMutableDictionary *_entries; +} + +// Extra checks during initialization because the data is often loaded +// from untrusted serializations. - (id)initWithName:(NSString *)name { if ((self = [super init])) { - self.name = name ? name : @"Untitled"; + self.name = [name isKindOfClass:NSString.class] ? name : @"Untitled"; _entries = [[NSMutableDictionary alloc] init]; } return self; } +- (id)initWithSerialization:(NSDictionary *)serialization + mappings:(NSArray *)mappings { + if ((self = [self initWithName:serialization[@"name"]])) { + NSDictionary *entries = serialization[@"entries"]; + if ([entries isKindOfClass:NSDictionary.class]) { + for (id key in entries) { + if ([key isKindOfClass:NSString.class]) { + NJOutput *output = [NJOutput outputDeserialize:entries[key] + withMappings:mappings]; + if (output) + _entries[key] = output; + } + } + } + } + return self; +} + - (NJOutput *)objectForKeyedSubscript:(NJInput *)input { return input ? _entries[input.uid] : nil; } @@ -54,6 +77,21 @@ return success; } +- (NSUInteger)count { + return _entries.count; +} + +- (BOOL)hasConflictWith:(NJMapping *)other { + if (other.count < self.count) + return [other hasConflictWith:self]; + for (NSString *uid in _entries) { + NJOutput *output = other->_entries[uid]; + if (output && ![output isEqual:_entries[uid]]) + return YES; + } + return NO; +} + + (id)mappingWithContentsOfURL:(NSURL *)url mappings:(NSArray *)mappings error:(NSError **)error { NSInputStream *stream = [NSInputStream inputStreamWithURL:url]; [stream open]; @@ -74,18 +112,13 @@ return nil; } - NSDictionary *entries = serialization[@"entries"]; - NJMapping *mapping = [[NJMapping alloc] initWithName:serialization[@"name"]]; - for (id key in entries) { - NSDictionary *value = entries[key]; - if ([key isKindOfClass:NSString.class]) { - NJOutput *output = [NJOutput outputDeserialize:value - withMappings:mappings]; - if (output) - mapping.entries[key] = output; - } - } - return mapping; + return [[NJMapping alloc] initWithSerialization:serialization + mappings:mappings]; +} + +- (void)mergeEntriesFrom:(NJMapping *)other { + if (other) + [_entries addEntriesFromDictionary:other->_entries]; } @end