1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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_MESSAGE_ATTACHMENT_SET_H_ 6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_MESSAGE_ATTACHMENT_SET_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <vector> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 14*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_support_export.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace IPC { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker class MessageAttachment; 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 21*6777b538SAndroid Build Coastguard Worker // A MessageAttachmentSet is an ordered set of MessageAttachment objects 22*6777b538SAndroid Build Coastguard Worker // associated with an IPC message. All attachments are wrapped in a mojo handle 23*6777b538SAndroid Build Coastguard Worker // if necessary and sent over the mojo message pipe. 24*6777b538SAndroid Build Coastguard Worker // 25*6777b538SAndroid Build Coastguard Worker // For ChannelNacl under SFI NaCl, only Type::PLATFORM_FILE is supported. In 26*6777b538SAndroid Build Coastguard Worker // that case, the FD is sent over socket. 27*6777b538SAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 28*6777b538SAndroid Build Coastguard Worker class IPC_MESSAGE_SUPPORT_EXPORT MessageAttachmentSet 29*6777b538SAndroid Build Coastguard Worker : public base::RefCountedThreadSafe<MessageAttachmentSet> { 30*6777b538SAndroid Build Coastguard Worker public: 31*6777b538SAndroid Build Coastguard Worker MessageAttachmentSet(); 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker MessageAttachmentSet(const MessageAttachmentSet&) = delete; 34*6777b538SAndroid Build Coastguard Worker MessageAttachmentSet& operator=(const MessageAttachmentSet&) = delete; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // Return the number of attachments 37*6777b538SAndroid Build Coastguard Worker unsigned size() const; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker // Return true if no unconsumed descriptors remain empty()40*6777b538SAndroid Build Coastguard Worker bool empty() const { return attachments_.empty(); } 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // Returns whether the attachment was successfully added. 43*6777b538SAndroid Build Coastguard Worker // |index| is an output variable. On success, it contains the index of the 44*6777b538SAndroid Build Coastguard Worker // newly added attachment. 45*6777b538SAndroid Build Coastguard Worker bool AddAttachment(scoped_refptr<MessageAttachment> attachment, 46*6777b538SAndroid Build Coastguard Worker size_t* index); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Similar to the above method, but without output variables. 49*6777b538SAndroid Build Coastguard Worker bool AddAttachment(scoped_refptr<MessageAttachment> attachment); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Take the nth from the beginning of the vector, Code using this /must/ 52*6777b538SAndroid Build Coastguard Worker // access the attachments in order, and must do it at most once. 53*6777b538SAndroid Build Coastguard Worker // 54*6777b538SAndroid Build Coastguard Worker // This interface is designed for the deserialising code as it doesn't 55*6777b538SAndroid Build Coastguard Worker // support close flags. 56*6777b538SAndroid Build Coastguard Worker // returns: an attachment, or nullptr on error 57*6777b538SAndroid Build Coastguard Worker scoped_refptr<MessageAttachment> GetAttachmentAt(unsigned index); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // Marks all the descriptors as consumed and closes those which are 60*6777b538SAndroid Build Coastguard Worker // auto-close. 61*6777b538SAndroid Build Coastguard Worker void CommitAllDescriptors(); 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) 64*6777b538SAndroid Build Coastguard Worker // This is the maximum number of descriptors per message. We need to know this 65*6777b538SAndroid Build Coastguard Worker // because the control message kernel interface has to be given a buffer which 66*6777b538SAndroid Build Coastguard Worker // is large enough to store all the descriptor numbers. Otherwise the kernel 67*6777b538SAndroid Build Coastguard Worker // tells us that it truncated the control data and the extra descriptors are 68*6777b538SAndroid Build Coastguard Worker // lost. 69*6777b538SAndroid Build Coastguard Worker // 70*6777b538SAndroid Build Coastguard Worker // In debugging mode, it's a fatal error to try and add more than this number 71*6777b538SAndroid Build Coastguard Worker // of descriptors to a MessageAttachmentSet. 72*6777b538SAndroid Build Coastguard Worker static const size_t kMaxDescriptorsPerMessage = 7; 73*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker private: 78*6777b538SAndroid Build Coastguard Worker friend class base::RefCountedThreadSafe<MessageAttachmentSet>; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker ~MessageAttachmentSet(); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker // Return the number of file descriptors 83*6777b538SAndroid Build Coastguard Worker unsigned num_descriptors() const; 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Worker std::vector<scoped_refptr<MessageAttachment>> attachments_; 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker // This contains the index of the next descriptor which should be consumed. 88*6777b538SAndroid Build Coastguard Worker // It's used in a couple of ways. Firstly, at destruction we can check that 89*6777b538SAndroid Build Coastguard Worker // all the descriptors have been read (with GetNthDescriptor). Secondly, we 90*6777b538SAndroid Build Coastguard Worker // can check that they are read in order. 91*6777b538SAndroid Build Coastguard Worker unsigned consumed_descriptor_highwater_; 92*6777b538SAndroid Build Coastguard Worker }; 93*6777b538SAndroid Build Coastguard Worker 94*6777b538SAndroid Build Coastguard Worker } // namespace IPC 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_MESSAGE_ATTACHMENT_SET_H_ 97