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#ifndef CHROME_BROWSER_STORAGE_MONITOR_IMAGE_CAPTURE_DEVICE_H_
6#define CHROME_BROWSER_STORAGE_MONITOR_IMAGE_CAPTURE_DEVICE_H_
7
8#import <Foundation/Foundation.h>
9#import <ImageCaptureCore/ImageCaptureCore.h>
10
11#include "base/files/file_path.h"
12#include "base/mac/cocoa_protocols.h"
13#include "base/mac/foundation_util.h"
14#include "base/mac/scoped_nsobject.h"
15#include "base/memory/ref_counted.h"
16#include "base/memory/weak_ptr.h"
17#include "base/platform_file.h"
18#include "base/strings/string_util.h"
19#include "base/strings/sys_string_conversions.h"
20#include "base/synchronization/lock.h"
21
22// Clients use this listener interface to get notifications about
23// events happening as a particular ImageCapture device is interacted with.
24// Clients drive the interaction through the ImageCaptureDeviceManager
25// and the ImageCaptureDevice classes, and get notifications of
26// events through this interface.
27class ImageCaptureDeviceListener {
28 public:
29  virtual ~ImageCaptureDeviceListener() {}
30
31  // Get a notification that a particular item has been found on the device.
32  // These calls will come automatically after a new device is initialized.
33  // Names are in relative path form, so subdirectories and files in them will
34  // be passed as "dir/subdir/filename". These same relative filenames should
35  // be used as keys to download files.
36  virtual void ItemAdded(const std::string& name,
37                         const base::PlatformFileInfo& info) = 0;
38
39  // Called when there are no more items to retrieve.
40  virtual void NoMoreItems() = 0;
41
42  // Called upon completion of a file download request.
43  // Note: in NOT_FOUND error case, may be called inline with the download
44  // request.
45  virtual void DownloadedFile(const std::string& name,
46                              base::PlatformFileError error) = 0;
47
48  // Called to let the client know the device is removed. The client should
49  // set the ImageCaptureDevice listener to null upon receiving this call.
50  virtual void DeviceRemoved() = 0;
51};
52
53// Interface to a camera device found by ImageCaptureCore. This class manages a
54// session to the camera and provides the backing interactions to present the
55// media files on it to the filesystem delegate. FilePaths will be artificial,
56// like "/$device_id/" + name.
57// Note that all interactions with this class must happen on the UI thread.
58@interface ImageCaptureDevice
59    : NSObject<ICCameraDeviceDelegate, ICCameraDeviceDownloadDelegate> {
60 @private
61  base::scoped_nsobject<ICCameraDevice> camera_;
62  base::WeakPtr<ImageCaptureDeviceListener> listener_;
63  bool closing_;
64}
65
66- (id)initWithCameraDevice:(ICCameraDevice*)cameraDevice;
67- (void)setListener:(base::WeakPtr<ImageCaptureDeviceListener>)listener;
68- (void)open;
69- (void)close;
70
71// Download the given file |name| to the provided |local_path|. Completion
72// notice will be sent to the listener's DownloadedFile method. The name
73// should be of the same form as those sent to the listener's ItemAdded method.
74- (void)downloadFile:(const std::string&)name
75           localPath:(const base::FilePath&)localPath;
76
77@end
78
79#endif  // CHROME_BROWSER_STORAGE_MONITOR_IMAGE_CAPTURE_DEVICE_H_
80