diff options
author | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-07 18:24:52 +0000 |
---|---|---|
committer | robertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-07 18:24:52 +0000 |
commit | 4475892162b7069ec333f3fc64d086ba3957b752 (patch) | |
tree | 5f85c72235b6425bc20fbf48da693003cf295d7d /win8/metro_driver/winrt_utils.cc | |
parent | e6f1a6fbcc8869e27697b2bb548aa61e58f969a5 (diff) | |
download | chromium_src-4475892162b7069ec333f3fc64d086ba3957b752.zip chromium_src-4475892162b7069ec333f3fc64d086ba3957b752.tar.gz chromium_src-4475892162b7069ec333f3fc64d086ba3957b752.tar.bz2 |
Integrate the Windows 8 code into the Chromium tree.
BUG=127799
TEST=A Chromium build can run as the immersive browser on Windows 8.
Review URL: https://chromiumcodereview.appspot.com/10875008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@155429 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'win8/metro_driver/winrt_utils.cc')
-rw-r--r-- | win8/metro_driver/winrt_utils.cc | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/win8/metro_driver/winrt_utils.cc b/win8/metro_driver/winrt_utils.cc new file mode 100644 index 0000000..cfddc5e --- /dev/null +++ b/win8/metro_driver/winrt_utils.cc @@ -0,0 +1,225 @@ +// 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. + +#include "stdafx.h" +#include "winrt_utils.h" + +#include <shlobj.h> + +#include "base/file_path.h" +#include "base/logging.h" +#include "base/win/scoped_com_initializer.h" +#include "base/win/scoped_comptr.h" + +void CheckHR(HRESULT hr, const char* message) { + if (FAILED(hr)) { + if (message) + PLOG(DFATAL) << message << ", hr = " << std::hex << hr; + else + PLOG(DFATAL) << "COM ERROR" << ", hr = " << std::hex << hr; + } +} + +HSTRING MakeHString(const string16& str) { + HSTRING hstr; + if (FAILED(::WindowsCreateString(str.c_str(), str.size(), &hstr))) { + PLOG(DFATAL) << "Hstring creation failed"; + } + return hstr; +} + +string16 MakeStdWString(HSTRING hstring) { + const wchar_t* str; + UINT32 size = 0; + str = ::WindowsGetStringRawBuffer(hstring, &size); + if (!size) + return string16(); + return string16(str, size); +} + +namespace { + +#define IMPLEMENT_CREATE_PROPERTY(Name, Type) \ +HRESULT Create ## Name ## Property(Type value, \ + winfoundtn::IPropertyValue** prop) { \ + mswr::ComPtr<winfoundtn::IPropertyValueStatics> property_value_statics; \ + HRESULT hr = winrt_utils::CreateActivationFactory( \ + RuntimeClass_Windows_Foundation_PropertyValue, \ + property_value_statics.GetAddressOf()); \ + CheckHR(hr, "Can't create IPropertyValueStatics"); \ + hr = property_value_statics->Create ## Name ## ( \ + value, \ + reinterpret_cast<IInspectable**>(prop)); \ + CheckHR(hr, "Failed to create Property"); \ + return hr; \ +} + +#define COMPARE_ATOMIC_PROPERTY_VALUES(Name, Type) \ + Type lhs_value; \ + hr = lhs->Get ## Name ##(&lhs_value); \ + CheckHR(hr, "Can't get value for lhs"); \ + Type rhs_value; \ + hr = rhs->Get ## Name ##(&rhs_value); \ + CheckHR(hr, "Can't get value for rhs"); \ + if (lhs_value < rhs_value) \ + *result = -1; \ + else if (lhs_value > rhs_value) \ + *result = 1; \ + else \ + *result = 0; \ + hr = S_OK + +} // namespace + +namespace winrt_utils { + +IMPLEMENT_CREATE_PROPERTY(String, HSTRING); +IMPLEMENT_CREATE_PROPERTY(Int16, INT16); +IMPLEMENT_CREATE_PROPERTY(Int32, INT32); +IMPLEMENT_CREATE_PROPERTY(Int64, INT64); +IMPLEMENT_CREATE_PROPERTY(UInt8, UINT8); +IMPLEMENT_CREATE_PROPERTY(UInt16, UINT16); +IMPLEMENT_CREATE_PROPERTY(UInt32, UINT32); +IMPLEMENT_CREATE_PROPERTY(UInt64, UINT64); + +HRESULT CompareProperties(winfoundtn::IPropertyValue* lhs, + winfoundtn::IPropertyValue* rhs, + INT32* result) { + if (result == nullptr) { + PLOG(DFATAL) << "Invalid argument to CompareProperties."; + return E_INVALIDARG; + } + + if (lhs == rhs) { + *result = 0; + return S_OK; + } + + winfoundtn::PropertyType lhs_property_type; + HRESULT hr = lhs->get_Type(&lhs_property_type); + if (FAILED(hr)) { + PLOG(DFATAL) << "Can't get property type for lhs, hr=" << std::hex << hr; + } + + winfoundtn::PropertyType rhs_property_type; + hr = rhs->get_Type(&rhs_property_type); + CheckHR(hr, "Can't get property type for rhs"); + + if (lhs_property_type != rhs_property_type) + return E_INVALIDARG; + + switch (lhs_property_type) { + case winfoundtn::PropertyType::PropertyType_String: { + mswrw::HString lhs_string; + hr = lhs->GetString(lhs_string.GetAddressOf()); + CheckHR(hr, "Can't get string for lhs"); + + mswrw::HString rhs_string; + hr = rhs->GetString(rhs_string.GetAddressOf()); + CheckHR(hr, "Can't get string for rhs"); + + hr = WindowsCompareStringOrdinal( + lhs_string.Get(), rhs_string.Get(), result); + break; + } + case winfoundtn::PropertyType::PropertyType_Char16: { + COMPARE_ATOMIC_PROPERTY_VALUES(Char16, wchar_t); + break; + } + case winfoundtn::PropertyType::PropertyType_Double: { + COMPARE_ATOMIC_PROPERTY_VALUES(Double, double); + break; + } + case winfoundtn::PropertyType::PropertyType_Int16: { + COMPARE_ATOMIC_PROPERTY_VALUES(Int16, INT16); + break; + } + case winfoundtn::PropertyType::PropertyType_Int32: { + COMPARE_ATOMIC_PROPERTY_VALUES(Int32, INT32); + break; + } + case winfoundtn::PropertyType::PropertyType_Int64: { + COMPARE_ATOMIC_PROPERTY_VALUES(Int64, INT64); + break; + } + case winfoundtn::PropertyType::PropertyType_UInt8: { + COMPARE_ATOMIC_PROPERTY_VALUES(UInt8, UINT8); + break; + } + case winfoundtn::PropertyType::PropertyType_UInt16: { + COMPARE_ATOMIC_PROPERTY_VALUES(UInt16, UINT16); + break; + } + case winfoundtn::PropertyType::PropertyType_UInt32: { + COMPARE_ATOMIC_PROPERTY_VALUES(UInt32, UINT32); + break; + } + case winfoundtn::PropertyType::PropertyType_UInt64: { + COMPARE_ATOMIC_PROPERTY_VALUES(UInt64, UINT64); + break; + } + default: { + hr = E_NOTIMPL; + } + } + return hr; +} + +bool GetArgumentsFromShortcut(const FilePath& shortcut, + string16* arguments) { + HRESULT result; + base::win::ScopedComPtr<IShellLink> i_shell_link; + bool is_resolved = false; + + + base::win::ScopedCOMInitializer sta_com_initializer; + + // Get pointer to the IShellLink interface + result = i_shell_link.CreateInstance(CLSID_ShellLink, NULL, + CLSCTX_INPROC_SERVER); + if (SUCCEEDED(result)) { + base::win::ScopedComPtr<IPersistFile> persist; + // Query IShellLink for the IPersistFile interface + result = persist.QueryFrom(i_shell_link); + if (SUCCEEDED(result)) { + WCHAR temp_arguments[MAX_PATH]; + // Load the shell link + result = persist->Load(shortcut.value().c_str(), STGM_READ); + if (SUCCEEDED(result)) { + result = i_shell_link->GetArguments(temp_arguments, MAX_PATH); + *arguments = temp_arguments; + is_resolved = true; + } + } + } + + return is_resolved; +} + +string16 ReadArgumentsFromPinnedTaskbarShortcut() { + wchar_t path_buffer[MAX_PATH] = {}; + + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, + SHGFP_TYPE_CURRENT, path_buffer))) { + FilePath shortcut(path_buffer); + shortcut = shortcut.Append( + L"Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar"); + + // TODO(robertshield): Get this stuff from BrowserDistribution. +#if defined(GOOGLE_CHROME_BUILD) + shortcut = shortcut.Append(L"Google Chrome.lnk"); +#else + shortcut = shortcut.Append(L"Chromium.lnk"); +#endif + + string16 arguments; + if (GetArgumentsFromShortcut(shortcut, &arguments)) { + return arguments; + } + } + + return L""; +} + +} // namespace winrt_utils |