Home | History | Annotate | Download | only in plugin
      1 // Copyright (c) 2012 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 NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_TEMPORARY_FILE_H_
      6 #define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_TEMPORARY_FILE_H_
      7 
      8 #include "native_client/src/include/nacl_macros.h"
      9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
     10 
     11 #include "ppapi/c/private/pp_file_handle.h"
     12 
     13 namespace plugin {
     14 
     15 class Plugin;
     16 
     17 // Translation creates two temporary files.  The first temporary file holds
     18 // the object file created by llc.  The second holds the nexe produced by
     19 // the linker.  Both of these temporary files are used to both write and
     20 // read according to the following matrix:
     21 //
     22 // PnaclCoordinator::obj_file_:
     23 //     written by: llc     (passed in explicitly through SRPC)
     24 //     read by:    ld      (returned via lookup service from SRPC)
     25 // PnaclCoordinator::nexe_file_:
     26 //     written by: ld      (passed in explicitly through SRPC)
     27 //     read by:    sel_ldr (passed in explicitly to command channel)
     28 //
     29 
     30 // TempFile represents a file used as a temporary between stages in
     31 // translation.  It is automatically deleted when all handles are closed
     32 // (or earlier -- immediately unlinked on POSIX systems).  The file is only
     33 // opened, once, but because both reading and writing are necessary (and in
     34 // different processes), the user should reset / seek back to the beginning
     35 // of the file between sessions.
     36 class TempFile {
     37  public:
     38   // Create a TempFile.
     39   explicit TempFile(Plugin* plugin);
     40   ~TempFile();
     41 
     42   // Opens a temporary file object and descriptor wrapper referring to the file.
     43   // If |writeable| is true, the descriptor will be opened for writing, and
     44   // write_wrapper will return a valid pointer, otherwise it will return NULL.
     45   int32_t Open(bool writeable);
     46   // Resets file position of the handle, for reuse.
     47   bool Reset();
     48 
     49   // Accessors.
     50   // The nacl::DescWrapper* for the writeable version of the file.
     51   nacl::DescWrapper* write_wrapper() { return write_wrapper_.get(); }
     52   nacl::DescWrapper* read_wrapper() { return read_wrapper_.get(); }
     53 
     54   // Returns the handle to the file repesented and resets the internal handle
     55   // and all wrappers.
     56   PP_FileHandle TakeFileHandle();
     57 
     58   // Used by GetNexeFd() to set the underlying internal handle.
     59   PP_FileHandle* internal_handle() { return &internal_handle_; }
     60 
     61  private:
     62   NACL_DISALLOW_COPY_AND_ASSIGN(TempFile);
     63 
     64   Plugin* plugin_;
     65   nacl::scoped_ptr<nacl::DescWrapper> read_wrapper_;
     66   nacl::scoped_ptr<nacl::DescWrapper> write_wrapper_;
     67   PP_FileHandle internal_handle_;
     68 };
     69 
     70 }  // namespace plugin
     71 
     72 #endif  // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_TEMPORARY_FILE_H_
     73