| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/bookmarks/bookmark_html_writer.h" | 5 #include "chrome/browser/bookmarks/bookmark_html_writer.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 // Class responsible for the actual writing. Takes ownership of favicons_map. | 90 // Class responsible for the actual writing. Takes ownership of favicons_map. |
| 91 class Writer : public base::RefCountedThreadSafe<Writer> { | 91 class Writer : public base::RefCountedThreadSafe<Writer> { |
| 92 public: | 92 public: |
| 93 Writer(base::Value* bookmarks, | 93 Writer(base::Value* bookmarks, |
| 94 const FilePath& path, | 94 const FilePath& path, |
| 95 BookmarkFaviconFetcher::URLFaviconMap* favicons_map, | 95 BookmarkFaviconFetcher::URLFaviconMap* favicons_map, |
| 96 BookmarksExportObserver* observer) | 96 BookmarksExportObserver* observer) |
| 97 : bookmarks_(bookmarks), | 97 : bookmarks_(bookmarks), |
| 98 path_(path), | 98 path_(path), |
| 99 favicons_map_(favicons_map), | 99 favicons_map_(favicons_map), |
| 100 observer_(observer), | 100 observer_(observer) { |
| 101 file_stream_(NULL) { | |
| 102 } | 101 } |
| 103 | 102 |
| 104 // Writing bookmarks and favicons data to file. | 103 // Writing bookmarks and favicons data to file. |
| 105 void DoWrite() { | 104 void DoWrite() { |
| 106 if (!OpenFile()) | 105 if (!OpenFile()) |
| 107 return; | 106 return; |
| 108 | 107 |
| 109 Value* roots = NULL; | 108 Value* roots = NULL; |
| 110 if (!Write(kHeader) || | 109 if (!Write(kHeader) || |
| 111 bookmarks_->GetType() != Value::TYPE_DICTIONARY || | 110 bookmarks_->GetType() != Value::TYPE_DICTIONARY || |
| (...skipping 30 matching lines...) Expand all Loading... |
| 142 !WriteNode(*static_cast<DictionaryValue*>(mobile_folder_value), | 141 !WriteNode(*static_cast<DictionaryValue*>(mobile_folder_value), |
| 143 BookmarkNode::MOBILE)) { | 142 BookmarkNode::MOBILE)) { |
| 144 return; | 143 return; |
| 145 } | 144 } |
| 146 | 145 |
| 147 DecrementIndent(); | 146 DecrementIndent(); |
| 148 | 147 |
| 149 Write(kFolderChildrenEnd); | 148 Write(kFolderChildrenEnd); |
| 150 Write(kNewline); | 149 Write(kNewline); |
| 151 // File stream close is forced so that unit test could read it. | 150 // File stream close is forced so that unit test could read it. |
| 152 file_stream_.CloseSync(); | 151 file_stream_.reset(); |
| 153 | 152 |
| 154 NotifyOnFinish(); | 153 NotifyOnFinish(); |
| 155 } | 154 } |
| 156 | 155 |
| 157 private: | 156 private: |
| 158 friend class base::RefCountedThreadSafe<Writer>; | 157 friend class base::RefCountedThreadSafe<Writer>; |
| 159 | 158 |
| 160 // Types of text being written out. The type dictates how the text is | 159 // Types of text being written out. The type dictates how the text is |
| 161 // escaped. | 160 // escaped. |
| 162 enum TextType { | 161 enum TextType { |
| 163 // The text is the value of an html attribute, eg foo in | 162 // The text is the value of an html attribute, eg foo in |
| 164 // <a href="foo">. | 163 // <a href="foo">. |
| 165 ATTRIBUTE_VALUE, | 164 ATTRIBUTE_VALUE, |
| 166 | 165 |
| 167 // Actual content, eg foo in <h1>foo</h2>. | 166 // Actual content, eg foo in <h1>foo</h2>. |
| 168 CONTENT | 167 CONTENT |
| 169 }; | 168 }; |
| 170 | 169 |
| 171 ~Writer() {} | 170 ~Writer() {} |
| 172 | 171 |
| 173 // Opens the file, returning true on success. | 172 // Opens the file, returning true on success. |
| 174 bool OpenFile() { | 173 bool OpenFile() { |
| 174 file_stream_.reset(new net::FileStream(NULL)); |
| 175 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_WRITE; | 175 int flags = base::PLATFORM_FILE_CREATE_ALWAYS | base::PLATFORM_FILE_WRITE; |
| 176 return (file_stream_.OpenSync(path_, flags) == net::OK); | 176 return (file_stream_->OpenSync(path_, flags) == net::OK); |
| 177 } | 177 } |
| 178 | 178 |
| 179 // Increments the indent. | 179 // Increments the indent. |
| 180 void IncrementIndent() { | 180 void IncrementIndent() { |
| 181 indent_.resize(indent_.size() + kIndentSize, ' '); | 181 indent_.resize(indent_.size() + kIndentSize, ' '); |
| 182 } | 182 } |
| 183 | 183 |
| 184 // Decrements the indent. | 184 // Decrements the indent. |
| 185 void DecrementIndent() { | 185 void DecrementIndent() { |
| 186 DCHECK(!indent_.empty()); | 186 DCHECK(!indent_.empty()); |
| 187 indent_.resize(indent_.size() - kIndentSize, ' '); | 187 indent_.resize(indent_.size() - kIndentSize, ' '); |
| 188 } | 188 } |
| 189 | 189 |
| 190 // Called at the end of the export process. | 190 // Called at the end of the export process. |
| 191 void NotifyOnFinish() { | 191 void NotifyOnFinish() { |
| 192 if (observer_ != NULL) { | 192 if (observer_ != NULL) { |
| 193 observer_->OnExportFinished(); | 193 observer_->OnExportFinished(); |
| 194 } | 194 } |
| 195 } | 195 } |
| 196 | 196 |
| 197 // Writes raw text out returning true on success. This does not escape | 197 // Writes raw text out returning true on success. This does not escape |
| 198 // the text in anyway. | 198 // the text in anyway. |
| 199 bool Write(const std::string& text) { | 199 bool Write(const std::string& text) { |
| 200 size_t wrote = file_stream_.WriteSync(text.c_str(), text.length()); | 200 size_t wrote = file_stream_->WriteSync(text.c_str(), text.length()); |
| 201 bool result = (wrote == text.length()); | 201 bool result = (wrote == text.length()); |
| 202 DCHECK(result); | 202 DCHECK(result); |
| 203 return result; | 203 return result; |
| 204 } | 204 } |
| 205 | 205 |
| 206 // Writes out the text string (as UTF8). The text is escaped based on | 206 // Writes out the text string (as UTF8). The text is escaped based on |
| 207 // type. | 207 // type. |
| 208 bool Write(const std::string& text, TextType type) { | 208 bool Write(const std::string& text, TextType type) { |
| 209 DCHECK(IsStringUTF8(text)); | 209 DCHECK(IsStringUTF8(text)); |
| 210 std::string utf8_string; | 210 std::string utf8_string; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 // Path we're writing to. | 367 // Path we're writing to. |
| 368 FilePath path_; | 368 FilePath path_; |
| 369 | 369 |
| 370 // Map that stores favicon per URL. | 370 // Map that stores favicon per URL. |
| 371 scoped_ptr<BookmarkFaviconFetcher::URLFaviconMap> favicons_map_; | 371 scoped_ptr<BookmarkFaviconFetcher::URLFaviconMap> favicons_map_; |
| 372 | 372 |
| 373 // Observer to be notified on finish. | 373 // Observer to be notified on finish. |
| 374 BookmarksExportObserver* observer_; | 374 BookmarksExportObserver* observer_; |
| 375 | 375 |
| 376 // File we're writing to. | 376 // File we're writing to. |
| 377 net::FileStream file_stream_; | 377 scoped_ptr<net::FileStream> file_stream_; |
| 378 | 378 |
| 379 // How much we indent when writing a bookmark/folder. This is modified | 379 // How much we indent when writing a bookmark/folder. This is modified |
| 380 // via IncrementIndent and DecrementIndent. | 380 // via IncrementIndent and DecrementIndent. |
| 381 std::string indent_; | 381 std::string indent_; |
| 382 | 382 |
| 383 DISALLOW_COPY_AND_ASSIGN(Writer); | 383 DISALLOW_COPY_AND_ASSIGN(Writer); |
| 384 }; | 384 }; |
| 385 | 385 |
| 386 } // namespace | 386 } // namespace |
| 387 | 387 |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 // BookmarkModel isn't thread safe (nor would we want to lock it down | 502 // BookmarkModel isn't thread safe (nor would we want to lock it down |
| 503 // for the duration of the write), as such we make a copy of the | 503 // for the duration of the write), as such we make a copy of the |
| 504 // BookmarkModel using BookmarkCodec then write from that. | 504 // BookmarkModel using BookmarkCodec then write from that. |
| 505 if (fetcher == NULL) { | 505 if (fetcher == NULL) { |
| 506 fetcher = new BookmarkFaviconFetcher(profile, path, observer); | 506 fetcher = new BookmarkFaviconFetcher(profile, path, observer); |
| 507 fetcher->ExportBookmarks(); | 507 fetcher->ExportBookmarks(); |
| 508 } | 508 } |
| 509 } | 509 } |
| 510 | 510 |
| 511 } // namespace bookmark_html_writer | 511 } // namespace bookmark_html_writer |
| OLD | NEW |