1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_SYNC_MESSAGE_H_ 6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_SYNC_MESSAGE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <memory> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 15*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h" 16*6777b538SAndroid Build Coastguard Worker #endif 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker #include <memory> 19*6777b538SAndroid Build Coastguard Worker #include <string> 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 22*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message.h" 23*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_support_export.h" 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker namespace base { 26*6777b538SAndroid Build Coastguard Worker class WaitableEvent; 27*6777b538SAndroid Build Coastguard Worker } 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker namespace IPC { 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker class MessageReplyDeserializer; 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker class IPC_MESSAGE_SUPPORT_EXPORT SyncMessage : public Message { 34*6777b538SAndroid Build Coastguard Worker public: 35*6777b538SAndroid Build Coastguard Worker SyncMessage(int32_t routing_id, 36*6777b538SAndroid Build Coastguard Worker uint32_t type, 37*6777b538SAndroid Build Coastguard Worker PriorityValue priority, 38*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MessageReplyDeserializer> deserializer); 39*6777b538SAndroid Build Coastguard Worker ~SyncMessage() override; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker // Call this to get a deserializer for the output parameters. 42*6777b538SAndroid Build Coastguard Worker // Note that this can only be called once, and the caller is takes 43*6777b538SAndroid Build Coastguard Worker // ownership of the deserializer.. 44*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MessageReplyDeserializer> TakeReplyDeserializer(); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker // Returns true if the message is a reply to the given request id. 47*6777b538SAndroid Build Coastguard Worker static bool IsMessageReplyTo(const Message& msg, int request_id); 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // Given a reply message, returns an iterator to the beginning of the data 50*6777b538SAndroid Build Coastguard Worker // (i.e. skips over the synchronous specific data). 51*6777b538SAndroid Build Coastguard Worker static base::PickleIterator GetDataIterator(const Message* msg); 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // Given a synchronous message (or its reply), returns its id. 54*6777b538SAndroid Build Coastguard Worker static int GetMessageId(const Message& msg); 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker // Generates a reply message to the given message. 57*6777b538SAndroid Build Coastguard Worker static Message* GenerateReply(const Message* msg); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker private: 60*6777b538SAndroid Build Coastguard Worker struct SyncHeader { 61*6777b538SAndroid Build Coastguard Worker // unique ID (unique per sender) 62*6777b538SAndroid Build Coastguard Worker int message_id; 63*6777b538SAndroid Build Coastguard Worker }; 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker static bool ReadSyncHeader(const Message& msg, SyncHeader* header); 66*6777b538SAndroid Build Coastguard Worker static bool WriteSyncHeader(Message* msg, const SyncHeader& header); 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MessageReplyDeserializer> deserializer_; 69*6777b538SAndroid Build Coastguard Worker }; 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker // Used to deserialize parameters from a reply to a synchronous message 72*6777b538SAndroid Build Coastguard Worker class IPC_MESSAGE_SUPPORT_EXPORT MessageReplyDeserializer { 73*6777b538SAndroid Build Coastguard Worker public: ~MessageReplyDeserializer()74*6777b538SAndroid Build Coastguard Worker virtual ~MessageReplyDeserializer() {} 75*6777b538SAndroid Build Coastguard Worker bool SerializeOutputParameters(const Message& msg); 76*6777b538SAndroid Build Coastguard Worker private: 77*6777b538SAndroid Build Coastguard Worker // Derived classes need to implement this, using the given iterator (which 78*6777b538SAndroid Build Coastguard Worker // is skipped past the header for synchronous messages). 79*6777b538SAndroid Build Coastguard Worker virtual bool SerializeOutputParameters(const Message& msg, 80*6777b538SAndroid Build Coastguard Worker base::PickleIterator iter) = 0; 81*6777b538SAndroid Build Coastguard Worker }; 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker // When sending a synchronous message, this structure contains an object 84*6777b538SAndroid Build Coastguard Worker // that knows how to deserialize the response. 85*6777b538SAndroid Build Coastguard Worker struct IPC_MESSAGE_SUPPORT_EXPORT PendingSyncMsg { 86*6777b538SAndroid Build Coastguard Worker PendingSyncMsg(int id, 87*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MessageReplyDeserializer> d, 88*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::WaitableEvent> e); 89*6777b538SAndroid Build Coastguard Worker PendingSyncMsg(PendingSyncMsg&& that); 90*6777b538SAndroid Build Coastguard Worker ~PendingSyncMsg(); 91*6777b538SAndroid Build Coastguard Worker 92*6777b538SAndroid Build Coastguard Worker int id; 93*6777b538SAndroid Build Coastguard Worker bool send_result = false; 94*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MessageReplyDeserializer> deserializer; 95*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::WaitableEvent> done_event; 96*6777b538SAndroid Build Coastguard Worker }; 97*6777b538SAndroid Build Coastguard Worker 98*6777b538SAndroid Build Coastguard Worker } // namespace IPC 99*6777b538SAndroid Build Coastguard Worker 100*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_SYNC_MESSAGE_H_ 101