| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cloud_print/virtual_driver/win/port_monitor/port_monitor.h" | 5 #include "cloud_print/virtual_driver/win/port_monitor/port_monitor.h" |
| 6 | 6 |
| 7 #include <lmcons.h> | 7 #include <lmcons.h> |
| 8 #include <shellapi.h> | 8 #include <shellapi.h> |
| 9 #include <shlobj.h> | 9 #include <shlobj.h> |
| 10 #include <strsafe.h> | 10 #include <strsafe.h> |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 printer_handle = NULL; | 60 printer_handle = NULL; |
| 61 } | 61 } |
| 62 if (file) { | 62 if (file) { |
| 63 file_util::CloseFile(file); | 63 file_util::CloseFile(file); |
| 64 file = NULL; | 64 file = NULL; |
| 65 } | 65 } |
| 66 } | 66 } |
| 67 DWORD job_id; | 67 DWORD job_id; |
| 68 HANDLE printer_handle; | 68 HANDLE printer_handle; |
| 69 FILE* file; | 69 FILE* file; |
| 70 FilePath file_path; | 70 base::FilePath file_path; |
| 71 }; | 71 }; |
| 72 | 72 |
| 73 typedef struct { | 73 typedef struct { |
| 74 ACCESS_MASK granted_access; | 74 ACCESS_MASK granted_access; |
| 75 } XcvUiData; | 75 } XcvUiData; |
| 76 | 76 |
| 77 | 77 |
| 78 MONITORUI g_monitor_ui = { | 78 MONITORUI g_monitor_ui = { |
| 79 sizeof(MONITORUI), | 79 sizeof(MONITORUI), |
| 80 MonitorUiAddPortUi, | 80 MonitorUiAddPortUi, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 97 NULL, // ConfigurePort is not supported. | 97 NULL, // ConfigurePort is not supported. |
| 98 NULL, // DeletePort is not supported. | 98 NULL, // DeletePort is not supported. |
| 99 NULL, | 99 NULL, |
| 100 NULL, // SetPortTimeOuts is not supported. | 100 NULL, // SetPortTimeOuts is not supported. |
| 101 Monitor2XcvOpenPort, | 101 Monitor2XcvOpenPort, |
| 102 Monitor2XcvDataPort, | 102 Monitor2XcvDataPort, |
| 103 Monitor2XcvClosePort, | 103 Monitor2XcvClosePort, |
| 104 Monitor2Shutdown | 104 Monitor2Shutdown |
| 105 }; | 105 }; |
| 106 | 106 |
| 107 FilePath GetAppDataDir() { | 107 base::FilePath GetAppDataDir() { |
| 108 FilePath file_path; | 108 base::FilePath file_path; |
| 109 if (!PathService::Get(base::DIR_LOCAL_APP_DATA_LOW, &file_path)) { | 109 if (!PathService::Get(base::DIR_LOCAL_APP_DATA_LOW, &file_path)) { |
| 110 LOG(ERROR) << "Can't get DIR_LOCAL_APP_DATA_LOW"; | 110 LOG(ERROR) << "Can't get DIR_LOCAL_APP_DATA_LOW"; |
| 111 return FilePath(); | 111 return base::FilePath(); |
| 112 } | 112 } |
| 113 return file_path.Append(kAppDataDir); | 113 return file_path.Append(kAppDataDir); |
| 114 } | 114 } |
| 115 | 115 |
| 116 // Delete files which where not deleted by chrome. | 116 // Delete files which where not deleted by chrome. |
| 117 void DeleteLeakedFiles(const FilePath& dir) { | 117 void DeleteLeakedFiles(const base::FilePath& dir) { |
| 118 using file_util::FileEnumerator; | 118 using file_util::FileEnumerator; |
| 119 base::Time delete_before = base::Time::Now() - base::TimeDelta::FromDays(1); | 119 base::Time delete_before = base::Time::Now() - base::TimeDelta::FromDays(1); |
| 120 FileEnumerator enumerator(dir, false, FileEnumerator::FILES); | 120 FileEnumerator enumerator(dir, false, FileEnumerator::FILES); |
| 121 for (FilePath file_path = enumerator.Next(); !file_path.empty(); | 121 for (base::FilePath file_path = enumerator.Next(); !file_path.empty(); |
| 122 file_path = enumerator.Next()) { | 122 file_path = enumerator.Next()) { |
| 123 FileEnumerator::FindInfo info; | 123 FileEnumerator::FindInfo info; |
| 124 enumerator.GetFindInfo(&info); | 124 enumerator.GetFindInfo(&info); |
| 125 if (FileEnumerator::GetLastModifiedTime(info) < delete_before) | 125 if (FileEnumerator::GetLastModifiedTime(info) < delete_before) |
| 126 file_util::Delete(file_path, false); | 126 file_util::Delete(file_path, false); |
| 127 } | 127 } |
| 128 } | 128 } |
| 129 | 129 |
| 130 // Attempts to retrieve the title of the specified print job. | 130 // Attempts to retrieve the title of the specified print job. |
| 131 // On success returns TRUE and the first title_chars characters of the job title | 131 // On success returns TRUE and the first title_chars characters of the job title |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 primary_token)) { | 186 primary_token)) { |
| 187 LOG(ERROR) << "Unable to get primary thread token."; | 187 LOG(ERROR) << "Unable to get primary thread token."; |
| 188 return false; | 188 return false; |
| 189 } | 189 } |
| 190 return true; | 190 return true; |
| 191 } | 191 } |
| 192 | 192 |
| 193 // Launches the Cloud Print dialog in Chrome. | 193 // Launches the Cloud Print dialog in Chrome. |
| 194 // xps_path references a file to print. | 194 // xps_path references a file to print. |
| 195 // job_title is the title to be used for the resulting print job. | 195 // job_title is the title to be used for the resulting print job. |
| 196 bool LaunchPrintDialog(const FilePath& xps_path, | 196 bool LaunchPrintDialog(const base::FilePath& xps_path, |
| 197 const string16& job_title) { | 197 const string16& job_title) { |
| 198 HANDLE token = NULL; | 198 HANDLE token = NULL; |
| 199 if (!GetUserToken(&token)) { | 199 if (!GetUserToken(&token)) { |
| 200 LOG(ERROR) << "Unable to get user token."; | 200 LOG(ERROR) << "Unable to get user token."; |
| 201 return false; | 201 return false; |
| 202 } | 202 } |
| 203 base::win::ScopedHandle primary_token_scoped(token); | 203 base::win::ScopedHandle primary_token_scoped(token); |
| 204 | 204 |
| 205 FilePath chrome_path = GetChromeExePath(); | 205 base::FilePath chrome_path = GetChromeExePath(); |
| 206 if (chrome_path.empty()) { | 206 if (chrome_path.empty()) { |
| 207 LOG(ERROR) << "Unable to get chrome exe path."; | 207 LOG(ERROR) << "Unable to get chrome exe path."; |
| 208 return false; | 208 return false; |
| 209 } | 209 } |
| 210 | 210 |
| 211 CommandLine command_line(chrome_path); | 211 CommandLine command_line(chrome_path); |
| 212 | 212 |
| 213 FilePath chrome_profile = GetChromeProfilePath(); | 213 base::FilePath chrome_profile = GetChromeProfilePath(); |
| 214 if (!chrome_profile.empty()) { | 214 if (!chrome_profile.empty()) { |
| 215 command_line.AppendSwitchPath(switches::kCloudPrintUserDataDir, | 215 command_line.AppendSwitchPath(switches::kCloudPrintUserDataDir, |
| 216 chrome_profile); | 216 chrome_profile); |
| 217 } | 217 } |
| 218 | 218 |
| 219 command_line.AppendSwitchPath(switches::kCloudPrintFile, | 219 command_line.AppendSwitchPath(switches::kCloudPrintFile, |
| 220 xps_path); | 220 xps_path); |
| 221 command_line.AppendSwitchNative(switches::kCloudPrintFileType, | 221 command_line.AppendSwitchNative(switches::kCloudPrintFileType, |
| 222 kXpsMimeType); | 222 kXpsMimeType); |
| 223 command_line.AppendSwitchNative(switches::kCloudPrintJobTitle, | 223 command_line.AppendSwitchNative(switches::kCloudPrintJobTitle, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 236 void LaunchChromeDownloadPage() { | 236 void LaunchChromeDownloadPage() { |
| 237 if (kIsUnittest) | 237 if (kIsUnittest) |
| 238 return; | 238 return; |
| 239 HANDLE token = NULL; | 239 HANDLE token = NULL; |
| 240 if (!GetUserToken(&token)) { | 240 if (!GetUserToken(&token)) { |
| 241 LOG(ERROR) << "Unable to get user token."; | 241 LOG(ERROR) << "Unable to get user token."; |
| 242 return; | 242 return; |
| 243 } | 243 } |
| 244 base::win::ScopedHandle token_scoped(token); | 244 base::win::ScopedHandle token_scoped(token); |
| 245 | 245 |
| 246 FilePath ie_path; | 246 base::FilePath ie_path; |
| 247 PathService::Get(base::DIR_PROGRAM_FILESX86, &ie_path); | 247 PathService::Get(base::DIR_PROGRAM_FILESX86, &ie_path); |
| 248 ie_path = ie_path.Append(kIePath); | 248 ie_path = ie_path.Append(kIePath); |
| 249 CommandLine command_line(ie_path); | 249 CommandLine command_line(ie_path); |
| 250 command_line.AppendArg(kChromeInstallUrl); | 250 command_line.AppendArg(kChromeInstallUrl); |
| 251 | 251 |
| 252 base::LaunchOptions options; | 252 base::LaunchOptions options; |
| 253 options.as_user = token_scoped; | 253 options.as_user = token_scoped; |
| 254 base::LaunchProcess(command_line, options, NULL); | 254 base::LaunchProcess(command_line, options, NULL); |
| 255 } | 255 } |
| 256 | 256 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 276 return false; | 276 return false; |
| 277 } | 277 } |
| 278 if (session_id == 0) { | 278 if (session_id == 0) { |
| 279 return false; | 279 return false; |
| 280 } | 280 } |
| 281 } | 281 } |
| 282 return true; | 282 return true; |
| 283 } | 283 } |
| 284 } // namespace | 284 } // namespace |
| 285 | 285 |
| 286 FilePath ReadPathFromRegistry(HKEY root, const wchar_t* path_name) { | 286 base::FilePath ReadPathFromRegistry(HKEY root, const wchar_t* path_name) { |
| 287 base::win::RegKey gcp_key(HKEY_CURRENT_USER, kCloudPrintRegKey, KEY_READ); | 287 base::win::RegKey gcp_key(HKEY_CURRENT_USER, kCloudPrintRegKey, KEY_READ); |
| 288 string16 data; | 288 string16 data; |
| 289 if (SUCCEEDED(gcp_key.ReadValue(path_name, &data)) && | 289 if (SUCCEEDED(gcp_key.ReadValue(path_name, &data)) && |
| 290 file_util::PathExists(FilePath(data))) { | 290 file_util::PathExists(base::FilePath(data))) { |
| 291 return FilePath(data); | 291 return base::FilePath(data); |
| 292 } | 292 } |
| 293 return FilePath(); | 293 return base::FilePath(); |
| 294 } | 294 } |
| 295 | 295 |
| 296 FilePath ReadPathFromAnyRegistry(const wchar_t* path_name) { | 296 base::FilePath ReadPathFromAnyRegistry(const wchar_t* path_name) { |
| 297 FilePath result = ReadPathFromRegistry(HKEY_CURRENT_USER, path_name); | 297 base::FilePath result = ReadPathFromRegistry(HKEY_CURRENT_USER, path_name); |
| 298 if (!result.empty()) | 298 if (!result.empty()) |
| 299 return result; | 299 return result; |
| 300 return ReadPathFromRegistry(HKEY_LOCAL_MACHINE, path_name); | 300 return ReadPathFromRegistry(HKEY_LOCAL_MACHINE, path_name); |
| 301 } | 301 } |
| 302 | 302 |
| 303 FilePath GetChromeExePath() { | 303 base::FilePath GetChromeExePath() { |
| 304 FilePath path = ReadPathFromAnyRegistry(kChromeExePathRegValue); | 304 base::FilePath path = ReadPathFromAnyRegistry(kChromeExePathRegValue); |
| 305 if (!path.empty()) | 305 if (!path.empty()) |
| 306 return path; | 306 return path; |
| 307 return chrome_launcher_support::GetAnyChromePath(); | 307 return chrome_launcher_support::GetAnyChromePath(); |
| 308 } | 308 } |
| 309 | 309 |
| 310 FilePath GetChromeProfilePath() { | 310 base::FilePath GetChromeProfilePath() { |
| 311 FilePath path = ReadPathFromAnyRegistry(kChromeProfilePathRegValue); | 311 base::FilePath path = ReadPathFromAnyRegistry(kChromeProfilePathRegValue); |
| 312 if (!path.empty() && file_util::DirectoryExists(path)) | 312 if (!path.empty() && file_util::DirectoryExists(path)) |
| 313 return path; | 313 return path; |
| 314 return FilePath(); | 314 return base::FilePath(); |
| 315 } | 315 } |
| 316 | 316 |
| 317 BOOL WINAPI Monitor2EnumPorts(HANDLE, | 317 BOOL WINAPI Monitor2EnumPorts(HANDLE, |
| 318 wchar_t*, | 318 wchar_t*, |
| 319 DWORD level, | 319 DWORD level, |
| 320 BYTE* ports, | 320 BYTE* ports, |
| 321 DWORD ports_size, | 321 DWORD ports_size, |
| 322 DWORD* needed_bytes, | 322 DWORD* needed_bytes, |
| 323 DWORD* returned) { | 323 DWORD* returned) { |
| 324 if (needed_bytes == NULL) { | 324 if (needed_bytes == NULL) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 PortData* port_data = reinterpret_cast<PortData*>(port_handle); | 430 PortData* port_data = reinterpret_cast<PortData*>(port_handle); |
| 431 port_data->job_id = job_id; | 431 port_data->job_id = job_id; |
| 432 if (!OpenPrinter(printer_name, &(port_data->printer_handle), NULL)) { | 432 if (!OpenPrinter(printer_name, &(port_data->printer_handle), NULL)) { |
| 433 LOG(WARNING) << "Unable to open printer " << printer_name << "."; | 433 LOG(WARNING) << "Unable to open printer " << printer_name << "."; |
| 434 // We can continue without a handle to the printer. | 434 // We can continue without a handle to the printer. |
| 435 // It just means we can't get the job title or tell the spooler that | 435 // It just means we can't get the job title or tell the spooler that |
| 436 // the print job is complete. | 436 // the print job is complete. |
| 437 // This is the normal flow during a unit test. | 437 // This is the normal flow during a unit test. |
| 438 port_data->printer_handle = NULL; | 438 port_data->printer_handle = NULL; |
| 439 } | 439 } |
| 440 FilePath& file_path = port_data->file_path; | 440 base::FilePath& file_path = port_data->file_path; |
| 441 FilePath app_data_dir = GetAppDataDir(); | 441 base::FilePath app_data_dir = GetAppDataDir(); |
| 442 if (app_data_dir.empty()) | 442 if (app_data_dir.empty()) |
| 443 return FALSE; | 443 return FALSE; |
| 444 DeleteLeakedFiles(app_data_dir); | 444 DeleteLeakedFiles(app_data_dir); |
| 445 if (!file_util::CreateDirectory(app_data_dir) || | 445 if (!file_util::CreateDirectory(app_data_dir) || |
| 446 !file_util::CreateTemporaryFileInDir(app_data_dir, &file_path)) { | 446 !file_util::CreateTemporaryFileInDir(app_data_dir, &file_path)) { |
| 447 LOG(ERROR) << "Can't create temporary file in " << app_data_dir.value(); | 447 LOG(ERROR) << "Can't create temporary file in " << app_data_dir.value(); |
| 448 return FALSE; | 448 return FALSE; |
| 449 } | 449 } |
| 450 port_data->file = file_util::OpenFile(file_path, "wb+"); | 450 port_data->file = file_util::OpenFile(file_path, "wb+"); |
| 451 if (port_data->file == NULL) { | 451 if (port_data->file == NULL) { |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 if ((xcv_data->granted_access & SERVER_ACCESS_ADMINISTER) == 0) { | 579 if ((xcv_data->granted_access & SERVER_ACCESS_ADMINISTER) == 0) { |
| 580 return ERROR_ACCESS_DENIED; | 580 return ERROR_ACCESS_DENIED; |
| 581 } | 581 } |
| 582 if (output_data == NULL || output_data_bytes == 0) { | 582 if (output_data == NULL || output_data_bytes == 0) { |
| 583 return ERROR_INVALID_PARAMETER; | 583 return ERROR_INVALID_PARAMETER; |
| 584 } | 584 } |
| 585 // We don't handle AddPort or DeletePort since we don't support | 585 // We don't handle AddPort or DeletePort since we don't support |
| 586 // dynamic creation of ports. | 586 // dynamic creation of ports. |
| 587 if (lstrcmp(L"MonitorUI", data_name) == 0) { | 587 if (lstrcmp(L"MonitorUI", data_name) == 0) { |
| 588 DWORD dll_path_len = 0; | 588 DWORD dll_path_len = 0; |
| 589 FilePath dll_path(GetPortMonitorDllName()); | 589 base::FilePath dll_path(GetPortMonitorDllName()); |
| 590 dll_path_len = static_cast<DWORD>(dll_path.value().length()); | 590 dll_path_len = static_cast<DWORD>(dll_path.value().length()); |
| 591 if (output_data_bytes_needed != NULL) { | 591 if (output_data_bytes_needed != NULL) { |
| 592 *output_data_bytes_needed = dll_path_len; | 592 *output_data_bytes_needed = dll_path_len; |
| 593 } | 593 } |
| 594 if (output_data_bytes < dll_path_len) { | 594 if (output_data_bytes < dll_path_len) { |
| 595 return ERROR_INSUFFICIENT_BUFFER; | 595 return ERROR_INSUFFICIENT_BUFFER; |
| 596 } else { | 596 } else { |
| 597 ret_val = StringCbCopy(reinterpret_cast<wchar_t*>(output_data), | 597 ret_val = StringCbCopy(reinterpret_cast<wchar_t*>(output_data), |
| 598 output_data_bytes, | 598 output_data_bytes, |
| 599 dll_path.value().c_str()); | 599 dll_path.value().c_str()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 SetLastError(ERROR_INVALID_PARAMETER); | 645 SetLastError(ERROR_INVALID_PARAMETER); |
| 646 return NULL; | 646 return NULL; |
| 647 } | 647 } |
| 648 return &cloud_print::g_monitor_2; | 648 return &cloud_print::g_monitor_2; |
| 649 } | 649 } |
| 650 | 650 |
| 651 MONITORUI* WINAPI InitializePrintMonitorUI(void) { | 651 MONITORUI* WINAPI InitializePrintMonitorUI(void) { |
| 652 return &cloud_print::g_monitor_ui; | 652 return &cloud_print::g_monitor_ui; |
| 653 } | 653 } |
| 654 | 654 |
| OLD | NEW |