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