// Copyright 2014 The Dartium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file has been auto-generated by {{code_generator_dart}}. DO NOT MODIFY!

#include "sky/engine/config.h"
#include "{{dart_class}}.h"

{% for filename in cpp_includes %}
#include "{{filename}}"
{% endfor %}

#include "sky/engine/tonic/dart_api_scope.h"
#include "sky/engine/tonic/dart_converter.h"
#include "sky/engine/tonic/dart_isolate_scope.h"

namespace blink {

{% for method in methods if not method.custom %}
{{method.cpp_type}} {{dart_class}}::{{method.name}}({{method.argument_declarations | join(', ')}})
{
    {% set return_default = 'return true'
           if method.idl_type == 'boolean' else 'return' %}{# void #}
    if (!callback_.IsIsolateAlive())
        {{return_default}};
    DartIsolateScope scope(callback_.GetIsolate());
    DartApiScope apiScope;
    {% if method.call_with_this_handle %}
    // FIXME: we ignore thisValue which may or may not be correct for Dart.
    {% endif %}
    {% for argument in method.arguments %}
    Dart_Handle {{argument.handle}} = {{argument.cpp_value_to_dart_value}};
    if (Dart_IsError({{argument.handle}}))
        {{return_default}};
    {% endfor %}
    {% if method.arguments %}
    Dart_Handle arguments[] = { {{method.arguments | join(', ', attribute='handle')}} };
    {% else %}
    Dart_Handle *arguments = 0;
    {% endif %}

    {% set return_with = 'return'
           if method.idl_type == 'boolean' else '' %}{# void #}
    {{return_with}} callback_.handleEvent({{method.arguments | length}}, arguments);
}

{% endfor %}
}  // namespace blink
