• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_APP_REGISTRY_H_
6 #define CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_APP_REGISTRY_H_
7 
8 #include <map>
9 #include <string>
10 #include <vector>
11 
12 #include "base/files/file_path.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/scoped_vector.h"
15 #include "base/memory/weak_ptr.h"
16 #include "google_apis/drive/gdata_errorcode.h"
17 #include "google_apis/drive/gdata_wapi_parser.h"
18 #include "url/gurl.h"
19 
20 namespace google_apis {
21 class AppList;
22 }  // namespace google_apis
23 
24 namespace drive {
25 
26 class JobScheduler;
27 
28 // Data structure that defines Drive app. See
29 // https://chrome.google.com/webstore/category/collection/drive_apps for
30 // Drive apps available on the webstore.
31 struct DriveAppInfo {
32   DriveAppInfo();
33   DriveAppInfo(const std::string& app_id,
34                const google_apis::InstalledApp::IconList& app_icons,
35                const google_apis::InstalledApp::IconList& document_icons,
36                const std::string& web_store_id,
37                const std::string& app_name,
38                const std::string& object_type,
39                bool is_primary_selector);
40   ~DriveAppInfo();
41 
42   // Drive app id.
43   std::string app_id;
44   // Drive application icon URLs for this app, paired with their size (length of
45   // a side in pixels).
46   google_apis::InstalledApp::IconList app_icons;
47   // Drive document icon URLs for this app, paired with their size (length of
48   // a side in pixels).
49   google_apis::InstalledApp::IconList document_icons;
50   // Web store id/extension id;
51   std::string web_store_id;
52   // App name.
53   std::string app_name;
54   // Object (file) type description handled by this app.
55   std::string object_type;
56   // Is app the primary selector for file (default open action).
57   bool is_primary_selector;
58 };
59 
60 // Keeps the track of installed drive applications in-memory.
61 class DriveAppRegistry {
62  public:
63   explicit DriveAppRegistry(JobScheduler* scheduler);
64   ~DriveAppRegistry();
65 
66   // Returns a list of Drive app information for the |file_extension| with
67   // |mime_type|.
68   void GetAppsForFile(const base::FilePath::StringType& file_extension,
69                       const std::string& mime_type,
70                       ScopedVector<DriveAppInfo>* apps) const;
71 
72   // Updates this registry by fetching the data from the server.
73   void Update();
74 
75   // Updates this registry from the |app_list|.
76   void UpdateFromAppList(const google_apis::AppList& app_list);
77 
78  private:
79 
80   // Defines mapping between file content type selectors (extensions, MIME
81   // types) and corresponding app.
82   typedef std::multimap<std::string, DriveAppInfo*> DriveAppFileSelectorMap;
83 
84   // Part of Update(). Runs upon the completion of fetching the Drive apps
85   // data from the server.
86   void UpdateAfterGetAppList(google_apis::GDataErrorCode gdata_error,
87                              scoped_ptr<google_apis::AppList> app_list);
88 
89   // Helper function for loading Drive application file |selectors| into
90   // corresponding |map|.
91   static void AddAppSelectorList(
92       const std::string& web_store_id,
93       const std::string& app_name,
94       const google_apis::InstalledApp::IconList& app_icons,
95       const google_apis::InstalledApp::IconList& document_icons,
96       const std::string& object_type,
97       const std::string& app_id,
98       bool is_primary_selector,
99       const ScopedVector<std::string>& selectors,
100       DriveAppFileSelectorMap* map);
101 
102   // Finds matching |apps| from |map| based on provided file |selector|.
103   void FindAppsForSelector(const std::string& selector,
104                            const DriveAppFileSelectorMap& map,
105                            std::vector<DriveAppInfo*>* matched_apps) const;
106 
107   JobScheduler* scheduler_;
108 
109   // Map of filename extension to application info.
110   DriveAppFileSelectorMap app_extension_map_;
111 
112   // Map of MIME type to application info.
113   DriveAppFileSelectorMap app_mimetypes_map_;
114 
115   bool is_updating_;
116 
117   // Note: This should remain the last member so it'll be destroyed and
118   // invalidate the weak pointers before any other members are destroyed.
119   base::WeakPtrFactory<DriveAppRegistry> weak_ptr_factory_;
120   DISALLOW_COPY_AND_ASSIGN(DriveAppRegistry);
121 };
122 
123 namespace util {
124 
125 // The preferred icon size, which should usually be used for FindPreferredIcon;
126 const int kPreferredIconSize = 16;
127 
128 // Finds an icon in the list of icons. If unable to find an icon of the exact
129 // size requested, returns one with the next larger size. If all icons are
130 // smaller than the preferred size, we'll return the largest one available.
131 // Icons do not have to be sorted by the icon size. If there are no icons in
132 // the list, returns an empty URL.
133 GURL FindPreferredIcon(const google_apis::InstalledApp::IconList& icons,
134                        int preferred_size);
135 
136 }  // namespace util
137 
138 }  // namespace drive
139 
140 #endif  // CHROME_BROWSER_CHROMEOS_DRIVE_DRIVE_APP_REGISTRY_H_
141