blob: 5237b4664cd8add9018cd280780f4cee060968a7 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_NACL_RENDERER_PLUGIN_TEMPORARY_FILE_H_
#define COMPONENTS_NACL_RENDERER_PLUGIN_TEMPORARY_FILE_H_
#include "native_client/src/include/nacl_macros.h"
#include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
#include "ppapi/c/private/pp_file_handle.h"
namespace plugin {
class Plugin;
// Translation creates two temporary files. The first temporary file holds
// the object file created by llc. The second holds the nexe produced by
// the linker. Both of these temporary files are used to both write and
// read according to the following matrix:
//
// PnaclCoordinator::obj_file_:
// written by: llc (passed in explicitly through SRPC)
// read by: ld (returned via lookup service from SRPC)
// PnaclCoordinator::nexe_file_:
// written by: ld (passed in explicitly through SRPC)
// read by: sel_ldr (passed in explicitly to command channel)
//
// TempFile represents a file used as a temporary between stages in
// translation. It is automatically deleted when all handles are closed
// (or earlier -- immediately unlinked on POSIX systems). The file is only
// opened, once, but because both reading and writing are necessary (and in
// different processes), the user should reset / seek back to the beginning
// of the file between sessions.
class TempFile {
public:
// Create a TempFile.
TempFile(Plugin* plugin, PP_FileHandle handle);
~TempFile();
// Opens a temporary file object and descriptor wrapper referring to the file.
// If |writeable| is true, the descriptor will be opened for writing, and
// write_wrapper will return a valid pointer, otherwise it will return NULL.
int32_t Open(bool writeable);
// Resets file position of the handle, for reuse.
bool Reset();
// Accessors.
// The nacl::DescWrapper* for the writeable version of the file.
nacl::DescWrapper* write_wrapper() { return write_wrapper_.get(); }
nacl::DescWrapper* read_wrapper() { return read_wrapper_.get(); }
// Returns the handle to the file repesented and resets the internal handle
// and all wrappers.
PP_FileHandle TakeFileHandle();
private:
NACL_DISALLOW_COPY_AND_ASSIGN(TempFile);
Plugin* plugin_;
nacl::scoped_ptr<nacl::DescWrapper> read_wrapper_;
nacl::scoped_ptr<nacl::DescWrapper> write_wrapper_;
PP_FileHandle internal_handle_;
};
} // namespace plugin
#endif // COMPONENTS_NACL_RENDERER_PLUGIN_TEMPORARY_FILE_H_