OLD | NEW |
(Empty) | |
| 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 #include "webkit/fileapi/mtp_device_interface_win.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 |
| 9 #define CLIENT_NAME L"WPD Chromium" |
| 10 #define CLIENT_MAJOR_VER 1 |
| 11 #define CLIENT_MINOR_VER 0 |
| 12 #define CLIENT_REVISION 2 |
| 13 |
| 14 namespace fileapi { |
| 15 |
| 16 MtpDeviceInterfaceWin::MtpDeviceInterfaceWin( |
| 17 const FilePath::StringType& device_id) |
| 18 : device_id_(device_id) { |
| 19 CoInitialize(NULL); |
| 20 bool res = Init(); |
| 21 DCHECK(res); |
| 22 } |
| 23 |
| 24 MtpDeviceInterfaceWin::~MtpDeviceInterfaceWin() { |
| 25 pdevice_.Release(); |
| 26 CoUninitialize(); |
| 27 } |
| 28 |
| 29 bool MtpDeviceInterfaceWin::Init() { |
| 30 HRESULT hr = pdevice_.CreateInstance(__uuidof(PortableDevice), |
| 31 NULL, |
| 32 CLSCTX_INPROC_SERVER); |
| 33 if (FAILED(hr)) |
| 34 return false; |
| 35 |
| 36 base::win::ScopedComPtr<IPortableDeviceValues> client_info; |
| 37 // Fill out information about your application, so the device knows |
| 38 // who they are speaking to. Client information is optional. The client |
| 39 // can choose to identify itself, or to remain unknown to the driver. It is |
| 40 // beneficial to identify yourself because drivers may be able to optimize |
| 41 // their behavior for known clients. |
| 42 |
| 43 // CoCreate an IPortableDeviceValues interface to hold the client |
| 44 // information. |
| 45 hr = client_info.CreateInstance(__uuidof(PortableDeviceValues), |
| 46 NULL, |
| 47 CLSCTX_INPROC_SERVER); |
| 48 if (FAILED(hr)) |
| 49 return false; |
| 50 |
| 51 // Attempt to set all bits of client information |
| 52 hr = client_info->SetStringValue(WPD_CLIENT_NAME, CLIENT_NAME); |
| 53 if (FAILED(hr)) |
| 54 LOG(INFO) << "Failed to set WPD_CLIENT_NAME "; |
| 55 |
| 56 hr = client_info->SetUnsignedIntegerValue(WPD_CLIENT_MAJOR_VERSION, |
| 57 CLIENT_MAJOR_VER); |
| 58 if (FAILED(hr)) |
| 59 LOG(INFO) << "Failed to set WPD_CLIENT_MAJOR_VERSION"; |
| 60 |
| 61 hr = client_info->SetUnsignedIntegerValue(WPD_CLIENT_REVISION, |
| 62 CLIENT_REVISION); |
| 63 if (FAILED(hr)) |
| 64 LOG(INFO) << "Failed to set WPD_CLIENT_REVISION"; |
| 65 |
| 66 // Some device drivers need to impersonate the caller in order to function |
| 67 // correctly. Since our application does not need to restrict its identity, |
| 68 // specify SECURITY_IMPERSONATION so that we work with all devices. |
| 69 hr = client_info->SetUnsignedIntegerValue( |
| 70 WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE, SECURITY_IMPERSONATION); |
| 71 if (FAILED(hr)) |
| 72 LOG(INFO) << "Failed to set WPD_CLIENT_SECURITY_QUALITY_OF_SERVICE"; |
| 73 |
| 74 hr = pdevice_->Open(const_cast<wchar_t*>(device_id_.c_str()), client_info); |
| 75 if (FAILED(hr)) { |
| 76 if (hr == E_ACCESSDENIED) { |
| 77 // Failed to Open the device for Read Write access, will open it for |
| 78 // Read-only access instead. |
| 79 client_info->SetUnsignedIntegerValue(WPD_CLIENT_DESIRED_ACCESS, |
| 80 GENERIC_READ); |
| 81 hr = pdevice_->Open(const_cast<wchar_t*>(device_id_.c_str()), |
| 82 client_info); |
| 83 if (FAILED(hr)) |
| 84 return false; |
| 85 } else { |
| 86 return false; |
| 87 } |
| 88 } |
| 89 return true; |
| 90 } |
| 91 |
| 92 PlatformFileError MtpDeviceInterfaceWin::GetFileInfo( |
| 93 const FilePath& file_path, |
| 94 PlatformFileInfo* file_info) { |
| 95 NOTIMPLEMENTED(); |
| 96 return base::PLATFORM_FILE_ERROR_SECURITY; |
| 97 } |
| 98 |
| 99 FileSystemFileUtil::AbstractFileEnumerator* |
| 100 MtpDeviceInterfaceWin::CreateFileEnumerator( |
| 101 const FilePath& root, |
| 102 bool recursive) { |
| 103 NOTIMPLEMENTED(); |
| 104 return new FileSystemFileUtil::EmptyFileEnumerator(); |
| 105 } |
| 106 |
| 107 PlatformFileError MtpDeviceInterfaceWin::Touch( |
| 108 const FilePath& file_path, |
| 109 const base::Time& last_access_time, |
| 110 const base::Time& last_modified_time) { |
| 111 NOTIMPLEMENTED(); |
| 112 return base::PLATFORM_FILE_ERROR_SECURITY; |
| 113 } |
| 114 |
| 115 bool MtpDeviceInterfaceWin::PathExists(const FilePath& file_path) { |
| 116 NOTIMPLEMENTED(); |
| 117 return false; |
| 118 } |
| 119 |
| 120 bool MtpDeviceInterfaceWin::DirectoryExists(const FilePath& file_path) { |
| 121 NOTIMPLEMENTED(); |
| 122 return false; |
| 123 } |
| 124 |
| 125 bool MtpDeviceInterfaceWin::IsDirectoryEmpty(const FilePath& file_path) { |
| 126 NOTIMPLEMENTED(); |
| 127 return false; |
| 128 } |
| 129 |
| 130 } // namespace fileapi |
OLD | NEW |