@@ -354,7 +354,7 @@ string t_cocoa_generator::cocoa_thrift_imports() {
354354 * JSON strings.
355355 */
356356string t_cocoa_generator::to_json_protocol () {
357- return string () + " @protocol MSThriftToJson \n "
357+ return string () + " @protocol ThriftToJson \n "
358358 + " - (void) toJson: (NSMutableString *) builder;\n "
359359 + " @end\n\n " ;
360360}
@@ -364,80 +364,63 @@ string t_cocoa_generator::to_json_protocol() {
364364 * as they are appended.
365365 */
366366string t_cocoa_generator::json_escape_function () {
367- return string () + " @interface NSMutableString (JsonEscaping)\n "
368- + " \n "
369- + " - (void) appendJsonString: (NSString *)toEscape;\n "
370- + " - (void) appendJsonData: (NSData *)data;\n "
371- + " \n "
372- + " @end\n "
373- + " \n "
374- + " @interface NSData (ToHex)\n "
375- + " \n "
376- + " - (NSString *) toHexString;\n "
377- + " \n "
378- + " @end\n "
379- + " \n "
380- + " @implementation NSMutableString (JsonEscaping)\n "
381- + " \n "
382- + " - (void) appendJsonString: (NSString *)toEscape {\n "
383- + " NSUInteger len = [toEscape length];\n "
384- + " unichar buffer[len];\n "
385- + " \n "
386- + " [toEscape getCharacters:buffer range:NSMakeRange(0, len)];\n "
387- + " \n "
388- + " [self appendString: @\"\\\"\" ];\n "
389- + " for (int i = 0; i < len; ++i) {\n "
390- + " unichar c = buffer[i];\n "
391- + " \n "
392- + " switch (c) {\n "
393- + " case '\\\\ ': [self appendString: @\"\\\\\\\\\" ]; break;\n "
394- + " case '\\ b': [self appendString: @\"\\\\ b\" ]; break;\n "
395- + " case '\\ f': [self appendString: @\"\\\\ f\" ]; break;\n "
396- + " case '\\ n': [self appendString: @\"\\\\ n\" ]; break;\n "
397- + " case '\\ r': [self appendString: @\"\\\\ r\" ]; break;\n "
398- + " case '\\ t': [self appendString: @\"\\\\ t\" ]; break;\n "
399- + " default:\n "
400- + " if (c < 32 || c > 127) {\n "
401- + " [self appendFormat:@\"\\\\ u%04x\" , (int) c];\n "
402- + " } else {\n "
403- + " [self appendFormat:@\" %C\" , c];\n "
404- + " }\n "
405- + " break;\n "
406- + " }\n "
407- + " }\n "
408- + " [self appendString: @\"\\\"\" ];\n "
409- + " }\n "
410- + " \n "
411- + " - (void) appendJsonData: (NSData *)data {\n "
412- + " [self appendJsonString:[data toHexString]];\n "
413- + " }\n "
414- + " \n "
415- + " @end\n "
416- + " \n "
417- + " @implementation NSData (ToHex)\n "
418- + " \n "
419- + " - (NSString *) toHexString {\n "
420- + " static char const *kHexAlphabet = \" 0123456789ABCDEF\" ;\n "
421- + " NSUInteger numBytes = self.length;\n "
422- + " \n "
423- + " if (numBytes > 0) {\n "
424- + " const unsigned char *data = self.bytes;\n "
425- + " char *hex = malloc(sizeof(char) * (numBytes * 2 + 1));\n "
426- + " char *p = hex;\n "
427- + " for (NSUInteger i = 0; i < numBytes; ++i) {\n "
428- + " *p++ = kHexAlphabet[((*data & 0xF0) >> 4)];\n "
429- + " *p++ = kHexAlphabet[ (*data & 0x0F) ];\n "
430- + " ++data;\n "
431- + " }\n "
432- + " NSString *result = [NSString stringWithUTF8String:hex];\n "
433- + " free(hex);\n "
434- + " return result;\n "
435- + " } else {\n "
436- + " return @\"\" ;\n "
437- + " }\n "
438- + " }\n "
439- + " \n "
440- + " @end\n\n " ;
367+ stringstream out;
368+ out << " static NSString* HexEncode(NSData *toEncode) {\n "
369+ << " static char const *kHexAlphabet = \" 0123456789ABCDEF\" ;\n "
370+ << " NSUInteger numBytes = toEncode.length;\n "
371+ << " \n "
372+ << " if (numBytes > 0) {\n "
373+ << " const unsigned char *data = toEncode.bytes;\n "
374+ << " char *hex = malloc(sizeof(char) * (numBytes * 2 + 1));\n "
375+ << " char *p = hex;\n "
376+ << " for (NSUInteger i = 0; i < numBytes; ++i) {\n "
377+ << " *p++ = kHexAlphabet[((*data & 0xF0) >> 4)];\n "
378+ << " *p++ = kHexAlphabet[ (*data & 0x0F) ];\n "
379+ << " ++data;\n "
380+ << " }\n "
381+ << " NSString *result = [NSString stringWithUTF8String:hex];\n "
382+ << " free(hex);\n "
383+ << " return result;\n "
384+ << " } else {\n "
385+ << " return @\"\" ;\n "
386+ << " }\n "
387+ << " }\n "
388+ << " \n "
389+ << " static void AppendJsonEscapedString(NSMutableString *ms, NSString *toEscape) {\n "
390+ << " NSUInteger len = toEscape.length;\n "
391+ << " unichar buffer[len];\n "
392+ << " \n "
393+ << " [toEscape getCharacters:buffer range:NSMakeRange(0, len)];\n "
394+ << " \n "
395+ << " [ms appendString:@\"\\\"\" ];\n "
396+ << " for (int i = 0; i < len; ++i) {\n "
397+ << " unichar c = buffer[i];\n "
398+ << " switch (c) {\n "
399+ << " case '\\\\ ': [ms appendString: @\"\\\\\\\\\" ]; break;\n "
400+ << " case '\\ b': [ms appendString: @\"\\\\ b\" ]; break;\n "
401+ << " case '\\ f': [ms appendString: @\"\\\\ f\" ]; break;\n "
402+ << " case '\\ n': [ms appendString: @\"\\\\ n\" ]; break;\n "
403+ << " case '\\ r': [ms appendString: @\"\\\\ r\" ]; break;\n "
404+ << " case '\\ t': [ms appendString: @\"\\\\ t\" ]; break;\n "
405+ << " default:\n "
406+ << " if (c < 32 || c > 127) {\n "
407+ << " [ms appendFormat:@\"\\\\ u%04x\" , (int) c];\n "
408+ << " } else {\n "
409+ << " [ms appendFormat:@\" %C\" , c];\n "
410+ << " }\n "
411+ << " break;\n "
412+ << " }\n "
413+ << " }\n "
414+ << " [ms appendString:@\"\\\"\" ];\n "
415+ << " }\n "
416+ << " \n "
417+ << " static void AppendJsonEscapedBinary(NSMutableString *ms, NSData *toEscape) {\n "
418+ << " [ms appendString:@\"\\\"\" ];\n "
419+ << " [ms appendString:HexEncode(toEscape)];\n "
420+ << " [ms appendString:@\"\\\"\" ];\n "
421+ << " }\n\n " ;
422+
423+ return out.str ();
441424}
442425
443426/* *
@@ -490,9 +473,9 @@ void t_cocoa_generator::generate_enum(t_enum* tenum) {
490473 f_header_ << endl << " };" << endl << endl;
491474
492475 // Generate name-lookup function
493- f_header_ << " NSString* nameOf " << name << " (enum " << name << " value);\n\n " ;
476+ f_header_ << " NSString* NameOf " << name << " (enum " << name << " value);\n\n " ;
494477
495- f_impl_ << " NSString* nameOf " << name << " (enum " << name << " value) {\n " ;
478+ f_impl_ << " NSString* NameOf " << name << " (enum " << name << " value) {\n " ;
496479
497480 indent (f_impl_, 1 ) << " switch (value) {\n " ;
498481
@@ -615,7 +598,7 @@ void t_cocoa_generator::generate_cocoa_struct_interface(ofstream& out,
615598 }
616599 out << " <TBase, NSCoding" ;
617600 if (emit_to_json_) {
618- out << " , MSThriftToJson " ;
601+ out << " , ThriftToJson " ;
619602 }
620603 out << " > " ;
621604
@@ -1487,15 +1470,15 @@ void t_cocoa_generator::generate_cocoa_struct_to_json_method(
14871470 }
14881471 indent (out, nl) << " [builder appendFormat:@\" " << spec << " \" , " << field_name << " ];\n " ;
14891472 } else if (base == t_base_type::TYPE_STRING && base_type->is_binary ()) {
1490- indent (out, nl) << " [ builder appendJsonData: " << field_name << " ] ;\n " ;
1473+ indent (out, nl) << " AppendJsonEscapedBinary( builder, " << field_name << " ) ;\n " ;
14911474 } else if (base == t_base_type::TYPE_STRING) {
1492- indent (out, nl) << " [ builder appendJsonString: " << field_name << " ] ;\n " ;
1475+ indent (out, nl) << " AppendJsonEscapedString( builder, " << field_name << " ) ;\n " ;
14931476 } else {
14941477 throw " what r u doing" ;
14951478 }
14961479 } else if (type->is_enum ()) {
14971480 string enum_name = cocoa_prefix_ + type->get_name ();
1498- indent (out, nl) << " [builder appendFormat:@\"\\\" %@\\\"\" , nameOf " << enum_name << " (" << field_name << " )];\n " ;
1481+ indent (out, nl) << " [builder appendFormat:@\"\\\" %@\\\"\" , NameOf " << enum_name << " (" << field_name << " )];\n " ;
14991482 } else if (type->is_list () || type->is_set ()) {
15001483 t_type *element_type;
15011484 if (type->is_list ()) {
@@ -1563,11 +1546,11 @@ void t_cocoa_generator::generate_cocoa_struct_to_json_method(
15631546 string append_method;
15641547 t_base_type *base = static_cast <t_base_type*>(type);
15651548 if (base->is_binary ()) {
1566- append_method = " appendJsonData: " ;
1549+ append_method = " AppendJsonEscapedBinary " ;
15671550 } else {
1568- append_method = " appendJsonString: " ;
1551+ append_method = " AppendJsonEscapedString " ;
15691552 }
1570- indent (out, nl + 1 ) << " [ builder " << append_method << key_name << " ] ;\n " ;
1553+ indent (out, nl + 1 ) << append_method << " ( builder, " << key_name << " ) ;\n " ;
15711554 } else {
15721555 indent (out, nl + 1 ) << " [builder appendFormat:@\"\\\" %@\\\"\" , " << key_name << " ];\n " ;
15731556 }
0 commit comments