iCuke 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|