1// Copyright 2013 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_FILE_SYSTEM_TRUNCATE_OPERATION_H_
6#define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_TRUNCATE_OPERATION_H_
7
8#include "base/basictypes.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/memory/weak_ptr.h"
12#include "chrome/browser/chromeos/drive/file_errors.h"
13
14namespace base {
15class FilePath;
16class SequencedTaskRunner;
17}  // namespace base
18
19namespace drive {
20
21class JobScheduler;
22class ResourceEntry;
23
24namespace internal {
25class FileCache;
26class ResourceMetadata;
27}  // namespace internal
28
29namespace file_system {
30
31class OperationDelegate;
32class DownloadOperation;
33
34// This class encapsulates the drive Truncate function. It is responsible for
35// fetching the content from the Drive server if necessary, truncating the
36// file content actually, and then notifying the file is locally modified and
37// that it is necessary to upload the file to the server.
38class TruncateOperation {
39 public:
40  TruncateOperation(base::SequencedTaskRunner* blocking_task_runner,
41                    OperationDelegate* delegate,
42                    JobScheduler* scheduler,
43                    internal::ResourceMetadata* metadata,
44                    internal::FileCache* cache,
45                    const base::FilePath& temporary_file_directory);
46  ~TruncateOperation();
47
48  // Performs the truncate operation on the file at drive path |file_path| to
49  // |length| bytes. Invokes |callback| when finished with the result of the
50  // operation. |callback| must not be null.
51  void Truncate(const base::FilePath& file_path,
52                int64 length,
53                const FileOperationCallback& callback);
54 private:
55  // Part of Truncate(). Called after EnsureFileDownloadedByPath() is complete.
56  void TruncateAfterEnsureFileDownloadedByPath(
57      int64 length,
58      const FileOperationCallback& callback,
59      FileError error,
60      const base::FilePath& local_file_path,
61      scoped_ptr<ResourceEntry> resource_entry);
62
63  // Part of Truncate(). Called after TruncateOnBlockingPool() is complete.
64  void TruncateAfterTruncateOnBlockingPool(
65      const std::string& local_id,
66      const FileOperationCallback& callback,
67      FileError error);
68
69  scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
70  OperationDelegate* delegate_;
71  internal::ResourceMetadata* metadata_;
72  internal::FileCache* cache_;
73
74  scoped_ptr<DownloadOperation> download_operation_;
75
76  // Note: This should remain the last member so it'll be destroyed and
77  // invalidate the weak pointers before any other members are destroyed.
78  base::WeakPtrFactory<TruncateOperation> weak_ptr_factory_;
79  DISALLOW_COPY_AND_ASSIGN(TruncateOperation);
80};
81
82}  // namespace file_system
83}  // namespace drive
84
85#endif  // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_TRUNCATE_OPERATION_H_
86