Skip to content

Commit 7214676

Browse files
author
Damian Kołakowski
committed
switched to Apple's NSJSONSerialization
1 parent 5c95339 commit 7214676

16 files changed

+554
-4768
lines changed

iOSHierarchyViewer.xcodeproj/project.pbxproj

+5-19
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
7CB3BD71158A44CF0001D338 /* HVBaseRequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CB3BD63158A44CF0001D338 /* HVBaseRequestHandler.m */; };
3232
7CB3BD72158A44CF0001D338 /* HVHTTPServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CB3BD64158A44CF0001D338 /* HVHTTPServer.h */; };
3333
7CB3BD73158A44CF0001D338 /* HVHTTPServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CB3BD65158A44CF0001D338 /* HVHTTPServer.m */; };
34-
7CB3BD79158A45850001D338 /* JSONKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CB3BD77158A45850001D338 /* JSONKit.h */; };
35-
7CB3BD7A158A45850001D338 /* JSONKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CB3BD78158A45850001D338 /* JSONKit.m */; };
3634
7CE2ED1415E40CDE00684792 /* HVCoreDataHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE2ED1215E40CDE00684792 /* HVCoreDataHandler.h */; };
3735
7CE2ED1515E40CDE00684792 /* HVCoreDataHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7CE2ED1315E40CDE00684792 /* HVCoreDataHandler.m */; };
3836
7CE955DE1540C5CB0042A03A /* HVHierarchyScanner.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE955D01540C5CB0042A03A /* HVHierarchyScanner.h */; };
@@ -49,7 +47,7 @@
4947
7C11395715E580BA004AED3F /* navbar.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = navbar.js; sourceTree = "<group>"; };
5048
7C11395915E580C4004AED3F /* webapp_navbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = webapp_navbar.h; sourceTree = "<group>"; };
5149
7C12E28115E7E292009D2F26 /* webapp_index_ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = webapp_index_ui.h; sourceTree = "<group>"; };
52-
7C861E34153DF2E000935C95 /* libiOSViewHierarchy.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libiOSViewHierarchy.a; path = libiOSHierarchyViewer.a; sourceTree = BUILT_PRODUCTS_DIR; };
50+
7C861E34153DF2E000935C95 /* libiOSHierarchyViewer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libiOSHierarchyViewer.a; sourceTree = BUILT_PRODUCTS_DIR; };
5351
7C861E37153DF2E000935C95 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
5452
7C861E3B153DF2E000935C95 /* iOSHierarchyViewer-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iOSHierarchyViewer-Prefix.pch"; sourceTree = "<group>"; };
5553
7C861E49153DF33A00935C95 /* iOSHierarchyViewer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iOSHierarchyViewer.h; sourceTree = "<group>"; };
@@ -69,8 +67,6 @@
6967
7CB3BD64158A44CF0001D338 /* HVHTTPServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HVHTTPServer.h; sourceTree = "<group>"; };
7068
7CB3BD65158A44CF0001D338 /* HVHTTPServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HVHTTPServer.m; sourceTree = "<group>"; };
7169
7CB3BD75158A45690001D338 /* index_ui.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index_ui.html; sourceTree = "<group>"; };
72-
7CB3BD77158A45850001D338 /* JSONKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSONKit.h; sourceTree = "<group>"; };
73-
7CB3BD78158A45850001D338 /* JSONKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSONKit.m; sourceTree = "<group>"; };
7470
7CD97A5415B299E500CBAAA1 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
7571
7CDFD54415E55B97001D5841 /* jquery.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = jquery.js; sourceTree = "<group>"; };
7672
7CE2ED1215E40CDE00684792 /* HVCoreDataHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HVCoreDataHandler.h; sourceTree = "<group>"; };
@@ -104,7 +100,7 @@
104100
7C861E35153DF2E000935C95 /* Products */ = {
105101
isa = PBXGroup;
106102
children = (
107-
7C861E34153DF2E000935C95 /* libiOSViewHierarchy.a */,
103+
7C861E34153DF2E000935C95 /* libiOSHierarchyViewer.a */,
108104
);
109105
name = Products;
110106
sourceTree = "<group>";
@@ -121,7 +117,6 @@
121117
7C861E39153DF2E000935C95 /* iOSViewHierarchy */ = {
122118
isa = PBXGroup;
123119
children = (
124-
7CB3BD76158A45850001D338 /* json */,
125120
7CB3BD74158A45690001D338 /* webapp */,
126121
7CB3BD56158A44CF0001D338 /* http */,
127122
7CE955D01540C5CB0042A03A /* HVHierarchyScanner.h */,
@@ -190,15 +185,6 @@
190185
path = webapp;
191186
sourceTree = "<group>";
192187
};
193-
7CB3BD76158A45850001D338 /* json */ = {
194-
isa = PBXGroup;
195-
children = (
196-
7CB3BD77158A45850001D338 /* JSONKit.h */,
197-
7CB3BD78158A45850001D338 /* JSONKit.m */,
198-
);
199-
path = json;
200-
sourceTree = "<group>";
201-
};
202188
/* End PBXGroup section */
203189

204190
/* Begin PBXHeadersBuildPhase section */
@@ -215,7 +201,6 @@
215201
7CB3BD6E158A44CF0001D338 /* HVStaticFileHandler.h in Headers */,
216202
7CB3BD70158A44CF0001D338 /* HVBaseRequestHandler.h in Headers */,
217203
7CB3BD72158A44CF0001D338 /* HVHTTPServer.h in Headers */,
218-
7CB3BD79158A45850001D338 /* JSONKit.h in Headers */,
219204
688149D115D1929400E38AE0 /* HVDefines.h in Headers */,
220205
7CE2ED1415E40CDE00684792 /* HVCoreDataHandler.h in Headers */,
221206
7C11391B15E57627004AED3F /* webapp_jquery.h in Headers */,
@@ -244,7 +229,7 @@
244229
);
245230
name = iOSHierarchyViewer;
246231
productName = iOSViewHierarchy;
247-
productReference = 7C861E34153DF2E000935C95 /* libiOSViewHierarchy.a */;
232+
productReference = 7C861E34153DF2E000935C95 /* libiOSHierarchyViewer.a */;
248233
productType = "com.apple.product-type.library.static";
249234
};
250235
/* End PBXNativeTarget section */
@@ -303,7 +288,6 @@
303288
7CB3BD6F158A44CF0001D338 /* HVStaticFileHandler.m in Sources */,
304289
7CB3BD71158A44CF0001D338 /* HVBaseRequestHandler.m in Sources */,
305290
7CB3BD73158A44CF0001D338 /* HVHTTPServer.m in Sources */,
306-
7CB3BD7A158A45850001D338 /* JSONKit.m in Sources */,
307291
7CE2ED1515E40CDE00684792 /* HVCoreDataHandler.m in Sources */,
308292
7C11395815E580BA004AED3F /* navbar.js in Sources */,
309293
);
@@ -364,6 +348,7 @@
364348
);
365349
PRODUCT_NAME = iOSHierarchyViewer;
366350
SKIP_INSTALL = YES;
351+
TARGETED_DEVICE_FAMILY = "1,2";
367352
};
368353
name = Debug;
369354
};
@@ -379,6 +364,7 @@
379364
);
380365
PRODUCT_NAME = iOSHierarchyViewer;
381366
SKIP_INSTALL = YES;
367+
TARGETED_DEVICE_FAMILY = "1,2";
382368
};
383369
name = Release;
384370
};

iOSHierarchyViewer.xcodeproj/xcuserdata/damiankolakowski.xcuserdatad/xcschemes/xcschememanagement.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<key>iOSViewHierarchy.xcscheme</key>
88
<dict>
99
<key>orderHint</key>
10-
<integer>1</integer>
10+
<integer>0</integer>
1111
</dict>
1212
</dict>
1313
<key>SuppressBuildableAutocreation</key>

iOSViewHierarchy/HVHierarchyScanner.m

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#import <math.h>
99
#import <QuartzCore/QuartzCore.h>
1010
#import "HVHierarchyScanner.h"
11-
#import "JSONKit.h"
1211

1312
@implementation HVHierarchyScanner
1413

iOSViewHierarchy/http/HVBaseRequestHandler.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99

1010
@interface HVBaseRequestHandler : NSObject <HVRequestHandler>
1111

12-
- (BOOL)writeData:(char *)data length:(int)length toSocket:(int)socket;
12+
- (BOOL)writeData:(NSData*)data toSocket:(int)socket;
1313

14-
- (BOOL)writeOKStatus:(int)socket;
14+
- (BOOL)writeJSONResponse:(id)object toSocket:(int)socket;
1515

16-
- (BOOL)writeText:(NSString *)text toSocket:(int)socket;
16+
- (BOOL)writeJSONErrorResponse:(NSString*)error toSocket:(int)socket;
1717

1818
@end

iOSViewHierarchy/http/HVBaseRequestHandler.m

+22-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@implementation HVBaseRequestHandler
1111

12-
- (BOOL)writeData:(char *)data length:(int)length toSocket:(int)socket;
12+
- (BOOL)writeRawData:(char *)data length:(int)length toSocket:(int)socket;
1313
{
1414
int sent = 0;
1515
while (sent < length) {
@@ -23,23 +23,40 @@ - (BOOL)writeData:(char *)data length:(int)length toSocket:(int)socket;
2323
return YES;
2424
}
2525

26+
- (BOOL)writeData:(NSData*)data toSocket:(int)socket
27+
{
28+
return [self writeRawData:(char*)[data bytes] length:[data length] toSocket:socket];
29+
}
30+
2631
- (BOOL)writeText:(NSString *)text toSocket:(int)socket
2732
{
2833
if (text) {
2934
NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
30-
return [self writeData:(char *)[data bytes] length:[data length] toSocket:socket];
35+
return [self writeRawData:(char *)[data bytes] length:[data length] toSocket:socket];
3136
}
3237
return NO;
3338
}
3439

35-
- (BOOL)writeOKStatus:(int)socket
40+
- (BOOL)writeJSONErrorResponse:(NSString*)error toSocket:(int)socket
41+
{
42+
return [self writeJSONResponse:[NSDictionary dictionaryWithObject:error forKey:@"error"] toSocket:socket];
43+
}
44+
45+
- (BOOL)writeJSONResponse:(id)object toSocket:(int)socket
3646
{
37-
return [self writeText:@"HTTP/1.0 200 OK\r\n" toSocket:socket];
47+
NSError* serializationError;
48+
NSData* data = [NSJSONSerialization dataWithJSONObject:object options:kNilOptions
49+
error:&serializationError];
50+
if ( data ) {
51+
return [self writeData:data toSocket:socket];
52+
} else {
53+
return [self writeJSONErrorResponse: serializationError.description toSocket:socket];
54+
}
3855
}
3956

4057
- (BOOL)handleRequest:(NSString *)url withHeaders:(NSDictionary *)headers query:(NSDictionary *)query address:(NSString *)address onSocket:(int)socket
4158
{
42-
return [self writeOKStatus:socket];
59+
return [self writeText:@"HTTP/1.0 200 OK\r\n\r\n" toSocket:socket];
4360
}
4461

4562
@end

iOSViewHierarchy/http/api/HVBase64StaticFile.m

+1-3
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,7 @@ - (NSData *)base64DataFromString:(NSString *)string
130130
- (BOOL)handleRequest:(NSString *)url withHeaders:(NSDictionary *)headers query:(NSDictionary *)query address:(NSString *)address onSocket:(int)socket
131131
{
132132
if ([super handleRequest:url withHeaders:headers query:query address:address onSocket:socket]) {
133-
if ([self writeText:@"\r\n" toSocket:socket]) {
134-
return [self writeData:(char *)[cachedResponse bytes] length:[cachedResponse length] toSocket:socket];
135-
}
133+
return [self writeData:cachedResponse toSocket:socket];
136134
}
137135
return NO;
138136
}

iOSViewHierarchy/http/api/HVCoreDataHandler.m

+7-16
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
//
77
//
88

9-
#import "JSONKit.h"
109
#import "HVCoreDataHandler.h"
1110

1211
@implementation HVCoreDataHandler
@@ -81,7 +80,7 @@ - (BOOL) handleSchemeRequest:(int)socket
8180
[contextModelDictionary setObject:contextName forKey:@"name"];
8281
[resultArray addObject:contextModelDictionary];
8382
}
84-
return [self writeText:[resultArray JSONString] toSocket:socket];
83+
return [self writeJSONResponse:resultArray toSocket:socket];
8584
}
8685

8786
- (BOOL) handleFetchRequest:(int)socket query:(NSDictionary *)query
@@ -91,28 +90,28 @@ - (BOOL) handleFetchRequest:(int)socket query:(NSDictionary *)query
9190
NSString* contextName = [query objectForKey:@"context"];
9291
NSManagedObjectContext* context = [contextDictionary objectForKey:contextName];
9392
if ( !context ) {
94-
return [self writeText:[[NSDictionary dictionaryWithObject:@"Can't find context" forKey:@"error"] JSONString] toSocket:socket];
93+
return [self writeJSONErrorResponse:@"Can't find context" toSocket:socket];
9594
}
9695
NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
9796
if ( predicate ) {
9897
@try {
9998
request.predicate = [NSPredicate predicateWithFormat:predicate];
10099
}
101100
@catch (NSException *exception) {
102-
return [self writeText:[[NSDictionary dictionaryWithObject:[exception description] forKey:@"error"] JSONString] toSocket:socket];
101+
return [self writeJSONErrorResponse:exception.description toSocket:socket];
103102
}
104103
}
105104
request.entity = [NSEntityDescription entityForName:entity inManagedObjectContext:context];
106105
if ( !request.entity ) {
107-
return [self writeText:[[NSDictionary dictionaryWithObject:@"Can't find entity" forKey:@"error"] JSONString] toSocket:socket];
106+
return [self writeJSONErrorResponse:@"Can't find entity" toSocket:socket];
108107
}
109108
NSError* error = nil;
110109
NSArray* result = nil;
111110
@try {
112111
result = [context executeFetchRequest:request error:&error];
113112
}
114113
@catch (NSException *exception) {
115-
return [self writeText:[[NSDictionary dictionaryWithObject:[exception description] forKey:@"error"] JSONString] toSocket:socket];
114+
return [self writeJSONErrorResponse:[exception description] toSocket:socket];
116115
}
117116
if ( result ) {
118117
NSMutableArray* resultArray = [[[NSMutableArray alloc] init] autorelease];
@@ -132,28 +131,20 @@ - (BOOL) handleFetchRequest:(int)socket query:(NSDictionary *)query
132131
}
133132
[resultArray addObject:dictionary];
134133
}
135-
NSError* jsonSerializationError;
136-
NSString* json = [resultArray JSONStringWithOptions:JKSerializeOptionNone error:&jsonSerializationError];
137-
if ( json ) {
138-
return [self writeText:[resultArray JSONString] toSocket:socket];
139-
} else {
140-
return [self writeText:[[NSDictionary dictionaryWithObject:[jsonSerializationError description] forKey:@"error"] JSONString] toSocket:socket];
141-
}
134+
return [self writeJSONResponse:resultArray toSocket:socket];
142135
} else {
143-
return [self writeText:[[NSDictionary dictionaryWithObject:[error description] forKey:@"error"] JSONString] toSocket:socket];
136+
return [self writeJSONErrorResponse:[error description] toSocket:socket];
144137
}
145138
}
146139

147140
- (BOOL)handleRequest:(NSString *)url withHeaders:(NSDictionary *)headers query:(NSDictionary *)query address:(NSString *)address onSocket:(int)socket
148141
{
149142
if ([super handleRequest:url withHeaders:headers query:query address:address onSocket:socket]) {
150-
if ([self writeText:@"\r\n" toSocket:socket]) {
151143
if ( query && [query count] > 0 ) {
152144
return [self handleFetchRequest:socket query:query];
153145
} else {
154146
return [self handleSchemeRequest:socket];
155147
}
156-
}
157148
}
158149
return NO;
159150
}

iOSViewHierarchy/http/api/HVHierarchyHandler.m

+8-12
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#import "HVDefines.h"
88
#import "HVHierarchyHandler.h"
99
#import "HVHierarchyScanner.h"
10-
#import "JSONKit.h"
1110

1211
@implementation HVHierarchyHandler
1312

@@ -20,17 +19,14 @@ - (BOOL)handleRequest:(NSString *)url withHeaders:(NSDictionary *)headers query:
2019
{
2120
if ([super handleRequest:url withHeaders:headers query:query address:address onSocket:socket]) {
2221
NSArray *hierarchyDict = [HVHierarchyScanner hierarchySnapshot];
23-
if ([self writeText:@"\r\n" toSocket:socket]) {
24-
NSMutableDictionary *responseDic = [[[NSMutableDictionary alloc] initWithCapacity:10] autorelease];
25-
[responseDic setValue:hierarchyDict forKey:@"windows"];
26-
CGRect screenRect = [[UIScreen mainScreen] bounds];
27-
[responseDic setValue:[NSNumber numberWithFloat:screenRect.size.width] forKey:@"screen_w"];
28-
[responseDic setValue:[NSNumber numberWithFloat:screenRect.size.height] forKey:@"screen_h"];
29-
[responseDic setValue:@IOS_HIERARCHY_VIEWER_VERSION forKey:@"version"];
30-
//[responseDic setValue:[NSArray arrayWithObjects:@"CGRect", @"CGPoint", @"NSString", @"BOOL", nil] forKey:@"editable"];];
31-
return [self writeText:[responseDic JSONString] toSocket:socket];
32-
}
33-
return NO;
22+
NSMutableDictionary *responseDic = [[[NSMutableDictionary alloc] initWithCapacity:10] autorelease];
23+
[responseDic setValue:hierarchyDict forKey:@"windows"];
24+
CGRect screenRect = [[UIScreen mainScreen] bounds];
25+
[responseDic setValue:[NSNumber numberWithFloat:screenRect.size.width] forKey:@"screen_w"];
26+
[responseDic setValue:[NSNumber numberWithFloat:screenRect.size.height] forKey:@"screen_h"];
27+
[responseDic setValue:@IOS_HIERARCHY_VIEWER_VERSION forKey:@"version"];
28+
//[responseDic setValue:[NSArray arrayWithObjects:@"CGRect", @"CGPoint", @"NSString", @"BOOL", nil] forKey:@"editable"];];
29+
return [self writeJSONResponse:responseDic toSocket:socket];
3430
}
3531
return NO;
3632
}

iOSViewHierarchy/http/api/HVPreviewHandler.m

+23-25
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,32 @@ + (HVPreviewHandler *)handler
1818
- (BOOL)handleRequest:(NSString *)url withHeaders:(NSDictionary *)headers query:(NSDictionary *)query address:(NSString *)address onSocket:(int)socket
1919
{
2020
if ([super handleRequest:url withHeaders:headers query:query address:address onSocket:socket]) {
21-
if ([self writeText:@"\r\n" toSocket:socket]) {
22-
if ([query objectForKey:@"id"]) {
23-
long id = [(NSString *)[query objectForKey:@"id"] longLongValue];
24-
UIView *view = [HVHierarchyScanner findViewById:id];
25-
if (view) {
26-
UIGraphicsBeginImageContext(view.bounds.size);
27-
28-
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
29-
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
30-
31-
NSData *pngData = UIImagePNGRepresentation(image);
32-
UIGraphicsEndImageContext();
33-
34-
return [self writeData:(char *)[pngData bytes] length:[pngData length] toSocket:socket];
35-
}
36-
} else {
37-
CGRect screenRect = [[UIScreen mainScreen] bounds];
38-
CGFloat screenWidth = screenRect.size.width;
39-
CGFloat screenHeight = screenRect.size.height;
40-
UIGraphicsBeginImageContext(CGSizeMake(screenWidth, screenHeight));
41-
for (UIWindow *w in [[UIApplication sharedApplication] windows]) {
42-
[w.layer renderInContext:UIGraphicsGetCurrentContext()];
43-
}
21+
if ([query objectForKey:@"id"]) {
22+
long id = [(NSString *)[query objectForKey:@"id"] longLongValue];
23+
UIView *view = [HVHierarchyScanner findViewById:id];
24+
if (view) {
25+
UIGraphicsBeginImageContext(view.bounds.size);
26+
27+
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
4428
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
45-
NSData *scaledData = UIImagePNGRepresentation(image);
29+
30+
NSData *pngData = UIImagePNGRepresentation(image);
4631
UIGraphicsEndImageContext();
47-
return [self writeData:(char *)[scaledData bytes] length:[scaledData length] toSocket:socket];
32+
33+
return [self writeData:pngData toSocket:socket];
34+
}
35+
} else {
36+
CGRect screenRect = [[UIScreen mainScreen] bounds];
37+
CGFloat screenWidth = screenRect.size.width;
38+
CGFloat screenHeight = screenRect.size.height;
39+
UIGraphicsBeginImageContext(CGSizeMake(screenWidth, screenHeight));
40+
for (UIWindow *w in [[UIApplication sharedApplication] windows]) {
41+
[w.layer renderInContext:UIGraphicsGetCurrentContext()];
4842
}
43+
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
44+
NSData *scaledData = UIImagePNGRepresentation(image);
45+
UIGraphicsEndImageContext();
46+
return [self writeData:scaledData toSocket:socket];
4947
}
5048
}
5149
return NO;

0 commit comments

Comments
 (0)