File.h revision 7e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20
160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//===-- File.h --------------------------------------------------*- C++ -*-===//
260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//
360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//                     The LLVM Compiler Infrastructure
460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//
560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton// This file is distributed under the University of Illinois Open Source
660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton// License. See LICENSE.TXT for details.
760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//
860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//===----------------------------------------------------------------------===//
960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
1060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#ifndef liblldb_File_h_
1160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#define liblldb_File_h_
1260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#if defined(__cplusplus)
1360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
14419144b064166f0d18b06cad4d52fe66e7ca058fGreg Clayton#include <stdio.h>
15419144b064166f0d18b06cad4d52fe66e7ca058fGreg Clayton
1660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#include "lldb/lldb-private.h"
1760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
1860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonnamespace lldb_private {
1960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
2060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//----------------------------------------------------------------------
2160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// @class File File.h "lldb/Host/File.h"
2260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// @brief A file class.
2360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton///
2460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// A file class that divides abstracts the LLDB core from host file
2560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton/// functionality.
2660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton//----------------------------------------------------------------------
2760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonclass File
2860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton{
2960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonpublic:
305892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    static int kInvalidDescriptor;
315892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    static FILE * kInvalidStream;
325892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
3360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    enum OpenOptions
3460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
3560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionRead                 = (1u << 0),    // Open file for reading
3660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionWrite                = (1u << 1),    // Open file for writing
3760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionAppend               = (1u << 2),    // Don't truncate file when opening, append to end of file
3860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionNonBlocking          = (1u << 3),    // File reads
3960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        eOpenOptionCanCreate            = (1u << 4),    // Create file if doesn't already exist
40c08c4d3fa57387517b9ef43230f4b92c19e70572Greg Clayton        eOpenOptionCanCreateNewOnly     = (1u << 5)    // Can create file only if it doesn't already exist
4160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    };
4260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
4360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    enum Permissions
4460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
4560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsUserRead        = (1u << 0),
4660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsUserWrite       = (1u << 1),
4760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsUserExecute     = (1u << 2),
4860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsGroupRead       = (1u << 3),
4960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsGroupWrite      = (1u << 4),
5060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsGroupExecute    = (1u << 5),
5160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsWorldRead       = (1u << 6),
5260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton        ePermissionsWorldWrite      = (1u << 7),
535892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldExecute    = (1u << 8),
545892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
555892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsUserRW      = (ePermissionsUserRead    | ePermissionsUserWrite    | 0                        ),
565892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsUserRX      = (ePermissionsUserRead    | 0                        | ePermissionsUserExecute  ),
575892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsUserRWX     = (ePermissionsUserRead    | ePermissionsUserWrite    | ePermissionsUserExecute  ),
585892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
595892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsGroupRW     = (ePermissionsGroupRead   | ePermissionsGroupWrite   | 0                        ),
605892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsGroupRX     = (ePermissionsGroupRead   | 0                        | ePermissionsGroupExecute ),
615892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsGroupRWX    = (ePermissionsGroupRead   | ePermissionsGroupWrite   | ePermissionsGroupExecute ),
625892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
635892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldRW     = (ePermissionsWorldRead   | ePermissionsWorldWrite   | 0                        ),
645892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldRX     = (ePermissionsWorldRead   | 0                        | ePermissionsWorldExecute ),
655892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsWorldRWX    = (ePermissionsWorldRead   | ePermissionsWorldWrite   | ePermissionsWorldExecute ),
665892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
675892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneR   = (ePermissionsUserRead    | ePermissionsGroupRead    | ePermissionsWorldRead    ),
685892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneW   = (ePermissionsUserWrite   | ePermissionsGroupWrite   | ePermissionsWorldWrite   ),
695892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneX   = (ePermissionsUserExecute | ePermissionsGroupExecute | ePermissionsWorldExecute ),
705892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
715892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneRW  = (ePermissionsEveryoneR   | ePermissionsEveryoneW    | 0                        ),
725892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneRX  = (ePermissionsEveryoneR   | 0                        | ePermissionsEveryoneX    ),
735892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsEveryoneRWX = (ePermissionsEveryoneR   | ePermissionsEveryoneW    | ePermissionsEveryoneX    ),
745892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        ePermissionsDefault     = (ePermissionsUserRW      | ePermissionsGroupRead)
7560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    };
7660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
775892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File() :
785892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_descriptor (kInvalidDescriptor),
795892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_stream (kInvalidStream),
805892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_options (0),
815892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_owned (false)
825892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
835892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
845892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
855892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File (FILE *fh, bool transfer_ownership) :
865892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_descriptor (kInvalidDescriptor),
875892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_stream (fh),
885892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_options (0),
895892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_owned (transfer_ownership)
9060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
9160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
9260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
935892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File (const File &rhs);
945892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
955892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File &
965892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    operator= (const File &rhs);
9760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
9860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Constructor with path.
9960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
10060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Takes a path to a file which can be just a filename, or a full
10160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// path. If \a path is not NULL or empty, this function will call
102d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// File::Open (const char *path, uint32_t options, uint32_t permissions).
10360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
10460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @param[in] path
10560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     The full or partial path to a file.
10660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
10760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @param[in] options
108d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::OpenOptions)
10960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
11060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @param[in] permissions
111d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::Permissions)
11260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
113d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Open (const char *path, uint32_t options, uint32_t permissions)
11460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
11560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    File (const char *path,
11660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton          uint32_t options,
1175892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton          uint32_t permissions = ePermissionsDefault);
11860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
1195892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
1205892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File (int fd, bool tranfer_ownership) :
1215892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_descriptor (fd),
1225892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_stream (kInvalidStream),
1235892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_options (0),
1245892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        m_owned (tranfer_ownership)
1255892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
1265892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
12760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
12860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Destructor.
12960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
13060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// The destructor is virtual in case this class is subclassed.
13160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
13260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    virtual
13360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ~File ();
13460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
13560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    bool
13660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    IsValid () const
13760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
1385892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return DescriptorIsValid() || StreamIsValid();
13960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
14060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
14160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
14260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Convert to pointer operator.
14360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
14460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// This allows code to check a File object to see if it
14560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// contains anything valid using code such as:
14660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
14760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @code
14860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// File file(...);
14960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// if (file)
15060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// { ...
15160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @endcode
15260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
15360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @return
15460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     A pointer to this object if either the directory or filename
15560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     is valid, NULL otherwise.
15660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
15760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    operator
15860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    bool () const
15960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
1605892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return DescriptorIsValid() || StreamIsValid();
16160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
16260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
16360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
16460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Logical NOT operator.
16560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
16660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// This allows code to check a File object to see if it is
16760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// invalid using code such as:
16860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
16960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @code
17060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// File file(...);
17160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// if (!file)
17260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// { ...
17360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @endcode
17460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
17560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @return
17660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     Returns \b true if the object has an empty directory and
17760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     filename, \b false otherwise.
17860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
17960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    bool
18060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    operator! () const
18160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    {
1825892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return !DescriptorIsValid() && !StreamIsValid();
18360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    }
18460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
18560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
18660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// Get the file spec for this file.
18760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///
18860a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    /// @return
18960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    ///     A reference to the file specification object.
19060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
191882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Error
192882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    GetFileSpec (FileSpec &file_spec) const;
19360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
194d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
195d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Open a file for read/writing with the specified options.
196d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
197d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Takes a path to a file which can be just a filename, or a full
198d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// path.
199d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
200d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] path
201d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The full or partial path to a file.
202d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
203d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] options
204d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::OpenOptions)
205d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
206d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] permissions
207d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     Options to use when opening (see File::Permissions)
208d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
20960a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
21060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Open (const char *path,
21160a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton          uint32_t options,
2125892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton          uint32_t permissions = ePermissionsDefault);
21360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
21460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
21560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Close ();
21660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
2175892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Error
2185892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Duplicate (const File &rhs);
2195892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2205892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    int
2215892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    GetDescriptor() const;
2225892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2235892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    void
2245892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    SetDescriptor(int fd, bool transfer_ownership);
2255892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2265892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    FILE *
2275892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    GetStream ();
2285892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
2295892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    void
2305892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    SetStream (FILE *fh, bool transfer_ownership);
2315892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
232d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
233d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Read bytes from a file from the current file position.
234d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
235d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe. Use the read function
236d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// that takes an "off_t &offset" to ensure correct operation in
237d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// multi-threaded environments.
238d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
239d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
240d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer where to put the bytes that are read.
241d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
242d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
243d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to read form the current file position
244d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     which gets modified with the number of bytes that were read.
245d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
246d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
247d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
248d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
249d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
25060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
251d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Read (void *buf, size_t &num_bytes);
25260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
253d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
254d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Write bytes to a file at the current file position.
255d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
256d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe. Use the write function
257d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// that takes an "off_t &offset" to ensure correct operation in
258d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// multi-threaded environments.
259d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
260d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
261d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer where to put the bytes that are read.
262d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
263d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
264d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to write to the current file position
265d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     which gets modified with the number of bytes that were
266d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     written.
267d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
268d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
269d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
270d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
271d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
27260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    Error
273d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Write (const void *buf, size_t &num_bytes);
27460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
275d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
276d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Seek to an offset relative to the beginning of the file.
277d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
278d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe, other threads that
279d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// access this object might also change the current file position.
280d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// For thread safe reads and writes see the following functions:
281d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Read (void *, size_t, off_t &)
282d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Write (const void *, size_t, off_t &)
283d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
284d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
285d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset to seek to within the file relative to the
286d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     beginning of the file which gets filled in the the resulting
287d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     absolute file offset.
288d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
289d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
290d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
291d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
292d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
293882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Error
294882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    SeekFromStart (off_t& offset);
295882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
296d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
297d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Seek to an offset relative to the current file position.
298d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
299d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe, other threads that
300d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// access this object might also change the current file position.
301d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// For thread safe reads and writes see the following functions:
302d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Read (void *, size_t, off_t &)
303d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Write (const void *, size_t, off_t &)
304d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
305d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
306d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset to seek to within the file relative to the
307d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     current file position. On return this parameter gets filled
308d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     in the the resulting absolute file offset.
309d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
310d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
311d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
312d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
313d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
314882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Error
315882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    SeekFromCurrent (off_t& offset);
316882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
317d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
318d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Seek to an offset relative to the end of the file.
319d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
320d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is NOT thread safe, other threads that
321d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// access this object might also change the current file position.
322d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// For thread safe reads and writes see the following functions:
323d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Read (void *, size_t, off_t &)
324d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @see File::Write (const void *, size_t, off_t &)
325d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
326d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
327d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset to seek to within the file relative to the
328d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     end of the file which gets filled in the the resulting
329d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     absolute file offset.
330d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
331d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
332d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
333d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
334d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
335882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Error
336882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    SeekFromEnd (off_t& offset);
337882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
338d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
339d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Read bytes from a file from the specified file offset.
340d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
341d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is thread safe in that clients manager their
342d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// own file position markers and reads on other threads won't mess
343d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// up the current read.
344d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
345d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
346d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer where to put the bytes that are read.
347d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
348d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
349d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to read form the current file position
350d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     which gets modified with the number of bytes that were read.
351d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
352d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
353d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset within the file from which to read \a num_bytes
354d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     bytes. This offset gets incremented by the number of bytes
355d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     that were read.
356d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
357d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
358d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
359d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
360d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
361d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Error
362d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Read (void *dst, size_t &num_bytes, off_t &offset);
363d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton
364d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
365d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Write bytes to a file at the specified file offset.
366d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
367d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// NOTE: This function is thread safe in that clients manager their
368d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// own file position markers, though clients will need to implement
369d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// their own locking externally to avoid multiple people writing
370d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// to the file at the same time.
371d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
372d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in] buf
373d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     A buffer containing the bytes to write.
374d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
375d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] num_bytes
376d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The number of bytes to write to the file at offset \a offset.
377d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     \a num_bytes gets modified with the number of bytes that
378d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     were read.
379d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
380d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @param[in/out] offset
381d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     The offset within the file at which to write \a num_bytes
382d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     bytes. This offset gets incremented by the number of bytes
383d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     that were written.
384d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
385d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
386d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
387d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
388d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
389d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Error
390d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    Write (const void *src, size_t &num_bytes, off_t &offset);
391d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton
3925892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
3935892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// Flush the current stream
3945892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
3955892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// @return
3965892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     An error object that indicates success or the reason for
3975892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     failure.
3985892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
3995892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Error
4005892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    Flush ();
401d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton
402d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
403d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// Sync to disk.
404d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///
405d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    /// @return
406d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     An error object that indicates success or the reason for
407d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    ///     failure.
408d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton    //------------------------------------------------------------------
409882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Error
410882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton    Sync ();
411882ef0508d9fc517b8ce51a6115b0a3a4e195725Greg Clayton
4125892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
4135892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// Output printf formatted output to the stream.
4145892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
4155892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// Print some formatted output to the stream.
4165892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
4175892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// @param[in] format
4185892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     A printf style format string.
4195892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///
4205892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    /// @param[in] ...
4215892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     Variable arguments that are needed for the printf style
4225892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    ///     format string \a format.
4235892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    //------------------------------------------------------------------
4245892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    int
4257e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    Printf (const char *format, ...)  __attribute__ ((format (printf, 2, 3)));
4265892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
4275892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    int
4285892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    PrintfVarArg(const char *format, va_list args);
4295892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
43060a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Claytonprotected:
4315892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
4325892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
4335892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    bool
4345892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    DescriptorIsValid () const
4355892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
4365892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return m_descriptor >= 0;
4375892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
4385892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
4395892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    bool
4405892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    StreamIsValid () const
4415892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    {
4425892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        return m_stream != kInvalidStream;
4435892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    }
4445892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton
44560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
44660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    // Member variables
44760a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton    //------------------------------------------------------------------
4485892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    int m_descriptor;
4495892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    FILE *m_stream;
4505892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    uint32_t m_options;
4515892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    bool m_owned;
45260a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton};
45360a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
45460a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton} // namespace lldb_private
45560a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton
45660a63aea48af3c5fb34a808e97cb5227eebbaf00Greg Clayton#endif  // #if defined(__cplusplus)
457d35305ab31c10130fd60cec3f6ff62c49f1fb9ddGreg Clayton#endif  // liblldb_File_h_
458