extension_sync_event_observer.cc revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
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#include "chrome/browser/extensions/api/sync_file_system/extension_sync_event_observer.h" 6 7#include "chrome/browser/extensions/api/sync_file_system/sync_file_system_api_helpers.h" 8#include "chrome/browser/extensions/event_names.h" 9#include "chrome/browser/extensions/event_router.h" 10#include "chrome/browser/extensions/extension_service.h" 11#include "chrome/browser/extensions/extension_system.h" 12#include "chrome/browser/sync_file_system/sync_event_observer.h" 13#include "chrome/browser/sync_file_system/sync_file_system_service.h" 14#include "chrome/browser/sync_file_system/syncable_file_system_util.h" 15#include "chrome/common/extensions/api/sync_file_system.h" 16#include "webkit/browser/fileapi/file_system_url.h" 17#include "webkit/common/fileapi/file_system_util.h" 18 19using sync_file_system::SyncEventObserver; 20 21namespace extensions { 22 23ExtensionSyncEventObserver::ExtensionSyncEventObserver( 24 Profile* profile) 25 : profile_(profile), 26 sync_service_(NULL) {} 27 28void ExtensionSyncEventObserver::InitializeForService( 29 sync_file_system::SyncFileSystemService* sync_service) { 30 DCHECK(sync_service); 31 if (sync_service_ != NULL) { 32 DCHECK_EQ(sync_service_, sync_service); 33 return; 34 } 35 sync_service_ = sync_service; 36 sync_service_->AddSyncEventObserver(this); 37} 38 39ExtensionSyncEventObserver::~ExtensionSyncEventObserver() {} 40 41void ExtensionSyncEventObserver::Shutdown() { 42 if (sync_service_ != NULL) 43 sync_service_->RemoveSyncEventObserver(this); 44} 45 46std::string ExtensionSyncEventObserver::GetExtensionId( 47 const GURL& app_origin) { 48 const Extension* app = ExtensionSystem::Get(profile_)->extension_service()-> 49 GetInstalledApp(app_origin); 50 if (!app) { 51 // The app is uninstalled or disabled. 52 return std::string(); 53 } 54 return app->id(); 55} 56 57void ExtensionSyncEventObserver::OnSyncStateUpdated( 58 const GURL& app_origin, 59 sync_file_system::SyncServiceState state, 60 const std::string& description) { 61 // Convert state and description into SyncState Object. 62 api::sync_file_system::ServiceInfo service_info; 63 service_info.state = SyncServiceStateToExtensionEnum(state); 64 service_info.description = description; 65 scoped_ptr<base::ListValue> params( 66 api::sync_file_system::OnServiceStatusChanged::Create(service_info)); 67 68 BroadcastOrDispatchEvent(app_origin, 69 event_names::kOnServiceStatusChanged, 70 params.Pass()); 71} 72 73void ExtensionSyncEventObserver::OnFileSynced( 74 const fileapi::FileSystemURL& url, 75 sync_file_system::SyncFileStatus status, 76 sync_file_system::SyncAction action, 77 sync_file_system::SyncDirection direction) { 78 scoped_ptr<base::ListValue> params(new base::ListValue()); 79 80 // For now we always assume events come only for files (not directories). 81 params->Append(CreateDictionaryValueForFileSystemEntry( 82 url, sync_file_system::SYNC_FILE_TYPE_FILE)); 83 84 // Status, SyncAction and any optional notes to go here. 85 api::sync_file_system::FileStatus status_enum = 86 SyncFileStatusToExtensionEnum(status); 87 api::sync_file_system::SyncAction action_enum = 88 SyncActionToExtensionEnum(action); 89 api::sync_file_system::SyncDirection direction_enum = 90 SyncDirectionToExtensionEnum(direction); 91 params->AppendString(api::sync_file_system::ToString(status_enum)); 92 params->AppendString(api::sync_file_system::ToString(action_enum)); 93 params->AppendString(api::sync_file_system::ToString(direction_enum)); 94 95 BroadcastOrDispatchEvent(url.origin(), 96 event_names::kOnFileStatusChanged, 97 params.Pass()); 98} 99 100void ExtensionSyncEventObserver::BroadcastOrDispatchEvent( 101 const GURL& app_origin, 102 const std::string& event_name, 103 scoped_ptr<base::ListValue> values) { 104 // Check to see whether the event should be broadcasted to all listening 105 // extensions or sent to a specific extension ID. 106 bool broadcast_mode = app_origin.is_empty(); 107 EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router(); 108 DCHECK(event_router); 109 110 scoped_ptr<Event> event(new Event(event_name, values.Pass())); 111 event->restrict_to_profile = profile_; 112 113 // No app_origin, broadcast to all listening extensions for this event name. 114 if (broadcast_mode) { 115 event_router->BroadcastEvent(event.Pass()); 116 return; 117 } 118 119 // Dispatch to single extension ID. 120 const std::string extension_id = GetExtensionId(app_origin); 121 if (extension_id.empty()) 122 return; 123 event_router->DispatchEventToExtension(extension_id, event.Pass()); 124} 125 126} // namespace extensions 127