• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4  
5  #ifndef BASE_JSON_JSON_FILE_VALUE_SERIALIZER_H_
6  #define BASE_JSON_JSON_FILE_VALUE_SERIALIZER_H_
7  
8  #include <string>
9  
10  #include "base/base_export.h"
11  #include "base/basictypes.h"
12  #include "base/files/file_path.h"
13  #include "base/values.h"
14  
15  class BASE_EXPORT JSONFileValueSerializer : public base::ValueSerializer {
16   public:
17    // json_file_patch is the path of a file that will be source of the
18    // deserialization or the destination of the serialization.
19    // When deserializing, the file should exist, but when serializing, the
20    // serializer will attempt to create the file at the specified location.
JSONFileValueSerializer(const base::FilePath & json_file_path)21    explicit JSONFileValueSerializer(const base::FilePath& json_file_path)
22      : json_file_path_(json_file_path),
23        allow_trailing_comma_(false) {}
24  
~JSONFileValueSerializer()25    virtual ~JSONFileValueSerializer() {}
26  
27    // DO NOT USE except in unit tests to verify the file was written properly.
28    // We should never serialize directly to a file since this will block the
29    // thread. Instead, serialize to a string and write to the file you want on
30    // the file thread.
31    //
32    // Attempt to serialize the data structure represented by Value into
33    // JSON.  If the return value is true, the result will have been written
34    // into the file whose name was passed into the constructor.
35    virtual bool Serialize(const base::Value& root) OVERRIDE;
36  
37    // Equivalent to Serialize(root) except binary values are omitted from the
38    // output.
39    bool SerializeAndOmitBinaryValues(const base::Value& root);
40  
41    // Attempt to deserialize the data structure encoded in the file passed
42    // in to the constructor into a structure of Value objects.  If the return
43    // value is NULL, and if |error_code| is non-null, |error_code| will
44    // contain an integer error code (either JsonFileError or JsonParseError).
45    // If |error_message| is non-null, it will be filled in with a formatted
46    // error message including the location of the error if appropriate.
47    // The caller takes ownership of the returned value.
48    virtual base::Value* Deserialize(int* error_code,
49                                     std::string* error_message) OVERRIDE;
50  
51    // This enum is designed to safely overlap with JSONReader::JsonParseError.
52    enum JsonFileError {
53      JSON_NO_ERROR = 0,
54      JSON_ACCESS_DENIED = 1000,
55      JSON_CANNOT_READ_FILE,
56      JSON_FILE_LOCKED,
57      JSON_NO_SUCH_FILE
58    };
59  
60    // File-specific error messages that can be returned.
61    static const char* kAccessDenied;
62    static const char* kCannotReadFile;
63    static const char* kFileLocked;
64    static const char* kNoSuchFile;
65  
66    // Convert an error code into an error message.  |error_code| is assumed to
67    // be a JsonFileError.
68    static const char* GetErrorMessageForCode(int error_code);
69  
set_allow_trailing_comma(bool new_value)70    void set_allow_trailing_comma(bool new_value) {
71      allow_trailing_comma_ = new_value;
72    }
73  
74   private:
75    bool SerializeInternal(const base::Value& root, bool omit_binary_values);
76  
77    base::FilePath json_file_path_;
78    bool allow_trailing_comma_;
79  
80    // A wrapper for ReadFileToString which returns a non-zero JsonFileError if
81    // there were file errors.
82    int ReadFileToString(std::string* json_string);
83  
84    DISALLOW_IMPLICIT_CONSTRUCTORS(JSONFileValueSerializer);
85  };
86  
87  #endif  // BASE_JSON_JSON_FILE_VALUE_SERIALIZER_H_
88  
89