19e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Copyright (c) 2012 The Chromium Authors. All rights reserved. 29e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// Use of this source code is governed by a BSD-style license that can be 39e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// found in the LICENSE file. 49e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 59e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#ifndef PPAPI_HOST_RESOURCE_MESSAGE_HANDLER_H_ 69e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#define PPAPI_HOST_RESOURCE_MESSAGE_HANDLER_H_ 79e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 89e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "base/basictypes.h" 99e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "ppapi/c/pp_stdint.h" 109e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "ppapi/host/ppapi_host_export.h" 119e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 129e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace IPC { 139e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass Message; 149e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek} 159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 169e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace ppapi { 179e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremeneknamespace host { 189e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 19993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekstruct HostMessageContext; 20993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenekstruct ReplyMessageContext; 21993f1c72913417be7c534ec7a634363cdfc84fa5Ted Kremenek 2222ab7a4d900ed53285fd0b6720e7b43af84724d8Zhongxing Xu// This is the base class of classes that can handle resource messages. It 23a693d4fa7a6dc31b23837cf38cba7aa2af8f00f3Ted Kremenek// mainly exists at present to share code for checking replies to resource 249e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek// messages are valid. 259e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenekclass PPAPI_HOST_EXPORT ResourceMessageHandler { 26dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu public: 27dc0a25d9bff956cdbe54ea0bfc8fbbe3ceb4eb92Zhongxing Xu ResourceMessageHandler(); 289e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual ~ResourceMessageHandler(); 299e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 309e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Called when this handler should handle a particular message. This should 319e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // call into the the message handler implemented by subclasses (i.e. 329e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // |OnResourceMessageReceived|) and perform any additional work necessary to 339e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // handle the message (e.g. checking resource replies are valid). True is 349e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // returned if the message is handled and false otherwise. 359e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual bool HandleMessage(const IPC::Message& msg, 36bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek HostMessageContext* context) = 0; 379e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek 389e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // Send a resource reply message. 399e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual void SendReply(const ReplyMessageContext& context, 409e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek const IPC::Message& msg) = 0; 41026c66395b88a09437319139a43b090093f7e1ddZhongxing Xu 42e8e86482da4c1872673bbb9c237649229d19793bTed Kremenek protected: 4382bd99f4db2454cc6e1b7bfaac6db25cb3444ddcTed Kremenek // Runs the message handler and checks that a reply was sent if necessary. 449e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek void RunMessageHandlerAndReply(const IPC::Message& msg, 459e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek HostMessageContext* context); 46369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu 4777cfac623178d0c16e16e2f171d20b0fea8fde30Zhongxing Xu // Handles messages associated with a given resource object. If the flags 48329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // indicate that a response is required, the return value of this function 490312c0e09c9de480d78607972ac64a88f4e94a33Ted Kremenek // will be sent as a resource message "response" along with the message 50329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // specified in the reply of the context. 51329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // 52329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // You can do a response asynchronously by returning PP_OK_COMPLETIONPENDING. 53329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // This will cause the reply to be skipped, and the class implementing this 54329d6fde79254503b14724e1231a9d70fa6b387fTed Kremenek // function will take responsibility for issuing the callback. The callback 559e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // can be issued inside OnResourceMessageReceived before it returns, or at 569e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // a future time. 579e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // 589e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // If you don't have a particular reply message, you can just ignore 599e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // the reply in the message context. However, if you have a reply more than 609e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // just the int32_t result code, set the reply to be the message of your 619e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // choosing. 62a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek // 639e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek // The default implementation just returns PP_ERROR_NOTSUPPORTED. 649e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek virtual int32_t OnResourceMessageReceived(const IPC::Message& msg, 659e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek HostMessageContext* context); 66a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek 67a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek private: 68a43484afda4c4fb4b23a53a2dc91d985d39dc2c4Ted Kremenek DISALLOW_COPY_AND_ASSIGN(ResourceMessageHandler); 699e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek}; 70bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek 71bb7c96f290453104ec35ca17111a5165f68a4697Ted Kremenek} // namespace host 72ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek} // namespace ppapi 73ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek 74ea20cd74793d257679267032419a9ff7fc89dc05Ted Kremenek#endif // PPAPI_HOST_RESOURCE_MESSAGE_HANDLER_H_ 751508636e99faddf569a57fce82c0fb3aa2124396Ted Kremenek