Playlist Generator
1.0
|
00001 /* 00002 Copyright (c) 2010, Stig Brautaset. 00003 All rights reserved. 00004 00005 Redistribution and use in source and binary forms, with or without 00006 modification, are permitted provided that the following conditions are 00007 met: 00008 00009 Redistributions of source code must retain the above copyright 00010 notice, this list of conditions and the following disclaimer. 00011 00012 Redistributions in binary form must reproduce the above copyright 00013 notice, this list of conditions and the following disclaimer in the 00014 documentation and/or other materials provided with the distribution. 00015 00016 Neither the name of the the author nor the names of its contributors 00017 may be used to endorse or promote products derived from this software 00018 without specific prior written permission. 00019 00020 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 00021 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00022 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00023 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 00024 HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00025 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00026 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00027 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00028 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00029 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00030 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 */ 00032 00033 #import "SBJsonStreamParserState.h" 00034 #import "SBJsonStreamParser.h" 00035 00036 #define SINGLETON \ 00037 + (id)sharedInstance { \ 00038 static id state; \ 00039 if (!state) state = [[self alloc] init]; \ 00040 return state; \ 00041 } 00042 00043 @implementation SBJsonStreamParserState 00044 00045 + (id)sharedInstance { return nil; } 00046 00047 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00048 return NO; 00049 } 00050 00051 - (SBJsonStreamParserStatus)parserShouldReturn:(SBJsonStreamParser*)parser { 00052 return SBJsonStreamParserWaitingForData; 00053 } 00054 00055 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok {} 00056 00057 - (BOOL)needKey { 00058 return NO; 00059 } 00060 00061 - (NSString*)name { 00062 return @"<aaiie!>"; 00063 } 00064 00065 - (BOOL)isError { 00066 return NO; 00067 } 00068 00069 @end 00070 00071 #pragma mark - 00072 00073 @implementation SBJsonStreamParserStateStart 00074 00075 SINGLETON 00076 00077 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00078 return token == sbjson_token_array_start || token == sbjson_token_object_start; 00079 } 00080 00081 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00082 00083 SBJsonStreamParserState *state = nil; 00084 switch (tok) { 00085 case sbjson_token_array_start: 00086 state = [SBJsonStreamParserStateArrayStart sharedInstance]; 00087 break; 00088 00089 case sbjson_token_object_start: 00090 state = [SBJsonStreamParserStateObjectStart sharedInstance]; 00091 break; 00092 00093 case sbjson_token_array_end: 00094 case sbjson_token_object_end: 00095 if (parser.supportMultipleDocuments) 00096 state = parser.state; 00097 else 00098 state = [SBJsonStreamParserStateComplete sharedInstance]; 00099 break; 00100 00101 case sbjson_token_eof: 00102 return; 00103 00104 default: 00105 state = [SBJsonStreamParserStateError sharedInstance]; 00106 break; 00107 } 00108 00109 00110 parser.state = state; 00111 } 00112 00113 - (NSString*)name { return @"before outer-most array or object"; } 00114 00115 @end 00116 00117 #pragma mark - 00118 00119 @implementation SBJsonStreamParserStateComplete 00120 00121 SINGLETON 00122 00123 - (NSString*)name { return @"after outer-most array or object"; } 00124 00125 - (SBJsonStreamParserStatus)parserShouldReturn:(SBJsonStreamParser*)parser { 00126 return SBJsonStreamParserComplete; 00127 } 00128 00129 @end 00130 00131 #pragma mark - 00132 00133 @implementation SBJsonStreamParserStateError 00134 00135 SINGLETON 00136 00137 - (NSString*)name { return @"in error"; } 00138 00139 - (SBJsonStreamParserStatus)parserShouldReturn:(SBJsonStreamParser*)parser { 00140 return SBJsonStreamParserError; 00141 } 00142 00143 - (BOOL)isError { 00144 return YES; 00145 } 00146 00147 @end 00148 00149 #pragma mark - 00150 00151 @implementation SBJsonStreamParserStateObjectStart 00152 00153 SINGLETON 00154 00155 - (NSString*)name { return @"at beginning of object"; } 00156 00157 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00158 switch (token) { 00159 case sbjson_token_object_end: 00160 case sbjson_token_string: 00161 return YES; 00162 break; 00163 default: 00164 return NO; 00165 break; 00166 } 00167 } 00168 00169 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00170 parser.state = [SBJsonStreamParserStateObjectGotKey sharedInstance]; 00171 } 00172 00173 - (BOOL)needKey { 00174 return YES; 00175 } 00176 00177 @end 00178 00179 #pragma mark - 00180 00181 @implementation SBJsonStreamParserStateObjectGotKey 00182 00183 SINGLETON 00184 00185 - (NSString*)name { return @"after object key"; } 00186 00187 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00188 return token == sbjson_token_keyval_separator; 00189 } 00190 00191 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00192 parser.state = [SBJsonStreamParserStateObjectSeparator sharedInstance]; 00193 } 00194 00195 @end 00196 00197 #pragma mark - 00198 00199 @implementation SBJsonStreamParserStateObjectSeparator 00200 00201 SINGLETON 00202 00203 - (NSString*)name { return @"as object value"; } 00204 00205 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00206 switch (token) { 00207 case sbjson_token_object_start: 00208 case sbjson_token_array_start: 00209 case sbjson_token_true: 00210 case sbjson_token_false: 00211 case sbjson_token_null: 00212 case sbjson_token_number: 00213 case sbjson_token_string: 00214 return YES; 00215 break; 00216 00217 default: 00218 return NO; 00219 break; 00220 } 00221 } 00222 00223 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00224 parser.state = [SBJsonStreamParserStateObjectGotValue sharedInstance]; 00225 } 00226 00227 @end 00228 00229 #pragma mark - 00230 00231 @implementation SBJsonStreamParserStateObjectGotValue 00232 00233 SINGLETON 00234 00235 - (NSString*)name { return @"after object value"; } 00236 00237 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00238 switch (token) { 00239 case sbjson_token_object_end: 00240 case sbjson_token_separator: 00241 return YES; 00242 break; 00243 default: 00244 return NO; 00245 break; 00246 } 00247 } 00248 00249 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00250 parser.state = [SBJsonStreamParserStateObjectNeedKey sharedInstance]; 00251 } 00252 00253 00254 @end 00255 00256 #pragma mark - 00257 00258 @implementation SBJsonStreamParserStateObjectNeedKey 00259 00260 SINGLETON 00261 00262 - (NSString*)name { return @"in place of object key"; } 00263 00264 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00265 return sbjson_token_string == token; 00266 } 00267 00268 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00269 parser.state = [SBJsonStreamParserStateObjectGotKey sharedInstance]; 00270 } 00271 00272 - (BOOL)needKey { 00273 return YES; 00274 } 00275 00276 @end 00277 00278 #pragma mark - 00279 00280 @implementation SBJsonStreamParserStateArrayStart 00281 00282 SINGLETON 00283 00284 - (NSString*)name { return @"at array start"; } 00285 00286 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00287 switch (token) { 00288 case sbjson_token_object_end: 00289 case sbjson_token_keyval_separator: 00290 case sbjson_token_separator: 00291 return NO; 00292 break; 00293 00294 default: 00295 return YES; 00296 break; 00297 } 00298 } 00299 00300 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00301 parser.state = [SBJsonStreamParserStateArrayGotValue sharedInstance]; 00302 } 00303 00304 @end 00305 00306 #pragma mark - 00307 00308 @implementation SBJsonStreamParserStateArrayGotValue 00309 00310 SINGLETON 00311 00312 - (NSString*)name { return @"after array value"; } 00313 00314 00315 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00316 return token == sbjson_token_array_end || token == sbjson_token_separator; 00317 } 00318 00319 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00320 if (tok == sbjson_token_separator) 00321 parser.state = [SBJsonStreamParserStateArrayNeedValue sharedInstance]; 00322 } 00323 00324 @end 00325 00326 #pragma mark - 00327 00328 @implementation SBJsonStreamParserStateArrayNeedValue 00329 00330 SINGLETON 00331 00332 - (NSString*)name { return @"as array value"; } 00333 00334 00335 - (BOOL)parser:(SBJsonStreamParser*)parser shouldAcceptToken:(sbjson_token_t)token { 00336 switch (token) { 00337 case sbjson_token_array_end: 00338 case sbjson_token_keyval_separator: 00339 case sbjson_token_object_end: 00340 case sbjson_token_separator: 00341 return NO; 00342 break; 00343 00344 default: 00345 return YES; 00346 break; 00347 } 00348 } 00349 00350 - (void)parser:(SBJsonStreamParser*)parser shouldTransitionTo:(sbjson_token_t)tok { 00351 parser.state = [SBJsonStreamParserStateArrayGotValue sharedInstance]; 00352 } 00353 00354 @end 00355