// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #include "bin/dartutils.h" #include "bin/eventhandler.h" #include "bin/socket.h" #include "include/dart_api.h" static const int kNativeEventHandlerFieldIndex = 0; static const intptr_t kTimerId = -1; static const intptr_t kInvalidId = -2; /* * Returns the reference of the EventHandler stored in the native field. */ static EventHandler* GetEventHandler(Dart_Handle handle) { intptr_t value = 0; Dart_Handle result = Dart_GetNativeInstanceField( handle, kNativeEventHandlerFieldIndex, &value); if (Dart_IsError(result)) { Dart_PropagateError(result); } EventHandler* event_handler = reinterpret_cast(value); ASSERT(event_handler != NULL); return event_handler; } /* * Sets the reference of the EventHandler in the native field. */ static void SetEventHandler(Dart_Handle handle, EventHandler* event_handler) { Dart_SetNativeInstanceField(handle, kNativeEventHandlerFieldIndex, reinterpret_cast(event_handler)); } /* * Starts the EventHandler thread and stores its reference in the dart * EventHandler object. args[0] holds the reference to the dart EventHandler * object. */ void FUNCTION_NAME(EventHandler_Start)(Dart_NativeArguments args) { Dart_EnterScope(); Dart_Handle handle = Dart_GetNativeArgument(args, 0); EventHandler* event_handler = EventHandler::Start(); SetEventHandler(handle, event_handler); Dart_ExitScope(); } /* * Send data to the EventHandler thread to register for a given instance * args[1] a ReceivePort args[2] with a notification event args[3]. args[0] * holds the reference to the dart EventHandler object. */ void FUNCTION_NAME(EventHandler_SendData)(Dart_NativeArguments args) { Dart_EnterScope(); Dart_Handle handle = Dart_GetNativeArgument(args, 0); EventHandler* event_handler = GetEventHandler(handle); Dart_Handle sender = Dart_GetNativeArgument(args, 1); intptr_t id = kInvalidId; if (Dart_IsNull(sender)) { id = kTimerId; } else { Socket::GetSocketIdNativeField(sender, &id); } handle = Dart_GetNativeArgument(args, 2); Dart_Port dart_port = DartUtils::GetIntegerField(handle, DartUtils::kIdFieldName); int64_t data = DartUtils::GetIntegerValue(Dart_GetNativeArgument(args, 3)); event_handler->SendData(id, dart_port, data); Dart_ExitScope(); }