Index: remoting/host/plugin/policy_hack/json_value_serializer.cc |
diff --git a/remoting/host/plugin/policy_hack/json_value_serializer.cc b/remoting/host/plugin/policy_hack/json_value_serializer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..79a7d1b3d44afbe452217bcb21164c576107d5d5 |
--- /dev/null |
+++ b/remoting/host/plugin/policy_hack/json_value_serializer.cc |
@@ -0,0 +1,116 @@ |
+// Copyright (c) 2006-2008 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. |
+ |
+// Forked from content/common/json_value_serializer.h |
+ |
+#include "remoting/host/plugin/policy_hack/json_value_serializer.h" |
+ |
+#include "base/file_util.h" |
+#include "base/json/json_reader.h" |
+#include "base/json/json_writer.h" |
+#include "base/string_util.h" |
+ |
+namespace remoting { |
+namespace policy_hack { |
+ |
+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) { |
+ if (!json_string_ || initialized_with_const_string_) |
+ return false; |
+ |
+ base::JSONWriter::Write(&root, pretty_print_, json_string_); |
+ return true; |
+} |
+ |
+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_code, |
+ error_str); |
+} |
+ |
+/******* File Serializer *******/ |
+ |
+bool JSONFileValueSerializer::Serialize(const Value& root) { |
+ std::string json_string; |
+ JSONStringValueSerializer serializer(&json_string); |
+ serializer.set_pretty_print(true); |
+ bool result = serializer.Serialize(root); |
+ if (!result) |
+ return false; |
+ |
+ int data_size = static_cast<int>(json_string.size()); |
+ if (file_util::WriteFile(json_file_path_, |
+ json_string.data(), |
+ data_size) != data_size) |
+ return false; |
+ |
+ return true; |
+} |
+ |
+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; |
+ 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_code, error_str); |
+} |
+ |
+} // namespace policy_hack |
+} // namespace remoting |