/*********************************************************************** * WindowsConcatString (combase.@) */ HRESULT WINAPI WindowsConcatString(HSTRING str1, HSTRING str2, HSTRING *out) { struct hstring_private *priv1 = impl_from_HSTRING(str1); struct hstring_private *priv2 = impl_from_HSTRING(str2); struct hstring_private *priv; TRACE("(%p, %p, %p)\n", str1, str2, out); if (out == NULL) return E_INVALIDARG; if (str1 == NULL) return WindowsDuplicateString(str2, out); if (str2 == NULL) return WindowsDuplicateString(str1, out); if (!priv1->length && !priv2->length) { *out = NULL; return S_OK; } if (!alloc_string(priv1->length + priv2->length, out)) return E_OUTOFMEMORY; priv = impl_from_HSTRING(*out); memcpy(priv->buffer, priv1->buffer, priv1->length * sizeof(*priv1->buffer)); memcpy(priv->buffer + priv1->length, priv2->buffer, priv2->length * sizeof(*priv2->buffer)); return S_OK; }
void FrameworkView::FileActivated(ComPtr<IFileActivatedEventArgs>& aArgs, bool aStartup) { if (!aArgs) return; ComPtr<IVectorView<ABI::Windows::Storage::IStorageItem*>> list; AssertHRESULT(aArgs->get_Files(list.GetAddressOf())); ComPtr<ABI::Windows::Storage::IStorageItem> item; AssertHRESULT(list->GetAt(0, item.GetAddressOf())); HString filePath; AssertHRESULT(item->get_Path(filePath.GetAddressOf())); if (aStartup) { WindowsDuplicateString(filePath.Get(), &sActivationURI); } else { PerformURILoad(filePath); } }
void FrameworkView::SearchActivated(ComPtr<ISearchActivatedEventArgs>& aArgs, bool aStartup) { if (!aArgs) return; HString data; AssertHRESULT(aArgs->get_QueryText(data.GetAddressOf())); if (WindowsIsStringEmpty(data.Get())) return; unsigned int length; WinUtils::LogW(L"SearchActivated text=%s", data.GetRawBuffer(&length)); if (aStartup) { WindowsDuplicateString(data.Get(), &sActivationURI); } else { PerformURILoadOrSearch(data); } }
void FrameworkView::ProcessActivationArgs(IActivatedEventArgs* aArgs, bool aStartup) { ActivationKind kind; if (!aArgs || FAILED(aArgs->get_Kind(&kind))) return; ComPtr<IActivatedEventArgs> args(aArgs); if (kind == ActivationKind::ActivationKind_Protocol) { WinUtils::Log("Activation argument kind: Protocol"); ComPtr<IProtocolActivatedEventArgs> protoArgs; AssertHRESULT(args.As(&protoArgs)); ComPtr<IUriRuntimeClass> uri; AssertHRESULT(protoArgs->get_Uri(uri.GetAddressOf())); if (!uri) return; HString data; AssertHRESULT(uri->get_AbsoluteUri(data.GetAddressOf())); if (WindowsIsStringEmpty(data.Get())) return; if (aStartup) { WindowsDuplicateString(data.Get(), &sActivationURI); } else { PerformURILoad(data); } } else if (kind == ActivationKind::ActivationKind_Search) { WinUtils::Log("Activation argument kind: Search"); ComPtr<ISearchActivatedEventArgs> searchArgs; args.As(&searchArgs); SearchActivated(searchArgs, aStartup); } else if (kind == ActivationKind::ActivationKind_File) { WinUtils::Log("Activation argument kind: File"); ComPtr<IFileActivatedEventArgs> fileArgs; args.As(&fileArgs); FileActivated(fileArgs, aStartup); } else if (kind == ActivationKind::ActivationKind_Launch) { WinUtils::Log("Activation argument kind: Launch"); ComPtr<ILaunchActivatedEventArgs> launchArgs; args.As(&launchArgs); LaunchActivated(launchArgs, aStartup); } }
/*********************************************************************** * WindowsTrimStringEnd (combase.@) */ HRESULT WINAPI WindowsTrimStringEnd(HSTRING str1, HSTRING str2, HSTRING *out) { struct hstring_private *priv1 = impl_from_HSTRING(str1); struct hstring_private *priv2 = impl_from_HSTRING(str2); UINT32 len; TRACE("(%p, %p, %p)\n", str1, str2, out); if (!out || !str2 || !priv2->length) return E_INVALIDARG; if (!str1) { *out = NULL; return S_OK; } for (len = priv1->length; len > 0; len--) { if (!wmemchr(priv2->buffer, priv1->buffer[len - 1], priv2->length)) break; } return (len < priv1->length) ? WindowsCreateString(priv1->buffer, len, out) : WindowsDuplicateString(str1, out); }
/*********************************************************************** * WindowsTrimStringStart (combase.@) */ HRESULT WINAPI WindowsTrimStringStart(HSTRING str1, HSTRING str2, HSTRING *out) { struct hstring_private *priv1 = impl_from_HSTRING(str1); struct hstring_private *priv2 = impl_from_HSTRING(str2); UINT32 start; TRACE("(%p, %p, %p)\n", str1, str2, out); if (!out || !str2 || !priv2->length) return E_INVALIDARG; if (!str1) { *out = NULL; return S_OK; } for (start = 0; start < priv1->length; start++) { if (!wmemchr(priv2->buffer, priv1->buffer[start], priv2->length)) break; } return start ? WindowsCreateString(&priv1->buffer[start], priv1->length - start, out) : WindowsDuplicateString(str1, out); }