Home | History | Annotate | Download | only in CoreIPC
      1 /*
      2  * Copyright (C) 2010 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
     14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
     17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     23  * THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef Attachment_h
     27 #define Attachment_h
     28 
     29 namespace CoreIPC {
     30 
     31 class ArgumentDecoder;
     32 class ArgumentEncoder;
     33 
     34 class Attachment {
     35 public:
     36     Attachment();
     37 
     38     enum Type {
     39         Uninitialized,
     40 #if PLATFORM(MAC)
     41         MachPortType,
     42         MachOOLMemoryType,
     43 #elif USE(UNIX_DOMAIN_SOCKETS)
     44         MappedMemory
     45 #endif
     46     };
     47 
     48 #if PLATFORM(MAC)
     49     Attachment(mach_port_name_t port, mach_msg_type_name_t disposition);
     50     Attachment(void* address, mach_msg_size_t size, mach_msg_copy_options_t copyOptions, bool deallocate);
     51 #elif USE(UNIX_DOMAIN_SOCKETS)
     52     Attachment(int fileDescriptor, size_t);
     53 #endif
     54 
     55     Type type() const { return m_type; }
     56 
     57 #if PLATFORM(MAC)
     58     void release();
     59 
     60     // MachPortType
     61     mach_port_name_t port() const { ASSERT(m_type == MachPortType); return m_port.port; }
     62     mach_msg_type_name_t disposition() const { ASSERT(m_type == MachPortType); return m_port.disposition; }
     63 
     64     // MachOOLMemoryType
     65     void* address() const { ASSERT(m_type == MachOOLMemoryType); return m_oolMemory.address; }
     66     mach_msg_size_t size() const { ASSERT(m_type == MachOOLMemoryType); return m_oolMemory.size; }
     67     mach_msg_copy_options_t copyOptions() const { ASSERT(m_type == MachOOLMemoryType); return m_oolMemory.copyOptions; }
     68     bool deallocate() const { ASSERT(m_type == MachOOLMemoryType); return m_oolMemory.deallocate; }
     69 #elif USE(UNIX_DOMAIN_SOCKETS)
     70     size_t size() const { return m_size; }
     71 
     72     int releaseFileDescriptor() { int temp = m_fileDescriptor; m_fileDescriptor = -1; return temp; }
     73     int fileDescriptor() const { return m_fileDescriptor; }
     74 
     75     void dispose();
     76 #endif
     77 
     78     void encode(ArgumentEncoder*) const;
     79     static bool decode(ArgumentDecoder*, Attachment&);
     80 
     81 private:
     82     Type m_type;
     83 
     84 #if PLATFORM(MAC)
     85     union {
     86         struct {
     87             mach_port_name_t port;
     88             mach_msg_type_name_t disposition;
     89         } m_port;
     90         struct {
     91             void* address;
     92             mach_msg_size_t size;
     93             mach_msg_copy_options_t copyOptions;
     94             bool deallocate;
     95         } m_oolMemory;
     96     };
     97 #elif USE(UNIX_DOMAIN_SOCKETS)
     98     int m_fileDescriptor;
     99     size_t m_size;
    100 #endif
    101 };
    102 
    103 } // namespace CoreIPC
    104 
    105 #endif // Attachment_h
    106