| Index: cloud_print/virtual_driver/win/install/setup.cc
|
| diff --git a/cloud_print/virtual_driver/win/install/setup.cc b/cloud_print/virtual_driver/win/install/setup.cc
|
| index d64ea9aebfee918a12cde377a4dfd241e1c2a60e..262a3f74efbc281f9137feb2720dddbbb1053d96 100644
|
| --- a/cloud_print/virtual_driver/win/install/setup.cc
|
| +++ b/cloud_print/virtual_driver/win/install/setup.cc
|
| @@ -16,6 +16,7 @@
|
| #include "base/string16.h"
|
| #include "base/win/registry.h"
|
| #include "base/win/scoped_handle.h"
|
| +#include "base/win/windows_version.h"
|
| #include "cloud_print/virtual_driver/win/virtual_driver_consts.h"
|
| #include "cloud_print/virtual_driver/win/virtual_driver_helpers.h"
|
| #include "grit/virtual_driver_setup_resources.h"
|
| @@ -70,6 +71,7 @@ void DeleteOmahaKeys() {
|
| if (key.Open(HKEY_LOCAL_MACHINE, cloud_print::kKeyLocation,
|
| DELETE) != ERROR_SUCCESS) {
|
| LOG(ERROR) << "Unable to open key to delete";
|
| + return;
|
| }
|
| if (key.DeleteKey(L"") != ERROR_SUCCESS) {
|
| LOG(ERROR) << "Unable to delete key";
|
| @@ -198,7 +200,10 @@ UINT CALLBACK CabinetCallback(PVOID data,
|
| FILE_IN_CABINET_INFO* info =
|
| reinterpret_cast<FILE_IN_CABINET_INFO*>(param1);
|
| for (int i = 0; i < arraysize(kDependencyList); i++) {
|
| - if (wcsstr(info->NameInCabinet, kDependencyList[i])) {
|
| + FilePath base_name(info->NameInCabinet);
|
| + base_name = base_name.BaseName();
|
| + if (FilePath::CompareEqualIgnoreCase(base_name.value().c_str(),
|
| + kDependencyList[i])) {
|
| StringCchCopy(info->FullTargetName, MAX_PATH,
|
| temp_path->Append(kDependencyList[i]).value().c_str());
|
| return FILEOP_DOIT;
|
| @@ -211,26 +216,47 @@ UINT CALLBACK CabinetCallback(PVOID data,
|
| }
|
|
|
| void ReadyPpdDependencies(const FilePath& install_path) {
|
| - CORE_PRINTER_DRIVER driver;
|
| - GetCorePrinterDrivers(NULL,
|
| - NULL,
|
| - L"{D20EA372-DD35-4950-9ED8-A6335AFE79F0}",
|
| - 1,
|
| - &driver);
|
| - DWORD size = MAX_PATH;
|
| - wchar_t package_path[MAX_PATH];
|
| - GetPrinterDriverPackagePath(NULL,
|
| - NULL,
|
| - NULL,
|
| - driver.szPackageID,
|
| - package_path,
|
| - MAX_PATH,
|
| - &size);
|
| -
|
| - SetupIterateCabinet(package_path,
|
| - 0,
|
| - CabinetCallback,
|
| - const_cast<FilePath*>(&install_path));
|
| + base::win::Version version = base::win::GetVersion();
|
| + if (version >= base::win::VERSION_VISTA) {
|
| + // GetCorePrinterDrivers and GetPrinterDriverPackagePath only exist on
|
| + // Vista and later. Winspool.drv must be delayloaded so these calls don't
|
| + // create problems on XP.
|
| + DWORD size = MAX_PATH;
|
| + wchar_t package_path[MAX_PATH] = {0};
|
| + CORE_PRINTER_DRIVER driver;
|
| + GetCorePrinterDrivers(NULL,
|
| + NULL,
|
| + L"{D20EA372-DD35-4950-9ED8-A6335AFE79F0}",
|
| + 1,
|
| + &driver);
|
| + GetPrinterDriverPackagePath(NULL,
|
| + NULL,
|
| + NULL,
|
| + driver.szPackageID,
|
| + package_path,
|
| + MAX_PATH,
|
| + &size);
|
| + SetupIterateCabinet(package_path,
|
| + 0,
|
| + CabinetCallback,
|
| + const_cast<FilePath*>(&install_path));
|
| + } else {
|
| + // PS driver files are in the sp3 cab.
|
| + FilePath package_path;
|
| + PathService::Get(base::DIR_WINDOWS, &package_path);
|
| + package_path = package_path.Append(L"Driver Cache\\i386\\sp3.cab");
|
| + SetupIterateCabinet(package_path.value().c_str(),
|
| + 0,
|
| + CabinetCallback,
|
| + const_cast<FilePath*>(&install_path));
|
| +
|
| + // The XPS driver files are just sitting uncompressed in the driver cache.
|
| + FilePath xps_path;
|
| + PathService::Get(base::DIR_WINDOWS, &xps_path);
|
| + xps_path = xps_path.Append(L"Driver Cache\\i386");
|
| + xps_path = xps_path.Append(kDriverName);
|
| + file_util::CopyFile(xps_path, install_path.Append(kDriverName));
|
| + }
|
| }
|
|
|
| HRESULT InstallPpd(const FilePath& install_path) {
|
| @@ -383,10 +409,24 @@ void CleanupUninstall() {
|
| ::RegDeleteKey(HKEY_LOCAL_MACHINE, kUninstallRegistry);
|
| }
|
|
|
| +bool IsOSSupported() {
|
| + // We don't support XP service pack 2 or older.
|
| + base::win::Version version = base::win::GetVersion();
|
| + return (version > base::win::VERSION_XP) ||
|
| + ((version == base::win::VERSION_XP) &&
|
| + (base::win::OSInfo::GetInstance()->service_pack().major >= 3));
|
| +}
|
| +
|
| HRESULT InstallVirtualDriver(const FilePath& install_path) {
|
| HRESULT result = S_OK;
|
| +
|
| + if (!IsOSSupported()) {
|
| + LOG(ERROR) << "Requires XP SP3 or later.";
|
| + return ERROR_OLD_WIN_VERSION;
|
| + }
|
| +
|
| if (!file_util::CreateDirectory(install_path)) {
|
| - LOG(ERROR) << "Can't create install directory";
|
| + LOG(ERROR) << "Can't create install directory.";
|
| return ERROR_ACCESS_DENIED;
|
| }
|
| SetupUninstall(install_path);
|
|
|