| 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/chromeos/drive/drive_files.h" | 5 #include "chrome/browser/chromeos/drive/drive_files.h" |
| 6 | 6 |
| 7 #include "base/platform_file.h" | 7 #include "base/platform_file.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
| 10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
| 11 #include "chrome/browser/chromeos/drive/drive.pb.h" | 11 #include "chrome/browser/chromeos/drive/drive.pb.h" |
| 12 #include "chrome/browser/chromeos/drive/drive_file_system_util.h" | 12 #include "chrome/browser/chromeos/drive/drive_file_system_util.h" |
| 13 #include "chrome/browser/chromeos/drive/drive_resource_metadata.h" | 13 #include "chrome/browser/chromeos/drive/drive_resource_metadata.h" |
| 14 #include "chrome/browser/google_apis/gdata_wapi_parser.h" | 14 #include "chrome/browser/google_apis/gdata_wapi_parser.h" |
| 15 #include "net/base/escape.h" | 15 #include "net/base/escape.h" |
| 16 | 16 |
| 17 namespace gdata { | 17 namespace drive { |
| 18 | 18 |
| 19 // DriveEntry class. | 19 // DriveEntry class. |
| 20 | 20 |
| 21 DriveEntry::DriveEntry(DriveResourceMetadata* resource_metadata) | 21 DriveEntry::DriveEntry(DriveResourceMetadata* resource_metadata) |
| 22 : parent_(NULL), | 22 : parent_(NULL), |
| 23 resource_metadata_(resource_metadata), | 23 resource_metadata_(resource_metadata), |
| 24 deleted_(false) { | 24 deleted_(false) { |
| 25 DCHECK(resource_metadata); | 25 DCHECK(resource_metadata); |
| 26 } | 26 } |
| 27 | 27 |
| 28 DriveEntry::~DriveEntry() { | 28 DriveEntry::~DriveEntry() { |
| 29 } | 29 } |
| 30 | 30 |
| 31 DriveFile* DriveEntry::AsDriveFile() { | 31 DriveFile* DriveEntry::AsDriveFile() { |
| 32 return NULL; | 32 return NULL; |
| 33 } | 33 } |
| 34 | 34 |
| 35 DriveDirectory* DriveEntry::AsDriveDirectory() { | 35 DriveDirectory* DriveEntry::AsDriveDirectory() { |
| 36 return NULL; | 36 return NULL; |
| 37 } | 37 } |
| 38 | 38 |
| 39 void DriveEntry::InitFromDocumentEntry(const DocumentEntry& doc) { | 39 void DriveEntry::InitFromDocumentEntry(const gdata::DocumentEntry& doc) { |
| 40 // For regular files, the 'filename' and 'title' attribute in the metadata | 40 // For regular files, the 'filename' and 'title' attribute in the metadata |
| 41 // may be different (e.g. due to rename). To be consistent with the web | 41 // may be different (e.g. due to rename). To be consistent with the web |
| 42 // interface and other client to use the 'title' attribute, instead of | 42 // interface and other client to use the 'title' attribute, instead of |
| 43 // 'filename', as the file name in the local snapshot. | 43 // 'filename', as the file name in the local snapshot. |
| 44 title_ = UTF16ToUTF8(doc.title()); | 44 title_ = UTF16ToUTF8(doc.title()); |
| 45 // SetBaseNameFromTitle() must be called after |title_| is set. | 45 // SetBaseNameFromTitle() must be called after |title_| is set. |
| 46 SetBaseNameFromTitle(); | 46 SetBaseNameFromTitle(); |
| 47 | 47 |
| 48 file_info_.last_modified = doc.updated_time(); | 48 file_info_.last_modified = doc.updated_time(); |
| 49 // If doc.last_viewed_time().is_null() then, we will pass 0 to the | 49 // If doc.last_viewed_time().is_null() then, we will pass 0 to the |
| 50 // protocol buffer. Moreover, this value may be unreliable. | 50 // protocol buffer. Moreover, this value may be unreliable. |
| 51 // See: crbug.com/152628. | 51 // See: crbug.com/152628. |
| 52 file_info_.last_accessed = doc.last_viewed_time(); | 52 file_info_.last_accessed = doc.last_viewed_time(); |
| 53 file_info_.creation_time = doc.published_time(); | 53 file_info_.creation_time = doc.published_time(); |
| 54 | 54 |
| 55 resource_id_ = doc.resource_id(); | 55 resource_id_ = doc.resource_id(); |
| 56 content_url_ = doc.content_url(); | 56 content_url_ = doc.content_url(); |
| 57 deleted_ = doc.deleted(); | 57 deleted_ = doc.deleted(); |
| 58 | 58 |
| 59 const Link* edit_link = doc.GetLinkByType(Link::LINK_EDIT); | 59 const gdata::Link* edit_link = doc.GetLinkByType(gdata::Link::LINK_EDIT); |
| 60 if (edit_link) | 60 if (edit_link) |
| 61 edit_url_ = edit_link->href(); | 61 edit_url_ = edit_link->href(); |
| 62 | 62 |
| 63 const Link* parent_link = doc.GetLinkByType(Link::LINK_PARENT); | 63 const gdata::Link* parent_link = doc.GetLinkByType(gdata::Link::LINK_PARENT); |
| 64 if (parent_link) | 64 if (parent_link) |
| 65 parent_resource_id_ = util::ExtractResourceIdFromUrl(parent_link->href()); | 65 parent_resource_id_ = util::ExtractResourceIdFromUrl(parent_link->href()); |
| 66 } | 66 } |
| 67 | 67 |
| 68 const DriveFile* DriveEntry::AsDriveFileConst() const { | 68 const DriveFile* DriveEntry::AsDriveFileConst() const { |
| 69 // cast away const and call the non-const version. This is safe. | 69 // cast away const and call the non-const version. This is safe. |
| 70 return const_cast<DriveEntry*>(this)->AsDriveFile(); | 70 return const_cast<DriveEntry*>(this)->AsDriveFile(); |
| 71 } | 71 } |
| 72 | 72 |
| 73 const DriveDirectory* DriveEntry::AsDriveDirectoryConst() const { | 73 const DriveDirectory* DriveEntry::AsDriveDirectoryConst() const { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 89 } | 89 } |
| 90 | 90 |
| 91 void DriveEntry::SetBaseNameFromTitle() { | 91 void DriveEntry::SetBaseNameFromTitle() { |
| 92 base_name_ = util::EscapeUtf8FileName(title_); | 92 base_name_ = util::EscapeUtf8FileName(title_); |
| 93 } | 93 } |
| 94 | 94 |
| 95 // DriveFile class implementation. | 95 // DriveFile class implementation. |
| 96 | 96 |
| 97 DriveFile::DriveFile(DriveResourceMetadata* resource_metadata) | 97 DriveFile::DriveFile(DriveResourceMetadata* resource_metadata) |
| 98 : DriveEntry(resource_metadata), | 98 : DriveEntry(resource_metadata), |
| 99 kind_(ENTRY_KIND_UNKNOWN), | 99 kind_(gdata::ENTRY_KIND_UNKNOWN), |
| 100 is_hosted_document_(false) { | 100 is_hosted_document_(false) { |
| 101 file_info_.is_directory = false; | 101 file_info_.is_directory = false; |
| 102 } | 102 } |
| 103 | 103 |
| 104 DriveFile::~DriveFile() { | 104 DriveFile::~DriveFile() { |
| 105 } | 105 } |
| 106 | 106 |
| 107 DriveFile* DriveFile::AsDriveFile() { | 107 DriveFile* DriveFile::AsDriveFile() { |
| 108 return this; | 108 return this; |
| 109 } | 109 } |
| 110 | 110 |
| 111 void DriveFile::SetBaseNameFromTitle() { | 111 void DriveFile::SetBaseNameFromTitle() { |
| 112 if (is_hosted_document_) { | 112 if (is_hosted_document_) { |
| 113 base_name_ = util::EscapeUtf8FileName(title_ + document_extension_); | 113 base_name_ = util::EscapeUtf8FileName(title_ + document_extension_); |
| 114 } else { | 114 } else { |
| 115 DriveEntry::SetBaseNameFromTitle(); | 115 DriveEntry::SetBaseNameFromTitle(); |
| 116 } | 116 } |
| 117 } | 117 } |
| 118 | 118 |
| 119 void DriveFile::InitFromDocumentEntry(const DocumentEntry& doc) { | 119 void DriveFile::InitFromDocumentEntry(const gdata::DocumentEntry& doc) { |
| 120 DriveEntry::InitFromDocumentEntry(doc); | 120 DriveEntry::InitFromDocumentEntry(doc); |
| 121 | 121 |
| 122 // Check if this entry is a true file, or... | 122 // Check if this entry is a true file, or... |
| 123 if (doc.is_file()) { | 123 if (doc.is_file()) { |
| 124 file_info_.size = doc.file_size(); | 124 file_info_.size = doc.file_size(); |
| 125 file_md5_ = doc.file_md5(); | 125 file_md5_ = doc.file_md5(); |
| 126 | 126 |
| 127 // The resumable-edit-media link should only be present for regular | 127 // The resumable-edit-media link should only be present for regular |
| 128 // files as hosted documents are not uploadable. | 128 // files as hosted documents are not uploadable. |
| 129 const Link* upload_link = | 129 const gdata::Link* upload_link = |
| 130 doc.GetLinkByType(Link::LINK_RESUMABLE_EDIT_MEDIA); | 130 doc.GetLinkByType(gdata::Link::LINK_RESUMABLE_EDIT_MEDIA); |
| 131 if (upload_link) | 131 if (upload_link) |
| 132 upload_url_ = upload_link->href(); | 132 upload_url_ = upload_link->href(); |
| 133 } else { | 133 } else { |
| 134 // ... a hosted document. | 134 // ... a hosted document. |
| 135 // Attach .g<something> extension to hosted documents so we can special | 135 // Attach .g<something> extension to hosted documents so we can special |
| 136 // case their handling in UI. | 136 // case their handling in UI. |
| 137 // TODO(zelidrag): Figure out better way how to pass entry info like kind | 137 // TODO(zelidrag): Figure out better way how to pass entry info like kind |
| 138 // to UI through the File API stack. | 138 // to UI through the File API stack. |
| 139 document_extension_ = doc.GetHostedDocumentExtension(); | 139 document_extension_ = doc.GetHostedDocumentExtension(); |
| 140 // We don't know the size of hosted docs and it does not matter since | 140 // We don't know the size of hosted docs and it does not matter since |
| 141 // is has no effect on the quota. | 141 // is has no effect on the quota. |
| 142 file_info_.size = 0; | 142 file_info_.size = 0; |
| 143 } | 143 } |
| 144 kind_ = doc.kind(); | 144 kind_ = doc.kind(); |
| 145 content_mime_type_ = doc.content_mime_type(); | 145 content_mime_type_ = doc.content_mime_type(); |
| 146 is_hosted_document_ = doc.is_hosted_document(); | 146 is_hosted_document_ = doc.is_hosted_document(); |
| 147 // SetBaseNameFromTitle() must be called after |title_|, | 147 // SetBaseNameFromTitle() must be called after |title_|, |
| 148 // |is_hosted_document_| and |document_extension_| are set. | 148 // |is_hosted_document_| and |document_extension_| are set. |
| 149 SetBaseNameFromTitle(); | 149 SetBaseNameFromTitle(); |
| 150 | 150 |
| 151 const Link* thumbnail_link = doc.GetLinkByType(Link::LINK_THUMBNAIL); | 151 const gdata::Link* thumbnail_link = doc.GetLinkByType( |
| 152 gdata::Link::LINK_THUMBNAIL); |
| 152 if (thumbnail_link) | 153 if (thumbnail_link) |
| 153 thumbnail_url_ = thumbnail_link->href(); | 154 thumbnail_url_ = thumbnail_link->href(); |
| 154 | 155 |
| 155 const Link* alternate_link = doc.GetLinkByType(Link::LINK_ALTERNATE); | 156 const gdata::Link* alternate_link = doc.GetLinkByType( |
| 157 gdata::Link::LINK_ALTERNATE); |
| 156 if (alternate_link) | 158 if (alternate_link) |
| 157 alternate_url_ = alternate_link->href(); | 159 alternate_url_ = alternate_link->href(); |
| 158 } | 160 } |
| 159 | 161 |
| 160 // DriveDirectory class implementation. | 162 // DriveDirectory class implementation. |
| 161 | 163 |
| 162 DriveDirectory::DriveDirectory(DriveResourceMetadata* resource_metadata) | 164 DriveDirectory::DriveDirectory(DriveResourceMetadata* resource_metadata) |
| 163 : DriveEntry(resource_metadata) { | 165 : DriveEntry(resource_metadata) { |
| 164 file_info_.is_directory = true; | 166 file_info_.is_directory = true; |
| 165 } | 167 } |
| 166 | 168 |
| 167 DriveDirectory::~DriveDirectory() { | 169 DriveDirectory::~DriveDirectory() { |
| 168 RemoveChildren(); | 170 RemoveChildren(); |
| 169 } | 171 } |
| 170 | 172 |
| 171 DriveDirectory* DriveDirectory::AsDriveDirectory() { | 173 DriveDirectory* DriveDirectory::AsDriveDirectory() { |
| 172 return this; | 174 return this; |
| 173 } | 175 } |
| 174 | 176 |
| 175 void DriveDirectory::InitFromDocumentEntry(const DocumentEntry& doc) { | 177 void DriveDirectory::InitFromDocumentEntry(const gdata::DocumentEntry& doc) { |
| 176 DriveEntry::InitFromDocumentEntry(doc); | 178 DriveEntry::InitFromDocumentEntry(doc); |
| 177 | 179 |
| 178 const Link* upload_link = | 180 const gdata::Link* upload_link = |
| 179 doc.GetLinkByType(Link::LINK_RESUMABLE_CREATE_MEDIA); | 181 doc.GetLinkByType(gdata::Link::LINK_RESUMABLE_CREATE_MEDIA); |
| 180 if (upload_link) | 182 if (upload_link) |
| 181 upload_url_ = upload_link->href(); | 183 upload_url_ = upload_link->href(); |
| 182 } | 184 } |
| 183 | 185 |
| 184 void DriveDirectory::AddEntry(DriveEntry* entry) { | 186 void DriveDirectory::AddEntry(DriveEntry* entry) { |
| 185 DCHECK(!entry->parent()); | 187 DCHECK(!entry->parent()); |
| 186 | 188 |
| 187 // Try to add the entry to resource map. | 189 // Try to add the entry to resource map. |
| 188 if (!resource_metadata_->AddEntryToResourceMap(entry)) { | 190 if (!resource_metadata_->AddEntryToResourceMap(entry)) { |
| 189 LOG(WARNING) << "Duplicate resource=" << entry->resource_id() | 191 LOG(WARNING) << "Duplicate resource=" << entry->resource_id() |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 const bool ok = entry_proto.SerializeToString(serialized_proto); | 498 const bool ok = entry_proto.SerializeToString(serialized_proto); |
| 497 DCHECK(ok); | 499 DCHECK(ok); |
| 498 } else if (dir) { | 500 } else if (dir) { |
| 499 DriveDirectoryProto dir_proto; | 501 DriveDirectoryProto dir_proto; |
| 500 dir->ToProto(&dir_proto); | 502 dir->ToProto(&dir_proto); |
| 501 const bool ok = dir_proto.SerializeToString(serialized_proto); | 503 const bool ok = dir_proto.SerializeToString(serialized_proto); |
| 502 DCHECK(ok); | 504 DCHECK(ok); |
| 503 } | 505 } |
| 504 } | 506 } |
| 505 | 507 |
| 506 } // namespace gdata | 508 } // namespace drive |
| OLD | NEW |