12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/message_loop.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/ppb_message_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/completion_callback.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/instance_handle.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/cpp/module_impl.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace pp {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <> const char* interface_name<PPB_MessageLoop>() {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PPB_MESSAGELOOP_INTERFACE_1_0;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MessageLoop::MessageLoop() : Resource() {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MessageLoop::MessageLoop(const InstanceHandle& instance) : Resource() {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (has_interface<PPB_MessageLoop>()) {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PassRefFromConstructor(get_interface<PPB_MessageLoop>()->Create(
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        instance.pp_instance()));
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MessageLoop::MessageLoop(const MessageLoop& other)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Resource(other) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MessageLoop::MessageLoop(PP_Resource pp_message_loop)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Resource(pp_message_loop) {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MessageLoop MessageLoop::GetForMainThread() {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_interface<PPB_MessageLoop>())
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return MessageLoop();
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return MessageLoop(
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      get_interface<PPB_MessageLoop>()->GetForMainThread());
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MessageLoop MessageLoop::GetCurrent() {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_interface<PPB_MessageLoop>())
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return MessageLoop();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return MessageLoop(
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      get_interface<PPB_MessageLoop>()->GetCurrent());
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t MessageLoop::AttachToCurrentThread() {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_interface<PPB_MessageLoop>())
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_NOINTERFACE;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return get_interface<PPB_MessageLoop>()->AttachToCurrentThread(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pp_resource());
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t MessageLoop::Run() {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_interface<PPB_MessageLoop>())
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_NOINTERFACE;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return get_interface<PPB_MessageLoop>()->Run(pp_resource());
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t MessageLoop::PostWork(const CompletionCallback& callback,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  int64_t delay_ms) {
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_interface<PPB_MessageLoop>())
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_NOINTERFACE;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return get_interface<PPB_MessageLoop>()->PostWork(
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pp_resource(),
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback.pp_completion_callback(),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delay_ms);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t MessageLoop::PostQuit(bool should_destroy) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!has_interface<PPB_MessageLoop>())
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return PP_ERROR_NOINTERFACE;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return get_interface<PPB_MessageLoop>()->PostQuit(
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pp_resource(), PP_FromBool(should_destroy));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace pp
88