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