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