| // Copyright 2010-2015, Google Inc. |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following disclaimer |
| // in the documentation and/or other materials provided with the |
| // distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| #ifndef MOZC_BASE_CONFIG_FILE_STREAM_H_ |
| #define MOZC_BASE_CONFIG_FILE_STREAM_H_ |
| |
| #include "base/file_stream.h" |
| |
| namespace mozc { |
| |
| // TODO(taku, komatsu) move ConfigFileStream to config/ directory? |
| |
| // A class for user-configurable file object |
| // |
| // read filename and return istream object. |
| // filename format: |
| // |
| // A) system file embedded in .exe file |
| // system://ms-ime.tsv |
| // system://kotoeri.tsv |
| // |
| // B) user file. expaneded into $(USER_PROFILE_DIR)/file_name |
| // user://foo.tsv |
| // user://foo.bar |
| // |
| // C) file -- should only be enabled in debug build |
| // file:///foo/bar/foo.tsv |
| // |
| // D) on-memory -- for debug. Does not store to the disk at all. |
| // memory://foo.tsv |
| // memory://foo.bar |
| // |
| class ConfigFileStream { |
| public: |
| // Open |filename| as a text file with read permission. |
| static istream *OpenReadText(const string &filename) { |
| return Open(filename, ios_base::in); |
| } |
| |
| // Open |filename| as a binary file with read permission. |
| static istream *OpenReadBinary(const string &filename) { |
| return Open(filename, ios_base::in | ios_base::binary); |
| } |
| |
| // Mozc 1.3 and prior had had a following method, which opens |filename| |
| // as a text file with read permission. |
| // static istream *Open(const string &filename) { |
| // return Open(filename, ios_base::in); |
| // } |
| // As of Mozc 1.3, a number of files had had depended on this method. |
| // However, we did not programatically replaced all of them with |
| // |OpenReadText| because these existing code do not have enough unit |
| // tests to check the treatment of line-end character, especially on Windows. |
| // Perhaps |OpenReadBinary| might be more appropriate in some cases. |
| // So we left |LegacyOpen| as an alias of the old version. |
| // You should not use this method in new code. |
| // TODO(yukawa): Add unit tests and replace |LegacyOpen| with |OpenReadText| |
| // or |OpenReadBinary| where this method is used. |
| static istream *LegacyOpen(const string &filename) { |
| return Open(filename, ios_base::in); |
| } |
| |
| // Update the specified config filename (formatted as above) with |
| // the |new_contents| atomically. Returns true if the update |
| // succeeds. |
| // Note that this method uses binary mode to update |filename|. |
| // TODO(yukawa): Consider to rename to |AtomicUpdateBinary|. |
| static bool AtomicUpdate(const string &filename, |
| const string &new_binary_contens); |
| |
| // if prefix is system:// or memory:// return ""; |
| static string GetFileName(const string &filename); |
| |
| // Clear all memory:// files. This is a utility method for testing. |
| static void ClearOnMemoryFiles(); |
| |
| private: |
| // This function was deplicated. Use OpenReadText or OpenReadBinary instead. |
| // TODO(yukawa): Move this function to anonymous namespace in |
| // config_file_stream.cc. |
| static istream *Open(const string &filename, ios_base::openmode mode); |
| }; |
| } // namespace mozc |
| |
| #endif // MOZC_BASE_CONFIG_FILE_STREAM_H_ |