├── .gitignore ├── .idea ├── TumblrKit.iml ├── encodings.xml ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── scopes │ └── scope_settings.xml ├── vcs.xml └── xcode.xml ├── English.lproj └── InfoPlist.strings ├── Info.plist ├── MIT-LICENSE.txt ├── NSDictionary+TumblrKit.h ├── NSDictionary+TumblrKit.m ├── NSString+TumblrKit.h ├── NSString+TumblrKit.m ├── README.md ├── TKPost.h ├── TKPost.m ├── TKPostsRequest.h ├── TKPostsRequest.m ├── TKPostsResponse.h ├── TKPostsResponse.m ├── TKRequest.h ├── TKRequest.m ├── TKTumblelog.h ├── TKTumblelog.m ├── TKTumblelogsRequest.h ├── TKTumblelogsRequest.m ├── TKTumblelogsResponse.h ├── TKTumblelogsResponse.m ├── TKTumblr.h ├── TKTumblr.m ├── TKTumblrReadRequest.h ├── TKTumblrReadRequest.m ├── TumblrKit Tests for Mac ├── TumblrKit Tests for Mac-Info.plist ├── TumblrKit Tests for Mac-Prefix.pch ├── TumblrKit_Tests_for_Mac.h ├── TumblrKit_Tests_for_Mac.m └── en.lproj │ └── InfoPlist.strings ├── TumblrKit Tests for iOS ├── TKTumblelogsRequestTests.h ├── TKTumblelogsRequestTests.m ├── TumblrKit Tests for iOS-Info.plist ├── TumblrKit Tests for iOS-Prefix.pch ├── TumblrKit_Tests_for_iOS.h ├── TumblrKit_Tests_for_iOS.m └── en.lproj │ └── InfoPlist.strings ├── TumblrKit for Mac ├── TumblrKit for Mac-Info.plist ├── TumblrKit for Mac-Prefix.pch ├── TumblrKit_for_Mac.h ├── TumblrKit_for_Mac.m └── en.lproj │ └── InfoPlist.strings ├── TumblrKit for iOS ├── TumblrKit for iOS-Prefix.pch ├── TumblrKit_for_iOS.h └── TumblrKit_for_iOS.m ├── TumblrKit.xcodeproj ├── igorsutton.mode2v3 └── project.pbxproj └── doxygen.config /.gitignore: -------------------------------------------------------------------------------- 1 | # XCode noise 2 | build/ 3 | *.mode1v3 4 | *.pbxuser 5 | *.perspectivev3 6 | *.xcodeproj/project.xcworkspace/* 7 | *.xcodeproj/xcuserdata/* 8 | 9 | # OSX noise 10 | .DS_Store 11 | profile 12 | 13 | # Doxygen 14 | *.docset/ 15 | html/ 16 | latex/ 17 | 18 | # shared objects 19 | *.dylib 20 | -------------------------------------------------------------------------------- /.idea/TumblrKit.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | http://www.w3.org/1999/xhtml 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/xcode.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.github.isutton.${PRODUCT_NAME:rfc1034Identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /MIT-LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Copyright (c) 2010, 2011 TumblrKit 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in 12 | all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | 22 | -------------------------------------------------------------------------------- /NSDictionary+TumblrKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | /** 24 | TumblrKit's additions to NSDictionary. 25 | */ 26 | @interface NSDictionary (TumblrKit) 27 | 28 | - (NSData *)multipartMIMEData; 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /NSDictionary+TumblrKit.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "NSDictionary+TumblrKit.h" 24 | #import "NSString+TumblrKit.h" 25 | 26 | @implementation NSDictionary (TumblrKit) 27 | 28 | - (NSData *)multipartMIMEData 29 | { 30 | NSString *format = @"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n"; 31 | NSMutableData *result = [NSMutableData data]; 32 | NSMutableDictionary *dict_ = [self mutableCopy]; 33 | 34 | // Hack: it seems the order we send the data in the HTTP post body matter 35 | // in the Tumblr API. We'll remove the "type" object from the dictionary 36 | // we copied and append its value as first thing, then we'll iterate the 37 | // remaining keys. The impressive part is it worked directly when TumblrKit 38 | // was compiled in 32 bit mode (where "type" was the first item to be encoded) 39 | // but didn't work in 64 bit mode. It seems the architecture affects the 40 | // sort of the keys, but we should not rely on that anyway (nor should the 41 | // Tumblr API engineers :-) 42 | 43 | id value = [dict_ objectForKey:@"type"]; 44 | [dict_ removeObjectForKey:@"type"]; 45 | [result appendData:[[NSString stringWithFormat:format, [NSString MIMEBoundary], @"type", value] dataUsingEncoding:NSUTF8StringEncoding]]; 46 | 47 | for (NSString *key in dict_) { 48 | if ([key isEqualToString:@"data"]) { 49 | [result appendData:[[NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n", [NSString MIMEBoundary], key] dataUsingEncoding:NSUTF8StringEncoding]]; 50 | [result appendData:[dict_ objectForKey:key]]; 51 | [result appendData:[@"\n" dataUsingEncoding:NSUTF8StringEncoding]]; 52 | } 53 | else { 54 | [result appendData:[[NSString stringWithFormat:format, [NSString MIMEBoundary], key, [dict_ objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]]; 55 | } 56 | } 57 | 58 | [result appendData:[[NSString stringWithFormat:@"--%@--\r\n", [NSString MIMEBoundary]] dataUsingEncoding:NSUTF8StringEncoding]]; 59 | 60 | return result; 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /NSString+TumblrKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import 24 | 25 | @interface NSString (TumblrKit) 26 | 27 | - (NSString *)stringByAddingQueryPercentEscapesUsingEncoding:(NSStringEncoding)encoding; 28 | + (NSString *)MIMEBoundary; 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /NSString+TumblrKit.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "NSString+TumblrKit.h" 24 | 25 | @implementation NSString (TumblrKit) 26 | 27 | - (NSString *)stringByAddingQueryPercentEscapesUsingEncoding:(NSStringEncoding)encoding 28 | { 29 | NSString *result = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes( 30 | NULL, 31 | (__bridge_retained CFStringRef)[self mutableCopy], 32 | NULL, 33 | CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"), 34 | kCFStringEncodingUTF8); 35 | return result; 36 | } 37 | 38 | + (NSString *)MIMEBoundary 39 | { 40 | static NSString *MIMEBoundary = nil; 41 | 42 | if (!MIMEBoundary) { 43 | MIMEBoundary = [[NSString alloc] initWithFormat: 44 | @"----_=_MIMEBoundary_%@_=_----", 45 | [[NSProcessInfo processInfo] globallyUniqueString]]; 46 | } 47 | 48 | return MIMEBoundary; 49 | } 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | TumblrKit 2 | ========= 3 | 4 | TumblrKit is a light-weight wrapper around Tumblr's API in Objective-C. 5 | 6 | Currently you can: 7 | 8 | * Fetch posts from Tumblr (regular, conversation, quote and link) 9 | * Upload posts to Tumblr (regular, conversation, quote, link and photo) 10 | 11 | Usage 12 | ----- 13 | 14 | You can fetch a post with a specific POST_ID using the following: 15 | 16 | TKTumblr *tumblr = [[TKTumblr alloc] initWithEmail:EMAIL andPassword:PASSWORD]; 17 | TKPost *thePost = [tumblr postWithID:[NSNumber numberWithInt:POST_ID] andDomain:@"example.tumblr.com"]; 18 | NSLog(@"thePost: %@", thePost); 19 | 20 | If you want to fetch more than one post: 21 | 22 | // Instantiate a new TKTumblr object. 23 | TKTumblr *tumblr = [[TKTumblr alloc] initWithEmail:EMAIL andPassword:PASSWORD]; 24 | 25 | // Configure a delegate implementing the TKTumblrDelegate protocol. 26 | tumblr.delegate = aDelegate; 27 | 28 | // Configure the read request object. 29 | TKTumblrReadRequest *theReadRequest = [[TKTumblrReadRequest alloc] init]; 30 | 31 | // Return the post in raw text (if you wrote using Markdown). 32 | theReadRequest.filter = TKPostFilterNone; 33 | 34 | // Execute the read request. For each post, TKTumblr will send the 35 | // tumblrDidReceivePost:withDomain: message to the delegate object. 36 | [tumblr postsWithReadRequest:theReadRequest]; 37 | 38 | To upload a TKPost: 39 | 40 | // Create a new TKPost 41 | TKPostRegular *thePost = [[TKPostRegular alloc] init]; 42 | thePost.title = @"The title"; 43 | thePost.body = @"The body"; 44 | 45 | // Upload it to Tumblr. The delegate will receive either 46 | // tumblrDidUploadPost:withDomain:postId: or 47 | // tumblrDidFailToUploadPost:withDomain:returnCode: 48 | [tumblr uploadPost:thePost withDomain:@"another-example.tumblr.com"]; 49 | 50 | // If you're lazy, you can dismiss the withDomain to upload to your main 51 | // Tumblelog. 52 | [tumblr uploadPost:thePost]; 53 | 54 | To Do 55 | ----- 56 | 57 | * Currently network connections are synchronous. Need to add support for asynchronous connections, and respective delegate methods. 58 | -------------------------------------------------------------------------------- /TKPost.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #if TARGET_OS_IPHONE 24 | typedef UIImage TKImage; 25 | #elif TARGET_OS_MAC 26 | typedef NSImage TKImage; 27 | #endif 28 | 29 | typedef enum 30 | { 31 | TKPostStateAll, 32 | TKPostStateDraft, 33 | TKPostStateQueue, 34 | TKPostStateSubmission 35 | } TKPostState; 36 | 37 | typedef enum 38 | { 39 | TKPostTypeAll, 40 | TKPostTypeRegular, 41 | TKPostTypeLink, 42 | TKPostTypeQuote, 43 | TKPostTypePhoto, 44 | TKPostTypeConversation, 45 | TKPostTypeVideo, 46 | TKPostTypeAudio, 47 | TKPostTypeAnswer 48 | } TKPostType; 49 | 50 | typedef enum 51 | { 52 | TKPostFormatHTML, 53 | TKPostFormatMarkdown 54 | } TKPostFormat; 55 | 56 | typedef enum 57 | { 58 | TKPostFilterHTML, 59 | TKPostFilterText, 60 | TKPostFilterNone 61 | } TKPostFilter; 62 | 63 | /** 64 | Base class for all TumblrKit post representation. 65 | */ 66 | @interface TKPost : NSObject 67 | { 68 | /** This post's ID. */ 69 | NSNumber *postID; 70 | 71 | /** This post's URL. */ 72 | NSString *url; 73 | 74 | /** This post's slug. */ 75 | NSString *slug; 76 | 77 | /** This post's publish date. */ 78 | NSDate *date; 79 | 80 | /** This post's reblog key. */ 81 | NSString *reblogKey; 82 | 83 | /** This post's type. */ 84 | TKPostType type; 85 | 86 | /** This post's format. */ 87 | TKPostFormat format; 88 | 89 | /** This post's group (or domain). */ 90 | NSString *group; 91 | } 92 | 93 | @property (nonatomic,copy) NSNumber *postID; 94 | @property (nonatomic,copy) NSString *url; 95 | @property (nonatomic,copy) NSString *slug; 96 | @property (nonatomic,copy) NSDate *date; 97 | @property (nonatomic,copy) NSString *reblogKey; 98 | @property (nonatomic,assign) TKPostType type; 99 | @property (nonatomic,assign) TKPostFormat format; 100 | @property (nonatomic,copy) NSString *group; 101 | 102 | /** 103 | Creates a new TKPost subclass based on the attributeDict parameter. 104 | */ 105 | + (id)postWithAttributes:(NSDictionary *)attributeDict; 106 | 107 | /** 108 | Initializes the base TKPost object with attributeDict contents. 109 | */ 110 | - (id)initWithAttributes:(NSDictionary *)attributeDict; 111 | 112 | /** 113 | Returns this post's type as string. 114 | */ 115 | - (NSString *)typeAsString; 116 | 117 | /** 118 | Returns a dictionary containing all the attributes of the current post. 119 | */ 120 | - (NSDictionary *)attributesAsDictionary; 121 | 122 | @end 123 | 124 | /** 125 | Represents Tumblr's "regular" kind of post. 126 | */ 127 | @interface TKPostRegular : TKPost 128 | { 129 | /** This post's title. */ 130 | NSMutableString *title; 131 | 132 | /** This post's body. */ 133 | NSMutableString *body; 134 | } 135 | 136 | /** 137 | Returns a copy of this post's title. 138 | */ 139 | - (NSString *)title; 140 | 141 | /** 142 | Sets this post's title. 143 | */ 144 | - (void)setTitle:(NSString *)aTitle; 145 | 146 | /** 147 | Returns a copy of this post's body. 148 | */ 149 | - (NSString *)body; 150 | 151 | /** 152 | Sets this post's body. 153 | */ 154 | - (void)setBody:(NSString *)aBody; 155 | 156 | /** 157 | Appends the given string to this post's title. 158 | */ 159 | - (void)appendToTitle:(NSString *)string; 160 | 161 | /** 162 | Appends the given string to this post's body. 163 | */ 164 | - (void)appendToBody:(NSString *)string; 165 | 166 | @end 167 | 168 | @interface TKPostLink : TKPost 169 | { 170 | NSMutableString *text; 171 | NSURL *URL; 172 | } 173 | 174 | @property (nonatomic,copy) NSURL *URL; 175 | 176 | - (NSString *)text; 177 | - (void)setText:(NSString *)aText; 178 | - (void)appendToText:(NSString *)string; 179 | - (void)setURLWithString:(NSString *)URLString; 180 | 181 | @end 182 | 183 | @interface TKPostQuote : TKPost 184 | { 185 | NSMutableString *text; 186 | NSMutableString *source; 187 | } 188 | 189 | - (NSString *)text; 190 | - (void)setText:(NSString *)aText; 191 | - (NSString *)source; 192 | - (void)setSource:(NSString *)aSource; 193 | - (void)appendToText:(NSString *)string; 194 | - (void)appendToSource:(NSString *)string; 195 | 196 | @end 197 | 198 | @interface TKPostPhoto : TKPost 199 | { 200 | NSMutableString *caption; 201 | NSString *source; 202 | TKImage *image; 203 | NSInteger width; 204 | NSInteger height; 205 | } 206 | 207 | @property (assign) NSInteger width; 208 | @property (assign) NSInteger height; 209 | @property (copy) NSString *source; 210 | @property (strong) TKImage *image; 211 | 212 | - (NSString *)caption; 213 | - (void)setCaption:(NSString *)aCaption; 214 | - (void)appendToCaption:(NSString *)string; 215 | 216 | @end 217 | 218 | @interface TKPostConversation : TKPost 219 | { 220 | NSMutableString *text; 221 | } 222 | 223 | - (NSString *)text; 224 | - (void)setText:(NSString *)aText; 225 | - (void)appendToText:(NSString *)string; 226 | 227 | @end 228 | 229 | @interface TKPostVideo : TKPost 230 | { 231 | NSMutableString *caption; 232 | NSMutableString *source; 233 | NSMutableString *player; 234 | } 235 | 236 | - (NSString *)caption; 237 | - (void)setCaption:(NSString *)aCaption; 238 | - (NSString *)source; 239 | - (void)setSource:(NSString *)aSource; 240 | - (NSString *)player; 241 | - (void)setPlayer:(NSString *)aPlayer; 242 | - (void)appendToCaption:(NSString *)string; 243 | - (void)appendToSource:(NSString *)string; 244 | - (void)appendToPlayer:(NSString *)string; 245 | 246 | @end 247 | 248 | @interface TKPostAudio : TKPost 249 | { 250 | NSMutableString *caption; 251 | NSMutableString *player; 252 | } 253 | 254 | - (NSString *)caption; 255 | - (void)setCaption:(NSString *)aCaption; 256 | - (NSString *)player; 257 | - (void)setPlayer:(NSString *)aPlayer; 258 | - (void)appendToCaption:(NSString *)string; 259 | - (void)appendToPlayer:(NSString *)string; 260 | 261 | @end 262 | -------------------------------------------------------------------------------- /TKPost.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKPost.h" 24 | 25 | static NSString *TKPostTypeFromTumblrAsString[] = 26 | { 27 | @"", 28 | @"regular", 29 | @"link", 30 | @"quote", 31 | @"photo", 32 | @"conversation", 33 | @"video", 34 | @"audio", 35 | @"answer" 36 | }; 37 | 38 | static NSString *TKPostTypeAsString[] = 39 | { 40 | @"", 41 | @"TKPostTypeRegular", 42 | @"TKPostTypeLink", 43 | @"TKPostTypeQuote", 44 | @"TKPostTypePhoto", 45 | @"TKPostTypeConversation", 46 | @"TKPostTypeVideo", 47 | @"TKPostTypeAudio", 48 | @"TKPostTypeAnswer" 49 | }; 50 | 51 | static NSString *TKPostFormatAsString[] = 52 | { 53 | @"TKPostFormatHTML", 54 | @"TKPostFormatMarkdown" 55 | }; 56 | 57 | @implementation TKPost 58 | 59 | @synthesize postID, url, slug, date, reblogKey, type, format, group; 60 | 61 | - (id)init 62 | { 63 | if ((self = [super init]) != nil) { 64 | postID = nil; 65 | url = nil; 66 | reblogKey = nil; 67 | date = nil; 68 | url = nil; 69 | group = nil; 70 | format = TKPostFormatHTML; 71 | } 72 | 73 | return self; 74 | } 75 | 76 | - (id)initWithAttributes:(NSDictionary *)attributeDict 77 | { 78 | if ((self = [self init]) != nil) { 79 | self.postID = [attributeDict objectForKey:@"id"]; 80 | self.url = [attributeDict objectForKey:@"url"]; 81 | self.date = [attributeDict objectForKey:@"date"]; 82 | self.slug = [attributeDict objectForKey:@"slug"]; 83 | self.reblogKey = [attributeDict objectForKey:@"reblog-key"]; 84 | self.format = [[attributeDict objectForKey:@"format"] isEqualToString:@"html"] 85 | ? TKPostFormatHTML 86 | : TKPostFormatMarkdown; 87 | } 88 | 89 | return self; 90 | } 91 | 92 | 93 | - (NSString *)description 94 | { 95 | return [NSString stringWithFormat:@"Post ID: %@, Date: %@, URL: %@, Slug: %@, Type: %@, Reblog Key: %@, Format: %@", self.postID, self.date, self.url, self.slug, TKPostTypeAsString[self.type], self.reblogKey, TKPostFormatAsString[self.format]]; 96 | } 97 | 98 | + (id)postWithAttributes:(NSDictionary *)attributeDict 99 | { 100 | /** 101 | Simplistic dictionary to be used statically. Used to map a Tumblr's post type 102 | to internal TumblrKit class names. 103 | */ 104 | static NSDictionary *TKPostTypeToClassNameDict; 105 | if (!TKPostTypeToClassNameDict) { 106 | TKPostTypeToClassNameDict = [NSDictionary dictionaryWithObjectsAndKeys: 107 | @"TKPostPhoto", @"photo", 108 | @"TKPostConversation", @"conversation", 109 | @"TKPostLink", @"link", 110 | @"TKPostQuote", @"quote", 111 | @"TKPostRegular", @"regular", 112 | @"TKPostVideo", @"video", 113 | @"TKPostAudio", @"audio", 114 | nil]; 115 | } 116 | 117 | Class postClass; 118 | NSString *type_ = [attributeDict objectForKey:@"type"]; 119 | 120 | postClass = NSClassFromString([TKPostTypeToClassNameDict objectForKey:type_]); 121 | 122 | return [(TKPost *) [postClass alloc] initWithAttributes:attributeDict]; 123 | } 124 | 125 | - (NSString *)typeAsString 126 | { 127 | return TKPostTypeFromTumblrAsString[self.type]; 128 | } 129 | 130 | - (NSDictionary *)attributesAsDictionary 131 | { 132 | NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 133 | [self typeAsString], @"type", 134 | [self group], @"group", 135 | nil]; 136 | return dict; 137 | } 138 | 139 | @end 140 | 141 | @implementation TKPostRegular 142 | 143 | - (id)init 144 | { 145 | if ((self = [super init]) != nil) { 146 | self.title = @""; 147 | self.body = @""; 148 | self.type = TKPostTypeRegular; 149 | } 150 | 151 | return self; 152 | } 153 | 154 | 155 | - (NSString *)title 156 | { 157 | return [title copy]; 158 | } 159 | 160 | - (void)setTitle:(NSString *)aTitle 161 | { 162 | if (aTitle != title) { 163 | title = [aTitle mutableCopy]; 164 | } 165 | } 166 | 167 | - (NSString *)body 168 | { 169 | return [body copy]; 170 | } 171 | 172 | - (void)setBody:(NSString *)aBody 173 | { 174 | if (aBody != body) { 175 | body = [aBody mutableCopy]; 176 | } 177 | } 178 | 179 | - (void)appendToBody:(NSString *)string 180 | { 181 | [body appendString:string]; 182 | } 183 | 184 | - (void)appendToTitle:(NSString *)string 185 | { 186 | [title appendString:string]; 187 | } 188 | 189 | - (NSString *)description 190 | { 191 | return [NSString stringWithFormat:@"%@, Title: %@, Body: %@", [super description], self.title, self.body]; 192 | } 193 | 194 | - (NSDictionary *)attributesAsDictionary 195 | { 196 | NSMutableDictionary *dict = (NSMutableDictionary *) [super attributesAsDictionary]; 197 | [dict setObject:body forKey:@"body"]; 198 | [dict setObject:title forKey:@"title"]; 199 | return dict; 200 | } 201 | 202 | @end 203 | 204 | @implementation TKPostLink 205 | 206 | @synthesize URL; 207 | 208 | - (id)init 209 | { 210 | if ((self = [super init]) != nil) { 211 | URL = nil; 212 | type = TKPostTypeLink; 213 | text = [[NSMutableString alloc] init]; 214 | } 215 | 216 | return self; 217 | } 218 | 219 | 220 | - (NSString *)text 221 | { 222 | return [text copy]; 223 | } 224 | 225 | - (void)setText:(NSString *)aText 226 | { 227 | if (aText != text) { 228 | text = [aText mutableCopy]; 229 | } 230 | } 231 | 232 | - (void)appendToText:(NSString *)string 233 | { 234 | [text appendString:string]; 235 | } 236 | 237 | - (void)setURLWithString:(NSString *)URLString 238 | { 239 | self.URL = [NSURL URLWithString:URLString]; 240 | } 241 | 242 | - (NSString *)description 243 | { 244 | return [NSString stringWithFormat:@"%@, Link Text: %@, Link URL: %@", [super description], self.text, self.URL]; 245 | } 246 | 247 | - (NSDictionary *)attributesAsDictionary 248 | { 249 | NSMutableDictionary *dict = (NSMutableDictionary *) [super attributesAsDictionary]; 250 | [dict setObject:text forKey:@"name"]; 251 | [dict setObject:[URL absoluteString] forKey:@"url"]; 252 | return dict; 253 | } 254 | 255 | @end 256 | 257 | @implementation TKPostQuote 258 | 259 | - (id)init 260 | { 261 | if ((self = [super init]) != nil) { 262 | type = TKPostTypeQuote; 263 | source = [[NSMutableString alloc] init]; 264 | text = [[NSMutableString alloc] init]; 265 | } 266 | 267 | return self; 268 | } 269 | 270 | 271 | - (NSString *)text 272 | { 273 | return [text copy]; 274 | } 275 | 276 | - (void)setText:(NSString *)aText 277 | { 278 | if (aText != text) { 279 | text = [aText mutableCopy]; 280 | } 281 | } 282 | 283 | - (NSString *)source 284 | { 285 | return [source copy]; 286 | } 287 | 288 | - (void)setSource:(NSString *)aSource 289 | { 290 | if (aSource != source) { 291 | source = [aSource mutableCopy]; 292 | } 293 | } 294 | 295 | - (void)appendToText:(NSString *)string 296 | { 297 | [text appendString:string]; 298 | } 299 | 300 | - (void)appendToSource:(NSString *)string 301 | { 302 | [source appendString:string]; 303 | } 304 | 305 | - (NSString *)description 306 | { 307 | return [NSString stringWithFormat:@"%@, Quote Text: %@, Quote Source: %@", [super description], self.text, self.source]; 308 | } 309 | 310 | - (NSDictionary *)attributesAsDictionary 311 | { 312 | NSMutableDictionary *dict = (NSMutableDictionary *) [super attributesAsDictionary]; 313 | [dict setObject:text forKey:@"quote"]; 314 | [dict setObject:source forKey:@"whatever"]; 315 | return dict; 316 | } 317 | 318 | @end 319 | 320 | @implementation TKPostConversation 321 | 322 | - (id)init 323 | { 324 | if ((self = [super init]) != nil) { 325 | type = TKPostTypeConversation; 326 | text = [[NSMutableString alloc] init]; 327 | } 328 | 329 | return self; 330 | } 331 | 332 | 333 | - (NSString *)text 334 | { 335 | return [text copy]; 336 | } 337 | 338 | - (void)setText:(NSString *)aText 339 | { 340 | if (aText != text) { 341 | text = [aText mutableCopy]; 342 | } 343 | } 344 | 345 | - (void)appendToText:(NSString *)string 346 | { 347 | [text appendString:string]; 348 | } 349 | 350 | - (NSString *)description 351 | { 352 | return [NSString stringWithFormat:@"%@, Conversation Text: %@", [super description], self.text]; 353 | } 354 | 355 | - (NSDictionary *)attributesAsDictionary 356 | { 357 | NSMutableDictionary *dict = (NSMutableDictionary *) [super attributesAsDictionary]; 358 | [dict setObject:text forKey:@"conversation"]; 359 | [dict setObject:@"" forKey:@"title"]; 360 | return dict; 361 | } 362 | 363 | @end 364 | 365 | @implementation TKPostPhoto 366 | 367 | @synthesize width, height, source, image; 368 | 369 | - (id)init 370 | { 371 | if ((self = [super init]) != nil) { 372 | type = TKPostTypePhoto; 373 | caption = [[NSMutableString alloc] init]; 374 | image = nil; 375 | source = nil; 376 | width = 0; 377 | height = 0; 378 | } 379 | 380 | return self; 381 | } 382 | 383 | - (id)initWithAttributes:(NSDictionary *)attributeDict 384 | { 385 | if ((self = [super initWithAttributes:attributeDict]) != nil) { 386 | width = [[attributeDict objectForKey:@"width"] integerValue]; 387 | height = [[attributeDict objectForKey:@"height"] integerValue]; 388 | } 389 | 390 | return self; 391 | } 392 | 393 | 394 | - (NSString *)caption 395 | { 396 | return [caption copy]; 397 | } 398 | 399 | - (void)setCaption:(NSString *)aCaption 400 | { 401 | if (aCaption != caption) { 402 | caption = [aCaption mutableCopy]; 403 | } 404 | } 405 | 406 | - (void)appendToCaption:(NSString *)string 407 | { 408 | [caption appendString:string]; 409 | } 410 | 411 | - (NSString *)description 412 | { 413 | return [NSString stringWithFormat:@"%@, Photo Caption: %@, Photo Width: %i, Photo Height: %i", [super description], self.caption, self.width, self.height]; 414 | } 415 | 416 | - (NSDictionary *)attributesAsDictionary 417 | { 418 | NSMutableDictionary *dict = (NSMutableDictionary *) [super attributesAsDictionary]; 419 | if (source != nil) 420 | [dict setObject:source forKey:@"source"]; 421 | if (image != nil && source == nil) { 422 | #if TARGET_OS_IPHONE 423 | [dict setObject:UIImageJPEGRepresentation(image, 1.0) forKey:@"data"]; 424 | #elif TARGET_OS_MAC 425 | NSBitmapImageRep *bitmap = [[image representations] objectAtIndex:0]; 426 | [dict setObject:[bitmap representationUsingType:NSJPEGFileType properties:nil] forKey:@"data"]; 427 | #endif 428 | } 429 | [dict setObject:caption forKey:@"caption"]; 430 | 431 | return dict; 432 | } 433 | 434 | @end 435 | 436 | @implementation TKPostVideo 437 | 438 | - (id)init 439 | { 440 | if ((self = [super init]) != nil) { 441 | type = TKPostTypeVideo; 442 | caption = [[NSMutableString alloc] init]; 443 | source = [[NSMutableString alloc] init]; 444 | player = [[NSMutableString alloc] init]; 445 | } 446 | 447 | return self; 448 | } 449 | 450 | 451 | - (NSString *)caption 452 | { 453 | return [caption copy]; 454 | } 455 | 456 | - (void)setCaption:(NSString *)aCaption 457 | { 458 | if (aCaption != caption) { 459 | caption = [aCaption mutableCopy]; 460 | } 461 | } 462 | 463 | - (NSString *)source 464 | { 465 | return [source copy]; 466 | } 467 | 468 | - (void)setSource:(NSString *)aSource 469 | { 470 | if (aSource != source) { 471 | source = [aSource mutableCopy]; 472 | } 473 | } 474 | 475 | - (NSString *)player 476 | { 477 | return [player copy]; 478 | } 479 | 480 | - (void)setPlayer:(NSString *)aPlayer 481 | { 482 | if (aPlayer != player) { 483 | player = [aPlayer mutableCopy]; 484 | } 485 | } 486 | 487 | - (void)appendToCaption:(NSString *)string 488 | { 489 | [caption appendString:string]; 490 | } 491 | 492 | - (void)appendToSource:(NSString *)string 493 | { 494 | [source appendString:string]; 495 | } 496 | 497 | - (void)appendToPlayer:(NSString *)string 498 | { 499 | [player appendString:string]; 500 | } 501 | 502 | - (NSString *)description 503 | { 504 | return [NSString stringWithFormat:@"%@, Video Caption: %@, Video Source: %@, Video Player: %@", [super description], self.caption, self.source, self.player]; 505 | } 506 | 507 | @end 508 | 509 | @implementation TKPostAudio 510 | 511 | - (id)init 512 | { 513 | if ((self = [super init]) != nil) { 514 | type = TKPostTypeAudio; 515 | caption = [[NSMutableString alloc] init]; 516 | player = [[NSMutableString alloc] init]; 517 | } 518 | 519 | return self; 520 | } 521 | 522 | 523 | - (NSString *)caption 524 | { 525 | return [caption copy]; 526 | } 527 | 528 | - (void)setCaption:(NSString *)aCaption 529 | { 530 | if (aCaption != caption) { 531 | caption = [aCaption mutableCopy]; 532 | } 533 | } 534 | 535 | - (NSString *)player 536 | { 537 | return [player copy]; 538 | } 539 | 540 | - (void)setPlayer:(NSString *)aPlayer 541 | { 542 | if (aPlayer != player) { 543 | player = [aPlayer mutableCopy]; 544 | } 545 | } 546 | 547 | - (void)appendToCaption:(NSString *)string 548 | { 549 | [caption appendString:string]; 550 | } 551 | 552 | - (void)appendToPlayer:(NSString *)string 553 | { 554 | [player appendString:string]; 555 | } 556 | 557 | - (NSString *)description 558 | { 559 | return [NSString stringWithFormat:@"%@, Audio Caption: %@, Audio Player: %@", [super description], self.caption, self.player]; 560 | } 561 | 562 | @end 563 | -------------------------------------------------------------------------------- /TKPostsRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKRequest.h" 24 | 25 | @class TKPostsRequest; 26 | @class TKPostsResponse; 27 | @class TKPost; 28 | 29 | @protocol TKPostsRequestDelegate 30 | 31 | - (void)postsRequest:(TKPostsRequest *)request didReceiveResponse:(TKPostsResponse *)response; 32 | - (void)postsRequest:(TKPostsRequest *)request didFailWithError:(NSError *)error; 33 | 34 | @end 35 | 36 | @interface TKPostsRequest : TKRequest 37 | { 38 | @private 39 | NSDictionary *_options; 40 | NSMutableArray *_receivedPosts; 41 | NSXMLParser *_parser; 42 | NSString *_currentElementName; 43 | TKPost *_currentPost; 44 | } 45 | 46 | #pragma mark - API 47 | 48 | @property (weak, nonatomic) id delegate; 49 | @property (strong, readonly) NSDictionary *options; 50 | 51 | - (id)initWithOptions:(NSDictionary *)options delegate:(id)delegate; 52 | 53 | @end 54 | 55 | extern NSString const *TKPostsRequestDomainKey; 56 | extern NSString const *TKPostsRequestPostIDKey; 57 | extern NSString const *TKPostsRequestStartAtIndexKey; 58 | extern NSString const *TKPostsRequestNumberOfPostsKey; -------------------------------------------------------------------------------- /TKPostsRequest.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKPostsRequest.h" 24 | #import "TKPostsResponse.h" 25 | #import "TKPost.h" 26 | 27 | @implementation TKPostsRequest 28 | 29 | @synthesize delegate = _delegate; 30 | 31 | #pragma mark - NSObject 32 | 33 | - (void)dealloc; 34 | { 35 | _receivedPosts = nil; 36 | _options = nil; 37 | _parser = nil; 38 | } 39 | 40 | #pragma mark - NSXMLParserDelegate 41 | 42 | - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict; 43 | { 44 | _currentElementName = elementName; 45 | 46 | if ([elementName isEqualToString:@"post"]) 47 | _currentPost = [TKPost postWithAttributes:attributeDict]; 48 | } 49 | 50 | - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName; 51 | { 52 | if ([elementName isEqualToString:@"post"]) { 53 | [_receivedPosts addObject:_currentPost]; 54 | } 55 | } 56 | 57 | #pragma clang diagnostic push 58 | #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 59 | 60 | - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; 61 | { 62 | static NSDictionary *elementToSelectorDict = nil; 63 | 64 | if (!elementToSelectorDict) { 65 | elementToSelectorDict = [[NSDictionary alloc] initWithObjectsAndKeys: 66 | @"appendToText:", @"text", 67 | @"appendToCaption:",@"caption", 68 | @"appendToPlayer:", @"player", 69 | @"appendToBody:", @"body", 70 | @"setURLWithString:", @"url", 71 | nil]; 72 | } 73 | 74 | NSString *key = [[_currentElementName componentsSeparatedByString:@"-"] lastObject]; 75 | SEL selector = NSSelectorFromString([elementToSelectorDict objectForKey:key]); 76 | if (selector && [_currentPost respondsToSelector:selector]) { 77 | [_currentPost performSelector:selector withObject:string]; 78 | } 79 | } 80 | 81 | #pragma clang diagnostic pop 82 | 83 | - (void)parserDidEndDocument:(NSXMLParser *)parser; 84 | { 85 | _currentPost = nil; 86 | [self.delegate postsRequest:self didReceiveResponse:[TKPostsResponse responseWithPosts:_receivedPosts]]; 87 | } 88 | 89 | #pragma mark - TKRequest 90 | 91 | - (NSURL *)URL; 92 | { 93 | NSMutableDictionary *options = [_options mutableCopy]; 94 | NSString *domain = [options objectForKey:TKPostsRequestDomainKey]; 95 | [options removeObjectForKey:TKPostsRequestDomainKey]; 96 | NSMutableString *URLString = [NSMutableString stringWithFormat:@"http://%@/api/read?", domain]; 97 | 98 | NSMutableArray *queryStringArray = [NSMutableArray array]; 99 | for (NSString *key in [options allKeys]) { 100 | NSString *value = [options objectForKey:key]; 101 | [queryStringArray addObject:[NSString stringWithFormat:@"%@=%@", key, value]]; 102 | } 103 | 104 | [URLString appendString:[queryStringArray componentsJoinedByString:@"&"]]; 105 | NSURL *URL = [NSURL URLWithString:URLString]; 106 | return URL; 107 | } 108 | 109 | - (void)connectionDidFinishLoadingData:(NSData *)data; 110 | { 111 | _parser = [[NSXMLParser alloc] initWithData:data]; 112 | [_parser setDelegate:self]; 113 | [_parser parse]; 114 | } 115 | 116 | - (void)connectionDidFailWithError:(NSError *)error; 117 | { 118 | [self.delegate postsRequest:self didFailWithError:error]; 119 | } 120 | 121 | #pragma mark - API 122 | 123 | - (id)initWithOptions:(NSDictionary *)options delegate:(id)delegate; 124 | { 125 | if (!(self = [self init])) 126 | return nil; 127 | 128 | if (![options objectForKey:TKPostsRequestDomainKey]) 129 | [NSException raise:@"TKPostsRequestDomainKey is mandatory" format:@"TKPostsRequestDomainKey is mandatory"]; 130 | 131 | _receivedPosts = [[NSMutableArray alloc] init]; 132 | _options = options; 133 | _delegate = delegate; 134 | 135 | return self; 136 | } 137 | 138 | - (NSDictionary *)options; 139 | { 140 | return _options; 141 | } 142 | 143 | @end 144 | 145 | NSString const *TKPostsRequestDomainKey = @"domain"; 146 | NSString const *TKPostsRequestPostIDKey = @"id"; 147 | NSString const *TKPostsRequestStartAtIndexKey = @"start"; 148 | NSString const *TKPostsRequestNumberOfPostsKey = @"num"; 149 | -------------------------------------------------------------------------------- /TKPostsResponse.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | @interface TKPostsResponse : NSObject 24 | 25 | @property (strong, nonatomic) NSArray *posts; 26 | 27 | #pragma mark - API 28 | 29 | + (id)responseWithPosts:(NSArray *)posts; 30 | - (id)initWithPosts:(NSArray *)posts; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /TKPostsResponse.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKPostsResponse.h" 24 | 25 | @implementation TKPostsResponse 26 | 27 | @synthesize posts = _posts; 28 | 29 | #pragma mark - NSObject 30 | 31 | 32 | #pragma mark - API 33 | 34 | + (id)responseWithPosts:(NSArray *)posts; 35 | { 36 | return [[self alloc] initWithPosts:posts]; 37 | } 38 | 39 | - (id)initWithPosts:(NSArray *)posts; 40 | { 41 | if (!(self = [self init])) 42 | return nil; 43 | 44 | _posts = posts; 45 | 46 | return self; 47 | } 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /TKRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | @class TKRequest; 24 | 25 | @protocol TKRequestable 26 | 27 | @optional 28 | - (void)connectionDidFinishLoadingData:(NSData *)data; 29 | - (void)connectionDidFailWithError:(NSError *)error; 30 | 31 | @optional 32 | - (NSData *)HTTPBody; 33 | 34 | @required 35 | - (NSURL *)URL; 36 | 37 | @end 38 | 39 | #if TARGET_OS_MAC 40 | @interface TKRequest : NSObject 41 | #elif TARGET_OS_IPHONE 42 | @interface TKRequest : NSObject 43 | #endif 44 | { 45 | @protected 46 | NSURLConnection *_connection; 47 | NSMutableData *_receivedData; 48 | } 49 | 50 | #pragma mark - API 51 | 52 | - (void)start; 53 | - (void)cancel; 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /TKRequest.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKRequest.h" 24 | 25 | #pragma GCC diagnostic ignored "-Wprotocol" 26 | 27 | @implementation TKRequest 28 | 29 | #pragma mark - NSObject 30 | 31 | - (id)init; 32 | { 33 | if (!(self = [super init])) 34 | return nil; 35 | 36 | _receivedData = [[NSMutableData alloc] init]; 37 | 38 | return self; 39 | } 40 | 41 | - (void)dealloc; 42 | { 43 | [self cancel]; 44 | _receivedData = nil; 45 | } 46 | 47 | #pragma mark - NSURLConnectionDelegate 48 | 49 | - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 50 | { 51 | [self connectionDidFailWithError:error]; 52 | } 53 | 54 | #pragma mark - NSURLConnectionDataDelegate 55 | 56 | - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 57 | { 58 | NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *) response; 59 | 60 | if (200 == [HTTPResponse statusCode]) 61 | return; 62 | 63 | [self cancel]; 64 | [self connectionDidFailWithError:[NSError errorWithDomain:[NSHTTPURLResponse localizedStringForStatusCode:[HTTPResponse statusCode]] code:[HTTPResponse statusCode] userInfo:nil]]; 65 | } 66 | 67 | - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 68 | { 69 | [_receivedData appendData:data]; 70 | } 71 | 72 | - (void)connectionDidFinishLoading:(NSURLConnection *)connection; 73 | { 74 | [self connectionDidFinishLoadingData:_receivedData]; 75 | _receivedData = nil; 76 | } 77 | 78 | #pragma mark - API 79 | 80 | - (void)start; 81 | { 82 | NSAssert(!_connection, @"start can't be called twice without being cancelled."); 83 | NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[self URL]]; 84 | 85 | if ([self respondsToSelector:@selector(HTTPBody)]) { 86 | theRequest.HTTPMethod = @"POST"; 87 | theRequest.HTTPBody = self.HTTPBody; 88 | } 89 | else { 90 | theRequest.HTTPMethod = @"GET"; 91 | } 92 | 93 | _connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 94 | } 95 | 96 | - (void)cancel; 97 | { 98 | [_connection cancel]; 99 | _connection = nil; 100 | } 101 | 102 | @end 103 | -------------------------------------------------------------------------------- /TKTumblelog.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | typedef enum 24 | { 25 | TKTumblelogTypePublic, 26 | TKTumblelogTypePrivate, 27 | } TKTumblelogType; 28 | 29 | @interface TKTumblelog : NSObject 30 | { 31 | NSString *title; 32 | NSString *name; 33 | NSURL *URL; 34 | NSURL *avatarURL; 35 | NSNumber *privateID; 36 | 37 | BOOL primary; 38 | 39 | TKTumblelogType type; 40 | } 41 | 42 | @property (nonatomic,copy) NSString *title; 43 | @property (nonatomic,copy) NSString *name; 44 | @property (nonatomic,strong) NSURL *URL; 45 | @property (nonatomic,strong) NSURL *avatarURL; 46 | @property (nonatomic,strong) NSNumber *privateID; 47 | @property (nonatomic,assign) BOOL primary; 48 | @property (nonatomic,assign) TKTumblelogType type; 49 | 50 | + (id)tumblelogWithAttributes:(NSDictionary *)attributeDict; 51 | - (id)initWithAttributes:(NSDictionary *)attributeDict; 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /TKTumblelog.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKTumblelog.h" 24 | 25 | 26 | @implementation TKTumblelog 27 | 28 | @synthesize title, name, URL, avatarURL, privateID, primary, type; 29 | 30 | + (id)tumblelogWithAttributes:(NSDictionary *)attributeDict 31 | { 32 | return [(TKTumblelog *)[self alloc] initWithAttributes:attributeDict]; 33 | } 34 | 35 | - (id)initWithAttributes:(NSDictionary *)attributeDict 36 | { 37 | if ((self = [super init]) != nil) { 38 | self.title = [attributeDict objectForKey:@"title"]; 39 | self.name = [attributeDict objectForKey:@"name"]; 40 | self.URL = [NSURL URLWithString:[attributeDict objectForKey:@"url"]]; 41 | self.avatarURL = [NSURL URLWithString:[attributeDict objectForKey:@"avatar-url"]]; 42 | self.privateID = [NSNumber numberWithInt:[[attributeDict objectForKey:@"private-id"] intValue]]; 43 | self.primary = [[attributeDict objectForKey:@"is-primary"] isEqualToString:@"yes"]; 44 | } 45 | return self; 46 | } 47 | 48 | - (NSString *)description 49 | { 50 | return [NSString stringWithFormat:@"Title: %@, Name: %@, URL: %@, Avatar URL: %@, Private ID: %@, Primary: %i", 51 | self.title, 52 | self.name, 53 | [self.URL absoluteString], 54 | [self.avatarURL absoluteString], 55 | self.privateID, 56 | self.primary]; 57 | } 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /TKTumblelogsRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKRequest.h" 24 | 25 | @class TKTumblelog; 26 | @class TKTumblelogsRequest; 27 | @class TKTumblelogsResponse; 28 | 29 | @protocol TKTumblelogsRequestDelegate 30 | 31 | - (void)tumblelogsRequest:(TKTumblelogsRequest *)request didReceiveResponse:(TKTumblelogsResponse *)response; 32 | 33 | - (void)tumblelogsRequest:(TKTumblelogsRequest *)request didFailWithError:(NSError *)error; 34 | 35 | @end 36 | 37 | @interface TKTumblelogsRequest : TKRequest 38 | { 39 | @private 40 | NSDictionary *_options; 41 | NSMutableArray *_receivedTumblelogs; 42 | NSString *_currentElementName; 43 | TKTumblelog *_currentTumblelog; 44 | } 45 | 46 | @property(weak, nonatomic) id delegate; 47 | 48 | - (id)initWithOptions:(NSDictionary *)options delegate:(id )delegate; 49 | 50 | @end 51 | 52 | extern NSString const *TKTumblelogsRequestEmailKey; 53 | extern NSString const *TKTumblelogsRequestPasswordKey; 54 | -------------------------------------------------------------------------------- /TKTumblelogsRequest.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKTumblelogsRequest.h" 24 | #import "TKTumblelogsResponse.h" 25 | #import "TKTumblelog.h" 26 | 27 | @implementation TKTumblelogsRequest 28 | 29 | @synthesize delegate = _delegate; 30 | 31 | #pragma mark - NSObject 32 | 33 | - (void)dealloc; 34 | { 35 | _options = nil; 36 | _receivedTumblelogs = nil; 37 | } 38 | 39 | #pragma mark - NSXMLParserDelegate 40 | 41 | - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 42 | { 43 | _currentElementName = elementName; 44 | 45 | if ([elementName isEqualToString:@"tumblelog"]) 46 | _currentTumblelog = [[TKTumblelog alloc] initWithAttributes:attributeDict]; 47 | } 48 | 49 | - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 50 | { 51 | if ([elementName isEqualToString:@"tumblelog"]) { 52 | [_receivedTumblelogs addObject:_currentTumblelog]; 53 | } 54 | } 55 | 56 | - (void)parserDidEndDocument:(NSXMLParser *)parser 57 | { 58 | [_delegate tumblelogsRequest:self didReceiveResponse:[TKTumblelogsResponse responseWithTumblelogs:_receivedTumblelogs]]; 59 | } 60 | 61 | #pragma mark - TKRequest 62 | 63 | - (NSURL *)URL; 64 | { 65 | return [NSURL URLWithString:@"http://www.tumblr.com/api/authenticate"]; 66 | } 67 | 68 | - (NSData *)HTTPBody; 69 | { 70 | NSString *HTTPBodyString = [NSString stringWithFormat:@"email=%@&password=%@", 71 | [_options objectForKey:TKTumblelogsRequestEmailKey], 72 | [_options objectForKey:TKTumblelogsRequestPasswordKey], 73 | nil]; 74 | return [HTTPBodyString dataUsingEncoding:NSUTF8StringEncoding]; 75 | } 76 | 77 | - (void)connectionDidFinishLoadingData:(NSData *)data; 78 | { 79 | _receivedTumblelogs = [[NSMutableArray alloc] init]; 80 | NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 81 | [parser setDelegate:self]; 82 | [parser parse]; 83 | } 84 | 85 | - (void)connectionDidFailWithError:(NSError *)error 86 | { 87 | [_delegate tumblelogsRequest:self didFailWithError:error]; 88 | } 89 | 90 | #pragma mark - API 91 | 92 | - (id)initWithOptions:(NSDictionary *)options delegate:(id)delegate; 93 | { 94 | if (!(self = [self init])) 95 | return nil; 96 | 97 | if (![options objectForKey:TKTumblelogsRequestEmailKey]) 98 | [NSException raise:@"TKTumblelogsRequestEmailKey is mandatory" format:@"TKTumblelogsRequestEmailKey is mandatory"]; 99 | 100 | if (![options objectForKey:TKTumblelogsRequestPasswordKey]) 101 | [NSException raise:@"TKTumblelogsRequestPasswordKey is mandatory" format:@"TKTumblelogsRequestPasswordKey is mandatory"]; 102 | 103 | _options = options; 104 | _delegate = delegate; 105 | 106 | return self; 107 | } 108 | 109 | @end 110 | 111 | NSString const *TKTumblelogsRequestEmailKey = @"email"; 112 | NSString const *TKTumblelogsRequestPasswordKey = @"password"; 113 | -------------------------------------------------------------------------------- /TKTumblelogsResponse.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | @interface TKTumblelogsResponse : NSObject 24 | 25 | @property (nonatomic,strong) NSArray *tumblelogs; 26 | 27 | #pragma mark - API 28 | 29 | + (id)responseWithTumblelogs:(NSArray *)tumblelogs; 30 | - (id)initWithTumblelogs:(NSArray *)tumblelogs; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /TKTumblelogsResponse.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKTumblelogsResponse.h" 24 | 25 | @implementation TKTumblelogsResponse 26 | 27 | @synthesize tumblelogs = _tumblelogs; 28 | 29 | #pragma mark - NSObject 30 | 31 | 32 | #pragma mark - API 33 | 34 | + (id)responseWithTumblelogs:(NSArray *)tumblelogs; 35 | { 36 | return [[self alloc] initWithTumblelogs:tumblelogs]; 37 | } 38 | 39 | - (id)initWithTumblelogs:(NSArray *)tumblelogs; 40 | { 41 | if (!(self = [self init])) 42 | return nil; 43 | 44 | _tumblelogs = tumblelogs; 45 | 46 | return self; 47 | } 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /TKTumblr.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKPost.h" 24 | #import "TKTumblrReadRequest.h" 25 | #import "TKTumblelog.h" 26 | 27 | #define Log(format, ...) NSLog(@"%s:%@", __PRETTY_FUNCTION__, [NSString stringWithFormat:format, ## __VA_ARGS__]); 28 | 29 | typedef enum 30 | { 31 | TKTumblrCreated = 201, 32 | TKTumblrBadRequest = 400, 33 | TKTumblrForbidden = 403 34 | } TKTumblrResponseReturnCode; 35 | 36 | @protocol TKTumblrDelegate 37 | 38 | @optional 39 | - (void)tumblrDidReceivePost:(TKPost *)thePost withDomain:(NSString *)theDomain; 40 | - (void)tumblrWillUploadPost:(TKPost *)thePost withDomain:(NSString *)theDomain; 41 | - (void)tumblrDidUploadPost:(TKPost *)thePost withDomain:(NSString *)theDomain postID:(NSNumber *)thePostID; 42 | - (void)tumblrDidFailToUploadPost:(TKPost *)thePost withDomain:(NSString *)theDomain returnCode:(TKTumblrResponseReturnCode)theReturnCode; 43 | - (void)tumblrDidReceiveTumblelog:(TKTumblelog *)theTumblelog; 44 | 45 | @end 46 | 47 | @interface TKTumblr : NSObject 48 | { 49 | id __weak delegate; 50 | 51 | NSString *email; 52 | NSString *password; 53 | 54 | TKTumblelog *currentTumblelog; 55 | TKPost *currentPost; 56 | TKPost *requestedPost; 57 | NSString *currentElementName; 58 | } 59 | 60 | @property (nonatomic,weak) id delegate; 61 | @property (nonatomic,copy) NSString *email; 62 | @property (nonatomic,copy) NSString *password; 63 | @property (nonatomic,strong) TKTumblelog *currentTumblelog; 64 | @property (nonatomic,strong) TKPost *currentPost; 65 | @property (nonatomic,strong) TKPost *requestedPost; 66 | @property (nonatomic,copy) NSString *currentElementName; 67 | 68 | - (id)initWithEmail:(NSString *)theEmail andPassword:(NSString *)thePassword; 69 | - (BOOL)uploadPost:(TKPost *)thePost; 70 | - (BOOL)uploadPost:(TKPost *)thePost withDomain:(NSString *)theDomain; 71 | - (void)postsWithReadRequest:(TKTumblrReadRequest *)theReadRequest; 72 | - (TKPost *)postWithID:(NSNumber *)thePostID andDomain:(NSString *)theDomain; 73 | - (NSDictionary *)attributesAsDictionary; 74 | - (NSArray *)tumblelogs; 75 | 76 | @end 77 | -------------------------------------------------------------------------------- /TKTumblr.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #include "TKTumblr.h" 24 | #include "NSString+TumblrKit.h" 25 | #include "NSDictionary+TumblrKit.h" 26 | #include "TKTumblelog.h" 27 | 28 | @implementation TKTumblr 29 | 30 | @synthesize delegate, email, password, currentPost, currentElementName, requestedPost, currentTumblelog; 31 | 32 | - (id)initWithEmail:(NSString *)theEmail andPassword:(NSString *)thePassword 33 | { 34 | if ((self = [super init]) != nil) { 35 | self.email = theEmail; 36 | self.password = thePassword; 37 | self.currentTumblelog = nil; 38 | self.currentPost = nil; 39 | self.currentElementName = nil; 40 | self.requestedPost = nil; 41 | } 42 | return self; 43 | } 44 | 45 | 46 | - (TKPost *)postWithID:(NSNumber *)thePostID andDomain:(NSString *)theDomain 47 | { 48 | TKTumblrReadRequest *theReadRequest = [[TKTumblrReadRequest alloc] initWithPostID:thePostID andDomain:theDomain]; 49 | NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[theReadRequest endpoint]]; 50 | id previousDelegate = [self delegate]; 51 | [self setDelegate:self]; 52 | [parser setDelegate:self]; 53 | [parser parse]; 54 | [self setDelegate:previousDelegate]; 55 | 56 | TKPost *thePost = nil; 57 | 58 | if (requestedPost) { 59 | thePost = [self requestedPost]; 60 | [self setRequestedPost:nil]; 61 | } 62 | 63 | return thePost; 64 | } 65 | 66 | - (void)postsWithReadRequest:(TKTumblrReadRequest *)theReadRequest 67 | { 68 | NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:[theReadRequest endpoint]]; 69 | [parser setDelegate:self]; 70 | [parser parse]; 71 | } 72 | 73 | - (BOOL)uploadPost:(TKPost *)thePost 74 | { 75 | return [self uploadPost:thePost withDomain:nil]; 76 | } 77 | 78 | - (BOOL)uploadPost:(TKPost *)thePost withDomain:(NSString *)theDomain 79 | { 80 | NSMutableDictionary *postDict = (NSMutableDictionary *)[self attributesAsDictionary]; 81 | 82 | if (theDomain) 83 | [postDict setObject:theDomain forKey:@"group"]; 84 | 85 | [postDict addEntriesFromDictionary:[thePost attributesAsDictionary]]; 86 | 87 | NSData *postBody = [postDict multipartMIMEData]; 88 | NSMutableURLRequest *theURLRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.tumblr.com/api/write"]]; 89 | 90 | [theURLRequest setHTTPMethod:@"POST"]; 91 | [theURLRequest setValue:@"8bit" forHTTPHeaderField:@"Content-Transfer-Encoding"]; 92 | [theURLRequest setValue:[NSString stringWithFormat:@"%d", [postBody length]] forHTTPHeaderField:@"Content-Length"]; 93 | [theURLRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", [NSString MIMEBoundary]] forHTTPHeaderField:@"Content-Type"]; 94 | [theURLRequest setHTTPBody:postBody]; 95 | 96 | 97 | if (delegate && [delegate respondsToSelector:@selector(tumblrWillUploadPost:withDomain:)]) { 98 | [delegate tumblrWillUploadPost:thePost withDomain:theDomain]; 99 | } 100 | 101 | NSError *error = nil; 102 | NSHTTPURLResponse *theURLResponse = nil; 103 | NSData *responseData = [NSURLConnection sendSynchronousRequest:theURLRequest 104 | returningResponse:&theURLResponse 105 | error:&error]; 106 | 107 | // Release the request before we can enter some potentially dangerous 108 | // code path. 109 | 110 | // Bail out quickly if NSURLConnection populated error. 111 | if (([theURLResponse statusCode] != TKTumblrCreated)) { 112 | if (delegate && [delegate respondsToSelector:@selector(tumblrDidFailToUploadPost:withDomain:returnCode:)]) { 113 | [delegate tumblrDidFailToUploadPost:thePost 114 | withDomain:theDomain 115 | returnCode:(TKTumblrResponseReturnCode)[theURLResponse statusCode]]; 116 | } 117 | return NO; 118 | } 119 | 120 | // The following code will only execute when we get a TKTumblrCreated response, so it's 121 | // safe to assume that responseData will have only the postID of the post we created. 122 | NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 123 | [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 124 | NSNumber *postID = [formatter numberFromString:[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]]; 125 | 126 | if (delegate && [delegate respondsToSelector:@selector(tumblrDidUploadPost:withDomain:postID:)]) { 127 | [delegate tumblrDidUploadPost:thePost withDomain:theDomain postID:postID]; 128 | } 129 | 130 | return YES; 131 | } 132 | 133 | - (NSDictionary *)attributesAsDictionary 134 | { 135 | NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithObjectsAndKeys: 136 | email, @"email", 137 | password, @"password", 138 | nil]; 139 | return dict; 140 | } 141 | 142 | - (NSArray *)tumblelogs 143 | { 144 | NSString *theURLString = [NSString stringWithFormat:@"https://www.tumblr.com/api/authenticate?email=%@&password=%@", 145 | [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 146 | [password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 147 | NSURL *theURL = [NSURL URLWithString:theURLString]; 148 | NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:theURL]; 149 | [parser setDelegate:self]; 150 | [parser parse]; 151 | 152 | return nil; 153 | } 154 | 155 | #pragma mark NSXMLParserDelegate 156 | 157 | - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 158 | { 159 | self.currentElementName = elementName; 160 | 161 | if ([elementName isEqualToString:@"post"]) { 162 | self.currentPost = [TKPost postWithAttributes:attributeDict]; 163 | } 164 | else if ([elementName isEqualToString:@"tumblelog"]) { 165 | self.currentTumblelog = [TKTumblelog tumblelogWithAttributes:attributeDict]; 166 | } 167 | } 168 | 169 | - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 170 | { 171 | if ([elementName isEqualToString:@"post"]) { 172 | if (currentPost != nil) { 173 | if (delegate && [delegate respondsToSelector:@selector(tumblrDidReceivePost:withDomain:)]) { 174 | [delegate tumblrDidReceivePost:currentPost withDomain:@""]; 175 | } 176 | } 177 | self.currentPost = nil; 178 | } 179 | else if ([elementName isEqualToString:@"tumblelog"]) { 180 | if (currentTumblelog != nil) { 181 | if (delegate && [delegate respondsToSelector:@selector(tumblrDidReceiveTumblelog:)]) { 182 | [delegate tumblrDidReceiveTumblelog:currentTumblelog]; 183 | } 184 | } 185 | self.currentTumblelog = nil; 186 | } 187 | } 188 | 189 | #pragma clang diagnostic push 190 | #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 191 | 192 | - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 193 | { 194 | static NSDictionary *elementToSelectorDict = nil; 195 | 196 | if (!elementToSelectorDict) { 197 | elementToSelectorDict = [NSDictionary dictionaryWithObjectsAndKeys: 198 | @"appendToText:", @"text", 199 | @"appendToCaption:",@"caption", 200 | @"appendToPlayer:", @"player", 201 | @"appendToBody:", @"body", 202 | @"setURLWithString:", @"url", 203 | nil]; 204 | } 205 | 206 | NSString *key = [[currentElementName componentsSeparatedByString:@"-"] lastObject]; 207 | SEL selector = NSSelectorFromString([elementToSelectorDict objectForKey:key]); 208 | if (selector) { 209 | [currentPost performSelector:selector withObject:string]; 210 | } 211 | } 212 | 213 | #pragma clang diagnostic pop 214 | 215 | #pragma mark TKTumblrDelegate 216 | 217 | - (void)tumblrDidReceivePost:(TKPost *)thePost withDomain:(NSString *)theDomain 218 | { 219 | [self setRequestedPost:thePost]; 220 | } 221 | 222 | @end 223 | -------------------------------------------------------------------------------- /TKTumblrReadRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import 24 | #import "TKPost.h" 25 | 26 | /** 27 | The TKTumblrReadRequest class is responsible to encapsulate the parameters 28 | used to retrieve one or a set of posts from Tumblr, represented in 29 | TumblrKit as TKPost objects. 30 | */ 31 | @interface TKTumblrReadRequest : NSObject 32 | { 33 | /** This represents the offset we want to use to fetch a series of posts. */ 34 | NSNumber *start; 35 | 36 | /** This represents the limit we want to use to fetch a series of posts. */ 37 | NSNumber *numOfPosts; 38 | 39 | /** The ID of the post we want to fetch. */ 40 | NSNumber *postID; 41 | 42 | /** The search string to look for posts. */ 43 | NSString *search; 44 | 45 | /** The origin group (or domain) we want to fetch posts. */ 46 | NSString *group; 47 | 48 | /** The type of posts we want to fetch. */ 49 | TKPostType type; 50 | 51 | /** The filter we want to use when fetching posts. */ 52 | TKPostFilter filter; 53 | 54 | /** The state of posts we want to fetch (requires authentication). */ 55 | TKPostState state; 56 | } 57 | 58 | @property (copy) NSNumber *start; 59 | @property (copy) NSNumber *numOfPosts; 60 | @property (copy) NSNumber *postID; 61 | @property (copy) NSString *search; 62 | @property (copy) NSString *group; 63 | 64 | @property (assign) TKPostType type; 65 | @property (assign) TKPostFilter filter; 66 | @property (assign) TKPostState state; 67 | 68 | /** 69 | Initialize a TKTumblrReadRequest with a postID and a domain. 70 | */ 71 | - (id)initWithPostID:(NSNumber *)thePostID andDomain:(NSString *)theDomain; 72 | 73 | /** 74 | The resulting endpoint (with query parameters) used to fetch the posts. 75 | */ 76 | - (NSURL *)endpoint; 77 | 78 | @end 79 | -------------------------------------------------------------------------------- /TKTumblrReadRequest.m: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2010, 2011 TumblrKit 3 | // 4 | // Permission is hereby granted, free of charge, to any person obtaining a copy 5 | // of this software and associated documentation files (the "Software"), to deal 6 | // in the Software without restriction, including without limitation the rights 7 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | // copies of the Software, and to permit persons to whom the Software is 9 | // furnished to do so, subject to the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be included in 12 | // all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | // THE SOFTWARE. 21 | // 22 | 23 | #import "TKTumblrReadRequest.h" 24 | 25 | static NSString *TKPostTypeAsQueryString[] = 26 | { 27 | @"all", 28 | @"text", 29 | @"link", 30 | @"quote", 31 | @"photo", 32 | @"chat", 33 | @"video", 34 | @"audio", 35 | @"answer" 36 | }; 37 | 38 | static NSString *TKPostFilterAsQueryString[] = 39 | { 40 | @"html", 41 | @"text", 42 | @"none" 43 | }; 44 | 45 | @implementation TKTumblrReadRequest 46 | 47 | @synthesize start, numOfPosts, postID, search, type, filter, state, group; 48 | 49 | - (id)init 50 | { 51 | if ((self = [super init]) != nil) { 52 | self.start = [NSNumber numberWithInt:0]; 53 | self.numOfPosts = [NSNumber numberWithInt:20]; 54 | self.postID = nil; 55 | self.search = nil; 56 | self.group = nil; 57 | self.type = TKPostTypeAll; 58 | self.state = TKPostStateAll; 59 | self.filter = TKPostFilterNone; 60 | } 61 | 62 | return self; 63 | } 64 | 65 | - (id)initWithPostID:(NSNumber *)thePostID andDomain:(NSString *)theDomain 66 | { 67 | if ((self = [self init]) != nil) { 68 | self.postID = thePostID; 69 | self.group = theDomain; 70 | } 71 | 72 | return self; 73 | } 74 | 75 | 76 | - (NSURL *)endpoint 77 | { 78 | NSMutableString *endpointString = [[NSMutableString alloc] initWithFormat:@"http://%@/api/read", group]; 79 | NSURL *endpoint = nil; 80 | 81 | if (postID) { 82 | [endpointString appendFormat:@"?id=%@&", postID]; 83 | } 84 | else { 85 | [endpointString appendFormat:@"?start=%@&num=%@&", start, numOfPosts]; 86 | 87 | if (type != TKPostTypeAll && type != TKPostTypeAnswer) { 88 | [endpointString appendFormat:@"type=%@&", TKPostTypeAsQueryString[type]]; 89 | } 90 | } 91 | 92 | [endpointString appendFormat:@"filter=%@", TKPostFilterAsQueryString[filter]]; 93 | endpoint = [NSURL URLWithString:endpointString]; 94 | return endpoint; 95 | } 96 | 97 | @end 98 | -------------------------------------------------------------------------------- /TumblrKit Tests for Mac/TumblrKit Tests for Mac-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.qiih.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /TumblrKit Tests for Mac/TumblrKit Tests for Mac-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'TumblrKit Tests for Mac' target in the 'TumblrKit Tests for Mac' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /TumblrKit Tests for Mac/TumblrKit_Tests_for_Mac.h: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_Tests_for_Mac.h 3 | // TumblrKit Tests for Mac 4 | // 5 | // Created by Igor Sutton on 12/14/11. 6 | // Copyright (c) 2011 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TKPostsRequest.h" 11 | #import "TKTumblelogsRequest.h" 12 | 13 | @interface TumblrKit_Tests_for_Mac : SenTestCase 14 | { 15 | BOOL _testIsDone; 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /TumblrKit Tests for Mac/TumblrKit_Tests_for_Mac.m: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_Tests_for_Mac.m 3 | // TumblrKit Tests for Mac 4 | // 5 | // Created by Igor Sutton on 12/14/11. 6 | // Copyright (c) 2011 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import "TumblrKit_Tests_for_Mac.h" 10 | #import "TKPost.h" 11 | #import "TKPostsResponse.h" 12 | #import "TKTumblelog.h" 13 | #import "TKTumblelogsResponse.h" 14 | 15 | @implementation TumblrKit_Tests_for_Mac 16 | 17 | - (void)setUp; 18 | { 19 | _testIsDone = NO; 20 | [super setUp]; 21 | } 22 | 23 | - (void)tearDown; 24 | { 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testPostsRequest001; 29 | { 30 | NSMutableDictionary *options = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"tumblrkit-test.tumblr.com", TKPostsRequestDomainKey, nil]; 31 | TKPostsRequest *request = [[TKPostsRequest alloc] initWithOptions:options delegate:self]; 32 | STAssertEqualObjects([[request URL] absoluteString], @"http://tumblrkit-test.tumblr.com/api/read?", @""); 33 | 34 | [options setObject:[NSNumber numberWithInt:10] forKey:TKPostsRequestNumberOfPostsKey]; 35 | request = [[TKPostsRequest alloc] initWithOptions:options delegate:self]; 36 | STAssertEqualObjects([[request URL] absoluteString], @"http://tumblrkit-test.tumblr.com/api/read?num=10", nil); 37 | 38 | [options setObject:[NSNumber numberWithInt:10] forKey:TKPostsRequestStartAtIndexKey]; 39 | request = [[TKPostsRequest alloc] initWithOptions:options delegate:self]; 40 | STAssertEqualObjects([[request URL] absoluteString], @"http://tumblrkit-test.tumblr.com/api/read?num=10&start=10", nil); 41 | 42 | [options setObject:[NSNumber numberWithInt:10] forKey:TKPostsRequestPostIDKey]; 43 | request = [[TKPostsRequest alloc] initWithOptions:options delegate:self]; 44 | STAssertEqualObjects([[request URL] absoluteString], @"http://tumblrkit-test.tumblr.com/api/read?num=10&id=10&start=10", nil); 45 | } 46 | 47 | - (void)testPostsRequest002; 48 | { 49 | NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 50 | @"tumblrkit-test.tumblr.com", TKPostsRequestDomainKey, 51 | [NSNumber numberWithInt:10], TKPostsRequestNumberOfPostsKey, 52 | nil]; 53 | TKPostsRequest *request = [[TKPostsRequest alloc] initWithOptions:options delegate:self]; 54 | [request start]; 55 | 56 | while (!_testIsDone) 57 | [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; 58 | 59 | } 60 | 61 | - (void)testPostsRequest003; 62 | { 63 | NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 64 | @"tumblrkit-test.tumblr.com", TKPostsRequestDomainKey, 65 | [NSNumber numberWithInt:10], TKPostsRequestNumberOfPostsKey, 66 | [NSNumber numberWithInt:5], TKPostsRequestStartAtIndexKey, 67 | nil]; 68 | 69 | TKPostsRequest *request = [[TKPostsRequest alloc] initWithOptions:options delegate:self]; 70 | [request start]; 71 | 72 | while (!_testIsDone) 73 | [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; 74 | } 75 | 76 | - (void)testPostsRequest004; 77 | { 78 | NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 79 | @"tumblrkit-test.tumblr.com", TKPostsRequestDomainKey, 80 | [NSNumber numberWithLong:8819125974], TKPostsRequestPostIDKey, 81 | nil]; 82 | 83 | TKPostsRequest *request = [[TKPostsRequest alloc] initWithOptions:options delegate:self]; 84 | [request start]; 85 | 86 | while (!_testIsDone) 87 | [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; 88 | } 89 | 90 | - (void)testTumblelogsRequest001; 91 | { 92 | NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 93 | @"email", TKTumblelogsRequestEmailKey, 94 | @"password", TKTumblelogsRequestPasswordKey, 95 | nil]; 96 | 97 | TKTumblelogsRequest *request = [[TKTumblelogsRequest alloc] initWithOptions:options delegate:self]; 98 | [request start]; 99 | 100 | while (!_testIsDone) 101 | [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; 102 | } 103 | 104 | #pragma mark - TKPostsRequestDelegate 105 | 106 | - (void)postsRequest:(TKPostsRequest *)request didReceiveResponse:(TKPostsResponse *)response; 107 | { 108 | _testIsDone = YES; 109 | 110 | if ([request.options objectForKey:TKPostsRequestNumberOfPostsKey]) 111 | STAssertEquals([[request.options objectForKey:TKPostsRequestNumberOfPostsKey] intValue], (int)[response.posts count], nil); 112 | 113 | if ([request.options objectForKey:TKPostsRequestPostIDKey]) { 114 | STAssertEquals((int)[response.posts count], 1, nil); 115 | TKPost *post = [response.posts objectAtIndex:0]; 116 | NSNumber *postID = [NSNumber numberWithLong:[post.postID longLongValue]]; 117 | STAssertEquals([request.options objectForKey:TKPostsRequestPostIDKey], postID, nil); 118 | } 119 | } 120 | 121 | - (void)postsRequest:(TKPostsRequest *)request didFailWithError:(NSError *)error; 122 | { 123 | _testIsDone = YES; 124 | 125 | STFail(@"%@", error); 126 | } 127 | 128 | #pragma mark - TKTumblelogsRequestDelegate 129 | 130 | - (void)tumblelogsRequest:(TKTumblelogsRequest *)request didReceiveResponse:(TKTumblelogsResponse *)response; 131 | { 132 | _testIsDone = YES; 133 | 134 | NSLog(@"Tumblelogs: %lu", [response.tumblelogs count]); 135 | } 136 | 137 | - (void)tumblelogsRequest:(TKTumblelogsRequest *)request didFailWithError:(NSError *)error; 138 | { 139 | _testIsDone = YES; 140 | 141 | STFail(@"%@", error); 142 | } 143 | 144 | @end 145 | -------------------------------------------------------------------------------- /TumblrKit Tests for Mac/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /TumblrKit Tests for iOS/TKTumblelogsRequestTests.h: -------------------------------------------------------------------------------- 1 | // 2 | // TKTumblelogsRequestTests.h 3 | // TumblrKit 4 | // 5 | // Created by Igor Sutton on 05/31/12. 6 | // Copyright (c) 2012 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "TKTumblelogsRequest.h" 11 | 12 | @interface TKTumblelogsRequestTests : SenTestCase 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /TumblrKit Tests for iOS/TKTumblelogsRequestTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // TKTumblelogsRequestTests.m 3 | // TumblrKit 4 | // 5 | // Created by Igor Sutton on 05/31/12. 6 | // Copyright (c) 2012 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import "TKTumblelogsRequestTests.h" 10 | #import "TKTumblelogsResponse.h" 11 | #import "TKTumblelog.h" 12 | 13 | @implementation TKTumblelogsRequestTests 14 | { 15 | NSArray *tumblelogs; 16 | BOOL requestHasFinished; 17 | void (^didReceiveResponseBlock)(TKTumblelogsResponse *response); 18 | void (^didFailWithErrorBlock)(NSError *error); 19 | } 20 | 21 | - (void)setUp 22 | { 23 | requestHasFinished = NO; 24 | } 25 | 26 | - (void)tearDown 27 | { 28 | 29 | } 30 | 31 | - (void)testSuccessfulRequest 32 | { 33 | NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"", TKTumblelogsRequestEmailKey, @"", TKTumblelogsRequestPasswordKey, nil]; 34 | TKTumblelogsRequest *request = [[TKTumblelogsRequest alloc] initWithOptions:options delegate:self]; 35 | [request start]; 36 | 37 | didFailWithErrorBlock = ^(NSError *error) { 38 | requestHasFinished = YES; 39 | STFail(@"An error occurred: %@", error); 40 | }; 41 | 42 | didReceiveResponseBlock = ^(TKTumblelogsResponse *response) { 43 | requestHasFinished = YES; 44 | tumblelogs = response.tumblelogs; 45 | }; 46 | 47 | // Keep running the mainRunLoop until the request has finished. 48 | while (!requestHasFinished) { 49 | [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; 50 | } 51 | 52 | STAssertNotNil(tumblelogs, nil); 53 | STAssertTrue([tumblelogs count] == 6, nil); 54 | 55 | TKTumblelog *tumblelog = [tumblelogs lastObject]; 56 | STAssertEqualObjects(tumblelog.title, @"TumblrKit test", nil); 57 | STAssertEqualObjects(tumblelog.name, @"tumblrkit-test", nil); 58 | STAssertEqualObjects(tumblelog.URL, [NSURL URLWithString:@"http://tumblrkit-test.tumblr.com/"], nil); 59 | } 60 | 61 | - (void)testForbiddenRequest 62 | { 63 | NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@"foo@bar", TKTumblelogsRequestEmailKey, @"baz", TKTumblelogsRequestPasswordKey, nil]; 64 | TKTumblelogsRequest *request = [[TKTumblelogsRequest alloc] initWithOptions:options delegate:self]; 65 | [request start]; 66 | 67 | didFailWithErrorBlock = ^(NSError *error) { 68 | requestHasFinished = YES; 69 | STAssertTrue(403 == [error code], nil); 70 | }; 71 | 72 | didReceiveResponseBlock = ^(TKTumblelogsResponse *response) { 73 | requestHasFinished = YES; 74 | STFail(@"Request should fail"); 75 | }; 76 | 77 | // Keep running the mainRunLoop until the request has finished. 78 | while (!requestHasFinished) { 79 | [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; 80 | } 81 | } 82 | 83 | - (void)tumblelogsRequest:(TKTumblelogsRequest *)request didReceiveResponse:(TKTumblelogsResponse *)response 84 | { 85 | didReceiveResponseBlock(response); 86 | } 87 | 88 | - (void)tumblelogsRequest:(TKTumblelogsRequest *)request didFailWithError:(NSError *)error 89 | { 90 | didFailWithErrorBlock(error); 91 | } 92 | 93 | @end 94 | -------------------------------------------------------------------------------- /TumblrKit Tests for iOS/TumblrKit Tests for iOS-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.qiih.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /TumblrKit Tests for iOS/TumblrKit Tests for iOS-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'TumblrKit Tests for iOS' target in the 'TumblrKit Tests for iOS' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /TumblrKit Tests for iOS/TumblrKit_Tests_for_iOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_Tests_for_iOS.h 3 | // TumblrKit Tests for iOS 4 | // 5 | // Created by Igor Sutton on 5/31/12. 6 | // Copyright (c) 2012 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TumblrKit_Tests_for_iOS : SenTestCase 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TumblrKit Tests for iOS/TumblrKit_Tests_for_iOS.m: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_Tests_for_iOS.m 3 | // TumblrKit Tests for iOS 4 | // 5 | // Created by Igor Sutton on 5/31/12. 6 | // Copyright (c) 2012 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import "TumblrKit_Tests_for_iOS.h" 10 | 11 | @implementation TumblrKit_Tests_for_iOS 12 | 13 | - (void)setUp 14 | { 15 | [super setUp]; 16 | 17 | // Set-up code here. 18 | } 19 | 20 | - (void)tearDown 21 | { 22 | // Tear-down code here. 23 | 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample 28 | { 29 | STFail(@"Unit tests are not implemented yet in TumblrKit Tests for iOS"); 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /TumblrKit Tests for iOS/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /TumblrKit for Mac/TumblrKit for Mac-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.qiih.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | NSHumanReadableCopyright 26 | Copyright © 2011 igorsutton.com. All rights reserved. 27 | NSPrincipalClass 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /TumblrKit for Mac/TumblrKit for Mac-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'TumblrKit for Mac' target in the 'TumblrKit for Mac' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #endif 8 | -------------------------------------------------------------------------------- /TumblrKit for Mac/TumblrKit_for_Mac.h: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_for_Mac.h 3 | // TumblrKit for Mac 4 | // 5 | // Created by Igor Sutton on 12/13/11. 6 | // Copyright (c) 2011 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TumblrKit_for_Mac : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TumblrKit for Mac/TumblrKit_for_Mac.m: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_for_Mac.m 3 | // TumblrKit for Mac 4 | // 5 | // Created by Igor Sutton on 12/13/11. 6 | // Copyright (c) 2011 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import "TumblrKit_for_Mac.h" 10 | 11 | @implementation TumblrKit_for_Mac 12 | 13 | - (id)init 14 | { 15 | self = [super init]; 16 | if (self) { 17 | // Initialization code here. 18 | } 19 | 20 | return self; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /TumblrKit for Mac/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /TumblrKit for iOS/TumblrKit for iOS-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'TumblrKit for iOS' target in the 'TumblrKit for iOS' project 3 | // 4 | 5 | #ifdef __OBJC__ 6 | #import 7 | #import 8 | #endif 9 | -------------------------------------------------------------------------------- /TumblrKit for iOS/TumblrKit_for_iOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_for_iOS.h 3 | // TumblrKit for iOS 4 | // 5 | // Created by Igor Sutton on 12/13/11. 6 | // Copyright (c) 2011 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TumblrKit_for_iOS : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /TumblrKit for iOS/TumblrKit_for_iOS.m: -------------------------------------------------------------------------------- 1 | // 2 | // TumblrKit_for_iOS.m 3 | // TumblrKit for iOS 4 | // 5 | // Created by Igor Sutton on 12/13/11. 6 | // Copyright (c) 2011 igorsutton.com. All rights reserved. 7 | // 8 | 9 | #import "TumblrKit_for_iOS.h" 10 | 11 | @implementation TumblrKit_for_iOS 12 | 13 | - (id)init 14 | { 15 | self = [super init]; 16 | if (self) { 17 | // Initialization code here. 18 | } 19 | 20 | return self; 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /TumblrKit.xcodeproj/igorsutton.mode2v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | XCProjectFormatConflictsModule 76 | Name 77 | Project Format Conflicts List 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | BundlePath 171 | /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources 172 | Description 173 | CondensedDescriptionKey 174 | DockingSystemVisible 175 | 176 | Extension 177 | mode2v3 178 | FavBarConfig 179 | 180 | PBXProjectModuleGUID 181 | 827E467111EB0D5D00684466 182 | XCBarModuleItemNames 183 | 184 | XCBarModuleItems 185 | 186 | 187 | FirstTimeWindowDisplayed 188 | 189 | Identifier 190 | com.apple.perspectives.project.mode2v3 191 | MajorVersion 192 | 34 193 | MinorVersion 194 | 0 195 | Name 196 | Condensed 197 | Notifications 198 | 199 | OpenEditors 200 | 201 | 202 | Content 203 | 204 | PBXProjectModuleGUID 205 | 82A53D9011ED1E0D006BA92A 206 | PBXProjectModuleLabel 207 | Test.m 208 | PBXSplitModuleInNavigatorKey 209 | 210 | Split0 211 | 212 | PBXProjectModuleGUID 213 | 82A53D9111ED1E0D006BA92A 214 | PBXProjectModuleLabel 215 | Test.m 216 | _historyCapacity 217 | 10 218 | bookmark 219 | 82A53D9711ED1E4B006BA92A 220 | history 221 | 222 | 82A53D9211ED1E0D006BA92A 223 | 224 | 225 | SplitCount 226 | 1 227 | 228 | StatusBarVisibility 229 | 230 | 231 | Geometry 232 | 233 | Frame 234 | {{0, 20}, {1060, 1026}} 235 | PBXModuleWindowStatusBarHidden2 236 | 237 | RubberWindowFrame 238 | 15 106 1060 1067 0 0 1920 1178 239 | 240 | 241 | 242 | Content 243 | 244 | PBXProjectModuleGUID 245 | 82A53D9811ED1E4B006BA92A 246 | PBXProjectModuleLabel 247 | TKTumblrConnection.h 248 | PBXSplitModuleInNavigatorKey 249 | 250 | Split0 251 | 252 | PBXProjectModuleGUID 253 | 82A53D9911ED1E4B006BA92A 254 | PBXProjectModuleLabel 255 | TKTumblrConnection.h 256 | _historyCapacity 257 | 10 258 | bookmark 259 | 82A53D9C11ED1E4B006BA92A 260 | history 261 | 262 | 82A53D9A11ED1E4B006BA92A 263 | 82A53D9B11ED1E4B006BA92A 264 | 265 | 266 | SplitCount 267 | 1 268 | 269 | StatusBarVisibility 270 | 271 | 272 | Geometry 273 | 274 | Frame 275 | {{0, 20}, {992, 1021}} 276 | PBXModuleWindowStatusBarHidden2 277 | 278 | RubberWindowFrame 279 | 84 48 992 1062 0 0 1920 1178 280 | 281 | 282 | 283 | PerspectiveWidths 284 | 285 | -1 286 | 287 | Perspectives 288 | 289 | 290 | ChosenToolbarItems 291 | 292 | active-combo-popup 293 | debugger-enable-breakpoints 294 | build-and-go 295 | com.apple.ide.PBXToolbarStopButton 296 | NSToolbarFlexibleSpaceItem 297 | get-info 298 | 299 | ControllerClassBaseName 300 | 301 | IconName 302 | WindowOfProject 303 | Identifier 304 | perspective.project 305 | IsVertical 306 | 307 | Layout 308 | 309 | 310 | Proportion 311 | 446pt 312 | Tabs 313 | 314 | 315 | BecomeActive 316 | 317 | ContentConfiguration 318 | 319 | PBXBottomSmartGroupGIDs 320 | 321 | PBXProjectModuleGUID 322 | 1C9437FD063B20B00039CFAC 323 | PBXProjectModuleLabel 324 | Files 325 | PBXProjectStructureProvided 326 | yes 327 | PBXSmartGroupTreeModuleColumnData 328 | 329 | PBXSmartGroupTreeModuleColumnWidthsKey 330 | 331 | 323 332 | 20 333 | 43 334 | 43 335 | 336 | PBXSmartGroupTreeModuleColumnsKey_v4 337 | 338 | MainColumn 339 | FileBuiltColumn 340 | ErrorsColumn 341 | WarningsColumn 342 | 343 | 344 | PBXSmartGroupTreeModuleOutlineStateKey_v7 345 | 346 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 347 | 348 | 0867D691FE84028FC02AAC07 349 | 08FB77AEFE84172EC02AAC07 350 | 32C88DFF0371C24200C91783 351 | 352 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 353 | 354 | 355 | 7 356 | 1 357 | 0 358 | 359 | 360 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 361 | {{0, 0}, {429, 333}} 362 | 363 | PBXTopSmartGroupGIDs 364 | 365 | XCIncludePerspectivesSwitch 366 | 367 | 368 | GeometryConfiguration 369 | 370 | Frame 371 | {{10, 27}, {446, 351}} 372 | GroupTreeTableConfiguration 373 | 374 | MainColumn 375 | 323 376 | FileBuiltColumn 377 | 20 378 | ErrorsColumn 379 | 43 380 | WarningsColumn 381 | 43 382 | 383 | RubberWindowFrame 384 | 1416 713 446 419 0 0 1920 1178 385 | 386 | Module 387 | PBXSmartGroupTreeModule 388 | 389 | 390 | ContentConfiguration 391 | 392 | PBXBottomSmartGroupGIDs 393 | 394 | 1C37FBAC04509CD000000102 395 | 1C37FAAC04509CD000000102 396 | 397 | PBXProjectModuleGUID 398 | 1C9437FE063B20B00039CFAC 399 | PBXProjectModuleLabel 400 | Targets 401 | PBXProjectStructureProvided 402 | no 403 | PBXSmartGroupTreeModuleColumnData 404 | 405 | PBXSmartGroupTreeModuleColumnWidthsKey 406 | 407 | 429 408 | 409 | PBXSmartGroupTreeModuleColumnsKey_v4 410 | 411 | MainColumn 412 | 413 | 414 | PBXSmartGroupTreeModuleOutlineStateKey_v7 415 | 416 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 417 | 418 | 1C37FBAC04509CD000000102 419 | 82A53D8C11ED1E0D006BA92A 420 | 82A53D8D11ED1E0D006BA92A 421 | 82A53D8E11ED1E0D006BA92A 422 | 82A53D8F11ED1E0D006BA92A 423 | 424 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 425 | 426 | 427 | 7 428 | 4 429 | 1 430 | 0 431 | 432 | 433 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 434 | {{0, 0}, {429, 333}} 435 | 436 | PBXTopSmartGroupGIDs 437 | 438 | XCIncludePerspectivesSwitch 439 | 440 | 441 | GeometryConfiguration 442 | 443 | Frame 444 | {{10, 27}, {446, 351}} 445 | GroupTreeTableConfiguration 446 | 447 | MainColumn 448 | 429 449 | 450 | 451 | Module 452 | PBXSmartGroupTreeModule 453 | 454 | 455 | ContentConfiguration 456 | 457 | PBXBottomSmartGroupGIDs 458 | 459 | 1C37FABC05509CD000000102 460 | 1C37FABC05539CD112110102 461 | E2644B35053B69B200211256 462 | 1C37FABC04509CD000100104 463 | 1CC0EA4004350EF90044410B 464 | 1CC0EA4004350EF90041110B 465 | 466 | PBXProjectModuleGUID 467 | 1C9437FF063B20B00039CFAC 468 | PBXProjectModuleLabel 469 | Other 470 | PBXProjectStructureProvided 471 | no 472 | PBXSmartGroupTreeModuleColumnData 473 | 474 | PBXSmartGroupTreeModuleColumnWidthsKey 475 | 476 | 555 477 | 478 | PBXSmartGroupTreeModuleColumnsKey_v4 479 | 480 | MainColumn 481 | 482 | 483 | PBXSmartGroupTreeModuleOutlineStateKey_v7 484 | 485 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 486 | 487 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 488 | 489 | 490 | 0 491 | 492 | 493 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 494 | {{0, 0}, {555, 301}} 495 | 496 | PBXTopSmartGroupGIDs 497 | 498 | XCIncludePerspectivesSwitch 499 | 500 | 501 | GeometryConfiguration 502 | 503 | Frame 504 | {{0, 0}, {572, 319}} 505 | GroupTreeTableConfiguration 506 | 507 | MainColumn 508 | 555 509 | 510 | 511 | Module 512 | PBXSmartGroupTreeModule 513 | 514 | 515 | 516 | 517 | Name 518 | Project 519 | ServiceClasses 520 | 521 | XCModuleDock 522 | XCDockableTabModule 523 | PBXSmartGroupTreeModule 524 | PBXSmartGroupTreeModule 525 | PBXSmartGroupTreeModule 526 | 527 | TableOfContents 528 | 529 | 82A53B9311EC8D7E006BA92A 530 | 82A53B9411EC8D7E006BA92A 531 | 1C9437FD063B20B00039CFAC 532 | 1C9437FE063B20B00039CFAC 533 | 1C9437FF063B20B00039CFAC 534 | 535 | ToolbarConfigUserDefaultsMinorVersion 536 | 2 537 | ToolbarConfiguration 538 | xcode.toolbar.config.default.shortV3 539 | 540 | 541 | PerspectivesBarVisible 542 | 543 | ShelfIsVisible 544 | 545 | SourceDescription 546 | file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode2.xcperspec' 547 | StatusbarIsVisible 548 | 549 | TimeStamp 550 | 0.0 551 | ToolbarConfigUserDefaultsMinorVersion 552 | 2 553 | ToolbarDisplayMode 554 | 2 555 | ToolbarIsVisible 556 | 557 | ToolbarSizeMode 558 | 1 559 | Type 560 | Perspectives 561 | UpdateMessage 562 | 563 | WindowJustification 564 | 0 565 | WindowOrderList 566 | 567 | 827E468111EB0E0600684466 568 | 82A53B9C11EC8D7E006BA92A 569 | 82A53B9D11EC8D7E006BA92A 570 | 1C530D5B069F1CE1000CFCEE 571 | 1C530D54069F1CE1000CFCEE 572 | 1C530D52069F1CE1000CFCEE 573 | /Users/igorsutton/Documents/Code/TumblrKit/TumblrKit.xcodeproj 574 | 82A53D9811ED1E4B006BA92A 575 | 82A53D9011ED1E0D006BA92A 576 | 577 | WindowString 578 | 1416 713 446 419 0 0 1920 1178 579 | WindowToolsV3 580 | 581 | 582 | Identifier 583 | windowTool.detail 584 | IsVertical 585 | 0 586 | Layout 587 | 588 | 589 | Dock 590 | 591 | 592 | BecomeActive 593 | 1 594 | ContentConfiguration 595 | 596 | PBXBottomSmartGroupGIDs 597 | 598 | 1C37FBAC04509CD000000102 599 | 1C37FAAC04509CD000000102 600 | 1C08E77C0454961000C914BD 601 | 1C37FABC05509CD000000102 602 | 1C37FABC05539CD112110102 603 | E2644B35053B69B200211256 604 | 1C37FABC04509CD000100104 605 | 1CC0EA4004350EF90044410B 606 | 1CC0EA4004350EF90041110B 607 | 608 | PBXProjectModuleGUID 609 | 1CE0B1FE06471DED0097A5F4 610 | PBXProjectModuleLabel 611 | Files 612 | PBXProjectStructureProvided 613 | yes 614 | PBXSmartGroupTreeModuleColumnData 615 | 616 | PBXSmartGroupTreeModuleColumnWidthsKey 617 | 618 | 245 619 | 620 | PBXSmartGroupTreeModuleColumnsKey_v4 621 | 622 | MainColumn 623 | 624 | 625 | PBXSmartGroupTreeModuleOutlineStateKey_v7 626 | 627 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 628 | 629 | 00C654E9FEEE28EC7F000001 630 | 1C37FABC05509CD000000102 631 | 632 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 633 | 634 | 635 | 0 636 | 637 | 638 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 639 | {{0, 0}, {245, 350}} 640 | 641 | PBXTopSmartGroupGIDs 642 | 643 | XCIncludePerspectivesSwitch 644 | 0 645 | 646 | GeometryConfiguration 647 | 648 | Frame 649 | {{0, 0}, {262, 368}} 650 | GroupTreeTableConfiguration 651 | 652 | MainColumn 653 | 245 654 | 655 | RubberWindowFrame 656 | 31 446 744 409 0 0 1440 878 657 | 658 | Module 659 | PBXSmartGroupTreeModule 660 | Proportion 661 | 262pt 662 | 663 | 664 | ContentConfiguration 665 | 666 | PBXProjectModuleGUID 667 | 1CA1AED706398EBD00589147 668 | PBXProjectModuleLabel 669 | Detail 670 | 671 | GeometryConfiguration 672 | 673 | Frame 674 | {{267, 0}, {477, 368}} 675 | RubberWindowFrame 676 | 31 446 744 409 0 0 1440 878 677 | 678 | Module 679 | XCDetailModule 680 | Proportion 681 | 477pt 682 | 683 | 684 | Proportion 685 | 100% 686 | 687 | 688 | Name 689 | Detail 690 | ServiceClasses 691 | 692 | PBXSmartGroupTreeModule 693 | XCDetailModule 694 | 695 | StatusbarIsVisible 696 | 1 697 | TableOfContents 698 | 699 | 1C335F2C07B51CD20023D4EE 700 | 1C335F2D07B51CD20023D4EE 701 | 1C335F2E07B51CD20023D4EE 702 | 1CE0B1FE06471DED0097A5F4 703 | 1CA1AED706398EBD00589147 704 | 705 | ToolbarConfiguration 706 | xcode.toolbar.config.defaultV3 707 | WindowString 708 | 31 446 744 409 0 0 1440 878 709 | WindowToolGUID 710 | 1C335F2C07B51CD20023D4EE 711 | WindowToolIsVisible 712 | 1 713 | 714 | 715 | Identifier 716 | MENUSEPARATOR 717 | 718 | 719 | FirstTimeWindowDisplayed 720 | 721 | Identifier 722 | windowTool.build 723 | IsVertical 724 | 725 | Layout 726 | 727 | 728 | Dock 729 | 730 | 731 | BecomeActive 732 | 733 | ContentConfiguration 734 | 735 | PBXProjectModuleGUID 736 | 1CD0528F0623707200166675 737 | PBXProjectModuleLabel 738 | Test.m 739 | StatusBarVisibility 740 | 741 | 742 | GeometryConfiguration 743 | 744 | Frame 745 | {{0, 0}, {1920, 836}} 746 | RubberWindowFrame 747 | 0 60 1920 1118 0 0 1920 1178 748 | 749 | Module 750 | PBXNavigatorGroup 751 | Proportion 752 | 836pt 753 | 754 | 755 | ContentConfiguration 756 | 757 | PBXProjectModuleGUID 758 | XCMainBuildResultsModuleGUID 759 | PBXProjectModuleLabel 760 | Build Results 761 | XCBuildResultsTrigger_Collapse 762 | 1021 763 | XCBuildResultsTrigger_Open 764 | 1011 765 | 766 | GeometryConfiguration 767 | 768 | Frame 769 | {{0, 841}, {1920, 236}} 770 | RubberWindowFrame 771 | 0 60 1920 1118 0 0 1920 1178 772 | 773 | Module 774 | PBXBuildResultsModule 775 | Proportion 776 | 236pt 777 | 778 | 779 | Proportion 780 | 1077pt 781 | 782 | 783 | Name 784 | Build Results 785 | ServiceClasses 786 | 787 | PBXBuildResultsModule 788 | 789 | StatusbarIsVisible 790 | 791 | TableOfContents 792 | 793 | 1C530D52069F1CE1000CFCEE 794 | 82A53B8A11EC8D79006BA92A 795 | 1CD0528F0623707200166675 796 | XCMainBuildResultsModuleGUID 797 | 798 | ToolbarConfiguration 799 | xcode.toolbar.config.buildV3 800 | WindowContentMinSize 801 | 486 300 802 | WindowString 803 | 0 60 1920 1118 0 0 1920 1178 804 | WindowToolGUID 805 | 1C530D52069F1CE1000CFCEE 806 | WindowToolIsVisible 807 | 808 | 809 | 810 | FirstTimeWindowDisplayed 811 | 812 | Identifier 813 | windowTool.debugger 814 | IsVertical 815 | 816 | Layout 817 | 818 | 819 | Dock 820 | 821 | 822 | ContentConfiguration 823 | 824 | Debugger 825 | 826 | HorizontalSplitView 827 | 828 | _collapsingFrameDimension 829 | 0.0 830 | _indexOfCollapsedView 831 | 0 832 | _percentageOfCollapsedView 833 | 0.0 834 | isCollapsed 835 | yes 836 | sizes 837 | 838 | {{0, 0}, {714, 461}} 839 | {{0, 461}, {714, 461}} 840 | 841 | 842 | VerticalSplitView 843 | 844 | _collapsingFrameDimension 845 | 0.0 846 | _indexOfCollapsedView 847 | 0 848 | _percentageOfCollapsedView 849 | 0.0 850 | isCollapsed 851 | yes 852 | sizes 853 | 854 | {{0, 0}, {714, 922}} 855 | {{714, 0}, {713, 922}} 856 | 857 | 858 | 859 | LauncherConfigVersion 860 | 8 861 | PBXProjectModuleGUID 862 | 1C162984064C10D400B95A72 863 | PBXProjectModuleLabel 864 | Debug - GLUTExamples (Underwater) 865 | 866 | GeometryConfiguration 867 | 868 | DebugConsoleVisible 869 | None 870 | DebugConsoleWindowFrame 871 | {{200, 200}, {500, 300}} 872 | DebugSTDIOWindowFrame 873 | {{200, 200}, {500, 300}} 874 | Frame 875 | {{0, 0}, {1427, 922}} 876 | PBXDebugSessionStackFrameViewKey 877 | 878 | DebugVariablesTableConfiguration 879 | 880 | Name 881 | 120 882 | Value 883 | 85 884 | Summary 885 | 484 886 | 887 | Frame 888 | {{0, 461}, {714, 461}} 889 | RubberWindowFrame 890 | 33 180 1427 963 0 0 1920 1178 891 | 892 | RubberWindowFrame 893 | 33 180 1427 963 0 0 1920 1178 894 | 895 | Module 896 | PBXDebugSessionModule 897 | Proportion 898 | 922pt 899 | 900 | 901 | Proportion 902 | 922pt 903 | 904 | 905 | Name 906 | Debugger 907 | ServiceClasses 908 | 909 | PBXDebugSessionModule 910 | 911 | StatusbarIsVisible 912 | 913 | TableOfContents 914 | 915 | 1C530D54069F1CE1000CFCEE 916 | 82A53B8B11EC8D79006BA92A 917 | 1C162984064C10D400B95A72 918 | 82A53B8C11EC8D79006BA92A 919 | 82A53B8D11EC8D79006BA92A 920 | 82A53B8E11EC8D79006BA92A 921 | 82A53B8F11EC8D79006BA92A 922 | 82A53B9011EC8D79006BA92A 923 | 924 | ToolbarConfiguration 925 | xcode.toolbar.config.debugV3 926 | WindowString 927 | 33 180 1427 963 0 0 1920 1178 928 | WindowToolGUID 929 | 1C530D54069F1CE1000CFCEE 930 | WindowToolIsVisible 931 | 932 | 933 | 934 | Identifier 935 | windowTool.find 936 | Layout 937 | 938 | 939 | Dock 940 | 941 | 942 | Dock 943 | 944 | 945 | ContentConfiguration 946 | 947 | PBXProjectModuleGUID 948 | 1CDD528C0622207200134675 949 | PBXProjectModuleLabel 950 | <No Editor> 951 | PBXSplitModuleInNavigatorKey 952 | 953 | Split0 954 | 955 | PBXProjectModuleGUID 956 | 1CD0528D0623707200166675 957 | 958 | SplitCount 959 | 1 960 | 961 | StatusBarVisibility 962 | 1 963 | 964 | GeometryConfiguration 965 | 966 | Frame 967 | {{0, 0}, {781, 167}} 968 | RubberWindowFrame 969 | 62 385 781 470 0 0 1440 878 970 | 971 | Module 972 | PBXNavigatorGroup 973 | Proportion 974 | 781pt 975 | 976 | 977 | Proportion 978 | 50% 979 | 980 | 981 | BecomeActive 982 | 1 983 | ContentConfiguration 984 | 985 | PBXProjectModuleGUID 986 | 1CD0528E0623707200166675 987 | PBXProjectModuleLabel 988 | Project Find 989 | 990 | GeometryConfiguration 991 | 992 | Frame 993 | {{8, 0}, {773, 254}} 994 | RubberWindowFrame 995 | 62 385 781 470 0 0 1440 878 996 | 997 | Module 998 | PBXProjectFindModule 999 | Proportion 1000 | 50% 1001 | 1002 | 1003 | Proportion 1004 | 428pt 1005 | 1006 | 1007 | Name 1008 | Project Find 1009 | ServiceClasses 1010 | 1011 | PBXProjectFindModule 1012 | 1013 | StatusbarIsVisible 1014 | 1 1015 | TableOfContents 1016 | 1017 | 1C530D57069F1CE1000CFCEE 1018 | 1C530D58069F1CE1000CFCEE 1019 | 1C530D59069F1CE1000CFCEE 1020 | 1CDD528C0622207200134675 1021 | 1C530D5A069F1CE1000CFCEE 1022 | 1CE0B1FE06471DED0097A5F4 1023 | 1CD0528E0623707200166675 1024 | 1025 | WindowString 1026 | 62 385 781 470 0 0 1440 878 1027 | WindowToolGUID 1028 | 1C530D57069F1CE1000CFCEE 1029 | WindowToolIsVisible 1030 | 0 1031 | 1032 | 1033 | Identifier 1034 | MENUSEPARATOR 1035 | 1036 | 1037 | FirstTimeWindowDisplayed 1038 | 1039 | Identifier 1040 | windowTool.debuggerConsole 1041 | IsVertical 1042 | 1043 | Layout 1044 | 1045 | 1046 | Dock 1047 | 1048 | 1049 | BecomeActive 1050 | 1051 | ContentConfiguration 1052 | 1053 | PBXProjectModuleGUID 1054 | 1C78EAAC065D492600B07095 1055 | PBXProjectModuleLabel 1056 | Debugger Console 1057 | 1058 | GeometryConfiguration 1059 | 1060 | Frame 1061 | {{0, 0}, {1529, 673}} 1062 | RubberWindowFrame 1063 | 33 429 1529 714 0 0 1920 1178 1064 | 1065 | Module 1066 | PBXDebugCLIModule 1067 | Proportion 1068 | 673pt 1069 | 1070 | 1071 | Proportion 1072 | 673pt 1073 | 1074 | 1075 | Name 1076 | Debugger Console 1077 | ServiceClasses 1078 | 1079 | PBXDebugCLIModule 1080 | 1081 | StatusbarIsVisible 1082 | 1083 | TableOfContents 1084 | 1085 | 1C530D5B069F1CE1000CFCEE 1086 | 82A53B9111EC8D79006BA92A 1087 | 1C78EAAC065D492600B07095 1088 | 1089 | ToolbarConfiguration 1090 | xcode.toolbar.config.consoleV3 1091 | WindowString 1092 | 33 429 1529 714 0 0 1920 1178 1093 | WindowToolGUID 1094 | 1C530D5B069F1CE1000CFCEE 1095 | WindowToolIsVisible 1096 | 1097 | 1098 | 1099 | Identifier 1100 | windowTool.snapshots 1101 | Layout 1102 | 1103 | 1104 | Dock 1105 | 1106 | 1107 | Module 1108 | XCSnapshotModule 1109 | Proportion 1110 | 100% 1111 | 1112 | 1113 | Proportion 1114 | 100% 1115 | 1116 | 1117 | Name 1118 | Snapshots 1119 | ServiceClasses 1120 | 1121 | XCSnapshotModule 1122 | 1123 | StatusbarIsVisible 1124 | Yes 1125 | ToolbarConfiguration 1126 | xcode.toolbar.config.snapshots 1127 | WindowString 1128 | 315 824 300 550 0 0 1440 878 1129 | WindowToolIsVisible 1130 | Yes 1131 | 1132 | 1133 | Identifier 1134 | windowTool.scm 1135 | Layout 1136 | 1137 | 1138 | Dock 1139 | 1140 | 1141 | ContentConfiguration 1142 | 1143 | PBXProjectModuleGUID 1144 | 1C78EAB2065D492600B07095 1145 | PBXProjectModuleLabel 1146 | <No Editor> 1147 | PBXSplitModuleInNavigatorKey 1148 | 1149 | Split0 1150 | 1151 | PBXProjectModuleGUID 1152 | 1C78EAB3065D492600B07095 1153 | 1154 | SplitCount 1155 | 1 1156 | 1157 | StatusBarVisibility 1158 | 1 1159 | 1160 | GeometryConfiguration 1161 | 1162 | Frame 1163 | {{0, 0}, {452, 0}} 1164 | RubberWindowFrame 1165 | 743 379 452 308 0 0 1280 1002 1166 | 1167 | Module 1168 | PBXNavigatorGroup 1169 | Proportion 1170 | 0pt 1171 | 1172 | 1173 | BecomeActive 1174 | 1 1175 | ContentConfiguration 1176 | 1177 | PBXProjectModuleGUID 1178 | 1CD052920623707200166675 1179 | PBXProjectModuleLabel 1180 | SCM 1181 | 1182 | GeometryConfiguration 1183 | 1184 | ConsoleFrame 1185 | {{0, 259}, {452, 0}} 1186 | Frame 1187 | {{0, 7}, {452, 259}} 1188 | RubberWindowFrame 1189 | 743 379 452 308 0 0 1280 1002 1190 | TableConfiguration 1191 | 1192 | Status 1193 | 30 1194 | FileName 1195 | 199 1196 | Path 1197 | 197.09500122070312 1198 | 1199 | TableFrame 1200 | {{0, 0}, {452, 250}} 1201 | 1202 | Module 1203 | PBXCVSModule 1204 | Proportion 1205 | 262pt 1206 | 1207 | 1208 | Proportion 1209 | 266pt 1210 | 1211 | 1212 | Name 1213 | SCM 1214 | ServiceClasses 1215 | 1216 | PBXCVSModule 1217 | 1218 | StatusbarIsVisible 1219 | 1 1220 | TableOfContents 1221 | 1222 | 1C78EAB4065D492600B07095 1223 | 1C78EAB5065D492600B07095 1224 | 1C78EAB2065D492600B07095 1225 | 1CD052920623707200166675 1226 | 1227 | ToolbarConfiguration 1228 | xcode.toolbar.config.scm 1229 | WindowString 1230 | 743 379 452 308 0 0 1280 1002 1231 | 1232 | 1233 | Identifier 1234 | windowTool.breakpoints 1235 | IsVertical 1236 | 0 1237 | Layout 1238 | 1239 | 1240 | Dock 1241 | 1242 | 1243 | BecomeActive 1244 | 1 1245 | ContentConfiguration 1246 | 1247 | PBXBottomSmartGroupGIDs 1248 | 1249 | 1C77FABC04509CD000000102 1250 | 1251 | PBXProjectModuleGUID 1252 | 1CE0B1FE06471DED0097A5F4 1253 | PBXProjectModuleLabel 1254 | Files 1255 | PBXProjectStructureProvided 1256 | no 1257 | PBXSmartGroupTreeModuleColumnData 1258 | 1259 | PBXSmartGroupTreeModuleColumnWidthsKey 1260 | 1261 | 168 1262 | 1263 | PBXSmartGroupTreeModuleColumnsKey_v4 1264 | 1265 | MainColumn 1266 | 1267 | 1268 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1269 | 1270 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1271 | 1272 | 1C77FABC04509CD000000102 1273 | 1274 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1275 | 1276 | 1277 | 0 1278 | 1279 | 1280 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1281 | {{0, 0}, {168, 350}} 1282 | 1283 | PBXTopSmartGroupGIDs 1284 | 1285 | XCIncludePerspectivesSwitch 1286 | 0 1287 | 1288 | GeometryConfiguration 1289 | 1290 | Frame 1291 | {{0, 0}, {185, 368}} 1292 | GroupTreeTableConfiguration 1293 | 1294 | MainColumn 1295 | 168 1296 | 1297 | RubberWindowFrame 1298 | 315 424 744 409 0 0 1440 878 1299 | 1300 | Module 1301 | PBXSmartGroupTreeModule 1302 | Proportion 1303 | 185pt 1304 | 1305 | 1306 | ContentConfiguration 1307 | 1308 | PBXProjectModuleGUID 1309 | 1CA1AED706398EBD00589147 1310 | PBXProjectModuleLabel 1311 | Detail 1312 | 1313 | GeometryConfiguration 1314 | 1315 | Frame 1316 | {{190, 0}, {554, 368}} 1317 | RubberWindowFrame 1318 | 315 424 744 409 0 0 1440 878 1319 | 1320 | Module 1321 | XCDetailModule 1322 | Proportion 1323 | 554pt 1324 | 1325 | 1326 | Proportion 1327 | 368pt 1328 | 1329 | 1330 | MajorVersion 1331 | 3 1332 | MinorVersion 1333 | 0 1334 | Name 1335 | Breakpoints 1336 | ServiceClasses 1337 | 1338 | PBXSmartGroupTreeModule 1339 | XCDetailModule 1340 | 1341 | StatusbarIsVisible 1342 | 1 1343 | TableOfContents 1344 | 1345 | 1CDDB66807F98D9800BB5817 1346 | 1CDDB66907F98D9800BB5817 1347 | 1CE0B1FE06471DED0097A5F4 1348 | 1CA1AED706398EBD00589147 1349 | 1350 | ToolbarConfiguration 1351 | xcode.toolbar.config.breakpointsV3 1352 | WindowString 1353 | 315 424 744 409 0 0 1440 878 1354 | WindowToolGUID 1355 | 1CDDB66807F98D9800BB5817 1356 | WindowToolIsVisible 1357 | 1 1358 | 1359 | 1360 | Identifier 1361 | windowTool.debugAnimator 1362 | Layout 1363 | 1364 | 1365 | Dock 1366 | 1367 | 1368 | Module 1369 | PBXNavigatorGroup 1370 | Proportion 1371 | 100% 1372 | 1373 | 1374 | Proportion 1375 | 100% 1376 | 1377 | 1378 | Name 1379 | Debug Visualizer 1380 | ServiceClasses 1381 | 1382 | PBXNavigatorGroup 1383 | 1384 | StatusbarIsVisible 1385 | 1 1386 | ToolbarConfiguration 1387 | xcode.toolbar.config.debugAnimatorV3 1388 | WindowString 1389 | 100 100 700 500 0 0 1280 1002 1390 | 1391 | 1392 | Identifier 1393 | windowTool.bookmarks 1394 | Layout 1395 | 1396 | 1397 | Dock 1398 | 1399 | 1400 | Module 1401 | PBXBookmarksModule 1402 | Proportion 1403 | 100% 1404 | 1405 | 1406 | Proportion 1407 | 100% 1408 | 1409 | 1410 | Name 1411 | Bookmarks 1412 | ServiceClasses 1413 | 1414 | PBXBookmarksModule 1415 | 1416 | StatusbarIsVisible 1417 | 0 1418 | WindowString 1419 | 538 42 401 187 0 0 1280 1002 1420 | 1421 | 1422 | Identifier 1423 | windowTool.projectFormatConflicts 1424 | Layout 1425 | 1426 | 1427 | Dock 1428 | 1429 | 1430 | Module 1431 | XCProjectFormatConflictsModule 1432 | Proportion 1433 | 100% 1434 | 1435 | 1436 | Proportion 1437 | 100% 1438 | 1439 | 1440 | Name 1441 | Project Format Conflicts 1442 | ServiceClasses 1443 | 1444 | XCProjectFormatConflictsModule 1445 | 1446 | StatusbarIsVisible 1447 | 0 1448 | WindowContentMinSize 1449 | 450 300 1450 | WindowString 1451 | 50 850 472 307 0 0 1440 877 1452 | 1453 | 1454 | Identifier 1455 | windowTool.classBrowser 1456 | Layout 1457 | 1458 | 1459 | Dock 1460 | 1461 | 1462 | BecomeActive 1463 | 1 1464 | ContentConfiguration 1465 | 1466 | OptionsSetName 1467 | Hierarchy, all classes 1468 | PBXProjectModuleGUID 1469 | 1CA6456E063B45B4001379D8 1470 | PBXProjectModuleLabel 1471 | Class Browser - NSObject 1472 | 1473 | GeometryConfiguration 1474 | 1475 | ClassesFrame 1476 | {{0, 0}, {368, 96}} 1477 | ClassesTreeTableConfiguration 1478 | 1479 | PBXClassNameColumnIdentifier 1480 | 208 1481 | PBXClassBookColumnIdentifier 1482 | 22 1483 | 1484 | Frame 1485 | {{0, 0}, {624, 318}} 1486 | MembersFrame 1487 | {{0, 105}, {368, 395}} 1488 | MembersTreeTableConfiguration 1489 | 1490 | PBXMemberTypeIconColumnIdentifier 1491 | 22 1492 | PBXMemberNameColumnIdentifier 1493 | 216 1494 | PBXMemberTypeColumnIdentifier 1495 | 91 1496 | PBXMemberBookColumnIdentifier 1497 | 22 1498 | 1499 | PBXModuleWindowStatusBarHidden2 1500 | 1 1501 | RubberWindowFrame 1502 | 128 171 624 339 0 0 1440 878 1503 | 1504 | Module 1505 | PBXClassBrowserModule 1506 | Proportion 1507 | 319pt 1508 | 1509 | 1510 | Proportion 1511 | 319pt 1512 | 1513 | 1514 | Name 1515 | Class Browser 1516 | ServiceClasses 1517 | 1518 | PBXClassBrowserModule 1519 | 1520 | StatusbarIsVisible 1521 | 0 1522 | TableOfContents 1523 | 1524 | 1C530D60069F1CE1000CFCEE 1525 | 1C530D61069F1CE1000CFCEE 1526 | 1CA6456E063B45B4001379D8 1527 | 1528 | ToolbarConfiguration 1529 | xcode.toolbar.config.classbrowser 1530 | WindowString 1531 | 128 171 624 339 0 0 1440 878 1532 | WindowToolGUID 1533 | 1C530D60069F1CE1000CFCEE 1534 | WindowToolIsVisible 1535 | 0 1536 | 1537 | 1538 | FirstTimeWindowDisplayed 1539 | 1540 | Identifier 1541 | windowTool.refactoring 1542 | IncludeInToolsMenu 1543 | 0 1544 | IsVertical 1545 | 1546 | Layout 1547 | 1548 | 1549 | Dock 1550 | 1551 | 1552 | ContentConfiguration 1553 | 1554 | PBXProjectModuleGUID 1555 | 827E468011EB0E0600684466 1556 | 1557 | GeometryConfiguration 1558 | 1559 | Frame 1560 | {{0, 0}, {1039, 689}} 1561 | RubberWindowFrame 1562 | 59 399 1039 730 0 0 1920 1178 1563 | XCRefactoringSplitViewLowerHeight 1564 | 300 1565 | XCRefactoringSplitViewTotalHeight 1566 | 606 1567 | 1568 | Module 1569 | XCRefactoringModule 1570 | Proportion 1571 | 689pt 1572 | 1573 | 1574 | Proportion 1575 | 689pt 1576 | 1577 | 1578 | Name 1579 | Refactoring 1580 | ServiceClasses 1581 | 1582 | XCRefactoringModule 1583 | 1584 | StatusbarIsVisible 1585 | 1586 | TableOfContents 1587 | 1588 | 827E468111EB0E0600684466 1589 | 82A53B9211EC8D79006BA92A 1590 | 827E468011EB0E0600684466 1591 | 1592 | WindowString 1593 | 59 399 1039 730 0 0 1920 1178 1594 | WindowToolGUID 1595 | 827E468111EB0E0600684466 1596 | WindowToolIsVisible 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | -------------------------------------------------------------------------------- /TumblrKit.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXAggregateTarget section */ 10 | 82B09E70123543700006D003 /* Documentation */ = { 11 | isa = PBXAggregateTarget; 12 | buildConfigurationList = 82B09E781235438A0006D003 /* Build configuration list for PBXAggregateTarget "Documentation" */; 13 | buildPhases = ( 14 | 82B09E6F123543700006D003 /* ShellScript */, 15 | ); 16 | dependencies = ( 17 | ); 18 | name = Documentation; 19 | productName = Documentation; 20 | }; 21 | /* End PBXAggregateTarget section */ 22 | 23 | /* Begin PBXBuildFile section */ 24 | 8231532B1577816900D73D75 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F79916149924E900920028 /* SenTestingKit.framework */; }; 25 | 8231532D1577816900D73D75 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8231532C1577816900D73D75 /* UIKit.framework */; }; 26 | 8231532E1577816900D73D75 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 827902D614979B0C0018F19E /* Foundation.framework */; }; 27 | 823153341577816900D73D75 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 823153321577816900D73D75 /* InfoPlist.strings */; }; 28 | 823153371577816900D73D75 /* TumblrKit_Tests_for_iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 823153361577816900D73D75 /* TumblrKit_Tests_for_iOS.m */; }; 29 | 823153461577854000D73D75 /* libTumblrKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8279032A1497E53E0018F19E /* libTumblrKit.a */; }; 30 | 8279032B1497E53E0018F19E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 827902D614979B0C0018F19E /* Foundation.framework */; }; 31 | 827903311497E53E0018F19E /* TumblrKit_for_iOS.m in Sources */ = {isa = PBXBuildFile; fileRef = 827903301497E53E0018F19E /* TumblrKit_for_iOS.m */; }; 32 | 8279034F1497E5860018F19E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 827902FF1497E4600018F19E /* Cocoa.framework */; }; 33 | 827903551497E5860018F19E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 827903531497E5860018F19E /* InfoPlist.strings */; }; 34 | 827903591497E5860018F19E /* TumblrKit_for_Mac.m in Sources */ = {isa = PBXBuildFile; fileRef = 827903581497E5860018F19E /* TumblrKit_for_Mac.m */; }; 35 | 82F798F31497E78A00920028 /* NSDictionary+TumblrKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 82B09F41123664CD0006D003 /* NSDictionary+TumblrKit.m */; }; 36 | 82F798F41497E78A00920028 /* NSString+TumblrKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 826CD95D11EDDAD600F5CB24 /* NSString+TumblrKit.m */; }; 37 | 82F798F51497E78A00920028 /* TKPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 827E467711EB0D9100684466 /* TKPost.m */; }; 38 | 82F798F61497E78A00920028 /* TKTumblr.m in Sources */ = {isa = PBXBuildFile; fileRef = 82B09EAF123643A70006D003 /* TKTumblr.m */; }; 39 | 82F798F71497E78A00920028 /* TKTumblrReadRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82B0A018123675EF0006D003 /* TKTumblrReadRequest.m */; }; 40 | 82F798F81497E78A00920028 /* TKTumblelog.m in Sources */ = {isa = PBXBuildFile; fileRef = 821DE1CE1237D09300B6A45D /* TKTumblelog.m */; }; 41 | 82F798FA1497E7A400920028 /* NSDictionary+TumblrKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 82B09F41123664CD0006D003 /* NSDictionary+TumblrKit.m */; }; 42 | 82F798FB1497E7A400920028 /* NSString+TumblrKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 826CD95D11EDDAD600F5CB24 /* NSString+TumblrKit.m */; }; 43 | 82F798FC1497E7A400920028 /* TKPost.m in Sources */ = {isa = PBXBuildFile; fileRef = 827E467711EB0D9100684466 /* TKPost.m */; }; 44 | 82F798FD1497E7A400920028 /* TKTumblr.m in Sources */ = {isa = PBXBuildFile; fileRef = 82B09EAF123643A70006D003 /* TKTumblr.m */; }; 45 | 82F798FE1497E7A400920028 /* TKTumblrReadRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82B0A018123675EF0006D003 /* TKTumblrReadRequest.m */; }; 46 | 82F798FF1497E7A400920028 /* TKTumblelog.m in Sources */ = {isa = PBXBuildFile; fileRef = 821DE1CE1237D09300B6A45D /* TKTumblelog.m */; }; 47 | 82F799011497E7E700920028 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 827902F71497E2A90018F19E /* UIKit.framework */; }; 48 | 82F799051497ED7A00920028 /* TKRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F799031497ED4E00920028 /* TKRequest.m */; }; 49 | 82F799081497F27300920028 /* TKPostsRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F799061497F27300920028 /* TKPostsRequest.h */; }; 50 | 82F799091497F27300920028 /* TKPostsRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F799061497F27300920028 /* TKPostsRequest.h */; }; 51 | 82F7990A1497F27300920028 /* TKPostsRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F799071497F27300920028 /* TKPostsRequest.m */; }; 52 | 82F7990B1497F27300920028 /* TKPostsRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F799071497F27300920028 /* TKPostsRequest.m */; }; 53 | 82F7990F1499244800920028 /* TKRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F799031497ED4E00920028 /* TKRequest.m */; }; 54 | 82F79917149924E900920028 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82F79916149924E900920028 /* SenTestingKit.framework */; }; 55 | 82F79918149924E900920028 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 827902FF1497E4600018F19E /* Cocoa.framework */; }; 56 | 82F7991E149924E900920028 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 82F7991C149924E900920028 /* InfoPlist.strings */; }; 57 | 82F79921149924E900920028 /* TumblrKit_Tests_for_Mac.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F79920149924E900920028 /* TumblrKit_Tests_for_Mac.m */; }; 58 | 82F799281499266E00920028 /* TumblrKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8279034E1497E5860018F19E /* TumblrKit.framework */; }; 59 | 82F7992B14992ED100920028 /* TKPostsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F7992914992ED100920028 /* TKPostsResponse.h */; }; 60 | 82F7992C14992ED100920028 /* TKPostsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F7992914992ED100920028 /* TKPostsResponse.h */; }; 61 | 82F7992D14992ED100920028 /* TKPostsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F7992A14992ED100920028 /* TKPostsResponse.m */; }; 62 | 82F7992E14992ED100920028 /* TKPostsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F7992A14992ED100920028 /* TKPostsResponse.m */; }; 63 | 82F79931149A167B00920028 /* TKTumblelogsRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F7992F149A167A00920028 /* TKTumblelogsRequest.h */; }; 64 | 82F79932149A167B00920028 /* TKTumblelogsRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F7992F149A167A00920028 /* TKTumblelogsRequest.h */; }; 65 | 82F79933149A167B00920028 /* TKTumblelogsRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F79930149A167A00920028 /* TKTumblelogsRequest.m */; }; 66 | 82F79934149A167B00920028 /* TKTumblelogsRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F79930149A167A00920028 /* TKTumblelogsRequest.m */; }; 67 | 82F79937149A19F500920028 /* TKTumblelogsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F79935149A19F500920028 /* TKTumblelogsResponse.h */; }; 68 | 82F79938149A19F500920028 /* TKTumblelogsResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 82F79935149A19F500920028 /* TKTumblelogsResponse.h */; }; 69 | 82F79939149A19F500920028 /* TKTumblelogsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F79936149A19F500920028 /* TKTumblelogsResponse.m */; }; 70 | 82F7993A149A19F500920028 /* TKTumblelogsResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 82F79936149A19F500920028 /* TKTumblelogsResponse.m */; }; 71 | 8DC2EF5A0486A6940098B219 /* TKTumblelogsRequestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DC2EF5A0486A6940098B218 /* TKTumblelogsRequestTests.m */; }; 72 | /* End PBXBuildFile section */ 73 | 74 | /* Begin PBXContainerItemProxy section */ 75 | 823153431577850200D73D75 /* PBXContainerItemProxy */ = { 76 | isa = PBXContainerItemProxy; 77 | containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 78 | proxyType = 1; 79 | remoteGlobalIDString = 827903291497E53E0018F19E; 80 | remoteInfo = "TumblrKit for iOS"; 81 | }; 82 | 82F79926149924FA00920028 /* PBXContainerItemProxy */ = { 83 | isa = PBXContainerItemProxy; 84 | containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; 85 | proxyType = 1; 86 | remoteGlobalIDString = 8279034D1497E5860018F19E; 87 | remoteInfo = "TumblrKit for Mac"; 88 | }; 89 | /* End PBXContainerItemProxy section */ 90 | 91 | /* Begin PBXFileReference section */ 92 | 0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 93 | 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 94 | 821384C812DF309700547830 /* MIT-LICENSE.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "MIT-LICENSE.txt"; sourceTree = ""; }; 95 | 821DE1CD1237D09300B6A45D /* TKTumblelog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKTumblelog.h; sourceTree = ""; }; 96 | 821DE1CE1237D09300B6A45D /* TKTumblelog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKTumblelog.m; sourceTree = ""; }; 97 | 8231532A1577816900D73D75 /* TumblrKit Tests for iOS.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TumblrKit Tests for iOS.octest"; sourceTree = BUILT_PRODUCTS_DIR; }; 98 | 8231532C1577816900D73D75 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 99 | 823153311577816900D73D75 /* TumblrKit Tests for iOS-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TumblrKit Tests for iOS-Info.plist"; sourceTree = ""; }; 100 | 823153331577816900D73D75 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 101 | 823153351577816900D73D75 /* TumblrKit_Tests_for_iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TumblrKit_Tests_for_iOS.h; sourceTree = ""; }; 102 | 823153361577816900D73D75 /* TumblrKit_Tests_for_iOS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TumblrKit_Tests_for_iOS.m; sourceTree = ""; }; 103 | 823153381577816900D73D75 /* TumblrKit Tests for iOS-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TumblrKit Tests for iOS-Prefix.pch"; sourceTree = ""; }; 104 | 826CD95C11EDDAD600F5CB24 /* NSString+TumblrKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+TumblrKit.h"; sourceTree = ""; }; 105 | 826CD95D11EDDAD600F5CB24 /* NSString+TumblrKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+TumblrKit.m"; sourceTree = ""; }; 106 | 827902D614979B0C0018F19E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 107 | 827902F71497E2A90018F19E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 108 | 827902FF1497E4600018F19E /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 109 | 827903021497E4600018F19E /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 110 | 827903031497E4600018F19E /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; 111 | 827903041497E4600018F19E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 112 | 8279032A1497E53E0018F19E /* libTumblrKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libTumblrKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; 113 | 8279032E1497E53E0018F19E /* TumblrKit for iOS-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TumblrKit for iOS-Prefix.pch"; sourceTree = ""; }; 114 | 8279032F1497E53E0018F19E /* TumblrKit_for_iOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TumblrKit_for_iOS.h; sourceTree = ""; }; 115 | 827903301497E53E0018F19E /* TumblrKit_for_iOS.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TumblrKit_for_iOS.m; sourceTree = ""; }; 116 | 8279034E1497E5860018F19E /* TumblrKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TumblrKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 117 | 827903521497E5860018F19E /* TumblrKit for Mac-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TumblrKit for Mac-Info.plist"; sourceTree = ""; }; 118 | 827903541497E5860018F19E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 119 | 827903561497E5860018F19E /* TumblrKit for Mac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TumblrKit for Mac-Prefix.pch"; sourceTree = ""; }; 120 | 827903571497E5860018F19E /* TumblrKit_for_Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TumblrKit_for_Mac.h; sourceTree = ""; }; 121 | 827903581497E5860018F19E /* TumblrKit_for_Mac.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TumblrKit_for_Mac.m; sourceTree = ""; }; 122 | 827E467611EB0D9100684466 /* TKPost.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKPost.h; sourceTree = ""; }; 123 | 827E467711EB0D9100684466 /* TKPost.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKPost.m; sourceTree = ""; }; 124 | 82A53DD011ED938C006BA92A /* TKTumblr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKTumblr.h; sourceTree = ""; }; 125 | 82B09EAF123643A70006D003 /* TKTumblr.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKTumblr.m; sourceTree = ""; }; 126 | 82B09F40123664CD0006D003 /* NSDictionary+TumblrKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+TumblrKit.h"; sourceTree = ""; }; 127 | 82B09F41123664CD0006D003 /* NSDictionary+TumblrKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+TumblrKit.m"; sourceTree = ""; }; 128 | 82B0A017123675EF0006D003 /* TKTumblrReadRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKTumblrReadRequest.h; sourceTree = ""; }; 129 | 82B0A018123675EF0006D003 /* TKTumblrReadRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKTumblrReadRequest.m; sourceTree = ""; }; 130 | 82B0A044123678940006D003 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; sourceTree = ""; }; 131 | 82F799021497ED4E00920028 /* TKRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKRequest.h; sourceTree = ""; }; 132 | 82F799031497ED4E00920028 /* TKRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKRequest.m; sourceTree = ""; }; 133 | 82F799061497F27300920028 /* TKPostsRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKPostsRequest.h; sourceTree = ""; }; 134 | 82F799071497F27300920028 /* TKPostsRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKPostsRequest.m; sourceTree = ""; }; 135 | 82F79915149924E900920028 /* TumblrKit Tests for Mac.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TumblrKit Tests for Mac.octest"; sourceTree = BUILT_PRODUCTS_DIR; }; 136 | 82F79916149924E900920028 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; 137 | 82F7991B149924E900920028 /* TumblrKit Tests for Mac-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TumblrKit Tests for Mac-Info.plist"; sourceTree = ""; }; 138 | 82F7991D149924E900920028 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 139 | 82F7991F149924E900920028 /* TumblrKit_Tests_for_Mac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TumblrKit_Tests_for_Mac.h; sourceTree = ""; }; 140 | 82F79920149924E900920028 /* TumblrKit_Tests_for_Mac.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TumblrKit_Tests_for_Mac.m; sourceTree = ""; }; 141 | 82F79922149924E900920028 /* TumblrKit Tests for Mac-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TumblrKit Tests for Mac-Prefix.pch"; sourceTree = ""; }; 142 | 82F7992914992ED100920028 /* TKPostsResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKPostsResponse.h; sourceTree = ""; }; 143 | 82F7992A14992ED100920028 /* TKPostsResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKPostsResponse.m; sourceTree = ""; }; 144 | 82F7992F149A167A00920028 /* TKTumblelogsRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKTumblelogsRequest.h; sourceTree = ""; }; 145 | 82F79930149A167A00920028 /* TKTumblelogsRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKTumblelogsRequest.m; sourceTree = ""; }; 146 | 82F79935149A19F500920028 /* TKTumblelogsResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKTumblelogsResponse.h; sourceTree = ""; }; 147 | 82F79936149A19F500920028 /* TKTumblelogsResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKTumblelogsResponse.m; sourceTree = ""; }; 148 | 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 149 | 8DC2EF5A0486A6940098B217 /* TKTumblelogsRequestTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TKTumblelogsRequestTests.h; sourceTree = ""; }; 150 | 8DC2EF5A0486A6940098B218 /* TKTumblelogsRequestTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TKTumblelogsRequestTests.m; sourceTree = ""; }; 151 | /* End PBXFileReference section */ 152 | 153 | /* Begin PBXFrameworksBuildPhase section */ 154 | 823153261577816900D73D75 /* Frameworks */ = { 155 | isa = PBXFrameworksBuildPhase; 156 | buildActionMask = 2147483647; 157 | files = ( 158 | 823153461577854000D73D75 /* libTumblrKit.a in Frameworks */, 159 | 8231532B1577816900D73D75 /* SenTestingKit.framework in Frameworks */, 160 | 8231532D1577816900D73D75 /* UIKit.framework in Frameworks */, 161 | 8231532E1577816900D73D75 /* Foundation.framework in Frameworks */, 162 | ); 163 | runOnlyForDeploymentPostprocessing = 0; 164 | }; 165 | 827903271497E53E0018F19E /* Frameworks */ = { 166 | isa = PBXFrameworksBuildPhase; 167 | buildActionMask = 2147483647; 168 | files = ( 169 | 82F799011497E7E700920028 /* UIKit.framework in Frameworks */, 170 | 8279032B1497E53E0018F19E /* Foundation.framework in Frameworks */, 171 | ); 172 | runOnlyForDeploymentPostprocessing = 0; 173 | }; 174 | 8279034A1497E5860018F19E /* Frameworks */ = { 175 | isa = PBXFrameworksBuildPhase; 176 | buildActionMask = 2147483647; 177 | files = ( 178 | 8279034F1497E5860018F19E /* Cocoa.framework in Frameworks */, 179 | ); 180 | runOnlyForDeploymentPostprocessing = 0; 181 | }; 182 | 82F79911149924E900920028 /* Frameworks */ = { 183 | isa = PBXFrameworksBuildPhase; 184 | buildActionMask = 2147483647; 185 | files = ( 186 | 82F79917149924E900920028 /* SenTestingKit.framework in Frameworks */, 187 | 82F799281499266E00920028 /* TumblrKit.framework in Frameworks */, 188 | 82F79918149924E900920028 /* Cocoa.framework in Frameworks */, 189 | ); 190 | runOnlyForDeploymentPostprocessing = 0; 191 | }; 192 | /* End PBXFrameworksBuildPhase section */ 193 | 194 | /* Begin PBXGroup section */ 195 | 034768DFFF38A50411DB9C8B /* Products */ = { 196 | isa = PBXGroup; 197 | children = ( 198 | 8279032A1497E53E0018F19E /* libTumblrKit.a */, 199 | 8279034E1497E5860018F19E /* TumblrKit.framework */, 200 | 82F79915149924E900920028 /* TumblrKit Tests for Mac.octest */, 201 | 8231532A1577816900D73D75 /* TumblrKit Tests for iOS.octest */, 202 | ); 203 | name = Products; 204 | sourceTree = ""; 205 | }; 206 | 0867D691FE84028FC02AAC07 /* TumblrKit */ = { 207 | isa = PBXGroup; 208 | children = ( 209 | 08FB77AEFE84172EC02AAC07 /* Classes */, 210 | 32C88DFF0371C24200C91783 /* Other Sources */, 211 | 089C1665FE841158C02AAC07 /* Resources */, 212 | 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, 213 | 8279032C1497E53E0018F19E /* TumblrKit for iOS */, 214 | 827903501497E5860018F19E /* TumblrKit for Mac */, 215 | 82F79919149924E900920028 /* TumblrKit Tests for Mac */, 216 | 8231532F1577816900D73D75 /* TumblrKit Tests for iOS */, 217 | 827902D514979B0C0018F19E /* Frameworks */, 218 | 034768DFFF38A50411DB9C8B /* Products */, 219 | ); 220 | name = TumblrKit; 221 | sourceTree = ""; 222 | }; 223 | 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { 224 | isa = PBXGroup; 225 | children = ( 226 | 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */, 227 | 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */, 228 | ); 229 | name = "External Frameworks and Libraries"; 230 | sourceTree = ""; 231 | }; 232 | 089C1665FE841158C02AAC07 /* Resources */ = { 233 | isa = PBXGroup; 234 | children = ( 235 | 8DC2EF5A0486A6940098B216 /* Info.plist */, 236 | 089C1666FE841158C02AAC07 /* InfoPlist.strings */, 237 | 82B0A044123678940006D003 /* README.md */, 238 | 821384C812DF309700547830 /* MIT-LICENSE.txt */, 239 | ); 240 | name = Resources; 241 | sourceTree = ""; 242 | }; 243 | 08FB77AEFE84172EC02AAC07 /* Classes */ = { 244 | isa = PBXGroup; 245 | children = ( 246 | 82B0A029123676790006D003 /* TumblrKit Additions */, 247 | 827E467611EB0D9100684466 /* TKPost.h */, 248 | 827E467711EB0D9100684466 /* TKPost.m */, 249 | 82A53DD011ED938C006BA92A /* TKTumblr.h */, 250 | 82B09EAF123643A70006D003 /* TKTumblr.m */, 251 | 82B0A017123675EF0006D003 /* TKTumblrReadRequest.h */, 252 | 82B0A018123675EF0006D003 /* TKTumblrReadRequest.m */, 253 | 821DE1CD1237D09300B6A45D /* TKTumblelog.h */, 254 | 821DE1CE1237D09300B6A45D /* TKTumblelog.m */, 255 | 82F799021497ED4E00920028 /* TKRequest.h */, 256 | 82F799031497ED4E00920028 /* TKRequest.m */, 257 | 82F799061497F27300920028 /* TKPostsRequest.h */, 258 | 82F799071497F27300920028 /* TKPostsRequest.m */, 259 | 82F7992914992ED100920028 /* TKPostsResponse.h */, 260 | 82F7992A14992ED100920028 /* TKPostsResponse.m */, 261 | 82F7992F149A167A00920028 /* TKTumblelogsRequest.h */, 262 | 82F79930149A167A00920028 /* TKTumblelogsRequest.m */, 263 | 82F79935149A19F500920028 /* TKTumblelogsResponse.h */, 264 | 82F79936149A19F500920028 /* TKTumblelogsResponse.m */, 265 | ); 266 | name = Classes; 267 | sourceTree = ""; 268 | }; 269 | 1058C7B0FEA5585E11CA2CBB /* Linked Frameworks */ = { 270 | isa = PBXGroup; 271 | children = ( 272 | 827902F71497E2A90018F19E /* UIKit.framework */, 273 | 0867D69BFE84028FC02AAC07 /* Foundation.framework */, 274 | ); 275 | name = "Linked Frameworks"; 276 | sourceTree = ""; 277 | }; 278 | 1058C7B2FEA5585E11CA2CBB /* Other Frameworks */ = { 279 | isa = PBXGroup; 280 | children = ( 281 | ); 282 | name = "Other Frameworks"; 283 | sourceTree = ""; 284 | }; 285 | 32C88DFF0371C24200C91783 /* Other Sources */ = { 286 | isa = PBXGroup; 287 | children = ( 288 | ); 289 | name = "Other Sources"; 290 | sourceTree = ""; 291 | }; 292 | 8231532F1577816900D73D75 /* TumblrKit Tests for iOS */ = { 293 | isa = PBXGroup; 294 | children = ( 295 | 8DC2EF5A0486A6940098B218 /* TKTumblelogsRequestTests.m */, 296 | 8DC2EF5A0486A6940098B217 /* TKTumblelogsRequestTests.h */, 297 | 823153351577816900D73D75 /* TumblrKit_Tests_for_iOS.h */, 298 | 823153361577816900D73D75 /* TumblrKit_Tests_for_iOS.m */, 299 | 823153301577816900D73D75 /* Supporting Files */, 300 | ); 301 | path = "TumblrKit Tests for iOS"; 302 | sourceTree = ""; 303 | }; 304 | 823153301577816900D73D75 /* Supporting Files */ = { 305 | isa = PBXGroup; 306 | children = ( 307 | 823153311577816900D73D75 /* TumblrKit Tests for iOS-Info.plist */, 308 | 823153321577816900D73D75 /* InfoPlist.strings */, 309 | 823153381577816900D73D75 /* TumblrKit Tests for iOS-Prefix.pch */, 310 | ); 311 | name = "Supporting Files"; 312 | sourceTree = ""; 313 | }; 314 | 827902D514979B0C0018F19E /* Frameworks */ = { 315 | isa = PBXGroup; 316 | children = ( 317 | 827902D614979B0C0018F19E /* Foundation.framework */, 318 | 827902FF1497E4600018F19E /* Cocoa.framework */, 319 | 82F79916149924E900920028 /* SenTestingKit.framework */, 320 | 8231532C1577816900D73D75 /* UIKit.framework */, 321 | 827903011497E4600018F19E /* Other Frameworks */, 322 | ); 323 | name = Frameworks; 324 | sourceTree = ""; 325 | }; 326 | 827903011497E4600018F19E /* Other Frameworks */ = { 327 | isa = PBXGroup; 328 | children = ( 329 | 827903021497E4600018F19E /* AppKit.framework */, 330 | 827903031497E4600018F19E /* CoreData.framework */, 331 | 827903041497E4600018F19E /* Foundation.framework */, 332 | ); 333 | name = "Other Frameworks"; 334 | sourceTree = ""; 335 | }; 336 | 8279032C1497E53E0018F19E /* TumblrKit for iOS */ = { 337 | isa = PBXGroup; 338 | children = ( 339 | 8279032F1497E53E0018F19E /* TumblrKit_for_iOS.h */, 340 | 827903301497E53E0018F19E /* TumblrKit_for_iOS.m */, 341 | 8279032D1497E53E0018F19E /* Supporting Files */, 342 | ); 343 | path = "TumblrKit for iOS"; 344 | sourceTree = ""; 345 | }; 346 | 8279032D1497E53E0018F19E /* Supporting Files */ = { 347 | isa = PBXGroup; 348 | children = ( 349 | 8279032E1497E53E0018F19E /* TumblrKit for iOS-Prefix.pch */, 350 | ); 351 | name = "Supporting Files"; 352 | sourceTree = ""; 353 | }; 354 | 827903501497E5860018F19E /* TumblrKit for Mac */ = { 355 | isa = PBXGroup; 356 | children = ( 357 | 827903571497E5860018F19E /* TumblrKit_for_Mac.h */, 358 | 827903581497E5860018F19E /* TumblrKit_for_Mac.m */, 359 | 827903511497E5860018F19E /* Supporting Files */, 360 | ); 361 | path = "TumblrKit for Mac"; 362 | sourceTree = ""; 363 | }; 364 | 827903511497E5860018F19E /* Supporting Files */ = { 365 | isa = PBXGroup; 366 | children = ( 367 | 827903521497E5860018F19E /* TumblrKit for Mac-Info.plist */, 368 | 827903531497E5860018F19E /* InfoPlist.strings */, 369 | 827903561497E5860018F19E /* TumblrKit for Mac-Prefix.pch */, 370 | ); 371 | name = "Supporting Files"; 372 | sourceTree = ""; 373 | }; 374 | 82B0A029123676790006D003 /* TumblrKit Additions */ = { 375 | isa = PBXGroup; 376 | children = ( 377 | 82B09F40123664CD0006D003 /* NSDictionary+TumblrKit.h */, 378 | 82B09F41123664CD0006D003 /* NSDictionary+TumblrKit.m */, 379 | 826CD95C11EDDAD600F5CB24 /* NSString+TumblrKit.h */, 380 | 826CD95D11EDDAD600F5CB24 /* NSString+TumblrKit.m */, 381 | ); 382 | name = "TumblrKit Additions"; 383 | sourceTree = ""; 384 | }; 385 | 82F79919149924E900920028 /* TumblrKit Tests for Mac */ = { 386 | isa = PBXGroup; 387 | children = ( 388 | 82F7991F149924E900920028 /* TumblrKit_Tests_for_Mac.h */, 389 | 82F79920149924E900920028 /* TumblrKit_Tests_for_Mac.m */, 390 | 82F7991A149924E900920028 /* Supporting Files */, 391 | ); 392 | path = "TumblrKit Tests for Mac"; 393 | sourceTree = ""; 394 | }; 395 | 82F7991A149924E900920028 /* Supporting Files */ = { 396 | isa = PBXGroup; 397 | children = ( 398 | 82F7991B149924E900920028 /* TumblrKit Tests for Mac-Info.plist */, 399 | 82F7991C149924E900920028 /* InfoPlist.strings */, 400 | 82F79922149924E900920028 /* TumblrKit Tests for Mac-Prefix.pch */, 401 | ); 402 | name = "Supporting Files"; 403 | sourceTree = ""; 404 | }; 405 | /* End PBXGroup section */ 406 | 407 | /* Begin PBXHeadersBuildPhase section */ 408 | 827903281497E53E0018F19E /* Headers */ = { 409 | isa = PBXHeadersBuildPhase; 410 | buildActionMask = 2147483647; 411 | files = ( 412 | 82F799081497F27300920028 /* TKPostsRequest.h in Headers */, 413 | 82F7992B14992ED100920028 /* TKPostsResponse.h in Headers */, 414 | 82F79931149A167B00920028 /* TKTumblelogsRequest.h in Headers */, 415 | 82F79937149A19F500920028 /* TKTumblelogsResponse.h in Headers */, 416 | ); 417 | runOnlyForDeploymentPostprocessing = 0; 418 | }; 419 | 8279034B1497E5860018F19E /* Headers */ = { 420 | isa = PBXHeadersBuildPhase; 421 | buildActionMask = 2147483647; 422 | files = ( 423 | 82F799091497F27300920028 /* TKPostsRequest.h in Headers */, 424 | 82F7992C14992ED100920028 /* TKPostsResponse.h in Headers */, 425 | 82F79932149A167B00920028 /* TKTumblelogsRequest.h in Headers */, 426 | 82F79938149A19F500920028 /* TKTumblelogsResponse.h in Headers */, 427 | ); 428 | runOnlyForDeploymentPostprocessing = 0; 429 | }; 430 | /* End PBXHeadersBuildPhase section */ 431 | 432 | /* Begin PBXNativeTarget section */ 433 | 823153291577816900D73D75 /* TumblrKit Tests for iOS */ = { 434 | isa = PBXNativeTarget; 435 | buildConfigurationList = 8231533B1577816900D73D75 /* Build configuration list for PBXNativeTarget "TumblrKit Tests for iOS" */; 436 | buildPhases = ( 437 | 823153251577816900D73D75 /* Sources */, 438 | 823153261577816900D73D75 /* Frameworks */, 439 | 823153271577816900D73D75 /* Resources */, 440 | 823153281577816900D73D75 /* ShellScript */, 441 | ); 442 | buildRules = ( 443 | ); 444 | dependencies = ( 445 | 823153441577850200D73D75 /* PBXTargetDependency */, 446 | ); 447 | name = "TumblrKit Tests for iOS"; 448 | productName = "TumblrKit Tests for iOS"; 449 | productReference = 8231532A1577816900D73D75 /* TumblrKit Tests for iOS.octest */; 450 | productType = "com.apple.product-type.bundle"; 451 | }; 452 | 827903291497E53E0018F19E /* TumblrKit for iOS */ = { 453 | isa = PBXNativeTarget; 454 | buildConfigurationList = 827903321497E53E0018F19E /* Build configuration list for PBXNativeTarget "TumblrKit for iOS" */; 455 | buildPhases = ( 456 | 827903261497E53E0018F19E /* Sources */, 457 | 827903271497E53E0018F19E /* Frameworks */, 458 | 827903281497E53E0018F19E /* Headers */, 459 | ); 460 | buildRules = ( 461 | ); 462 | dependencies = ( 463 | ); 464 | name = "TumblrKit for iOS"; 465 | productName = "TumblrKit for iOS"; 466 | productReference = 8279032A1497E53E0018F19E /* libTumblrKit.a */; 467 | productType = "com.apple.product-type.library.static"; 468 | }; 469 | 8279034D1497E5860018F19E /* TumblrKit for Mac */ = { 470 | isa = PBXNativeTarget; 471 | buildConfigurationList = 8279035A1497E5860018F19E /* Build configuration list for PBXNativeTarget "TumblrKit for Mac" */; 472 | buildPhases = ( 473 | 827903491497E5860018F19E /* Sources */, 474 | 8279034A1497E5860018F19E /* Frameworks */, 475 | 8279034B1497E5860018F19E /* Headers */, 476 | 8279034C1497E5860018F19E /* Resources */, 477 | ); 478 | buildRules = ( 479 | ); 480 | dependencies = ( 481 | ); 482 | name = "TumblrKit for Mac"; 483 | productName = "TumblrKit for Mac"; 484 | productReference = 8279034E1497E5860018F19E /* TumblrKit.framework */; 485 | productType = "com.apple.product-type.framework"; 486 | }; 487 | 82F79914149924E900920028 /* TumblrKit Tests for Mac */ = { 488 | isa = PBXNativeTarget; 489 | buildConfigurationList = 82F79923149924E900920028 /* Build configuration list for PBXNativeTarget "TumblrKit Tests for Mac" */; 490 | buildPhases = ( 491 | 82F79910149924E900920028 /* Sources */, 492 | 82F79911149924E900920028 /* Frameworks */, 493 | 82F79912149924E900920028 /* Resources */, 494 | 82F79913149924E900920028 /* ShellScript */, 495 | ); 496 | buildRules = ( 497 | ); 498 | dependencies = ( 499 | 82F79927149924FA00920028 /* PBXTargetDependency */, 500 | ); 501 | name = "TumblrKit Tests for Mac"; 502 | productName = "TumblrKit Tests for Mac"; 503 | productReference = 82F79915149924E900920028 /* TumblrKit Tests for Mac.octest */; 504 | productType = "com.apple.product-type.bundle"; 505 | }; 506 | /* End PBXNativeTarget section */ 507 | 508 | /* Begin PBXProject section */ 509 | 0867D690FE84028FC02AAC07 /* Project object */ = { 510 | isa = PBXProject; 511 | attributes = { 512 | LastUpgradeCheck = 0440; 513 | ORGANIZATIONNAME = TumblrKit; 514 | }; 515 | buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "TumblrKit" */; 516 | compatibilityVersion = "Xcode 3.2"; 517 | developmentRegion = English; 518 | hasScannedForEncodings = 1; 519 | knownRegions = ( 520 | English, 521 | Japanese, 522 | French, 523 | German, 524 | en, 525 | ); 526 | mainGroup = 0867D691FE84028FC02AAC07 /* TumblrKit */; 527 | productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; 528 | projectDirPath = ""; 529 | projectRoot = ""; 530 | targets = ( 531 | 82B09E70123543700006D003 /* Documentation */, 532 | 827903291497E53E0018F19E /* TumblrKit for iOS */, 533 | 8279034D1497E5860018F19E /* TumblrKit for Mac */, 534 | 82F79914149924E900920028 /* TumblrKit Tests for Mac */, 535 | 823153291577816900D73D75 /* TumblrKit Tests for iOS */, 536 | ); 537 | }; 538 | /* End PBXProject section */ 539 | 540 | /* Begin PBXResourcesBuildPhase section */ 541 | 823153271577816900D73D75 /* Resources */ = { 542 | isa = PBXResourcesBuildPhase; 543 | buildActionMask = 2147483647; 544 | files = ( 545 | 823153341577816900D73D75 /* InfoPlist.strings in Resources */, 546 | ); 547 | runOnlyForDeploymentPostprocessing = 0; 548 | }; 549 | 8279034C1497E5860018F19E /* Resources */ = { 550 | isa = PBXResourcesBuildPhase; 551 | buildActionMask = 2147483647; 552 | files = ( 553 | 827903551497E5860018F19E /* InfoPlist.strings in Resources */, 554 | ); 555 | runOnlyForDeploymentPostprocessing = 0; 556 | }; 557 | 82F79912149924E900920028 /* Resources */ = { 558 | isa = PBXResourcesBuildPhase; 559 | buildActionMask = 2147483647; 560 | files = ( 561 | 82F7991E149924E900920028 /* InfoPlist.strings in Resources */, 562 | ); 563 | runOnlyForDeploymentPostprocessing = 0; 564 | }; 565 | /* End PBXResourcesBuildPhase section */ 566 | 567 | /* Begin PBXShellScriptBuildPhase section */ 568 | 823153281577816900D73D75 /* ShellScript */ = { 569 | isa = PBXShellScriptBuildPhase; 570 | buildActionMask = 2147483647; 571 | files = ( 572 | ); 573 | inputPaths = ( 574 | ); 575 | outputPaths = ( 576 | ); 577 | runOnlyForDeploymentPostprocessing = 0; 578 | shellPath = /bin/sh; 579 | shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; 580 | }; 581 | 82B09E6F123543700006D003 /* ShellScript */ = { 582 | isa = PBXShellScriptBuildPhase; 583 | buildActionMask = 2147483647; 584 | files = ( 585 | ); 586 | inputPaths = ( 587 | ); 588 | outputPaths = ( 589 | ); 590 | runOnlyForDeploymentPostprocessing = 0; 591 | shellPath = /bin/sh; 592 | shellScript = "# Build the doxygen documentation for the project and load the docset into Xcode.\n\n# Use the following to adjust the value of the $DOXYGEN_PATH User-Defined Setting:\n# Binary install location: /Applications/Doxygen.app/Contents/Resources/doxygen\n# Source build install location: /usr/local/bin/doxygen\n\n# If the config file doesn't exist, run 'doxygen -g $SOURCE_ROOT/doxygen.config' to \n# a get default file.\n\nif ! [ -f $SOURCE_ROOT/doxygen.config ] \nthen \n echo doxygen config file does not exist\n $DOXYGEN_PATH -g $SOURCE_ROOT/doxygen.config\nfi\n\n# Append the proper input/output directories and docset info to the config file.\n# This works even though values are assigned higher up in the file. Easier than sed.\n\ncp -a $SOURCE_ROOT/doxygen.config $TEMP_DIR/doxygen.config\n\necho \"INPUT = $SOURCE_ROOT\" >> $TEMP_DIR/doxygen.config\necho \"OUTPUT_DIRECTORY = $SOURCE_ROOT/DoxygenDocs.docset\" >> $TEMP_DIR/doxygen.config\necho \"GENERATE_DOCSET = YES\" >> $TEMP_DIR/doxygen.config\necho \"DOCSET_BUNDLE_ID = com.mycompany.DoxygenExample\" >> $TEMP_DIR/doxygen.config\n\n# Run doxygen on the updated config file.\n# Note: doxygen creates a Makefile that does most of the heavy lifting.\n\n$DOXYGEN_PATH $TEMP_DIR/doxygen.config\n\n# make will invoke docsetutil. Take a look at the Makefile to see how this is done.\n\nmake -C $SOURCE_ROOT/DoxygenDocs.docset/html install\n\n# Construct a temporary applescript file to tell Xcode to load a docset.\n\nrm -f $TEMP_DIR/loadDocSet.scpt\n\necho \"tell application \\\"Xcode\\\"\" >> $TEMP_DIR/loadDocSet.scpt\necho \"load documentation set with path \\\"/Users/$USER/Library/Developer/Shared/Documentation/DocSets/\\\"\" \n >> $TEMP_DIR/loadDocSet.scpt\necho \"end tell\" >> $TEMP_DIR/loadDocSet.scpt\n\n# Run the load-docset applescript command.\n\nosascript $TEMP_DIR/loadDocSet.scpt\n\nexit 0"; 593 | }; 594 | 82F79913149924E900920028 /* ShellScript */ = { 595 | isa = PBXShellScriptBuildPhase; 596 | buildActionMask = 2147483647; 597 | files = ( 598 | ); 599 | inputPaths = ( 600 | ); 601 | outputPaths = ( 602 | ); 603 | runOnlyForDeploymentPostprocessing = 0; 604 | shellPath = /bin/sh; 605 | shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; 606 | }; 607 | /* End PBXShellScriptBuildPhase section */ 608 | 609 | /* Begin PBXSourcesBuildPhase section */ 610 | 823153251577816900D73D75 /* Sources */ = { 611 | isa = PBXSourcesBuildPhase; 612 | buildActionMask = 2147483647; 613 | files = ( 614 | 823153371577816900D73D75 /* TumblrKit_Tests_for_iOS.m in Sources */, 615 | 8DC2EF5A0486A6940098B219 /* TKTumblelogsRequestTests.m in Sources */, 616 | ); 617 | runOnlyForDeploymentPostprocessing = 0; 618 | }; 619 | 827903261497E53E0018F19E /* Sources */ = { 620 | isa = PBXSourcesBuildPhase; 621 | buildActionMask = 2147483647; 622 | files = ( 623 | 82F799051497ED7A00920028 /* TKRequest.m in Sources */, 624 | 82F798F31497E78A00920028 /* NSDictionary+TumblrKit.m in Sources */, 625 | 82F798F41497E78A00920028 /* NSString+TumblrKit.m in Sources */, 626 | 82F798F51497E78A00920028 /* TKPost.m in Sources */, 627 | 82F798F61497E78A00920028 /* TKTumblr.m in Sources */, 628 | 82F798F71497E78A00920028 /* TKTumblrReadRequest.m in Sources */, 629 | 82F798F81497E78A00920028 /* TKTumblelog.m in Sources */, 630 | 827903311497E53E0018F19E /* TumblrKit_for_iOS.m in Sources */, 631 | 82F7990A1497F27300920028 /* TKPostsRequest.m in Sources */, 632 | 82F7992D14992ED100920028 /* TKPostsResponse.m in Sources */, 633 | 82F79933149A167B00920028 /* TKTumblelogsRequest.m in Sources */, 634 | 82F79939149A19F500920028 /* TKTumblelogsResponse.m in Sources */, 635 | ); 636 | runOnlyForDeploymentPostprocessing = 0; 637 | }; 638 | 827903491497E5860018F19E /* Sources */ = { 639 | isa = PBXSourcesBuildPhase; 640 | buildActionMask = 2147483647; 641 | files = ( 642 | 82F7990F1499244800920028 /* TKRequest.m in Sources */, 643 | 82F798FA1497E7A400920028 /* NSDictionary+TumblrKit.m in Sources */, 644 | 82F798FB1497E7A400920028 /* NSString+TumblrKit.m in Sources */, 645 | 82F798FC1497E7A400920028 /* TKPost.m in Sources */, 646 | 82F798FD1497E7A400920028 /* TKTumblr.m in Sources */, 647 | 82F798FE1497E7A400920028 /* TKTumblrReadRequest.m in Sources */, 648 | 82F798FF1497E7A400920028 /* TKTumblelog.m in Sources */, 649 | 827903591497E5860018F19E /* TumblrKit_for_Mac.m in Sources */, 650 | 82F7990B1497F27300920028 /* TKPostsRequest.m in Sources */, 651 | 82F7992E14992ED100920028 /* TKPostsResponse.m in Sources */, 652 | 82F79934149A167B00920028 /* TKTumblelogsRequest.m in Sources */, 653 | 82F7993A149A19F500920028 /* TKTumblelogsResponse.m in Sources */, 654 | ); 655 | runOnlyForDeploymentPostprocessing = 0; 656 | }; 657 | 82F79910149924E900920028 /* Sources */ = { 658 | isa = PBXSourcesBuildPhase; 659 | buildActionMask = 2147483647; 660 | files = ( 661 | 82F79921149924E900920028 /* TumblrKit_Tests_for_Mac.m in Sources */, 662 | ); 663 | runOnlyForDeploymentPostprocessing = 0; 664 | }; 665 | /* End PBXSourcesBuildPhase section */ 666 | 667 | /* Begin PBXTargetDependency section */ 668 | 823153441577850200D73D75 /* PBXTargetDependency */ = { 669 | isa = PBXTargetDependency; 670 | target = 827903291497E53E0018F19E /* TumblrKit for iOS */; 671 | targetProxy = 823153431577850200D73D75 /* PBXContainerItemProxy */; 672 | }; 673 | 82F79927149924FA00920028 /* PBXTargetDependency */ = { 674 | isa = PBXTargetDependency; 675 | target = 8279034D1497E5860018F19E /* TumblrKit for Mac */; 676 | targetProxy = 82F79926149924FA00920028 /* PBXContainerItemProxy */; 677 | }; 678 | /* End PBXTargetDependency section */ 679 | 680 | /* Begin PBXVariantGroup section */ 681 | 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { 682 | isa = PBXVariantGroup; 683 | children = ( 684 | 089C1667FE841158C02AAC07 /* English */, 685 | ); 686 | name = InfoPlist.strings; 687 | sourceTree = ""; 688 | }; 689 | 823153321577816900D73D75 /* InfoPlist.strings */ = { 690 | isa = PBXVariantGroup; 691 | children = ( 692 | 823153331577816900D73D75 /* en */, 693 | ); 694 | name = InfoPlist.strings; 695 | sourceTree = ""; 696 | }; 697 | 827903531497E5860018F19E /* InfoPlist.strings */ = { 698 | isa = PBXVariantGroup; 699 | children = ( 700 | 827903541497E5860018F19E /* en */, 701 | ); 702 | name = InfoPlist.strings; 703 | sourceTree = ""; 704 | }; 705 | 82F7991C149924E900920028 /* InfoPlist.strings */ = { 706 | isa = PBXVariantGroup; 707 | children = ( 708 | 82F7991D149924E900920028 /* en */, 709 | ); 710 | name = InfoPlist.strings; 711 | sourceTree = ""; 712 | }; 713 | /* End PBXVariantGroup section */ 714 | 715 | /* Begin XCBuildConfiguration section */ 716 | 1DEB91B208733DA50010E9CD /* Debug */ = { 717 | isa = XCBuildConfiguration; 718 | buildSettings = { 719 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 720 | GCC_C_LANGUAGE_STANDARD = gnu99; 721 | GCC_OPTIMIZATION_LEVEL = 0; 722 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 723 | GCC_WARN_UNUSED_VARIABLE = YES; 724 | ONLY_ACTIVE_ARCH = YES; 725 | PRODUCT_NAME = TumblrKit; 726 | SDKROOT = macosx; 727 | }; 728 | name = Debug; 729 | }; 730 | 1DEB91B308733DA50010E9CD /* Release */ = { 731 | isa = XCBuildConfiguration; 732 | buildSettings = { 733 | ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; 734 | GCC_C_LANGUAGE_STANDARD = gnu99; 735 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 736 | GCC_WARN_UNUSED_VARIABLE = YES; 737 | PRODUCT_NAME = TumblrKit; 738 | SDKROOT = macosx; 739 | }; 740 | name = Release; 741 | }; 742 | 823153391577816900D73D75 /* Debug */ = { 743 | isa = XCBuildConfiguration; 744 | buildSettings = { 745 | ALWAYS_SEARCH_USER_PATHS = NO; 746 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 747 | CLANG_ENABLE_OBJC_ARC = YES; 748 | COPY_PHASE_STRIP = NO; 749 | FRAMEWORK_SEARCH_PATHS = ( 750 | "$(SDKROOT)/Developer/Library/Frameworks", 751 | "$(DEVELOPER_LIBRARY_DIR)/Frameworks", 752 | ); 753 | GCC_DYNAMIC_NO_PIC = NO; 754 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 755 | GCC_PREFIX_HEADER = "TumblrKit Tests for iOS/TumblrKit Tests for iOS-Prefix.pch"; 756 | GCC_PREPROCESSOR_DEFINITIONS = ( 757 | "DEBUG=1", 758 | "$(inherited)", 759 | ); 760 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 761 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 762 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 763 | INFOPLIST_FILE = "TumblrKit Tests for iOS/TumblrKit Tests for iOS-Info.plist"; 764 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 765 | PRODUCT_NAME = "$(TARGET_NAME)"; 766 | SDKROOT = iphoneos; 767 | WRAPPER_EXTENSION = octest; 768 | }; 769 | name = Debug; 770 | }; 771 | 8231533A1577816900D73D75 /* Release */ = { 772 | isa = XCBuildConfiguration; 773 | buildSettings = { 774 | ALWAYS_SEARCH_USER_PATHS = NO; 775 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 776 | CLANG_ENABLE_OBJC_ARC = YES; 777 | COPY_PHASE_STRIP = YES; 778 | FRAMEWORK_SEARCH_PATHS = ( 779 | "$(SDKROOT)/Developer/Library/Frameworks", 780 | "$(DEVELOPER_LIBRARY_DIR)/Frameworks", 781 | ); 782 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 783 | GCC_PREFIX_HEADER = "TumblrKit Tests for iOS/TumblrKit Tests for iOS-Prefix.pch"; 784 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 785 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 786 | INFOPLIST_FILE = "TumblrKit Tests for iOS/TumblrKit Tests for iOS-Info.plist"; 787 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 788 | PRODUCT_NAME = "$(TARGET_NAME)"; 789 | SDKROOT = iphoneos; 790 | VALIDATE_PRODUCT = YES; 791 | WRAPPER_EXTENSION = octest; 792 | }; 793 | name = Release; 794 | }; 795 | 827903331497E53E0018F19E /* Debug */ = { 796 | isa = XCBuildConfiguration; 797 | buildSettings = { 798 | ALWAYS_SEARCH_USER_PATHS = NO; 799 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 800 | CLANG_ENABLE_OBJC_ARC = YES; 801 | COPY_PHASE_STRIP = NO; 802 | DSTROOT = /tmp/TumblrKit_for_iOS.dst; 803 | GCC_DYNAMIC_NO_PIC = NO; 804 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 805 | GCC_PREFIX_HEADER = "TumblrKit for iOS/TumblrKit for iOS-Prefix.pch"; 806 | GCC_PREPROCESSOR_DEFINITIONS = ( 807 | "DEBUG=1", 808 | "$(inherited)", 809 | ); 810 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 811 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 812 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 813 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 814 | OTHER_LDFLAGS = "-ObjC"; 815 | PRODUCT_NAME = "$(PRODUCT_NAME)"; 816 | SDKROOT = iphoneos; 817 | SKIP_INSTALL = YES; 818 | WRAPPER_EXTENSION = TumblrKit; 819 | }; 820 | name = Debug; 821 | }; 822 | 827903341497E53E0018F19E /* Release */ = { 823 | isa = XCBuildConfiguration; 824 | buildSettings = { 825 | ALWAYS_SEARCH_USER_PATHS = NO; 826 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 827 | CLANG_ENABLE_OBJC_ARC = YES; 828 | COPY_PHASE_STRIP = YES; 829 | DSTROOT = /tmp/TumblrKit_for_iOS.dst; 830 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 831 | GCC_PREFIX_HEADER = "TumblrKit for iOS/TumblrKit for iOS-Prefix.pch"; 832 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 833 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 834 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 835 | OTHER_LDFLAGS = "-ObjC"; 836 | PRODUCT_NAME = "$(PRODUCT_NAME)"; 837 | SDKROOT = iphoneos; 838 | SKIP_INSTALL = YES; 839 | VALIDATE_PRODUCT = YES; 840 | WRAPPER_EXTENSION = TumblrKit; 841 | }; 842 | name = Release; 843 | }; 844 | 8279035B1497E5860018F19E /* Debug */ = { 845 | isa = XCBuildConfiguration; 846 | buildSettings = { 847 | ALWAYS_SEARCH_USER_PATHS = NO; 848 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 849 | CLANG_ENABLE_OBJC_ARC = YES; 850 | COMBINE_HIDPI_IMAGES = YES; 851 | COPY_PHASE_STRIP = NO; 852 | DYLIB_COMPATIBILITY_VERSION = 1; 853 | DYLIB_CURRENT_VERSION = 1; 854 | FRAMEWORK_VERSION = A; 855 | GCC_DYNAMIC_NO_PIC = NO; 856 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 857 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 858 | GCC_PREFIX_HEADER = "TumblrKit for Mac/TumblrKit for Mac-Prefix.pch"; 859 | GCC_PREPROCESSOR_DEFINITIONS = ( 860 | "DEBUG=1", 861 | "$(inherited)", 862 | ); 863 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 864 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 865 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 866 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 867 | INFOPLIST_FILE = "TumblrKit for Mac/TumblrKit for Mac-Info.plist"; 868 | MACOSX_DEPLOYMENT_TARGET = 10.7; 869 | PRODUCT_NAME = "$(PRODUCT_NAME)"; 870 | WRAPPER_EXTENSION = framework; 871 | }; 872 | name = Debug; 873 | }; 874 | 8279035C1497E5860018F19E /* Release */ = { 875 | isa = XCBuildConfiguration; 876 | buildSettings = { 877 | ALWAYS_SEARCH_USER_PATHS = NO; 878 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 879 | CLANG_ENABLE_OBJC_ARC = YES; 880 | COMBINE_HIDPI_IMAGES = YES; 881 | COPY_PHASE_STRIP = YES; 882 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 883 | DYLIB_COMPATIBILITY_VERSION = 1; 884 | DYLIB_CURRENT_VERSION = 1; 885 | FRAMEWORK_VERSION = A; 886 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 887 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 888 | GCC_PREFIX_HEADER = "TumblrKit for Mac/TumblrKit for Mac-Prefix.pch"; 889 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 890 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 891 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 892 | INFOPLIST_FILE = "TumblrKit for Mac/TumblrKit for Mac-Info.plist"; 893 | MACOSX_DEPLOYMENT_TARGET = 10.7; 894 | PRODUCT_NAME = "$(PRODUCT_NAME)"; 895 | WRAPPER_EXTENSION = framework; 896 | }; 897 | name = Release; 898 | }; 899 | 82B09E71123543700006D003 /* Debug */ = { 900 | isa = XCBuildConfiguration; 901 | buildSettings = { 902 | COMBINE_HIDPI_IMAGES = YES; 903 | COPY_PHASE_STRIP = NO; 904 | DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; 905 | GCC_DYNAMIC_NO_PIC = NO; 906 | GCC_OPTIMIZATION_LEVEL = 0; 907 | PRODUCT_NAME = Documentation; 908 | }; 909 | name = Debug; 910 | }; 911 | 82B09E72123543700006D003 /* Release */ = { 912 | isa = XCBuildConfiguration; 913 | buildSettings = { 914 | COMBINE_HIDPI_IMAGES = YES; 915 | COPY_PHASE_STRIP = YES; 916 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 917 | DOXYGEN_PATH = /Applications/Doxygen.app/Contents/Resources/doxygen; 918 | PRODUCT_NAME = Documentation; 919 | ZERO_LINK = YES; 920 | }; 921 | name = Release; 922 | }; 923 | 82F79924149924E900920028 /* Debug */ = { 924 | isa = XCBuildConfiguration; 925 | buildSettings = { 926 | ALWAYS_SEARCH_USER_PATHS = NO; 927 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 928 | CLANG_ENABLE_OBJC_ARC = YES; 929 | COMBINE_HIDPI_IMAGES = YES; 930 | COPY_PHASE_STRIP = NO; 931 | FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks/**"; 932 | GCC_DYNAMIC_NO_PIC = NO; 933 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 934 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 935 | GCC_PREFIX_HEADER = "TumblrKit Tests for Mac/TumblrKit Tests for Mac-Prefix.pch"; 936 | GCC_PREPROCESSOR_DEFINITIONS = ( 937 | "DEBUG=1", 938 | "$(inherited)", 939 | ); 940 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 941 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 942 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 943 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 944 | INFOPLIST_FILE = "TumblrKit Tests for Mac/TumblrKit Tests for Mac-Info.plist"; 945 | MACOSX_DEPLOYMENT_TARGET = 10.7; 946 | PRODUCT_NAME = "$(TARGET_NAME)"; 947 | WRAPPER_EXTENSION = octest; 948 | }; 949 | name = Debug; 950 | }; 951 | 82F79925149924E900920028 /* Release */ = { 952 | isa = XCBuildConfiguration; 953 | buildSettings = { 954 | ALWAYS_SEARCH_USER_PATHS = NO; 955 | ARCHS = "$(ARCHS_STANDARD_64_BIT)"; 956 | CLANG_ENABLE_OBJC_ARC = YES; 957 | COMBINE_HIDPI_IMAGES = YES; 958 | COPY_PHASE_STRIP = YES; 959 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 960 | FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks/**"; 961 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 962 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 963 | GCC_PREFIX_HEADER = "TumblrKit Tests for Mac/TumblrKit Tests for Mac-Prefix.pch"; 964 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 965 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 966 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 967 | INFOPLIST_FILE = "TumblrKit Tests for Mac/TumblrKit Tests for Mac-Info.plist"; 968 | MACOSX_DEPLOYMENT_TARGET = 10.7; 969 | PRODUCT_NAME = "$(TARGET_NAME)"; 970 | WRAPPER_EXTENSION = octest; 971 | }; 972 | name = Release; 973 | }; 974 | /* End XCBuildConfiguration section */ 975 | 976 | /* Begin XCConfigurationList section */ 977 | 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "TumblrKit" */ = { 978 | isa = XCConfigurationList; 979 | buildConfigurations = ( 980 | 1DEB91B208733DA50010E9CD /* Debug */, 981 | 1DEB91B308733DA50010E9CD /* Release */, 982 | ); 983 | defaultConfigurationIsVisible = 0; 984 | defaultConfigurationName = Release; 985 | }; 986 | 8231533B1577816900D73D75 /* Build configuration list for PBXNativeTarget "TumblrKit Tests for iOS" */ = { 987 | isa = XCConfigurationList; 988 | buildConfigurations = ( 989 | 823153391577816900D73D75 /* Debug */, 990 | 8231533A1577816900D73D75 /* Release */, 991 | ); 992 | defaultConfigurationIsVisible = 0; 993 | defaultConfigurationName = Release; 994 | }; 995 | 827903321497E53E0018F19E /* Build configuration list for PBXNativeTarget "TumblrKit for iOS" */ = { 996 | isa = XCConfigurationList; 997 | buildConfigurations = ( 998 | 827903331497E53E0018F19E /* Debug */, 999 | 827903341497E53E0018F19E /* Release */, 1000 | ); 1001 | defaultConfigurationIsVisible = 0; 1002 | defaultConfigurationName = Release; 1003 | }; 1004 | 8279035A1497E5860018F19E /* Build configuration list for PBXNativeTarget "TumblrKit for Mac" */ = { 1005 | isa = XCConfigurationList; 1006 | buildConfigurations = ( 1007 | 8279035B1497E5860018F19E /* Debug */, 1008 | 8279035C1497E5860018F19E /* Release */, 1009 | ); 1010 | defaultConfigurationIsVisible = 0; 1011 | defaultConfigurationName = Release; 1012 | }; 1013 | 82B09E781235438A0006D003 /* Build configuration list for PBXAggregateTarget "Documentation" */ = { 1014 | isa = XCConfigurationList; 1015 | buildConfigurations = ( 1016 | 82B09E71123543700006D003 /* Debug */, 1017 | 82B09E72123543700006D003 /* Release */, 1018 | ); 1019 | defaultConfigurationIsVisible = 0; 1020 | defaultConfigurationName = Release; 1021 | }; 1022 | 82F79923149924E900920028 /* Build configuration list for PBXNativeTarget "TumblrKit Tests for Mac" */ = { 1023 | isa = XCConfigurationList; 1024 | buildConfigurations = ( 1025 | 82F79924149924E900920028 /* Debug */, 1026 | 82F79925149924E900920028 /* Release */, 1027 | ); 1028 | defaultConfigurationIsVisible = 0; 1029 | defaultConfigurationName = Release; 1030 | }; 1031 | /* End XCConfigurationList section */ 1032 | }; 1033 | rootObject = 0867D690FE84028FC02AAC07 /* Project object */; 1034 | } 1035 | --------------------------------------------------------------------------------