Expanded open file functionality to use available apps.
[pithos-ios] / Classes / Folder.m
1 //
2 //  Folder.m
3 //  OpenStack
4 //
5 //  Created by Mike Mayo on 12/7/10.
6 //  The OpenStack project is provided under the Apache 2.0 license.
7 //
8
9 #import "Folder.h"
10 #import "StorageObject.h"
11 #import "NSObject+NSCoding.h"
12
13
14 @implementation Folder
15
16 @synthesize name, parent, folders, objects, metadata;
17
18 + (id)folder {
19         Folder *folder = [[[self alloc] init] autorelease];
20         folder.folders = [[NSMutableDictionary alloc] init];
21         folder.objects = [[NSMutableDictionary alloc] init];
22         return folder;
23 }
24
25 #pragma mark -
26 #pragma mark Serialization
27
28 - (id)init {
29     if (self = [super init]) {
30         self.folders = [[NSMutableDictionary alloc] init];
31         self.objects = [[NSMutableDictionary alloc] init];
32     }
33     return self;
34 }
35
36 - (void)encodeWithCoder:(NSCoder *)coder {
37     [self autoEncodeWithCoder:coder];
38     /*
39     [coder encodeObject:name forKey:@"name"];
40     [coder encodeObject:parent forKey:@"parent"];
41     [coder encodeObject:folders forKey:@"folders"];
42     [coder encodeObject:objects forKey:@"objects"];
43      */
44 }
45
46 - (id)initWithCoder:(NSCoder *)coder {
47     if (self = [super init]) {
48         [self autoDecode:coder];
49         /*
50         name = [[coder decodeObjectForKey:@"name"] retain];
51         parent = [[coder decodeObjectForKey:@"parent"] retain];
52         folders = [[coder decodeObjectForKey:@"folders"] retain];
53         objects = [[coder decodeObjectForKey:@"objects"] retain];
54          */
55     }
56     return self;
57 }
58
59
60 - (void)setObjects:(NSMutableDictionary *)objs {
61     if (self.objects != objs) {
62         [self.objects release];
63         
64         NSMutableDictionary *folderedFiles = [[NSMutableDictionary alloc] init];
65         NSMutableDictionary *files = [[NSMutableDictionary alloc] init];
66         folders = [[NSMutableDictionary alloc] init];
67
68         for (NSString *key in objs) {
69             StorageObject *object = [objs objectForKey:key];
70             
71             NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"/" options:NSRegularExpressionCaseInsensitive error:nil];            
72             NSInteger matches = [regex numberOfMatchesInString:object.name options:0 range:NSMakeRange(0, [object.name length])];
73
74             if (matches > 0) {
75                 // build up the folder structure
76                 NSArray *components = [object.name componentsSeparatedByString:@"/"];
77                 NSString *folderName = [components objectAtIndex:0];                
78                 object.name = [components lastObject];
79                 
80                 for (int i = [components count] - 2; i > 0; i--) {
81                     object.name = [NSString stringWithFormat:@"%@/%@", [components objectAtIndex:i], object.name];
82                 }
83
84                 if (![folderedFiles objectForKey:folderName]) {
85                     [folderedFiles setObject:[[NSMutableDictionary alloc] init] forKey:folderName];
86                 }
87
88                 NSMutableDictionary *files = [folderedFiles objectForKey:folderName];
89                 [files setObject:object forKey:object.name];
90                 
91             } else if ([object.contentType isEqualToString:@"application/directory"]) {
92                 Folder *folder = [[Folder alloc] init];
93                 folder.name = object.name;
94                 folder.parent = self;
95                 folder.metadata = object.metadata;    
96                 [self.folders setObject:folder forKey:folder.name];
97                 [folder release];
98             } else {
99                 // put the files in this folder                
100                 [files setObject:object forKey:object.name];
101             }
102         }
103         
104         // take the foldered files and recursively build the rest of the folder structure
105         NSArray *keys = [folderedFiles allKeys];
106         for (int i = 0; i < [keys count]; i++) {
107             NSString *folderName = [keys objectAtIndex:i];
108             NSMutableDictionary *files = [folderedFiles objectForKey:folderName];
109             Folder *folder = [[Folder alloc] init];
110             folder.name = folderName;
111             folder.parent = self;
112             folder.objects = files;
113             StorageObject *object = [objs objectForKey:folderName];
114             folder.metadata = object.metadata;
115             [self.folders setObject:folder forKey:folder.name];
116             [folder release];
117         }
118         
119         [folderedFiles release];
120         
121         objects = files;
122     }
123 }
124
125 - (NSArray *)sortedContents {
126     NSMutableArray *contents = [[NSMutableArray alloc] initWithArray:[self.folders allValues]];
127     [contents addObjectsFromArray:[self.objects allValues]];
128     if (!sortedContents || [sortedContents count] != [contents count]) {
129         sortedContents = [[NSArray alloc] initWithArray:[contents sortedArrayUsingSelector:@selector(compare:)]];
130     }
131     [contents release];
132     return sortedContents;
133 }
134
135 - (NSComparisonResult)compare:(Folder *)aFolder {
136     return [self.name caseInsensitiveCompare:aFolder.name];
137 }
138
139 - (NSString *)fullPath {
140     NSString *result = self.name;
141     if (parent) {
142         result = [NSString stringWithFormat:@"%@/%@", [parent fullPath], self.name];
143     }
144     if (!result) {
145         result = @"";
146     }
147     return result;
148 }
149
150 -(void)dealloc {
151         [name release];
152         [parent release];
153         [folders release];
154         [objects release];
155     [sortedContents release];
156         [super dealloc];
157 }
158
159 @end