| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/service.h" | 5 #include "vm/service.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
| 9 #include "platform/globals.h" | 9 #include "platform/globals.h" |
| 10 | 10 |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 } | 498 } |
| 499 if (has_parameter && !parameter->Validate(value)) { | 499 if (has_parameter && !parameter->Validate(value)) { |
| 500 PrintInvalidParamError(js, name); | 500 PrintInvalidParamError(js, name); |
| 501 return false; | 501 return false; |
| 502 } | 502 } |
| 503 } | 503 } |
| 504 return true; | 504 return true; |
| 505 } | 505 } |
| 506 | 506 |
| 507 | 507 |
| 508 void Service::PostError(const String& method_name, |
| 509 const Array& parameter_keys, |
| 510 const Array& parameter_values, |
| 511 const Instance& reply_port, |
| 512 const Instance& id, |
| 513 const Error& error) { |
| 514 Isolate* isolate = Isolate::Current(); |
| 515 StackZone zone(isolate); |
| 516 HANDLESCOPE(isolate); |
| 517 JSONStream js; |
| 518 js.Setup(zone.GetZone(), SendPort::Cast(reply_port).Id(), |
| 519 id, method_name, parameter_keys, parameter_values); |
| 520 js.PrintError(kExtensionError, |
| 521 "Error in extension `%s`: %s", |
| 522 js.method(), error.ToErrorCString()); |
| 523 js.PostReply(); |
| 524 } |
| 525 |
| 526 |
| 508 void Service::InvokeMethod(Isolate* isolate, const Array& msg) { | 527 void Service::InvokeMethod(Isolate* isolate, const Array& msg) { |
| 509 ASSERT(isolate != NULL); | 528 ASSERT(isolate != NULL); |
| 510 ASSERT(!msg.IsNull()); | 529 ASSERT(!msg.IsNull()); |
| 511 ASSERT(msg.Length() == 6); | 530 ASSERT(msg.Length() == 6); |
| 512 | 531 |
| 513 { | 532 { |
| 514 StackZone zone(isolate); | 533 StackZone zone(isolate); |
| 515 HANDLESCOPE(isolate); | 534 HANDLESCOPE(isolate); |
| 516 | 535 |
| 517 Instance& reply_port = Instance::Handle(isolate); | 536 Instance& reply_port = Instance::Handle(isolate); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 if (handler == NULL) { | 603 if (handler == NULL) { |
| 585 handler = FindRootEmbedderHandler(c_method_name); | 604 handler = FindRootEmbedderHandler(c_method_name); |
| 586 } | 605 } |
| 587 | 606 |
| 588 if (handler != NULL) { | 607 if (handler != NULL) { |
| 589 EmbedderHandleMessage(handler, &js); | 608 EmbedderHandleMessage(handler, &js); |
| 590 js.PostReply(); | 609 js.PostReply(); |
| 591 return; | 610 return; |
| 592 } | 611 } |
| 593 | 612 |
| 594 if (ScheduleExtensionHandler(method_name, | 613 const Instance& extension_handler = |
| 595 param_keys, | 614 Instance::Handle(isolate->LookupServiceExtensionHandler(method_name)); |
| 596 param_values, | 615 if (!extension_handler.IsNull()) { |
| 597 reply_port, | 616 ScheduleExtensionHandler(extension_handler, |
| 598 seq)) { | 617 method_name, |
| 618 param_keys, |
| 619 param_values, |
| 620 reply_port, |
| 621 seq); |
| 599 // Schedule was successful. Extension code will post a reply | 622 // Schedule was successful. Extension code will post a reply |
| 600 // asynchronously. | 623 // asynchronously. |
| 601 return; | 624 return; |
| 602 } | 625 } |
| 603 | 626 |
| 604 PrintUnrecognizedMethodError(&js); | 627 PrintUnrecognizedMethodError(&js); |
| 605 js.PostReply(); | 628 js.PostReply(); |
| 606 return; | 629 return; |
| 607 } | 630 } |
| 608 } | 631 } |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 while (current != NULL) { | 907 while (current != NULL) { |
| 885 if (strcmp(name, current->name()) == 0) { | 908 if (strcmp(name, current->name()) == 0) { |
| 886 return current; | 909 return current; |
| 887 } | 910 } |
| 888 current = current->next(); | 911 current = current->next(); |
| 889 } | 912 } |
| 890 return NULL; | 913 return NULL; |
| 891 } | 914 } |
| 892 | 915 |
| 893 | 916 |
| 894 bool Service::ScheduleExtensionHandler(const String& method_name, | 917 void Service::ScheduleExtensionHandler(const Instance& handler, |
| 918 const String& method_name, |
| 895 const Array& parameter_keys, | 919 const Array& parameter_keys, |
| 896 const Array& parameter_values, | 920 const Array& parameter_values, |
| 897 const Instance& reply_port, | 921 const Instance& reply_port, |
| 898 const Instance& id) { | 922 const Instance& id) { |
| 923 ASSERT(!handler.IsNull()); |
| 899 ASSERT(!method_name.IsNull()); | 924 ASSERT(!method_name.IsNull()); |
| 900 ASSERT(!parameter_keys.IsNull()); | 925 ASSERT(!parameter_keys.IsNull()); |
| 901 ASSERT(!parameter_values.IsNull()); | 926 ASSERT(!parameter_values.IsNull()); |
| 902 ASSERT(!reply_port.IsNull()); | 927 ASSERT(!reply_port.IsNull()); |
| 903 const Library& developer_lib = Library::Handle(Library::DeveloperLibrary()); | 928 Isolate* isolate = Isolate::Current(); |
| 904 ASSERT(!developer_lib.IsNull()); | 929 ASSERT(isolate != NULL); |
| 905 const Function& schedule_extension = Function::Handle( | 930 isolate->AppendServiceExtensionCall(handler, |
| 906 developer_lib.LookupLocalFunction(Symbols::_scheduleExtension())); | 931 method_name, |
| 907 ASSERT(!schedule_extension.IsNull()); | 932 parameter_keys, |
| 908 const Array& arguments = Array::Handle(Array::New(5)); | 933 parameter_values, |
| 909 arguments.SetAt(0, method_name); | 934 reply_port, |
| 910 arguments.SetAt(1, parameter_keys); | 935 id); |
| 911 arguments.SetAt(2, parameter_values); | |
| 912 arguments.SetAt(3, reply_port); | |
| 913 arguments.SetAt(4, id); | |
| 914 return (DartEntry::InvokeFunction(schedule_extension, arguments) == | |
| 915 Object::bool_true().raw()); | |
| 916 } | 936 } |
| 917 | 937 |
| 918 | 938 |
| 919 static const MethodParameter* get_isolate_params[] = { | 939 static const MethodParameter* get_isolate_params[] = { |
| 920 ISOLATE_PARAMETER, | 940 ISOLATE_PARAMETER, |
| 921 NULL, | 941 NULL, |
| 922 }; | 942 }; |
| 923 | 943 |
| 924 | 944 |
| 925 static bool GetIsolate(Isolate* isolate, JSONStream* js) { | 945 static bool GetIsolate(Isolate* isolate, JSONStream* js) { |
| (...skipping 2216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3142 ServiceMethodDescriptor& method = service_methods_[i]; | 3162 ServiceMethodDescriptor& method = service_methods_[i]; |
| 3143 if (strcmp(method_name, method.name) == 0) { | 3163 if (strcmp(method_name, method.name) == 0) { |
| 3144 return &method; | 3164 return &method; |
| 3145 } | 3165 } |
| 3146 } | 3166 } |
| 3147 return NULL; | 3167 return NULL; |
| 3148 } | 3168 } |
| 3149 | 3169 |
| 3150 | 3170 |
| 3151 } // namespace dart | 3171 } // namespace dart |
| OLD | NEW |