xref: /aosp_15_r20/external/cronet/ipc/ipc_sync_message.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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