root / pithos-macos / PithosLocalObjectState.m @ 3740ba57
History | View | Annotate | Download (7 kB)
1 | 0224a49f | Miltiadis Vasilakis | // |
---|---|---|---|
2 | 0224a49f | Miltiadis Vasilakis | // PithosLocalObjectState.m |
3 | 0224a49f | Miltiadis Vasilakis | // pithos-macos |
4 | 0224a49f | Miltiadis Vasilakis | // |
5 | 0224a49f | Miltiadis Vasilakis | // Copyright 2011 GRNET S.A. All rights reserved. |
6 | 0224a49f | Miltiadis Vasilakis | // |
7 | 0224a49f | Miltiadis Vasilakis | // Redistribution and use in source and binary forms, with or |
8 | 0224a49f | Miltiadis Vasilakis | // without modification, are permitted provided that the following |
9 | 0224a49f | Miltiadis Vasilakis | // conditions are met: |
10 | 0224a49f | Miltiadis Vasilakis | // |
11 | 0224a49f | Miltiadis Vasilakis | // 1. Redistributions of source code must retain the above |
12 | 0224a49f | Miltiadis Vasilakis | // copyright notice, this list of conditions and the following |
13 | 0224a49f | Miltiadis Vasilakis | // disclaimer. |
14 | 0224a49f | Miltiadis Vasilakis | // |
15 | 0224a49f | Miltiadis Vasilakis | // 2. Redistributions in binary form must reproduce the above |
16 | 0224a49f | Miltiadis Vasilakis | // copyright notice, this list of conditions and the following |
17 | 0224a49f | Miltiadis Vasilakis | // disclaimer in the documentation and/or other materials |
18 | 0224a49f | Miltiadis Vasilakis | // provided with the distribution. |
19 | 0224a49f | Miltiadis Vasilakis | // |
20 | 0224a49f | Miltiadis Vasilakis | // THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS |
21 | 0224a49f | Miltiadis Vasilakis | // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
22 | 0224a49f | Miltiadis Vasilakis | // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
23 | 0224a49f | Miltiadis Vasilakis | // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR |
24 | 0224a49f | Miltiadis Vasilakis | // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
25 | 0224a49f | Miltiadis Vasilakis | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
26 | 0224a49f | Miltiadis Vasilakis | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
27 | 0224a49f | Miltiadis Vasilakis | // USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
28 | 0224a49f | Miltiadis Vasilakis | // AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
29 | 0224a49f | Miltiadis Vasilakis | // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
30 | 0224a49f | Miltiadis Vasilakis | // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
31 | 0224a49f | Miltiadis Vasilakis | // POSSIBILITY OF SUCH DAMAGE. |
32 | 0224a49f | Miltiadis Vasilakis | // |
33 | 0224a49f | Miltiadis Vasilakis | // The views and conclusions contained in the software and |
34 | 0224a49f | Miltiadis Vasilakis | // documentation are those of the authors and should not be |
35 | 0224a49f | Miltiadis Vasilakis | // interpreted as representing official policies, either expressed |
36 | 0224a49f | Miltiadis Vasilakis | // or implied, of GRNET S.A. |
37 | 0224a49f | Miltiadis Vasilakis | |
38 | 0224a49f | Miltiadis Vasilakis | #import "PithosLocalObjectState.h" |
39 | 0224a49f | Miltiadis Vasilakis | #import "PithosUtilities.h" |
40 | e637fedf | Miltiadis Vasilakis | #import "HashMapHash.h" |
41 | 0224a49f | Miltiadis Vasilakis | |
42 | 0224a49f | Miltiadis Vasilakis | @implementation PithosLocalObjectState |
43 | 5e5eeeaa | Miltiadis Vasilakis | @synthesize filePath, isDirectory, hash, tmpFilePath, fileModificationDate, fileSize; |
44 | 0224a49f | Miltiadis Vasilakis | |
45 | 0224a49f | Miltiadis Vasilakis | #pragma mark - |
46 | 0224a49f | Miltiadis Vasilakis | #pragma mark Object Lifecycle |
47 | 0224a49f | Miltiadis Vasilakis | |
48 | df003f06 | Miltiadis Vasilakis | - (id)initWithFile:(NSString *)aFilePath blockHash:(NSString *)blockHash blockSize:(NSUInteger)blockSize { |
49 | e637fedf | Miltiadis Vasilakis | if ((self = [self init])) { |
50 | df003f06 | Miltiadis Vasilakis | self.filePath = aFilePath; |
51 | e637fedf | Miltiadis Vasilakis | if ([[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory] && !isDirectory) { |
52 | 5e5eeeaa | Miltiadis Vasilakis | self.hash = [HashMapHash calculateHashMapHash:[HashMapHash calculateObjectHashMap:filePath |
53 | 3a5dc79d | Miltiadis Vasilakis | withBlockHash:blockHash |
54 | 3a5dc79d | Miltiadis Vasilakis | andBlockSize:blockSize]]; |
55 | e637fedf | Miltiadis Vasilakis | } |
56 | e637fedf | Miltiadis Vasilakis | } |
57 | e637fedf | Miltiadis Vasilakis | return self; |
58 | e637fedf | Miltiadis Vasilakis | } |
59 | e637fedf | Miltiadis Vasilakis | |
60 | e637fedf | Miltiadis Vasilakis | - (id)initWithHash:(NSString *)aHash directory:(BOOL)anIsDirectory { |
61 | e637fedf | Miltiadis Vasilakis | if ((self = [self init])) { |
62 | e637fedf | Miltiadis Vasilakis | if (anIsDirectory) |
63 | e637fedf | Miltiadis Vasilakis | isDirectory = YES; |
64 | e637fedf | Miltiadis Vasilakis | else if ([aHash length] == 64) |
65 | 3a5dc79d | Miltiadis Vasilakis | self.hash = aHash; |
66 | e637fedf | Miltiadis Vasilakis | } |
67 | e637fedf | Miltiadis Vasilakis | return self; |
68 | e637fedf | Miltiadis Vasilakis | } |
69 | e637fedf | Miltiadis Vasilakis | |
70 | e637fedf | Miltiadis Vasilakis | + (id)localObjectState { |
71 | e637fedf | Miltiadis Vasilakis | return [[[self alloc] init] autorelease]; |
72 | e637fedf | Miltiadis Vasilakis | } |
73 | e637fedf | Miltiadis Vasilakis | |
74 | df003f06 | Miltiadis Vasilakis | + (id)localObjectStateWithFile:(NSString *)aFilePath blockHash:(NSString *)blockHash blockSize:(NSUInteger)blockSize { |
75 | df003f06 | Miltiadis Vasilakis | return [[[self alloc] initWithFile:aFilePath blockHash:blockHash blockSize:blockSize] autorelease]; |
76 | e637fedf | Miltiadis Vasilakis | } |
77 | e637fedf | Miltiadis Vasilakis | |
78 | e637fedf | Miltiadis Vasilakis | + (id)localObjectStateWithHash:(NSString *)aHash directory:(BOOL)anIsDirectory { |
79 | e637fedf | Miltiadis Vasilakis | return [[[self alloc] initWithHash:aHash directory:anIsDirectory] autorelease]; |
80 | 0224a49f | Miltiadis Vasilakis | } |
81 | 0224a49f | Miltiadis Vasilakis | |
82 | 0224a49f | Miltiadis Vasilakis | - (void)dealloc { |
83 | 5e5eeeaa | Miltiadis Vasilakis | [fileSize release]; |
84 | 5e5eeeaa | Miltiadis Vasilakis | [fileModificationDate release]; |
85 | 145a4c71 | Miltiadis Vasilakis | self.tmpFilePath = nil; |
86 | 145a4c71 | Miltiadis Vasilakis | [filePath release]; |
87 | 3a5dc79d | Miltiadis Vasilakis | [hash release]; |
88 | 0224a49f | Miltiadis Vasilakis | [super dealloc]; |
89 | 0224a49f | Miltiadis Vasilakis | } |
90 | 0224a49f | Miltiadis Vasilakis | |
91 | e637fedf | Miltiadis Vasilakis | - (NSString *)description { |
92 | 5e5eeeaa | Miltiadis Vasilakis | return [NSString stringWithFormat:@"hash: %@, filePath: %@, isDirectory: %d, fileModificationDate: %@, fileSize: %@", |
93 | 5e5eeeaa | Miltiadis Vasilakis | hash, filePath, isDirectory, fileModificationDate, fileSize]; |
94 | e637fedf | Miltiadis Vasilakis | } |
95 | e637fedf | Miltiadis Vasilakis | |
96 | e637fedf | Miltiadis Vasilakis | - (BOOL)isEqualToState:(PithosLocalObjectState *)aState { |
97 | e637fedf | Miltiadis Vasilakis | if (self.isDirectory) |
98 | e637fedf | Miltiadis Vasilakis | // Object is a directory, check the other |
99 | e637fedf | Miltiadis Vasilakis | return aState.isDirectory; |
100 | e637fedf | Miltiadis Vasilakis | else if (aState.isDirectory) |
101 | e637fedf | Miltiadis Vasilakis | // Object is not a directory, while the other is |
102 | e637fedf | Miltiadis Vasilakis | return NO; |
103 | 5e5eeeaa | Miltiadis Vasilakis | else if (![self exists]) |
104 | e637fedf | Miltiadis Vasilakis | // Object doesn't exist, check the other |
105 | 5e5eeeaa | Miltiadis Vasilakis | return (![aState exists]); |
106 | 5e5eeeaa | Miltiadis Vasilakis | else if (![aState exists]) |
107 | e637fedf | Miltiadis Vasilakis | // Object exists, while the other doesn't |
108 | e637fedf | Miltiadis Vasilakis | return NO; |
109 | e637fedf | Miltiadis Vasilakis | else |
110 | 3a5dc79d | Miltiadis Vasilakis | // Both objects exist, check that they have the same hash |
111 | 3a5dc79d | Miltiadis Vasilakis | return [self.hash isEqualToString:aState.hash]; |
112 | e637fedf | Miltiadis Vasilakis | } |
113 | e637fedf | Miltiadis Vasilakis | |
114 | 0224a49f | Miltiadis Vasilakis | #pragma mark - |
115 | 0224a49f | Miltiadis Vasilakis | #pragma mark Properties |
116 | 0224a49f | Miltiadis Vasilakis | |
117 | 0224a49f | Miltiadis Vasilakis | - (void)setIsDirectory:(BOOL)anIsDirectory { |
118 | 0224a49f | Miltiadis Vasilakis | isDirectory = anIsDirectory; |
119 | 0224a49f | Miltiadis Vasilakis | if (isDirectory) { |
120 | 3a5dc79d | Miltiadis Vasilakis | self.hash = nil; |
121 | 145a4c71 | Miltiadis Vasilakis | self.tmpFilePath = nil; |
122 | 0224a49f | Miltiadis Vasilakis | } |
123 | 0224a49f | Miltiadis Vasilakis | } |
124 | 0224a49f | Miltiadis Vasilakis | |
125 | 145a4c71 | Miltiadis Vasilakis | - (void)setTmpFilePath:(NSString *)aTmpFilePath { |
126 | 145a4c71 | Miltiadis Vasilakis | if (![tmpFilePath isEqualToString:aTmpFilePath]) { |
127 | 145a4c71 | Miltiadis Vasilakis | if (!aTmpFilePath) { |
128 | 0224a49f | Miltiadis Vasilakis | NSFileManager *fileManager = [NSFileManager defaultManager]; |
129 | 145a4c71 | Miltiadis Vasilakis | if ([fileManager fileExistsAtPath:tmpFilePath]) { |
130 | 0224a49f | Miltiadis Vasilakis | NSError *error = nil; |
131 | 145a4c71 | Miltiadis Vasilakis | if (![fileManager removeItemAtPath:tmpFilePath error:&error] || error) |
132 | 0224a49f | Miltiadis Vasilakis | [PithosUtilities fileActionFailedAlertWithTitle:@"Remove File Error" |
133 | 145a4c71 | Miltiadis Vasilakis | message:[NSString stringWithFormat:@"Cannot remove file at '%@'", tmpFilePath] |
134 | 0224a49f | Miltiadis Vasilakis | error:error]; |
135 | 0224a49f | Miltiadis Vasilakis | } |
136 | 0224a49f | Miltiadis Vasilakis | } |
137 | 145a4c71 | Miltiadis Vasilakis | [tmpFilePath release]; |
138 | 145a4c71 | Miltiadis Vasilakis | tmpFilePath = [aTmpFilePath retain]; |
139 | 0224a49f | Miltiadis Vasilakis | } |
140 | 0224a49f | Miltiadis Vasilakis | } |
141 | 0224a49f | Miltiadis Vasilakis | |
142 | e637fedf | Miltiadis Vasilakis | - (void)setHash:(NSString *)aHash { |
143 | 3a5dc79d | Miltiadis Vasilakis | [hash release]; |
144 | 3a5dc79d | Miltiadis Vasilakis | if ([aHash length] == 64) |
145 | 3a5dc79d | Miltiadis Vasilakis | hash = [aHash retain]; |
146 | 3a5dc79d | Miltiadis Vasilakis | else |
147 | 3a5dc79d | Miltiadis Vasilakis | hash = nil; |
148 | 5e5eeeaa | Miltiadis Vasilakis | if (filePath) { |
149 | 5e5eeeaa | Miltiadis Vasilakis | NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; |
150 | 5e5eeeaa | Miltiadis Vasilakis | self.fileModificationDate = [attributes objectForKey:NSFileModificationDate]; |
151 | 5e5eeeaa | Miltiadis Vasilakis | self.fileSize = [attributes objectForKey:NSFileSize]; |
152 | 5e5eeeaa | Miltiadis Vasilakis | } else { |
153 | 5e5eeeaa | Miltiadis Vasilakis | self.fileModificationDate = nil; |
154 | 5e5eeeaa | Miltiadis Vasilakis | self.fileSize = nil; |
155 | 5e5eeeaa | Miltiadis Vasilakis | } |
156 | 5e5eeeaa | Miltiadis Vasilakis | } |
157 | 5e5eeeaa | Miltiadis Vasilakis | |
158 | 5e5eeeaa | Miltiadis Vasilakis | #pragma mark - |
159 | 5e5eeeaa | Miltiadis Vasilakis | #pragma mark Methods |
160 | 5e5eeeaa | Miltiadis Vasilakis | |
161 | 5e5eeeaa | Miltiadis Vasilakis | - (BOOL)exists { |
162 | 5e5eeeaa | Miltiadis Vasilakis | return (isDirectory || hash); |
163 | 5e5eeeaa | Miltiadis Vasilakis | } |
164 | 5e5eeeaa | Miltiadis Vasilakis | |
165 | 5e5eeeaa | Miltiadis Vasilakis | - (BOOL)isModified { |
166 | 5e5eeeaa | Miltiadis Vasilakis | NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; |
167 | 5e5eeeaa | Miltiadis Vasilakis | return (![fileSize isEqualToNumber:[attributes objectForKey:NSFileSize]] || |
168 | 5e5eeeaa | Miltiadis Vasilakis | ![fileModificationDate isEqualToDate:[attributes objectForKey:NSFileModificationDate]]); |
169 | e637fedf | Miltiadis Vasilakis | } |
170 | e637fedf | Miltiadis Vasilakis | |
171 | 0224a49f | Miltiadis Vasilakis | #pragma mark - |
172 | 0224a49f | Miltiadis Vasilakis | #pragma mark NSCoding |
173 | 0224a49f | Miltiadis Vasilakis | |
174 | 0224a49f | Miltiadis Vasilakis | - (id)initWithCoder:(NSCoder *)decoder { |
175 | 0224a49f | Miltiadis Vasilakis | if ((self = [super init])) { |
176 | 3a5dc79d | Miltiadis Vasilakis | self.hash = [decoder decodeObjectForKey:@"hash"]; |
177 | df003f06 | Miltiadis Vasilakis | self.filePath = [decoder decodeObjectForKey:@"filePath"]; |
178 | 0224a49f | Miltiadis Vasilakis | self.isDirectory = [decoder decodeBoolForKey:@"isDirectory"]; |
179 | 145a4c71 | Miltiadis Vasilakis | self.tmpFilePath = [decoder decodeObjectForKey:@"tmpFilePath"]; |
180 | 5e5eeeaa | Miltiadis Vasilakis | self.fileModificationDate = [decoder decodeObjectForKey:@"fileModificationDate"]; |
181 | 5e5eeeaa | Miltiadis Vasilakis | self.fileSize = [decoder decodeObjectForKey:@"fileSize"]; |
182 | 0224a49f | Miltiadis Vasilakis | } |
183 | 0224a49f | Miltiadis Vasilakis | return self; |
184 | 0224a49f | Miltiadis Vasilakis | } |
185 | 0224a49f | Miltiadis Vasilakis | |
186 | 0224a49f | Miltiadis Vasilakis | - (void)encodeWithCoder:(NSCoder *)encoder { |
187 | 3a5dc79d | Miltiadis Vasilakis | [encoder encodeObject:hash forKey:@"hash"]; |
188 | df003f06 | Miltiadis Vasilakis | [encoder encodeObject:filePath forKey:@"filePath"]; |
189 | 0224a49f | Miltiadis Vasilakis | [encoder encodeBool:isDirectory forKey:@"isDirectory"]; |
190 | 145a4c71 | Miltiadis Vasilakis | [encoder encodeObject:tmpFilePath forKey:@"tmpFilePath"]; |
191 | 5e5eeeaa | Miltiadis Vasilakis | [encoder encodeObject:fileModificationDate forKey:@"fileModificationDate"]; |
192 | 5e5eeeaa | Miltiadis Vasilakis | [encoder encodeObject:fileSize forKey:@"fileSize"]; |
193 | 0224a49f | Miltiadis Vasilakis | } |
194 | 0224a49f | Miltiadis Vasilakis | |
195 | 0224a49f | Miltiadis Vasilakis | @end |