Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(68)

Unified Diff: media/cdm/ppapi/cdm_file_io_impl.h

Issue 545983005: CdmFileIOImpl: Refactor Write() implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cannot use "ERROR" on Windows!!! Also polished tests. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/cdm/ppapi/cdm_file_io_impl.cc » ('j') | media/cdm/ppapi/cdm_file_io_impl.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/cdm/ppapi/cdm_file_io_impl.h
diff --git a/media/cdm/ppapi/cdm_file_io_impl.h b/media/cdm/ppapi/cdm_file_io_impl.h
index f8a78e5f35426816201c65d1693103db231390e0..0d025620bba5500bac2141ae2a55bab82cee800f 100644
--- a/media/cdm/ppapi/cdm_file_io_impl.h
+++ b/media/cdm/ppapi/cdm_file_io_impl.h
@@ -22,6 +22,17 @@
namespace media {
// Due to PPAPI limitations, all functions must be called on the main thread.
+//
+// Implementation notes about states:
+// 1, When a method is called in an invalid state (e.g. Read() before Open() is
+// called, Write() before Open() finishes or Open() after Open()), kError
+// will be returned. The state of |this| will not change.
+// 2, When the file is opened by another CDM instance, or when we call Read()/
+// Write() during a pending Read()/Write(), kInUse will be returned. The
+// state of |this| will not change.
+// 3, When a pepper operation failed (either synchronously or asynchronously),
+// kError will be returned. The state of |this| will be set to ERROR.
+// 4. Any operation in ERROR state will end up with kError.
class CdmFileIOImpl : public cdm::FileIO {
public:
// A class that helps release |file_lock_map_|.
@@ -49,14 +60,15 @@ class CdmFileIOImpl : public cdm::FileIO {
virtual void Close() OVERRIDE;
private:
+ // TODO(xhwang): Introduce more detailed states for UMA logging if needed.
enum State {
- FILE_UNOPENED,
- OPENING_FILE_SYSTEM,
- OPENING_FILE,
- FILE_OPENED,
- READING_FILE,
- WRITING_FILE,
- FILE_CLOSED
+ STATE_UNOPENED,
+ STATE_OPENING_FILE_SYSTEM,
+ STATE_OPENED,
ddorwin 2014/09/16 18:07:37 Is this FS or FILE opened?
xhwang 2014/09/17 21:02:32 Done.
+ STATE_READING,
+ STATE_WRITING,
+ STATE_CLOSED,
+ STATE_ERROR
};
enum ErrorType {
@@ -106,22 +118,33 @@ class CdmFileIOImpl : public cdm::FileIO {
// objects.
void ReleaseFileLock();
+ // Helper functions for Open().
void OpenFileSystem();
void OnFileSystemOpened(int32_t result, pp::FileSystem file_system);
- void OpenFile();
- void OnFileOpened(int32_t result);
+
+ // Helper functions for Read().
+ void OpenFileForRead();
+ void OnFileOpenedForRead(int32_t result);
void ReadFile();
void OnFileRead(int32_t bytes_read);
- void SetLength(uint32_t length);
- void OnLengthSet(int32_t result);
- void WriteFile();
- void OnFileWritten(int32_t bytes_written);
-
- void CloseFile();
- // Calls client_->OnXxxxComplete with kError asynchronously. In some cases we
- // could actually call them synchronously, but since these errors shouldn't
- // happen in normal cases, we are not optimizing such cases.
+ // Helper functions for Write(). We always write data to a temporary file,
+ // then rename the temporary file to the target file. This can prevent data
+ // corruption if |this| is closed while waiting for writing to complete.
+ void OpenTempFileForWrite();
+ void OnTempFileOpenedForWrite(int32_t result);
+ void WriteTempFile();
+ void OnTempFileWritten(int32_t bytes_written);
+ void RenameTempFile();
+ void OnTempFileRenamed(int32_t result);
+
+ // Reset |this| to a clean state.
+ void Reset();
+
+ // For real open/read/write errors, Reset() and set the |state_| to ERROR.
+ // Calls client_->OnXxxxComplete with kError or kInUse asynchronously. In some
+ // cases we could actually call them synchronously, but since these errors
+ // shouldn't happen in normal cases, we are not optimizing such cases.
void OnError(ErrorType error_type);
// Callback to notify client of error asynchronously.
@@ -134,6 +157,7 @@ class CdmFileIOImpl : public cdm::FileIO {
const pp::InstanceHandle pp_instance_handle_;
+ // Format: /<original_file_name>
ddorwin 2014/09/16 18:07:37 "original"? Maybe "requested"?
xhwang 2014/09/17 21:02:32 Done.
std::string file_name_;
// A string ID that uniquely identifies a file in the user's profile.
@@ -144,11 +168,13 @@ class CdmFileIOImpl : public cdm::FileIO {
pp::IsolatedFileSystemPrivate isolated_file_system_;
pp::FileSystem file_system_;
+
+ // Shared between read and write. During read, |file_ref_| refers to the real
+ // file to read data from. During write, it refers to the temporary file to
+ // write data into.
pp::FileIO file_io_;
pp::FileRef file_ref_;
- pp::CompletionCallbackFactory<CdmFileIOImpl> callback_factory_;
-
// A temporary buffer to hold (partial) data to write or the data that has
// been read. The size of |io_buffer_| is always "bytes to write" or "bytes to
// read". Use "char" instead of "unit8_t" because PPB_FileIO uses char* for
@@ -168,6 +194,8 @@ class CdmFileIOImpl : public cdm::FileIO {
// Callback to report the file size in bytes after the first successful read.
pp::CompletionCallback first_file_read_cb_;
+ pp::CompletionCallbackFactory<CdmFileIOImpl> callback_factory_;
+
DISALLOW_COPY_AND_ASSIGN(CdmFileIOImpl);
};
« no previous file with comments | « no previous file | media/cdm/ppapi/cdm_file_io_impl.cc » ('j') | media/cdm/ppapi/cdm_file_io_impl.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698