Playlist Generator  1.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Properties Defines
SBJsonStreamParserState.m
Go to the documentation of this file.
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