Fix compile errors
[pithos-ios] / Classes / Image.m
1 //
2 //  Image.m
3 //  OpenStack
4 //
5 //  Created by Mike Mayo on 10/1/10.
6 //  The OpenStack project is provided under the Apache 2.0 license.
7 //
8
9 #import "Image.h"
10 #import "NSObject+NSCoding.h"
11
12
13 @implementation Image
14
15 @synthesize status, created, updated, canBeLaunched;
16
17 #pragma mark -
18 #pragma mark Serialization
19
20 - (void)encodeWithCoder:(NSCoder *)coder {
21     [coder encodeObject:identifier forKey:@"id"];
22     [coder encodeObject:name forKey:@"name"];
23     [coder encodeObject:status forKey:@"status"];
24     [coder encodeObject:created forKey:@"created"];
25     [coder encodeObject:updated forKey:@"updated"];
26     [coder encodeBool:canBeLaunched forKey:@"canBeLaunched"];
27 }
28
29 - (id)initWithCoder:(NSCoder *)coder {
30     self = [super init];
31     if (self) {
32         identifier = [[coder decodeObjectForKey:@"id"] retain];
33         name = [[coder decodeObjectForKey:@"name"] retain];
34         status = [[coder decodeObjectForKey:@"status"] retain];
35         created = [[coder decodeObjectForKey:@"created"] retain];
36         updated = [[coder decodeObjectForKey:@"updated"] retain];
37         @try {
38             canBeLaunched = [coder decodeBoolForKey:@"canBeLaunched"];
39         }
40         @catch (NSException *exception) {
41             canBeLaunched = YES;
42         }        
43     }
44     return self;
45 }
46
47 - (id)copyWithZone:(NSZone *)zone {
48     Image *copy = [[Image allocWithZone:zone] init];
49     copy.identifier = self.identifier;
50     copy.name = self.name;
51     copy.status = self.status;
52     return copy;
53 }
54
55 #pragma mark -
56 #pragma mark JSON
57
58 + (Image *)fromJSON:(NSDictionary *)dict {
59     Image *image = [[[Image alloc] initWithJSONDict:dict] autorelease];
60 //    [self autoParse:&image fromJSONDict:dict];
61     image.status = [dict objectForKey:@"status"];
62     return image;
63 }
64
65 #pragma mark -
66 #pragma mark Logo
67
68 - (NSString *)logoPrefix {
69         if ([name hasPrefix:@"CentOS"]) {
70                 return @"centos";
71         } else if ([name hasPrefix:@"Gentoo"]) {
72                 return @"gentoo";
73         } else if ([name hasPrefix:@"Debian"]) {
74                 return @"debian";
75         } else if ([name hasPrefix:@"Fedora"]) {
76                 return @"fedora";
77         } else if ([name hasPrefix:@"Ubuntu"]) {
78                 return @"ubuntu";
79         } else if ([name hasPrefix:@"Arch"]) {
80                 return @"arch";
81         } else if ([name hasPrefix:@"Red Hat"]) {
82                 return @"redhat";
83         } else if ([name hasPrefix:@"Windows"]) {
84                 return @"windows";
85         } else {
86         return kCustomImage;
87         }
88 }
89
90 #pragma mark -
91 #pragma mark Comparison
92
93 // overriding to handle version numbers in image names to create a natural ordering
94 - (NSComparisonResult)compare:(ComputeModel *)aComputeModel {
95     NSComparisonResult result = NSOrderedSame;
96     NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
97     NSArray *tokensA = [self.name componentsSeparatedByString:@" "];
98     NSArray *tokensB = [aComputeModel.name componentsSeparatedByString:@" "];
99
100     for (int i = 0; (i < [tokensA count] && i < [tokensB count]) && result == NSOrderedSame; i++) {
101
102         NSString *tokenA = [tokensA objectAtIndex:i];
103         NSString *tokenB = [tokensB objectAtIndex:i];
104         
105         // problem: 8.04.2 is not a number, so we need to tokenize again on .
106         
107         NSArray *versionTokensA = [tokenA componentsSeparatedByString:@"."];
108         NSArray *versionTokensB = [tokenB componentsSeparatedByString:@"."];
109         
110         for (int j = 0; (j < [versionTokensA count] || j < [versionTokensB count]) && result == NSOrderedSame; j++) {
111             
112             NSString *versionTokenA = [versionTokensA objectAtIndex:j];
113             NSString *versionTokenB = [versionTokensB objectAtIndex:j];
114             NSNumber *numberA = [formatter numberFromString:versionTokenA];
115             NSNumber *numberB = [formatter numberFromString:versionTokenB];
116             
117             if (numberA && numberB) {
118                 result = [numberA compare:numberB];
119             } else {
120                 result = [versionTokenA compare:versionTokenB];
121             }
122         }
123         
124     }
125     [formatter release];
126     return result;
127 }
128
129
130 #pragma mark -
131 #pragma mark Memory Management
132
133 - (void)dealloc {
134     [status release];
135     [created release];
136     [updated release];
137     [super dealloc];
138 }
139
140 @end