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