Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: chrome/browser/extensions/api/media_galleries_private/media_galleries_private_api.cc

Issue 11535008: Implement mediaGalleriesPrivate api to notify extensions about gallery changed events. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed review comments Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/extensions/api/media_galleries_private/media_galleries_ private_api.h" 5 #include "chrome/browser/extensions/api/media_galleries_private/media_galleries_ private_api.h"
6 6
7 #include "chrome/browser/extensions/api/media_galleries_private/media_galleries_ private_api_factory.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h"
9 #include "base/file_path.h"
10 #include "base/location.h"
11 #include "base/string_number_conversions.h"
12 #include "chrome/browser/browser_process.h"
13 #include "chrome/browser/extensions/api/media_galleries_private/gallery_watch_ma nager.h"
8 #include "chrome/browser/extensions/api/media_galleries_private/media_galleries_ private_event_router.h" 14 #include "chrome/browser/extensions/api/media_galleries_private/media_galleries_ private_event_router.h"
15 #include "chrome/browser/extensions/api/media_galleries_private/media_gallery_ex tension_notification_observer.h"
9 #include "chrome/browser/extensions/event_names.h" 16 #include "chrome/browser/extensions/event_names.h"
10 #include "chrome/browser/extensions/event_router.h" 17 #include "chrome/browser/extensions/event_router.h"
18 #include "chrome/browser/extensions/extension_function.h"
11 #include "chrome/browser/extensions/extension_system.h" 19 #include "chrome/browser/extensions/extension_system.h"
20 #include "chrome/browser/media_gallery/media_file_system_registry.h"
21 #include "chrome/browser/media_gallery/media_galleries_preferences.h"
22 #include "chrome/browser/system_monitor/media_storage_util.h"
23 #include "chrome/common/extensions/api/media_galleries_private.h"
24 #include "content/public/browser/browser_thread.h"
25 #include "content/public/browser/render_view_host.h"
12 26
13 namespace extensions { 27 namespace extensions {
14 28
29 namespace AddGalleryWatch =
30 extensions::api::media_galleries_private::AddGalleryWatch;
31 namespace RemoveGalleryWatch =
32 extensions::api::media_galleries_private::RemoveGalleryWatch;
33
34 namespace {
35
36 // Returns the absolute file path of the gallery specified by the |gallery_id|.
37 // Returns an empty file path if the |gallery_id| is invalid.
38 FilePath GetGalleryAbsolutePath(chrome::MediaGalleryPrefId gallery_id,
39 Profile* profile,
40 const Extension* extension) {
41 DCHECK(profile);
42 DCHECK(extension);
43 chrome::MediaFileSystemRegistry* registry =
44 g_browser_process->media_file_system_registry();
45 DCHECK(registry);
46 chrome::MediaGalleriesPreferences* preferences =
47 registry->GetPreferences(profile);
48 if (!preferences)
49 return FilePath();
50
51 const chrome::MediaGalleryPrefIdSet permitted_galleries =
52 preferences->GalleriesForExtension(*extension);
53 if (permitted_galleries.empty() ||
54 permitted_galleries.find(gallery_id) == permitted_galleries.end())
55 return FilePath();
56
57 const chrome::MediaGalleriesPrefInfoMap& galleries_info =
58 preferences->known_galleries();
59 return chrome::MediaStorageUtil::FindDevicePathById(
60 galleries_info.find(gallery_id)->second.device_id);
61 }
62
63 // Handles the profile shutdown event on the file thread to clean up
64 // GalleryWatchManager.
65 void HandleProfileShutdownOnFileThread(Profile* profile) {
66 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
67 GalleryWatchManager::OnProfileShutdown(profile);
68 }
69
70 // Sets up a gallery watch on the file thread for the extension specified by the
71 // |extension_id|.
72 // |profile| specifies the extension profile.
73 // |gallery_id| specifies the gallery identifier.
74 // |gallery_file_path| specifies the absolute gallery path.
75 // Returns true, if the watch setup operation was successful.
76 bool SetupGalleryWatchOnFileThread(Profile* profile,
77 uint64 gallery_id,
78 const FilePath& gallery_file_path,
79 const std::string& extension_id) {
80 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
81 return GalleryWatchManager::GetForProfile(profile)->StartGalleryWatch(
82 gallery_id, gallery_file_path, extension_id);
83 }
84
85 // Cancels the gallery watch for the extension specified by the |extension_id|
86 // on the file thread.
87 void RemoveGalleryWatchOnFileThread(Profile* profile,
88 const FilePath& gallery_file_path,
89 const std::string& extension_id) {
90 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
91 if (!GalleryWatchManager::HasForProfile(profile))
92 return;
93 GalleryWatchManager::GetForProfile(profile)->StopGalleryWatch(
94 gallery_file_path, extension_id);
95 }
96
97 } // namespace
98
99
100 ///////////////////////////////////////////////////////////////////////////////
101 // MediaGalleriesPrivateAPI //
102 ///////////////////////////////////////////////////////////////////////////////
103
15 MediaGalleriesPrivateAPI::MediaGalleriesPrivateAPI(Profile* profile) 104 MediaGalleriesPrivateAPI::MediaGalleriesPrivateAPI(Profile* profile)
16 : profile_(profile) { 105 : profile_(profile) {
106 DCHECK(profile_);
107 extension_notification_observer_.reset(
108 new MediaGalleryExtensionNotificationObserver(profile_));
17 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( 109 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver(
18 this, event_names::kOnAttachEventName); 110 this, event_names::kOnAttachEventName);
19 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( 111 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver(
20 this, event_names::kOnDetachEventName); 112 this, event_names::kOnDetachEventName);
21 113 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver(
114 this, event_names::kOnGalleryChangedEventName);
22 } 115 }
23 116
24 MediaGalleriesPrivateAPI::~MediaGalleriesPrivateAPI() { 117 MediaGalleriesPrivateAPI::~MediaGalleriesPrivateAPI() {
25 } 118 }
26 119
27 void MediaGalleriesPrivateAPI::Shutdown() { 120 void MediaGalleriesPrivateAPI::Shutdown() {
28 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); 121 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this);
122 content::BrowserThread::PostTask(
123 content::BrowserThread::FILE, FROM_HERE,
124 base::Bind(&HandleProfileShutdownOnFileThread, profile_));
29 } 125 }
30 126
31 void MediaGalleriesPrivateAPI::OnListenerAdded( 127 void MediaGalleriesPrivateAPI::OnListenerAdded(
32 const extensions::EventListenerInfo& details) { 128 const EventListenerInfo& details) {
33 media_galleries_private_event_router_.reset( 129 media_galleries_private_event_router_.reset(
34 new MediaGalleriesPrivateEventRouter(profile_)); 130 new MediaGalleriesPrivateEventRouter(profile_));
35 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); 131 }
132
133 ///////////////////////////////////////////////////////////////////////////////
134 // MediaGalleriesPrivateAddGalleryWatchFunction //
135 ///////////////////////////////////////////////////////////////////////////////
136 MediaGalleriesPrivateAddGalleryWatchFunction::
137 ~MediaGalleriesPrivateAddGalleryWatchFunction() {
138 }
139
140 bool MediaGalleriesPrivateAddGalleryWatchFunction::RunImpl() {
141 DCHECK(profile_);
142 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
143 if (!render_view_host() || !render_view_host()->GetProcess())
144 return false;
145
146 scoped_ptr<AddGalleryWatch::Params> params(
147 AddGalleryWatch::Params::Create(*args_));
148 EXTENSION_FUNCTION_VALIDATE(params.get());
149
150 if (params->gallery_id < 0) {
151 HandleResponse(params->gallery_id, false);
152 return true;
153 }
154
155 // First param is the gallery identifier to watch.
156 chrome::MediaGalleryPrefId gallery_pref_id =
157 static_cast<uint64>(params->gallery_id);
158 FilePath gallery_file_path(
159 GetGalleryAbsolutePath(gallery_pref_id, profile_, GetExtension()));
160 if (gallery_file_path.empty()) {
161 HandleResponse(gallery_pref_id, false);
Lei Zhang 2012/12/19 01:03:47 It looks like many other async extension APIs will
kmadhusu 2012/12/19 21:55:55 Done.
162 return true;
163 }
164
165 #if defined(OS_WIN)
166 content::BrowserThread::PostTaskAndReplyWithResult(
167 content::BrowserThread::FILE,
168 FROM_HERE,
169 base::Bind(&SetupGalleryWatchOnFileThread,
170 profile_,
171 gallery_pref_id,
172 gallery_file_path,
173 extension_id()),
174 base::Bind(&MediaGalleriesPrivateAddGalleryWatchFunction::HandleResponse,
175 this,
176 gallery_pref_id));
177 #else
178 // Recursive gallery watch operation is not currently supported on
179 // non-windows platforms. Please refer to crbug.com/144491 for more details.
180 HandleResponse(gallery_pref_id, false);
181 #endif
182 return true;
183 }
184
185 void MediaGalleriesPrivateAddGalleryWatchFunction::HandleResponse(
186 uint64 gallery_id,
187 bool success) {
188 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
189 extensions::api::media_galleries_private::AddGalleryWatchResult result;
190 result.gallery_id = gallery_id;
191 result.success = success;
192 SetResult(result.ToValue().release());
193 SendResponse(true);
194 }
195
196
197 ///////////////////////////////////////////////////////////////////////////////
198 // MediaGalleriesPrivateRemoveGalleryWatchFunction //
199 ///////////////////////////////////////////////////////////////////////////////
200
201 MediaGalleriesPrivateRemoveGalleryWatchFunction::
202 ~MediaGalleriesPrivateRemoveGalleryWatchFunction() {
203 }
204
205 bool MediaGalleriesPrivateRemoveGalleryWatchFunction::RunImpl() {
206 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
207 #if defined(OS_WIN)
208 if (!render_view_host() || !render_view_host()->GetProcess())
209 return false;
210
211 // Remove gallery watch operation is currently supported on windows platforms.
212 // Please refer to crbug.com/144491 for more details.
213 scoped_ptr<RemoveGalleryWatch::Params> params(
214 RemoveGalleryWatch::Params::Create(*args_));
215 EXTENSION_FUNCTION_VALIDATE(params.get());
216
217 if (params->gallery_id < 0)
218 return false;
219
220 // First param is the gallery identifier.
221 chrome::MediaGalleryPrefId gallery_pref_id =
222 static_cast<uint64>(params->gallery_id);
223
224 FilePath gallery_file_path(
225 GetGalleryAbsolutePath(gallery_pref_id, profile_, GetExtension()));
226 if (gallery_file_path.empty())
227 return false;
228
229 content::BrowserThread::PostTask(
230 content::BrowserThread::FILE, FROM_HERE,
231 base::Bind(&RemoveGalleryWatchOnFileThread,
232 profile_,
233 gallery_file_path,
234 extension_id()));
235 #endif
236 return true;
36 } 237 }
37 238
38 } // namespace extensions 239 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698