Index: chrome/common/json_value_serializer.cc |
diff --git a/chrome/common/json_value_serializer.cc b/chrome/common/json_value_serializer.cc |
index 1e739e6bde24e31c612bb7b00859f6710d1734d0..df92afda457d54056e501086bfb2ec575eec32c4 100644 |
--- a/chrome/common/json_value_serializer.cc |
+++ b/chrome/common/json_value_serializer.cc |
@@ -9,6 +9,11 @@ |
#include "base/json/json_writer.h" |
#include "base/string_util.h" |
+const char* JSONFileValueSerializer::kAccessDenied = "Access denied."; |
+const char* JSONFileValueSerializer::kCannotReadFile = "Can't read file."; |
+const char* JSONFileValueSerializer::kFileLocked = "File locked."; |
+const char* JSONFileValueSerializer::kNoSuchFile = "File doesn't exist."; |
+ |
JSONStringValueSerializer::~JSONStringValueSerializer() {} |
bool JSONStringValueSerializer::Serialize(const Value& root) { |
@@ -19,13 +24,15 @@ bool JSONStringValueSerializer::Serialize(const Value& root) { |
return true; |
} |
-Value* JSONStringValueSerializer::Deserialize(std::string* error_message) { |
+Value* JSONStringValueSerializer::Deserialize(int* error_code, |
+ std::string* error_str) { |
if (!json_string_) |
return NULL; |
return base::JSONReader::ReadAndReturnError(*json_string_, |
allow_trailing_comma_, |
- error_message); |
+ error_code, |
+ error_str); |
} |
/******* File Serializer *******/ |
@@ -47,11 +54,55 @@ bool JSONFileValueSerializer::Serialize(const Value& root) { |
return true; |
} |
-Value* JSONFileValueSerializer::Deserialize(std::string* error_message) { |
+int JSONFileValueSerializer::ReadFileToString(std::string* json_string) { |
+ DCHECK(json_string); |
+ if (!file_util::ReadFileToString(json_file_path_, json_string)) { |
+#if defined(OS_WIN) |
+ int error = ::GetLastError(); |
+ if (error == ERROR_SHARING_VIOLATION || error == ERROR_LOCK_VIOLATION) { |
+ return JSON_FILE_LOCKED; |
+ } else if (error == ERROR_ACCESS_DENIED) { |
+ return JSON_ACCESS_DENIED; |
+ } |
+#endif |
+ if (!file_util::PathExists(json_file_path_)) |
+ return JSON_NO_SUCH_FILE; |
+ else |
+ return JSON_CANNOT_READ_FILE; |
+ } |
+ return JSON_NO_ERROR; |
+} |
+ |
+const char* JSONFileValueSerializer::GetErrorMessageForCode(int error_code) { |
+ switch (error_code) { |
+ case JSON_NO_ERROR: |
+ return ""; |
+ case JSON_ACCESS_DENIED: |
+ return kAccessDenied; |
+ case JSON_CANNOT_READ_FILE: |
+ return kCannotReadFile; |
+ case JSON_FILE_LOCKED: |
+ return kFileLocked; |
+ case JSON_NO_SUCH_FILE: |
+ return kNoSuchFile; |
+ default: |
+ NOTREACHED(); |
+ return ""; |
+ } |
+} |
+ |
+Value* JSONFileValueSerializer::Deserialize(int* error_code, |
+ std::string* error_str) { |
std::string json_string; |
- if (!file_util::ReadFileToString(json_file_path_, &json_string)) { |
+ int error = ReadFileToString(&json_string); |
+ if (error != JSON_NO_ERROR) { |
+ if (error_code) |
+ *error_code = error; |
+ if (error_str) |
+ *error_str = GetErrorMessageForCode(error); |
return NULL; |
} |
+ |
JSONStringValueSerializer serializer(json_string); |
- return serializer.Deserialize(error_message); |
+ return serializer.Deserialize(error_code, error_str); |
} |