iCuke 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +13 -0
- data/LICENSE +20 -0
- data/README.rdoc +69 -0
- data/Rakefile +80 -0
- data/VERSION +1 -0
- data/app/iCuke/.gitignore +1 -0
- data/app/iCuke/Classes/FlipsideView.h +13 -0
- data/app/iCuke/Classes/FlipsideView.m +32 -0
- data/app/iCuke/Classes/FlipsideViewController.h +25 -0
- data/app/iCuke/Classes/FlipsideViewController.m +54 -0
- data/app/iCuke/Classes/MainView.h +15 -0
- data/app/iCuke/Classes/MainView.m +32 -0
- data/app/iCuke/Classes/MainViewController.h +16 -0
- data/app/iCuke/Classes/MainViewController.m +86 -0
- data/app/iCuke/Classes/iCukeAppDelegate.h +20 -0
- data/app/iCuke/Classes/iCukeAppDelegate.m +33 -0
- data/app/iCuke/FlipsideView.xib +444 -0
- data/app/iCuke/MainView.xib +520 -0
- data/app/iCuke/MainWindow.xib +355 -0
- data/app/iCuke/SniffingView.h +20 -0
- data/app/iCuke/SniffingView.m +191 -0
- data/app/iCuke/iCuke-Info.plist +30 -0
- data/app/iCuke/iCuke.xcodeproj/project.pbxproj +313 -0
- data/app/iCuke/iCuke_Prefix.pch +14 -0
- data/app/iCuke/main.m +16 -0
- data/ext/iCuke/.gitignore +2 -0
- data/ext/iCuke/DefaultsResponse.h +5 -0
- data/ext/iCuke/DefaultsResponse.m +67 -0
- data/ext/iCuke/EventResponse.h +5 -0
- data/ext/iCuke/EventResponse.m +122 -0
- data/ext/iCuke/Rakefile +22 -0
- data/ext/iCuke/Recorder.h +15 -0
- data/ext/iCuke/Recorder.m +85 -0
- data/ext/iCuke/RecorderResponse.h +5 -0
- data/ext/iCuke/RecorderResponse.m +59 -0
- data/ext/iCuke/SynthesizeSingleton.h +68 -0
- data/ext/iCuke/ViewResponse.h +5 -0
- data/ext/iCuke/ViewResponse.m +84 -0
- data/ext/iCuke/Viewer.h +8 -0
- data/ext/iCuke/Viewer.m +153 -0
- data/ext/iCuke/iCukeHTTPResponseHandler.h +50 -0
- data/ext/iCuke/iCukeHTTPResponseHandler.m +381 -0
- data/ext/iCuke/iCukeHTTPServer.h +53 -0
- data/ext/iCuke/iCukeHTTPServer.m +365 -0
- data/ext/iCuke/iCukeServer.h +16 -0
- data/ext/iCuke/iCukeServer.m +46 -0
- data/ext/iCuke/json/JSON.h +50 -0
- data/ext/iCuke/json/NSObject+SBJSON.h +68 -0
- data/ext/iCuke/json/NSObject+SBJSON.m +53 -0
- data/ext/iCuke/json/NSString+SBJSON.h +58 -0
- data/ext/iCuke/json/NSString+SBJSON.m +55 -0
- data/ext/iCuke/json/SBJSON.h +75 -0
- data/ext/iCuke/json/SBJSON.m +212 -0
- data/ext/iCuke/json/SBJsonBase.h +86 -0
- data/ext/iCuke/json/SBJsonBase.m +78 -0
- data/ext/iCuke/json/SBJsonParser.h +87 -0
- data/ext/iCuke/json/SBJsonParser.m +475 -0
- data/ext/iCuke/json/SBJsonWriter.h +129 -0
- data/ext/iCuke/json/SBJsonWriter.m +228 -0
- data/features/icuke.feature +17 -0
- data/features/support/env.rb +3 -0
- data/iCuke.gemspec +113 -0
- data/lib/icuke/cucumber.rb +211 -0
- data/lib/icuke/simulate.rb +132 -0
- data/lib/icuke/simulator.rb +107 -0
- data/lib/icuke.rb +1 -0
- metadata +163 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (C) 2007-2009 Stig Brautaset. All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of the author nor the names of its contributors may be used
|
15
|
+
to endorse or promote products derived from this software without specific
|
16
|
+
prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#import "NSString+SBJSON.h"
|
31
|
+
#import "SBJsonParser.h"
|
32
|
+
|
33
|
+
@implementation NSString (NSString_SBJSON)
|
34
|
+
|
35
|
+
- (id)JSONFragmentValue
|
36
|
+
{
|
37
|
+
SBJsonParser *jsonParser = [SBJsonParser new];
|
38
|
+
id repr = [jsonParser fragmentWithString:self];
|
39
|
+
if (!repr)
|
40
|
+
NSLog(@"-JSONFragmentValue failed. Error trace is: %@", [jsonParser errorTrace]);
|
41
|
+
[jsonParser release];
|
42
|
+
return repr;
|
43
|
+
}
|
44
|
+
|
45
|
+
- (id)JSONValue
|
46
|
+
{
|
47
|
+
SBJsonParser *jsonParser = [SBJsonParser new];
|
48
|
+
id repr = [jsonParser objectWithString:self];
|
49
|
+
if (!repr)
|
50
|
+
NSLog(@"-JSONValue failed. Error trace is: %@", [jsonParser errorTrace]);
|
51
|
+
[jsonParser release];
|
52
|
+
return repr;
|
53
|
+
}
|
54
|
+
|
55
|
+
@end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (C) 2007-2009 Stig Brautaset. All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of the author nor the names of its contributors may be used
|
15
|
+
to endorse or promote products derived from this software without specific
|
16
|
+
prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#import <Foundation/Foundation.h>
|
31
|
+
#import "SBJsonParser.h"
|
32
|
+
#import "SBJsonWriter.h"
|
33
|
+
|
34
|
+
/**
|
35
|
+
@brief Facade for SBJsonWriter/SBJsonParser.
|
36
|
+
|
37
|
+
Requests are forwarded to instances of SBJsonWriter and SBJsonParser.
|
38
|
+
*/
|
39
|
+
@interface SBJSON : SBJsonBase <SBJsonParser, SBJsonWriter> {
|
40
|
+
|
41
|
+
@private
|
42
|
+
SBJsonParser *jsonParser;
|
43
|
+
SBJsonWriter *jsonWriter;
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
/// Return the fragment represented by the given string
|
48
|
+
- (id)fragmentWithString:(NSString*)jsonrep
|
49
|
+
error:(NSError**)error;
|
50
|
+
|
51
|
+
/// Return the object represented by the given string
|
52
|
+
- (id)objectWithString:(NSString*)jsonrep
|
53
|
+
error:(NSError**)error;
|
54
|
+
|
55
|
+
/// Parse the string and return the represented object (or scalar)
|
56
|
+
- (id)objectWithString:(id)value
|
57
|
+
allowScalar:(BOOL)x
|
58
|
+
error:(NSError**)error;
|
59
|
+
|
60
|
+
|
61
|
+
/// Return JSON representation of an array or dictionary
|
62
|
+
- (NSString*)stringWithObject:(id)value
|
63
|
+
error:(NSError**)error;
|
64
|
+
|
65
|
+
/// Return JSON representation of any legal JSON value
|
66
|
+
- (NSString*)stringWithFragment:(id)value
|
67
|
+
error:(NSError**)error;
|
68
|
+
|
69
|
+
/// Return JSON representation (or fragment) for the given object
|
70
|
+
- (NSString*)stringWithObject:(id)value
|
71
|
+
allowScalar:(BOOL)x
|
72
|
+
error:(NSError**)error;
|
73
|
+
|
74
|
+
|
75
|
+
@end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (C) 2007-2009 Stig Brautaset. All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of the author nor the names of its contributors may be used
|
15
|
+
to endorse or promote products derived from this software without specific
|
16
|
+
prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#import "SBJSON.h"
|
31
|
+
|
32
|
+
@implementation SBJSON
|
33
|
+
|
34
|
+
- (id)init {
|
35
|
+
self = [super init];
|
36
|
+
if (self) {
|
37
|
+
jsonWriter = [SBJsonWriter new];
|
38
|
+
jsonParser = [SBJsonParser new];
|
39
|
+
[self setMaxDepth:512];
|
40
|
+
|
41
|
+
}
|
42
|
+
return self;
|
43
|
+
}
|
44
|
+
|
45
|
+
- (void)dealloc {
|
46
|
+
[jsonWriter release];
|
47
|
+
[jsonParser release];
|
48
|
+
[super dealloc];
|
49
|
+
}
|
50
|
+
|
51
|
+
#pragma mark Writer
|
52
|
+
|
53
|
+
|
54
|
+
- (NSString *)stringWithObject:(id)obj {
|
55
|
+
NSString *repr = [jsonWriter stringWithObject:obj];
|
56
|
+
if (repr)
|
57
|
+
return repr;
|
58
|
+
|
59
|
+
[errorTrace release];
|
60
|
+
errorTrace = [[jsonWriter errorTrace] mutableCopy];
|
61
|
+
return nil;
|
62
|
+
}
|
63
|
+
|
64
|
+
/**
|
65
|
+
Returns a string containing JSON representation of the passed in value, or nil on error.
|
66
|
+
If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error.
|
67
|
+
|
68
|
+
@param value any instance that can be represented as a JSON fragment
|
69
|
+
@param allowScalar wether to return json fragments for scalar objects
|
70
|
+
@param error used to return an error by reference (pass NULL if this is not desired)
|
71
|
+
|
72
|
+
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
73
|
+
*/
|
74
|
+
- (NSString*)stringWithObject:(id)value allowScalar:(BOOL)allowScalar error:(NSError**)error {
|
75
|
+
|
76
|
+
NSString *json = allowScalar ? [jsonWriter stringWithFragment:value] : [jsonWriter stringWithObject:value];
|
77
|
+
if (json)
|
78
|
+
return json;
|
79
|
+
|
80
|
+
[errorTrace release];
|
81
|
+
errorTrace = [[jsonWriter errorTrace] mutableCopy];
|
82
|
+
|
83
|
+
if (error)
|
84
|
+
*error = [errorTrace lastObject];
|
85
|
+
return nil;
|
86
|
+
}
|
87
|
+
|
88
|
+
/**
|
89
|
+
Returns a string containing JSON representation of the passed in value, or nil on error.
|
90
|
+
If nil is returned and @p error is not NULL, @p error can be interrogated to find the cause of the error.
|
91
|
+
|
92
|
+
@param value any instance that can be represented as a JSON fragment
|
93
|
+
@param error used to return an error by reference (pass NULL if this is not desired)
|
94
|
+
|
95
|
+
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
96
|
+
*/
|
97
|
+
- (NSString*)stringWithFragment:(id)value error:(NSError**)error {
|
98
|
+
return [self stringWithObject:value
|
99
|
+
allowScalar:YES
|
100
|
+
error:error];
|
101
|
+
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
Returns a string containing JSON representation of the passed in value, or nil on error.
|
105
|
+
If nil is returned and @p error is not NULL, @p error can be interrogated to find the cause of the error.
|
106
|
+
|
107
|
+
@param value a NSDictionary or NSArray instance
|
108
|
+
@param error used to return an error by reference (pass NULL if this is not desired)
|
109
|
+
*/
|
110
|
+
- (NSString*)stringWithObject:(id)value error:(NSError**)error {
|
111
|
+
return [self stringWithObject:value
|
112
|
+
allowScalar:NO
|
113
|
+
error:error];
|
114
|
+
}
|
115
|
+
|
116
|
+
#pragma mark Parsing
|
117
|
+
|
118
|
+
- (id)objectWithString:(NSString *)repr {
|
119
|
+
id obj = [jsonParser objectWithString:repr];
|
120
|
+
if (obj)
|
121
|
+
return obj;
|
122
|
+
|
123
|
+
[errorTrace release];
|
124
|
+
errorTrace = [[jsonParser errorTrace] mutableCopy];
|
125
|
+
|
126
|
+
return nil;
|
127
|
+
}
|
128
|
+
|
129
|
+
/**
|
130
|
+
Returns the object represented by the passed-in string or nil on error. The returned object can be
|
131
|
+
a string, number, boolean, null, array or dictionary.
|
132
|
+
|
133
|
+
@param value the json string to parse
|
134
|
+
@param allowScalar whether to return objects for JSON fragments
|
135
|
+
@param error used to return an error by reference (pass NULL if this is not desired)
|
136
|
+
|
137
|
+
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
138
|
+
*/
|
139
|
+
- (id)objectWithString:(id)value allowScalar:(BOOL)allowScalar error:(NSError**)error {
|
140
|
+
|
141
|
+
id obj = allowScalar ? [jsonParser fragmentWithString:value] : [jsonParser objectWithString:value];
|
142
|
+
if (obj)
|
143
|
+
return obj;
|
144
|
+
|
145
|
+
[errorTrace release];
|
146
|
+
errorTrace = [[jsonParser errorTrace] mutableCopy];
|
147
|
+
|
148
|
+
if (error)
|
149
|
+
*error = [errorTrace lastObject];
|
150
|
+
return nil;
|
151
|
+
}
|
152
|
+
|
153
|
+
/**
|
154
|
+
Returns the object represented by the passed-in string or nil on error. The returned object can be
|
155
|
+
a string, number, boolean, null, array or dictionary.
|
156
|
+
|
157
|
+
@param repr the json string to parse
|
158
|
+
@param error used to return an error by reference (pass NULL if this is not desired)
|
159
|
+
|
160
|
+
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
161
|
+
*/
|
162
|
+
- (id)fragmentWithString:(NSString*)repr error:(NSError**)error {
|
163
|
+
return [self objectWithString:repr
|
164
|
+
allowScalar:YES
|
165
|
+
error:error];
|
166
|
+
}
|
167
|
+
|
168
|
+
/**
|
169
|
+
Returns the object represented by the passed-in string or nil on error. The returned object
|
170
|
+
will be either a dictionary or an array.
|
171
|
+
|
172
|
+
@param repr the json string to parse
|
173
|
+
@param error used to return an error by reference (pass NULL if this is not desired)
|
174
|
+
*/
|
175
|
+
- (id)objectWithString:(NSString*)repr error:(NSError**)error {
|
176
|
+
return [self objectWithString:repr
|
177
|
+
allowScalar:NO
|
178
|
+
error:error];
|
179
|
+
}
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
#pragma mark Properties - parsing
|
184
|
+
|
185
|
+
- (NSUInteger)maxDepth {
|
186
|
+
return jsonParser.maxDepth;
|
187
|
+
}
|
188
|
+
|
189
|
+
- (void)setMaxDepth:(NSUInteger)d {
|
190
|
+
jsonWriter.maxDepth = jsonParser.maxDepth = d;
|
191
|
+
}
|
192
|
+
|
193
|
+
|
194
|
+
#pragma mark Properties - writing
|
195
|
+
|
196
|
+
- (BOOL)humanReadable {
|
197
|
+
return jsonWriter.humanReadable;
|
198
|
+
}
|
199
|
+
|
200
|
+
- (void)setHumanReadable:(BOOL)x {
|
201
|
+
jsonWriter.humanReadable = x;
|
202
|
+
}
|
203
|
+
|
204
|
+
- (BOOL)sortKeys {
|
205
|
+
return jsonWriter.sortKeys;
|
206
|
+
}
|
207
|
+
|
208
|
+
- (void)setSortKeys:(BOOL)x {
|
209
|
+
jsonWriter.sortKeys = x;
|
210
|
+
}
|
211
|
+
|
212
|
+
@end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (C) 2009 Stig Brautaset. All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of the author nor the names of its contributors may be used
|
15
|
+
to endorse or promote products derived from this software without specific
|
16
|
+
prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#import <Foundation/Foundation.h>
|
31
|
+
|
32
|
+
extern NSString * SBJSONErrorDomain;
|
33
|
+
|
34
|
+
|
35
|
+
enum {
|
36
|
+
EUNSUPPORTED = 1,
|
37
|
+
EPARSENUM,
|
38
|
+
EPARSE,
|
39
|
+
EFRAGMENT,
|
40
|
+
ECTRL,
|
41
|
+
EUNICODE,
|
42
|
+
EDEPTH,
|
43
|
+
EESCAPE,
|
44
|
+
ETRAILCOMMA,
|
45
|
+
ETRAILGARBAGE,
|
46
|
+
EEOF,
|
47
|
+
EINPUT
|
48
|
+
};
|
49
|
+
|
50
|
+
/**
|
51
|
+
@brief Common base class for parsing & writing.
|
52
|
+
|
53
|
+
This class contains the common error-handling code and option between the parser/writer.
|
54
|
+
*/
|
55
|
+
@interface SBJsonBase : NSObject {
|
56
|
+
NSMutableArray *errorTrace;
|
57
|
+
|
58
|
+
@protected
|
59
|
+
NSUInteger depth, maxDepth;
|
60
|
+
}
|
61
|
+
|
62
|
+
/**
|
63
|
+
@brief The maximum recursing depth.
|
64
|
+
|
65
|
+
Defaults to 512. If the input is nested deeper than this the input will be deemed to be
|
66
|
+
malicious and the parser returns nil, signalling an error. ("Nested too deep".) You can
|
67
|
+
turn off this security feature by setting the maxDepth value to 0.
|
68
|
+
*/
|
69
|
+
@property NSUInteger maxDepth;
|
70
|
+
|
71
|
+
/**
|
72
|
+
@brief Return an error trace, or nil if there was no errors.
|
73
|
+
|
74
|
+
Note that this method returns the trace of the last method that failed.
|
75
|
+
You need to check the return value of the call you're making to figure out
|
76
|
+
if the call actually failed, before you know call this method.
|
77
|
+
*/
|
78
|
+
@property(copy,readonly) NSArray* errorTrace;
|
79
|
+
|
80
|
+
/// @internal for use in subclasses to add errors to the stack trace
|
81
|
+
- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str;
|
82
|
+
|
83
|
+
/// @internal for use in subclasess to clear the error before a new parsing attempt
|
84
|
+
- (void)clearErrorTrace;
|
85
|
+
|
86
|
+
@end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (C) 2009 Stig Brautaset. All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of the author nor the names of its contributors may be used
|
15
|
+
to endorse or promote products derived from this software without specific
|
16
|
+
prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#import "SBJsonBase.h"
|
31
|
+
NSString * SBJSONErrorDomain = @"org.brautaset.JSON.ErrorDomain";
|
32
|
+
|
33
|
+
|
34
|
+
@implementation SBJsonBase
|
35
|
+
|
36
|
+
@synthesize errorTrace;
|
37
|
+
@synthesize maxDepth;
|
38
|
+
|
39
|
+
- (id)init {
|
40
|
+
self = [super init];
|
41
|
+
if (self)
|
42
|
+
self.maxDepth = 512;
|
43
|
+
return self;
|
44
|
+
}
|
45
|
+
|
46
|
+
- (void)dealloc {
|
47
|
+
[errorTrace release];
|
48
|
+
[super dealloc];
|
49
|
+
}
|
50
|
+
|
51
|
+
- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str {
|
52
|
+
NSDictionary *userInfo;
|
53
|
+
if (!errorTrace) {
|
54
|
+
errorTrace = [NSMutableArray new];
|
55
|
+
userInfo = [NSDictionary dictionaryWithObject:str forKey:NSLocalizedDescriptionKey];
|
56
|
+
|
57
|
+
} else {
|
58
|
+
userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
|
59
|
+
str, NSLocalizedDescriptionKey,
|
60
|
+
[errorTrace lastObject], NSUnderlyingErrorKey,
|
61
|
+
nil];
|
62
|
+
}
|
63
|
+
|
64
|
+
NSError *error = [NSError errorWithDomain:SBJSONErrorDomain code:code userInfo:userInfo];
|
65
|
+
|
66
|
+
[self willChangeValueForKey:@"errorTrace"];
|
67
|
+
[errorTrace addObject:error];
|
68
|
+
[self didChangeValueForKey:@"errorTrace"];
|
69
|
+
}
|
70
|
+
|
71
|
+
- (void)clearErrorTrace {
|
72
|
+
[self willChangeValueForKey:@"errorTrace"];
|
73
|
+
[errorTrace release];
|
74
|
+
errorTrace = nil;
|
75
|
+
[self didChangeValueForKey:@"errorTrace"];
|
76
|
+
}
|
77
|
+
|
78
|
+
@end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
/*
|
2
|
+
Copyright (C) 2009 Stig Brautaset. All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
|
14
|
+
* Neither the name of the author nor the names of its contributors may be used
|
15
|
+
to endorse or promote products derived from this software without specific
|
16
|
+
prior written permission.
|
17
|
+
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
19
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
20
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
21
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
22
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
23
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
24
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
25
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
26
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
27
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#import <Foundation/Foundation.h>
|
31
|
+
#import "SBJsonBase.h"
|
32
|
+
|
33
|
+
/**
|
34
|
+
@brief Options for the parser class.
|
35
|
+
|
36
|
+
This exists so the SBJSON facade can implement the options in the parser without having to re-declare them.
|
37
|
+
*/
|
38
|
+
@protocol SBJsonParser
|
39
|
+
|
40
|
+
/**
|
41
|
+
@brief Return the object represented by the given string.
|
42
|
+
|
43
|
+
Returns the object represented by the passed-in string or nil on error. The returned object can be
|
44
|
+
a string, number, boolean, null, array or dictionary.
|
45
|
+
|
46
|
+
@param repr the json string to parse
|
47
|
+
*/
|
48
|
+
- (id)objectWithString:(NSString *)repr;
|
49
|
+
|
50
|
+
@end
|
51
|
+
|
52
|
+
|
53
|
+
/**
|
54
|
+
@brief The JSON parser class.
|
55
|
+
|
56
|
+
JSON is mapped to Objective-C types in the following way:
|
57
|
+
|
58
|
+
@li Null -> NSNull
|
59
|
+
@li String -> NSMutableString
|
60
|
+
@li Array -> NSMutableArray
|
61
|
+
@li Object -> NSMutableDictionary
|
62
|
+
@li Boolean -> NSNumber (initialised with -initWithBool:)
|
63
|
+
@li Number -> NSDecimalNumber
|
64
|
+
|
65
|
+
Since Objective-C doesn't have a dedicated class for boolean values, these turns into NSNumber
|
66
|
+
instances. These are initialised with the -initWithBool: method, and
|
67
|
+
round-trip back to JSON properly. (They won't silently suddenly become 0 or 1; they'll be
|
68
|
+
represented as 'true' and 'false' again.)
|
69
|
+
|
70
|
+
JSON numbers turn into NSDecimalNumber instances,
|
71
|
+
as we can thus avoid any loss of precision. (JSON allows ridiculously large numbers.)
|
72
|
+
|
73
|
+
*/
|
74
|
+
@interface SBJsonParser : SBJsonBase <SBJsonParser> {
|
75
|
+
|
76
|
+
@private
|
77
|
+
const char *c;
|
78
|
+
}
|
79
|
+
|
80
|
+
@end
|
81
|
+
|
82
|
+
// don't use - exists for backwards compatibility with 2.1.x only. Will be removed in 2.3.
|
83
|
+
@interface SBJsonParser (Private)
|
84
|
+
- (id)fragmentWithString:(id)repr;
|
85
|
+
@end
|
86
|
+
|
87
|
+
|