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.
5 #ifndef NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_TEMPORARY_FILE_H_
6 #define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_TEMPORARY_FILE_H_
8 #include "native_client/src/include/nacl_macros.h"
9 #include "native_client/src/include/nacl_string.h"
10 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
12 #include "ppapi/c/private/pp_file_handle.h"
13 #include "ppapi/cpp/completion_callback.h"
19 // Translation creates two temporary files. The first temporary file holds
20 // the object file created by llc. The second holds the nexe produced by
21 // the linker. Both of these temporary files are used to both write and
22 // read according to the following matrix:
24 // PnaclCoordinator::obj_file_:
25 // written by: llc (passed in explicitly through SRPC)
26 // read by: ld (returned via lookup service from SRPC)
27 // PnaclCoordinator::nexe_file_:
28 // written by: ld (passed in explicitly through SRPC)
29 // read by: sel_ldr (passed in explicitly to command channel)
32 // TempFile represents a file used as a temporary between stages in
33 // translation. It is automatically deleted when all handles are closed
34 // (or earlier -- immediately unlinked on POSIX systems). The file is only
35 // opened, once, but because both reading and writing are necessary (and in
36 // different processes), the user should reset / seek back to the beginning
37 // of the file between sessions.
41 explicit TempFile(Plugin
* plugin
);
44 // Set an existing Fd instead of getting one from the nacl interface on open.
45 // Must be called before Open.
46 bool SetExistingFd(PP_FileHandle handle
);
47 // Opens a temporary file object and descriptor wrapper referring to the file.
48 // If |writeable| is true, the descriptor will be opened for writing, and
49 // write_wrapper will return a valid pointer, otherwise it will return NULL.
50 void Open(const pp::CompletionCallback
& cb
, bool writeable
);
51 // Resets file position of the handle, for reuse.
55 // The nacl::DescWrapper* for the writeable version of the file.
56 nacl::DescWrapper
* write_wrapper() { return write_wrapper_
.get(); }
57 nacl::DescWrapper
* read_wrapper() { return read_wrapper_
.get(); }
58 nacl::DescWrapper
* release_read_wrapper() {
59 return read_wrapper_
.release();
62 // For quota management.
63 const nacl::string
identifier() const {
64 return nacl::string(reinterpret_cast<const char*>(identifier_
));
68 NACL_DISALLOW_COPY_AND_ASSIGN(TempFile
);
71 nacl::scoped_ptr
<nacl::DescWrapper
> read_wrapper_
;
72 nacl::scoped_ptr
<nacl::DescWrapper
> write_wrapper_
;
73 PP_FileHandle existing_handle_
;
75 // An identifier string used for quota request processing. The quota
76 // interface needs a string that is unique per sel_ldr instance only, so
77 // the identifiers can be reused between runs of the translator, start-ups of
79 uint8_t identifier_
[16];
80 // A counter to dole out unique identifiers.
81 static uint32_t next_identifier
;
86 #endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_TEMPORARY_FILE_H_