OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from code import Code | 5 from code import Code |
6 from model import PropertyType | 6 from model import PropertyType |
7 import any_helper | 7 import any_helper |
8 import cpp_util | 8 import cpp_util |
9 import model | 9 import model |
10 import schema_util | 10 import schema_util |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 return '%s->ToValue().release()' % var | 348 return '%s->ToValue().release()' % var |
349 else: | 349 else: |
350 return '%s.ToValue().release()' % var | 350 return '%s.ToValue().release()' % var |
351 elif prop.type_ == PropertyType.ANY: | 351 elif prop.type_ == PropertyType.ANY: |
352 return '%s.DeepCopy()' % self._any_helper.GetValue(prop, var) | 352 return '%s.DeepCopy()' % self._any_helper.GetValue(prop, var) |
353 elif prop.type_ == PropertyType.ADDITIONAL_PROPERTIES: | 353 elif prop.type_ == PropertyType.ADDITIONAL_PROPERTIES: |
354 return '%s.DeepCopy()' % var | 354 return '%s.DeepCopy()' % var |
355 elif prop.type_ == PropertyType.ENUM: | 355 elif prop.type_ == PropertyType.ENUM: |
356 return 'CreateEnumValue(%s).release()' % var | 356 return 'CreateEnumValue(%s).release()' % var |
357 elif prop.type_ == PropertyType.BINARY: | 357 elif prop.type_ == PropertyType.BINARY: |
358 return '%s->DeepCopy()' % var | 358 if prop.optional: |
| 359 vardot = var + '->' |
| 360 else: |
| 361 vardot = var + '.' |
| 362 return ('base::BinaryValue::CreateWithCopiedBuffer(%sdata(), %ssize())' % |
| 363 (vardot, vardot)) |
359 elif self._IsArrayOrArrayRef(prop): | 364 elif self._IsArrayOrArrayRef(prop): |
360 return '%s.release()' % self._util_cc_helper.CreateValueFromArray( | 365 return '%s.release()' % self._util_cc_helper.CreateValueFromArray( |
361 self._cpp_type_generator.GetReferencedProperty(prop), var, | 366 self._cpp_type_generator.GetReferencedProperty(prop), var, |
362 prop.optional) | 367 prop.optional) |
363 elif self._IsFundamentalOrFundamentalRef(prop): | 368 elif self._IsFundamentalOrFundamentalRef(prop): |
364 if prop.optional: | 369 if prop.optional: |
365 var = '*' + var | 370 var = '*' + var |
366 prop = self._cpp_type_generator.GetReferencedProperty(prop); | 371 prop = self._cpp_type_generator.GetReferencedProperty(prop); |
367 return { | 372 return { |
368 PropertyType.STRING: 'base::Value::CreateStringValue(%s)', | 373 PropertyType.STRING: 'base::Value::CreateStringValue(%s)', |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 (c.Append('default:') | 540 (c.Append('default:') |
536 .Append(' return %(failure_value)s;') | 541 .Append(' return %(failure_value)s;') |
537 ) | 542 ) |
538 c.Eblock('}') | 543 c.Eblock('}') |
539 elif prop.type_ == PropertyType.ENUM: | 544 elif prop.type_ == PropertyType.ENUM: |
540 c.Sblock('{') | 545 c.Sblock('{') |
541 self._GenerateStringToEnumConversion(c, prop, value_var, 'enum_temp') | 546 self._GenerateStringToEnumConversion(c, prop, value_var, 'enum_temp') |
542 c.Append('%(dst)s->%(name)s = enum_temp;') | 547 c.Append('%(dst)s->%(name)s = enum_temp;') |
543 c.Eblock('}') | 548 c.Eblock('}') |
544 elif prop.type_ == PropertyType.BINARY: | 549 elif prop.type_ == PropertyType.BINARY: |
545 # This is the same if the property is optional or not. We need a pointer | |
546 # to the base::BinaryValue to be able to populate it, so a scoped_ptr is | |
547 # used whether it is optional or required. | |
548 (c.Append('if (!%(value_var)s->IsType(%(value_type)s))') | 550 (c.Append('if (!%(value_var)s->IsType(%(value_type)s))') |
549 .Append(' return %(failure_value)s;') | 551 .Append(' return %(failure_value)s;') |
550 .Append('%(dst)s->%(name)s.reset(') | 552 .Append('base::BinaryValue* binary_value =') |
551 .Append(' static_cast<base::BinaryValue*>(%(value_var)s)' | 553 .Append(' static_cast<base::BinaryValue*>(%(value_var)s);') |
552 '->DeepCopy());') | 554 ) |
553 ) | 555 if prop.optional: |
| 556 (c.Append('%(dst)s->%(name)s.reset(') |
| 557 .Append(' new std::string(binary_value->GetBuffer(),') |
| 558 .Append(' binary_value->GetSize()));') |
| 559 ) |
| 560 else: |
| 561 (c.Append('%(dst)s->%(name)s.assign(binary_value->GetBuffer(),') |
| 562 .Append(' binary_value->GetSize());') |
| 563 ) |
554 else: | 564 else: |
555 raise NotImplementedError(prop.type_) | 565 raise NotImplementedError(prop.type_) |
556 c.Eblock('}') | 566 c.Eblock('}') |
557 sub = { | 567 sub = { |
558 'value_var': value_var, | 568 'value_var': value_var, |
559 'name': prop.unix_name, | 569 'name': prop.unix_name, |
560 'dst': dst, | 570 'dst': dst, |
561 'failure_value': failure_value, | 571 'failure_value': failure_value, |
562 } | 572 } |
563 if prop.type_ not in (PropertyType.CHOICES, PropertyType.ANY): | 573 if prop.type_ not in (PropertyType.CHOICES, PropertyType.ANY): |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 """ | 716 """ |
707 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ == | 717 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ == |
708 PropertyType.ARRAY) | 718 PropertyType.ARRAY) |
709 | 719 |
710 def _IsFundamentalOrFundamentalRef(self, prop): | 720 def _IsFundamentalOrFundamentalRef(self, prop): |
711 """Determines if this property is a Fundamental type or is a ref to a | 721 """Determines if this property is a Fundamental type or is a ref to a |
712 Fundamental type. | 722 Fundamental type. |
713 """ | 723 """ |
714 return (self._cpp_type_generator.GetReferencedProperty(prop).type_. | 724 return (self._cpp_type_generator.GetReferencedProperty(prop).type_. |
715 is_fundamental) | 725 is_fundamental) |
OLD | NEW |