Index: chrome/browser/system_monitor/image_capture_device.mm |
=================================================================== |
--- chrome/browser/system_monitor/image_capture_device.mm (revision 175941) |
+++ chrome/browser/system_monitor/image_capture_device.mm (working copy) |
@@ -1,202 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-#import "chrome/browser/system_monitor/image_capture_device.h" |
- |
-#include "base/file_util.h" |
-#include "base/mac/mac_util.h" |
-#include "base/system_monitor/system_monitor.h" |
-#include "chrome/browser/system_monitor/media_storage_util.h" |
-#include "content/public/browser/browser_thread.h" |
- |
-namespace { |
- |
-void RenameFile(const FilePath& downloaded_filename, |
- const FilePath& desired_filename, |
- base::PlatformFileError* result) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); |
- bool success = file_util::ReplaceFile(downloaded_filename, desired_filename); |
- *result = success ? base::PLATFORM_FILE_OK |
- : base::PLATFORM_FILE_ERROR_NOT_FOUND; |
-} |
- |
-void ReturnRenameResultToListener( |
- base::WeakPtr<ImageCaptureDeviceListener> listener, |
- const std::string& name, |
- base::PlatformFileError* result) { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- scoped_ptr<base::PlatformFileError> result_deleter(result); |
- if (listener) |
- listener->DownloadedFile(name, *result); |
-} |
- |
-base::Time NSDateToBaseTime(NSDate* date) { |
- return base::Time::FromDoubleT([date timeIntervalSince1970]); |
-} |
- |
-} // namespace |
- |
-@implementation ImageCaptureDevice |
- |
-- (id)initWithCameraDevice:(ICCameraDevice*)cameraDevice { |
- if ((self = [super init])) { |
- camera_.reset([cameraDevice retain]); |
- [camera_ setDelegate:self]; |
- } |
- return self; |
-} |
- |
-- (void)dealloc { |
- // Make sure the session was closed and listener set to null |
- // before destruction. |
- DCHECK(![camera_ delegate]); |
- DCHECK(!listener_); |
- [super dealloc]; |
-} |
- |
-- (void)setListener:(base::WeakPtr<ImageCaptureDeviceListener>)listener { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- listener_ = listener; |
-} |
- |
-- (void)open { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- DCHECK(listener_); |
- [camera_ requestOpenSession]; |
-} |
- |
-- (void)close { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- [camera_ requestCloseSession]; |
- [camera_ setDelegate:nil]; |
- listener_.reset(); |
-} |
- |
-- (void)downloadFile:(const std::string&)name |
- localPath:(const FilePath&)localPath { |
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
- // Find the file with that name and start download. |
- for (ICCameraItem* item in [camera_ mediaFiles]) { |
- std::string itemName = base::SysNSStringToUTF8([item name]); |
- if (itemName == name) { |
- // To create save options for ImageCapture, we need to |
- // split the target filename into directory/name |
- // and encode the directory as a URL. |
- NSString* saveDirectory = |
- base::mac::FilePathToNSString(localPath.DirName()); |
- NSString* saveFilename = |
- base::mac::FilePathToNSString(localPath.BaseName()); |
- |
- NSMutableDictionary* options = |
- [NSMutableDictionary dictionaryWithCapacity:3]; |
- [options setObject:[NSURL fileURLWithPath:saveDirectory isDirectory:YES] |
- forKey:ICDownloadsDirectoryURL]; |
- [options setObject:saveFilename forKey:ICSaveAsFilename]; |
- [options setObject:[NSNumber numberWithBool:YES] forKey:ICOverwrite]; |
- |
- [camera_ requestDownloadFile:base::mac::ObjCCastStrict<ICCameraFile>(item) |
- options:options |
- downloadDelegate:self |
- didDownloadSelector: |
- @selector(didDownloadFile:error:options:contextInfo:) |
- contextInfo:NULL]; |
- return; |
- } |
- } |
- |
- if (listener_) |
- listener_->DownloadedFile(name, base::PLATFORM_FILE_ERROR_NOT_FOUND); |
-} |
- |
-- (void)cameraDevice:(ICCameraDevice*)camera didAddItem:(ICCameraItem*)item { |
- std::string name = base::SysNSStringToUTF8([item name]); |
- base::PlatformFileInfo info; |
- if ([[item UTI] isEqualToString:base::mac::CFToNSCast(kUTTypeFolder)]) |
- info.is_directory = true; |
- else |
- info.size = [base::mac::ObjCCastStrict<ICCameraFile>(item) fileSize]; |
- info.last_modified = NSDateToBaseTime([item modificationDate]); |
- info.creation_time = NSDateToBaseTime([item creationDate]); |
- info.last_accessed = info.last_modified; |
- |
- if (listener_) |
- listener_->ItemAdded(name, info); |
-} |
- |
-- (void)cameraDevice:(ICCameraDevice*)camera didAddItems:(NSArray*)items { |
- for (ICCameraItem* item in items) |
- [self cameraDevice:camera didAddItem:item]; |
-} |
- |
-- (void)didRemoveDevice:(ICDevice*)device { |
- device.delegate = NULL; |
- if (listener_) |
- listener_->DeviceRemoved(); |
-} |
- |
-// Notifies that a session was opened with the given device; potentially |
-// with an error. |
-- (void)device:(ICDevice*)device didOpenSessionWithError:(NSError*)error { |
- if (error) |
- [self didRemoveDevice:camera_]; |
-} |
- |
-- (void)device:(ICDevice*)device didEncounterError:(NSError*)error { |
- if (error && listener_) |
- listener_->DeviceRemoved(); |
-} |
- |
-// When this message is received, all media metadata is now loaded. |
-- (void)deviceDidBecomeReadyWithCompleteContentCatalog:(ICDevice*)device { |
- if (listener_) |
- listener_->NoMoreItems(); |
-} |
- |
-// For 10.7 and earlier, this method has the semantics of |
-// deviceDidBecomeReadyWithCompleteContentCatalog. For 10.8++, it has |
-// the semantics of notifying that the device can receive commands. |
-- (void)deviceDidBecomeReady:(ICDevice*)device { |
- if (listener_ && base::mac::IsOSLionOrEarlier()) |
- listener_->NoMoreItems(); |
-} |
- |
-- (void)didDownloadFile:(ICCameraFile*)file |
- error:(NSError*)error |
- options:(NSDictionary*)options |
- contextInfo:(void*)contextInfo { |
- std::string name = base::SysNSStringToUTF8([file name]); |
- |
- if (error) { |
- if (listener_) |
- listener_->DownloadedFile(name, base::PLATFORM_FILE_ERROR_FAILED); |
- return; |
- } |
- |
- std::string savedFilename = |
- base::SysNSStringToUTF8([options objectForKey:ICSavedFilename]); |
- std::string saveAsFilename = |
- base::SysNSStringToUTF8([options objectForKey:ICSaveAsFilename]); |
- if (savedFilename == saveAsFilename) { |
- if (listener_) |
- listener_->DownloadedFile(name, base::PLATFORM_FILE_OK); |
- return; |
- } |
- |
- // ImageCapture did not save the file into the name we gave it in the |
- // options. It picks a new name according to its best lights, so we need |
- // to rename the file. |
- FilePath saveDir(base::SysNSStringToUTF8( |
- [[options objectForKey:ICDownloadsDirectoryURL] path])); |
- FilePath saveAsPath = saveDir.Append(saveAsFilename); |
- FilePath savedPath = saveDir.Append(savedFilename); |
- // Shared result value from file-copy closure to tell-listener closure. |
- base::PlatformFileError* copyResult = new base::PlatformFileError(); |
- content::BrowserThread::PostTaskAndReply( |
- content::BrowserThread::FILE, |
- FROM_HERE, |
- base::Bind(&RenameFile, savedPath, saveAsPath, copyResult), |
- base::Bind(&ReturnRenameResultToListener, listener_, name, copyResult)); |
-} |
- |
-@end // ImageCaptureDevice |