15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILE_TASK_EXECUTOR_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_TASK_EXECUTOR_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/callback.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/weak_ptr.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chromeos/file_manager/file_tasks.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_errorcode.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DriveServiceInterface;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileSystemInterface;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ResourceEntry;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Delegate class for hooking fake instances and behaviors for testing.
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FileTaskExecutorDelegate {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~FileTaskExecutorDelegate() {}
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual FileSystemInterface* GetFileSystem() = 0;
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual DriveServiceInterface* GetDriveService() = 0;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OpenBrowserWindow(const GURL& open_link) = 0;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class implements an "executor" class that will execute tasks for
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// third party Drive apps that store data in Drive itself.  To do that, it
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// needs to find the file resource IDs and pass them to a server-side function
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that will authorize the app to open the given document and return a URL
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for opening the document in that app directly.
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class FileTaskExecutor {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Creates FileTaskExecutor with delegate derived from |profile|. Used in
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // product environment.
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  FileTaskExecutor(Profile* profile, const std::string& app_id);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Creates FileTaskExecutor with a specific delegate.
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FileTaskExecutor(scoped_ptr<FileTaskExecutorDelegate> delegate,
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   const std::string& app_id);
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Executes file tasks, runs |done| and deletes |this|.
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void Execute(const std::vector<storage::FileSystemURL>& file_urls,
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               const file_manager::file_tasks::FileTaskFinishedCallback& done);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ~FileTaskExecutor();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnFileEntryFetched(FileError error, scoped_ptr<ResourceEntry> entry);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAppAuthorized(const std::string& resource_id,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       google_apis::GDataErrorCode error,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const GURL& open_link);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Calls |done_| with |success| status and deletes |this|.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Done(bool success);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<FileTaskExecutorDelegate> delegate_;
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string app_id_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int current_index_;
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  file_manager::file_tasks::FileTaskFinishedCallback done_;
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::WeakPtrFactory<FileTaskExecutor> weak_ptr_factory_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace drive
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_TASK_EXECUTOR_H_
74