// // SharingDictionaryTransformer.m // pithos-macos // // Copyright 2011 GRNET S.A. All rights reserved. // // Redistribution and use in source and binary forms, with or // without modification, are permitted provided that the following // conditions are met: // // 1. Redistributions of source code must retain the above // copyright notice, this list of conditions and the following // disclaimer. // // 2. Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials // provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF // USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED // AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // The views and conclusions contained in the software and // documentation are those of the authors and should not be // interpreted as representing official policies, either expressed // or implied, of GRNET S.A. #import "SharingDictionaryTransformer.h" @implementation SharingDictionaryTransformer + (Class)transformedValueClass { return [NSMutableDictionary class]; } + (BOOL)allowsReverseTransformation { return YES; } - (id)transformedValue:(id)value { NSMutableDictionary *sharingDictionary = [NSMutableDictionary dictionary]; if (value == nil) return sharingDictionary; NSRange readRange = [(NSString *)value rangeOfString:@"read=" options:NSCaseInsensitiveSearch]; NSUInteger readStart = readRange.location + readRange.length; NSRange writeRange = [(NSString *)value rangeOfString:@"write=" options:NSCaseInsensitiveSearch]; NSUInteger writeStart = writeRange.location + writeRange.length; if (writeRange.length == 0) { if (readRange.length == 0) { return sharingDictionary; } for (NSString *readUser in [[(NSString *)value substringFromIndex:readStart] componentsSeparatedByString:@","]) { [sharingDictionary setValue:@"read" forKey:readUser]; } } else if (readRange.length == 0) { for (NSString *writeUser in [[(NSString *)value substringFromIndex:writeStart] componentsSeparatedByString:@","]) { [sharingDictionary setValue:@"write" forKey:writeUser]; } } else if (readRange.location < writeRange.location) { NSRange semicolonRange = [(NSString *)value rangeOfString:@";"]; for (NSString *readUser in [[(NSString *)value substringWithRange:NSMakeRange(readStart, semicolonRange.location - readStart)] componentsSeparatedByString:@","]) { [sharingDictionary setValue:@"read" forKey:readUser]; } for (NSString *writeUser in [[(NSString *)value substringFromIndex:writeStart] componentsSeparatedByString:@","]) { [sharingDictionary setValue:@"write" forKey:writeUser]; } } else { NSRange semicolonRange = [(NSString *)value rangeOfString:@";"]; for (NSString *readUser in [[(NSString *)value substringFromIndex:readStart] componentsSeparatedByString:@","]) { [sharingDictionary setValue:@"read" forKey:readUser]; } for (NSString *writeUser in [[(NSString *)value substringWithRange:NSMakeRange(writeStart, semicolonRange.location - writeStart)] componentsSeparatedByString:@","]) { [sharingDictionary setValue:@"write" forKey:writeUser]; } } return sharingDictionary; } - (id)reverseTransformedValue:(id)value { if (value == nil || ([(NSMutableDictionary *)value count] == 0)) return nil; NSString *readSharingString = nil; NSArray *readUsers = [(NSMutableDictionary *)value allKeysForObject:@"read"]; if ([readUsers count]) readSharingString = [NSString stringWithFormat:@"read=%@", [readUsers componentsJoinedByString:@","]]; NSString *writeSharingString = nil; NSArray *writeUsers = [(NSMutableDictionary *)value allKeysForObject:@"write"]; if ([writeUsers count]) writeSharingString = [NSString stringWithFormat:@"write=%@", [writeUsers componentsJoinedByString:@","]]; if (readSharingString) { if (writeSharingString) { return [NSString stringWithFormat:@"%@;%@", readSharingString, writeSharingString]; } return readSharingString; } else { return writeSharingString; } } + (void)initialize { [[NSValueTransformer class] setValueTransformer:[self new] forName:@"SharingDictionaryTransformer"]; } @end