Index: chrome/browser/apps/drive/drive_service_bridge.cc |
diff --git a/chrome/browser/apps/drive/drive_service_bridge.cc b/chrome/browser/apps/drive/drive_service_bridge.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..207fc357a6f351436978afec0031a71203ba86d8 |
--- /dev/null |
+++ b/chrome/browser/apps/drive/drive_service_bridge.cc |
@@ -0,0 +1,138 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/apps/drive/drive_service_bridge.h" |
+ |
+#include <string> |
+ |
+#include "base/logging.h" |
+#include "chrome/browser/drive/drive_api_service.h" |
+#include "chrome/browser/drive/drive_app_registry.h" |
+#include "chrome/browser/drive/drive_notification_manager.h" |
+#include "chrome/browser/drive/drive_notification_manager_factory.h" |
+#include "chrome/browser/drive/drive_notification_observer.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
+#include "chrome/browser/signin/signin_manager_factory.h" |
+#include "components/signin/core/browser/profile_oauth2_token_service.h" |
+#include "components/signin/core/browser/signin_manager.h" |
+#include "content/public/browser/browser_thread.h" |
+ |
+namespace { |
+ |
+// Hosts DriveAPIService and DriveAppRegistry. |
+// TODO(xiyuan): Optimize to leverage chromeos::DriveIntegrationService. |
+class DriveServiceBridgeImpl : public DriveServiceBridge, |
+ public drive::DriveServiceObserver, |
+ public drive::DriveNotificationObserver { |
+ public: |
+ explicit DriveServiceBridgeImpl(Profile* profile); |
+ virtual ~DriveServiceBridgeImpl(); |
+ |
+ void Initialize(); |
+ |
+ // DriveServiceBridge: |
+ virtual drive::DriveAppRegistry* GetAppRegistry() OVERRIDE; |
+ |
+ // drive::DriveServiceObserver: |
+ virtual void OnReadyToSendRequests() OVERRIDE; |
+ |
+ // drive::DriveNotificationObserver: |
+ virtual void OnNotificationReceived() OVERRIDE; |
+ virtual void OnPushNotificationEnabled(bool enabled) OVERRIDE; |
+ |
+ private: |
+ Profile* profile_; |
+ scoped_ptr<drive::DriveServiceInterface> drive_service_; |
+ scoped_ptr<drive::DriveAppRegistry> drive_app_registry_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DriveServiceBridgeImpl); |
+}; |
+ |
+DriveServiceBridgeImpl::DriveServiceBridgeImpl(Profile* profile) |
+ : profile_(profile) { |
+ DCHECK(profile_); |
+} |
+ |
+DriveServiceBridgeImpl::~DriveServiceBridgeImpl() { |
+ drive::DriveNotificationManager* drive_notification_manager = |
+ drive::DriveNotificationManagerFactory::FindForBrowserContext(profile_); |
+ if (drive_notification_manager) |
+ drive_notification_manager->RemoveObserver(this); |
+ |
+ drive_service_->RemoveObserver(this); |
+ |
+ drive_app_registry_.reset(); |
+ drive_service_.reset(); |
+} |
+ |
+void DriveServiceBridgeImpl::Initialize() { |
+ scoped_refptr<base::SequencedWorkerPool> worker_pool( |
+ content::BrowserThread::GetBlockingPool()); |
+ scoped_refptr<base::SequencedTaskRunner> drive_task_runner( |
+ worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( |
+ worker_pool->GetSequenceToken(), |
+ base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); |
+ |
+ ProfileOAuth2TokenService* token_service = |
+ ProfileOAuth2TokenServiceFactory::GetForProfile(profile_); |
+ drive_service_.reset(new drive::DriveAPIService( |
+ token_service, |
+ profile_->GetRequestContext(), |
+ drive_task_runner.get(), |
+ GURL(google_apis::DriveApiUrlGenerator::kBaseUrlForProduction), |
+ GURL(google_apis::DriveApiUrlGenerator::kBaseDownloadUrlForProduction), |
+ GURL(google_apis::GDataWapiUrlGenerator::kBaseUrlForProduction), |
+ std::string() /* custom_user_agent */)); |
+ SigninManagerBase* signin_manager = |
+ SigninManagerFactory::GetForProfile(profile_); |
+ drive_service_->Initialize(signin_manager->GetAuthenticatedAccountId()); |
+ drive_service_->AddObserver(this); |
+ |
+ drive::DriveNotificationManager* drive_notification_manager = |
+ drive::DriveNotificationManagerFactory::GetForBrowserContext(profile_); |
+ if (drive_notification_manager) |
+ drive_notification_manager->AddObserver(this); |
+ |
+ drive_app_registry_.reset(new drive::DriveAppRegistry(drive_service_.get())); |
+ if (drive_service_->CanSendRequest()) |
+ drive_app_registry_->Update(); |
+} |
+ |
+drive::DriveAppRegistry* DriveServiceBridgeImpl::GetAppRegistry() { |
+ return drive_app_registry_.get(); |
+} |
+ |
+void DriveServiceBridgeImpl::OnReadyToSendRequests() { |
+ drive_app_registry_->Update(); |
+} |
+ |
+void DriveServiceBridgeImpl::OnNotificationReceived() { |
+ if (drive_service_->CanSendRequest()) |
+ drive_app_registry_->Update(); |
+} |
+ |
+void DriveServiceBridgeImpl::OnPushNotificationEnabled(bool enabled) { |
+ if (enabled && drive_service_->CanSendRequest()) |
+ drive_app_registry_->Update(); |
+} |
+ |
+} // namespace |
+ |
+// static |
+scoped_ptr<DriveServiceBridge> DriveServiceBridge::Create(Profile* profile) { |
+ scoped_ptr<DriveServiceBridgeImpl> bridge( |
+ new DriveServiceBridgeImpl(profile)); |
+ bridge->Initialize(); |
+ return bridge.PassAs<DriveServiceBridge>(); |
+} |
+ |
+// static |
+void DriveServiceBridge::AppendDependsOnFactories( |
+ std::set<BrowserContextKeyedServiceFactory*>* factories) { |
+ DCHECK(factories); |
+ factories->insert(ProfileOAuth2TokenServiceFactory::GetInstance()); |
+ factories->insert(SigninManagerFactory::GetInstance()); |
+ factories->insert(drive::DriveNotificationManagerFactory::GetInstance()); |
+} |