file_metadata_handler.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright 2013 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#include "chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.h" 6 7#include <map> 8 9#include "base/bind.h" 10#include "base/bind_helpers.h" 11#include "base/values.h" 12#include "chrome/browser/extensions/api/sync_file_system/sync_file_system_api_helpers.h" 13#include "chrome/browser/profiles/profile.h" 14#include "chrome/browser/sync_file_system/file_metadata.h" 15#include "chrome/browser/sync_file_system/sync_file_system_service.h" 16#include "chrome/browser/sync_file_system/sync_file_system_service_factory.h" 17#include "chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.h" 18#include "chrome/common/extensions/extension.h" 19#include "content/public/browser/web_ui.h" 20#include "content/public/browser/web_ui_data_source.h" 21#include "grit/sync_file_system_internals_resources.h" 22 23using sync_file_system::FileMetadata; 24using sync_file_system::RemoteFileSyncService; 25using sync_file_system::SyncFileSystemServiceFactory; 26using sync_file_system::SyncServiceState; 27 28namespace syncfs_internals { 29 30namespace { 31 32std::string FileTypeToString(sync_file_system::FileType type) { 33 switch (type) { 34 case sync_file_system::TYPE_FILE: 35 return "File"; 36 case sync_file_system::TYPE_FOLDER: 37 return "Folder"; 38 } 39 40 NOTREACHED() << "Unknown FileType: " << type; 41 return "Unknown"; 42} 43 44} // namespace 45 46FileMetadataHandler::FileMetadataHandler(Profile* profile) 47 : profile_(profile), 48 weak_factory_(this) {} 49 50FileMetadataHandler::~FileMetadataHandler() {} 51 52void FileMetadataHandler::RegisterMessages() { 53 web_ui()->RegisterMessageCallback( 54 "getExtensions", 55 base::Bind(&FileMetadataHandler::GetExtensions, 56 base::Unretained(this))); 57 web_ui()->RegisterMessageCallback( 58 "getFileMetadata", 59 base::Bind(&FileMetadataHandler::GetFileMetadata, 60 base::Unretained(this))); 61} 62 63void FileMetadataHandler::GetFileMetadata( 64 const base::ListValue* args) { 65 std::string extension_id; 66 if (!args->GetString(0, &extension_id) || extension_id.empty()) { 67 LOG(WARNING) << "GetFileMetadata() Extension ID wasn't given"; 68 return; 69 } 70 71 // Extension ID from JS is just the host. Need to reformat it to chrome 72 // extension type GURL. 73 const GURL origin = extensions::Extension::GetBaseURLFromExtensionId( 74 extension_id); 75 76 // Get all metadata for the one specific origin. 77 FileMetadataMap* metadata_map = new FileMetadataMap; 78 size_t* num_results = new size_t(0); 79 SyncFileSystemServiceFactory::GetForProfile(profile_)->GetFileMetadataMap( 80 origin, 81 metadata_map, 82 num_results, 83 base::Bind(&FileMetadataHandler::DidGetFileMetadata, 84 weak_factory_.GetWeakPtr(), 85 base::Owned(metadata_map), 86 base::Owned(num_results))); 87} 88 89void FileMetadataHandler::GetExtensions(const base::ListValue* args) { 90 DCHECK(args); 91 base::ListValue list; 92 ExtensionStatusesHandler::GetExtensionStatusesAsDictionary(profile_, &list); 93 web_ui()->CallJavascriptFunction("FileMetadata.onGetExtensions", list); 94} 95 96// TODO(calvinlo): This would probably be better if there was a drop down UI 97// box to pick one origin at a time. Then this function would only print 98// files for one origin. 99void FileMetadataHandler::DidGetFileMetadata( 100 FileMetadataMap* metadata_map, 101 size_t* num_results, 102 sync_file_system::SyncStatusCode status) { 103 DCHECK(metadata_map); 104 DCHECK(num_results); 105 106 // Flatten map hierarchy in initial version. 107 base::ListValue list; 108 RemoteFileSyncService::FileMetadataMap::const_iterator file_path_itr; 109 for (file_path_itr = metadata_map->begin(); 110 file_path_itr != metadata_map->end(); 111 ++file_path_itr) { 112 const FileMetadata& metadata_object = file_path_itr->second; 113 std::string status_string = extensions::api::sync_file_system::ToString( 114 extensions::SyncFileStatusToExtensionEnum( 115 metadata_object.sync_status)); 116 117 // Convert each file metadata object into primitives for rendering. 118 base::DictionaryValue* dict = new DictionaryValue; 119 dict->SetString("status", status_string); 120 dict->SetString("type", FileTypeToString(metadata_object.type)); 121 dict->SetString("title", metadata_object.title); 122 dict->SetString("details", metadata_object.service_specific_metadata); 123 list.Append(dict); 124 } 125 126 web_ui()->CallJavascriptFunction("FileMetadata.onGetFileMetadata", list); 127} 128 129} // namespace syncfs_internals 130