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_LOCAL_TEMP_FILE_H_
6 #define NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_LOCAL_TEMP_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_rng.h"
11 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
13 #include "ppapi/c/trusted/ppb_file_io_trusted.h"
14 #include "ppapi/utility/completion_callback_factory.h"
17 class CompletionCallback
;
27 // Translation creates two temporary files. The first temporary file holds
28 // the object file created by llc. The second holds the nexe produced by
29 // the linker. Both of these temporary files are used to both write and
30 // read according to the following matrix:
32 // PnaclCoordinator::obj_file_:
33 // written by: llc (passed in explicitly through SRPC)
34 // read by: ld (returned via lookup service from SRPC)
35 // PnaclCoordinator::nexe_file_:
36 // written by: ld (passed in explicitly through SRPC)
37 // read by: sel_ldr (passed in explicitly to command channel)
40 // LocalTempFile represents a file used as a temporary between stages in
41 // translation. It is created in the local temporary file system of the page
42 // being processed. The name of the temporary file is a random 32-character
43 // hex string. Because both reading and writing are necessary, two I/O objects
44 // for the file are opened.
47 // Create a LocalTempFile with a random name.
48 LocalTempFile(Plugin
* plugin
,
49 pp::FileSystem
* file_system
,
50 const nacl::string
& base_dir
);
51 // Create a LocalTempFile with a specific filename.
52 LocalTempFile(Plugin
* plugin
,
53 pp::FileSystem
* file_system
,
54 const nacl::string
& base_dir
,
55 const nacl::string
& filename
);
57 // Opens a writeable file IO object and descriptor referring to the file.
58 void OpenWrite(const pp::CompletionCallback
& cb
);
59 // Opens a read only file IO object and descriptor referring to the file.
60 void OpenRead(const pp::CompletionCallback
& cb
);
61 // Closes the open descriptors.
62 void Close(const pp::CompletionCallback
& cb
);
63 // Deletes the temporary file.
64 void Delete(const pp::CompletionCallback
& cb
);
65 // Renames the temporary file.
66 void Rename(const nacl::string
& new_name
,
67 const pp::CompletionCallback
& cb
);
71 // The nacl::DescWrapper* for the writeable version of the file.
72 nacl::DescWrapper
* write_wrapper() { return write_wrapper_
.get(); }
73 nacl::DescWrapper
* release_write_wrapper() {
74 return write_wrapper_
.release();
76 // The nacl::DescWrapper* for the read-only version of the file.
77 nacl::DescWrapper
* read_wrapper() { return read_wrapper_
.get(); }
78 nacl::DescWrapper
* release_read_wrapper() {
79 return read_wrapper_
.release();
81 // For quota management.
82 const nacl::string
identifier() const {
83 return nacl::string(reinterpret_cast<const char*>(identifier_
));
85 pp::FileIO
* write_file_io() const { return write_io_
.get(); }
88 NACL_DISALLOW_COPY_AND_ASSIGN(LocalTempFile
);
92 // Gets the POSIX file descriptor for a resource.
93 int32_t GetFD(int32_t pp_error
,
94 const pp::Resource
& resource
,
96 // Called when the writable file IO was opened.
97 void WriteFileDidOpen(int32_t pp_error
);
98 // Called when the readable file IO was opened.
99 void ReadFileDidOpen(int32_t pp_error
);
100 // Completes the close operation after quota update.
101 void CloseContinuation(int32_t pp_error
);
104 pp::FileSystem
* file_system_
;
105 const PPB_FileIOTrusted
* file_io_trusted_
;
106 pp::CompletionCallbackFactory
<LocalTempFile
> callback_factory_
;
107 nacl::string base_dir_
;
108 nacl::string filename_
;
109 nacl::scoped_ptr
<pp::FileRef
> file_ref_
;
110 // Temporarily holds the previous file ref during a rename operation.
111 nacl::scoped_ptr
<pp::FileRef
> old_ref_
;
112 // The PPAPI and wrapper state for the writeable file.
113 nacl::scoped_ptr
<pp::FileIO
> write_io_
;
114 nacl::scoped_ptr
<nacl::DescWrapper
> write_wrapper_
;
115 // The PPAPI and wrapper state for the read-only file.
116 nacl::scoped_ptr
<pp::FileIO
> read_io_
;
117 nacl::scoped_ptr
<nacl::DescWrapper
> read_wrapper_
;
118 // The callback invoked when both file I/O objects are created.
119 pp::CompletionCallback done_callback_
;
120 // Random number generator used to create filenames.
121 struct NaClDescRng
*rng_desc_
;
122 // An identifier string used for quota request processing. The quota
123 // interface needs a string that is unique per sel_ldr instance only, so
124 // the identifiers can be reused between runs of the translator, start-ups of
126 uint8_t identifier_
[16];
127 // A counter to dole out unique identifiers.
128 static uint32_t next_identifier
;
131 } // namespace plugin
133 #endif // NATIVE_CLIENT_SRC_TRUSTED_PLUGIN_LOCAL_TEMP_FILE_H_