From 99831baf2e2d98caefbf1c7a212613ad5d6360a9 Mon Sep 17 00:00:00 2001 From: "Matt A. Tobin" Date: Wed, 4 Apr 2018 08:07:51 -0400 Subject: [PALEMOON] Swipe nsIEHistoryEnumerator from Basilisk --- .../components/migration/nsIEHistoryEnumerator.cpp | 258 ++++++++++----------- .../components/migration/nsIEHistoryEnumerator.h | 74 +++--- .../components/migration/nsWindowsMigrationUtils.h | 36 +++ 3 files changed, 192 insertions(+), 176 deletions(-) create mode 100644 application/palemoon/components/migration/nsWindowsMigrationUtils.h (limited to 'application/palemoon') diff --git a/application/palemoon/components/migration/nsIEHistoryEnumerator.cpp b/application/palemoon/components/migration/nsIEHistoryEnumerator.cpp index 7fe31a666..0b377d27e 100644 --- a/application/palemoon/components/migration/nsIEHistoryEnumerator.cpp +++ b/application/palemoon/components/migration/nsIEHistoryEnumerator.cpp @@ -1,139 +1,119 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsIEHistoryEnumerator.h" - -#include -#include - -#include "nsStringAPI.h" -#include "nsNetUtil.h" -#include "nsIVariant.h" -#include "nsCOMArray.h" -#include "nsArrayEnumerator.h" - -namespace { - - PRTime FileTimeToPRTime(FILETIME* filetime) - { - SYSTEMTIME st; - ::FileTimeToSystemTime(filetime, &st); - PRExplodedTime prt; - prt.tm_year = st.wYear; - // SYSTEMTIME's day-of-month parameter is 1-based, - // PRExplodedTime's is 0-based. - prt.tm_month = st.wMonth - 1; - prt.tm_mday = st.wDay; - prt.tm_hour = st.wHour; - prt.tm_min = st.wMinute; - prt.tm_sec = st.wSecond; - prt.tm_usec = st.wMilliseconds * 1000; - prt.tm_wday = 0; - prt.tm_yday = 0; - prt.tm_params.tp_gmt_offset = 0; - prt.tm_params.tp_dst_offset = 0; - return PR_ImplodeTime(&prt); - } - -} // Anonymous namespace. - -//////////////////////////////////////////////////////////////////////////////// -//// nsIEHistoryEnumerator - -NS_IMPL_ISUPPORTS(nsIEHistoryEnumerator, nsISimpleEnumerator) - -nsIEHistoryEnumerator::nsIEHistoryEnumerator() -{ - ::CoInitialize(nullptr); -} - -nsIEHistoryEnumerator::~nsIEHistoryEnumerator() -{ - ::CoUninitialize(); -} - -void -nsIEHistoryEnumerator::EnsureInitialized() -{ - if (mURLEnumerator) - return; - - HRESULT hr = ::CoCreateInstance(CLSID_CUrlHistory, - nullptr, - CLSCTX_INPROC_SERVER, - IID_IUrlHistoryStg2, - getter_AddRefs(mIEHistory)); - if (FAILED(hr)) - return; - - hr = mIEHistory->EnumUrls(getter_AddRefs(mURLEnumerator)); - if (FAILED(hr)) - return; -} - -NS_IMETHODIMP -nsIEHistoryEnumerator::HasMoreElements(bool* _retval) -{ - *_retval = false; - - EnsureInitialized(); - MOZ_ASSERT(mURLEnumerator, "Should have instanced an IE History URLEnumerator"); - if (!mURLEnumerator) - return NS_OK; - - STATURL statURL; - ULONG fetched; - - // First argument is not implemented, so doesn't matter what we pass. - HRESULT hr = mURLEnumerator->Next(1, &statURL, &fetched); - if (FAILED(hr) || fetched != 1UL) { - // Reached the last entry. - return NS_OK; - } - - nsCOMPtr uri; - if (statURL.pwcsUrl) { - nsDependentString url(statURL.pwcsUrl); - nsresult rv = NS_NewURI(getter_AddRefs(uri), url); - ::CoTaskMemFree(statURL.pwcsUrl); - if (NS_FAILED(rv)) { - // Got a corrupt or invalid URI, continue to the next entry. - return HasMoreElements(_retval); - } - } - - nsDependentString title(statURL.pwcsTitle); - - PRTime lastVisited = FileTimeToPRTime(&(statURL.ftLastVisited)); - - mCachedNextEntry = do_CreateInstance("@mozilla.org/hash-property-bag;1"); - MOZ_ASSERT(mCachedNextEntry, "Should have instanced a new property bag"); - if (mCachedNextEntry) { - mCachedNextEntry->SetPropertyAsInterface(NS_LITERAL_STRING("uri"), uri); - mCachedNextEntry->SetPropertyAsAString(NS_LITERAL_STRING("title"), title); - mCachedNextEntry->SetPropertyAsInt64(NS_LITERAL_STRING("time"), lastVisited); - - *_retval = true; - } - - if (statURL.pwcsTitle) - ::CoTaskMemFree(statURL.pwcsTitle); - - return NS_OK; -} - -NS_IMETHODIMP -nsIEHistoryEnumerator::GetNext(nsISupports** _retval) -{ - *_retval = nullptr; - - if (!mCachedNextEntry) - return NS_ERROR_FAILURE; - - NS_ADDREF(*_retval = mCachedNextEntry); - // Release the cached entry, so it can't be returned twice. - mCachedNextEntry = nullptr; - - return NS_OK; -} +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsIEHistoryEnumerator.h" + +#include +#include + +#include "nsArrayEnumerator.h" +#include "nsCOMArray.h" +#include "nsIVariant.h" +#include "nsNetUtil.h" +#include "nsStringAPI.h" +#include "nsWindowsMigrationUtils.h" +#include "prtime.h" + +//////////////////////////////////////////////////////////////////////////////// +//// nsIEHistoryEnumerator + +NS_IMPL_ISUPPORTS(nsIEHistoryEnumerator, nsISimpleEnumerator) + +nsIEHistoryEnumerator::nsIEHistoryEnumerator() +{ + ::CoInitialize(nullptr); +} + +nsIEHistoryEnumerator::~nsIEHistoryEnumerator() +{ + ::CoUninitialize(); +} + +void +nsIEHistoryEnumerator::EnsureInitialized() +{ + if (mURLEnumerator) + return; + + HRESULT hr = ::CoCreateInstance(CLSID_CUrlHistory, + nullptr, + CLSCTX_INPROC_SERVER, + IID_IUrlHistoryStg2, + getter_AddRefs(mIEHistory)); + if (FAILED(hr)) + return; + + hr = mIEHistory->EnumUrls(getter_AddRefs(mURLEnumerator)); + if (FAILED(hr)) + return; +} + +NS_IMETHODIMP +nsIEHistoryEnumerator::HasMoreElements(bool* _retval) +{ + *_retval = false; + + EnsureInitialized(); + MOZ_ASSERT(mURLEnumerator, "Should have instanced an IE History URLEnumerator"); + if (!mURLEnumerator) + return NS_OK; + + STATURL statURL; + ULONG fetched; + + // First argument is not implemented, so doesn't matter what we pass. + HRESULT hr = mURLEnumerator->Next(1, &statURL, &fetched); + if (FAILED(hr) || fetched != 1UL) { + // Reached the last entry. + return NS_OK; + } + + nsCOMPtr uri; + if (statURL.pwcsUrl) { + nsDependentString url(statURL.pwcsUrl); + nsresult rv = NS_NewURI(getter_AddRefs(uri), url); + ::CoTaskMemFree(statURL.pwcsUrl); + if (NS_FAILED(rv)) { + // Got a corrupt or invalid URI, continue to the next entry. + return HasMoreElements(_retval); + } + } + + nsDependentString title(statURL.pwcsTitle ? statURL.pwcsTitle : L""); + + bool lastVisitTimeIsValid; + PRTime lastVisited = WinMigrationFileTimeToPRTime(&(statURL.ftLastVisited), &lastVisitTimeIsValid); + + mCachedNextEntry = do_CreateInstance("@mozilla.org/hash-property-bag;1"); + MOZ_ASSERT(mCachedNextEntry, "Should have instanced a new property bag"); + if (mCachedNextEntry) { + mCachedNextEntry->SetPropertyAsInterface(NS_LITERAL_STRING("uri"), uri); + mCachedNextEntry->SetPropertyAsAString(NS_LITERAL_STRING("title"), title); + if (lastVisitTimeIsValid) { + mCachedNextEntry->SetPropertyAsInt64(NS_LITERAL_STRING("time"), lastVisited); + } + + *_retval = true; + } + + if (statURL.pwcsTitle) + ::CoTaskMemFree(statURL.pwcsTitle); + + return NS_OK; +} + +NS_IMETHODIMP +nsIEHistoryEnumerator::GetNext(nsISupports** _retval) +{ + *_retval = nullptr; + + if (!mCachedNextEntry) + return NS_ERROR_FAILURE; + + NS_ADDREF(*_retval = mCachedNextEntry); + // Release the cached entry, so it can't be returned twice. + mCachedNextEntry = nullptr; + + return NS_OK; +} diff --git a/application/palemoon/components/migration/nsIEHistoryEnumerator.h b/application/palemoon/components/migration/nsIEHistoryEnumerator.h index fc1419859..1572a8dd5 100644 --- a/application/palemoon/components/migration/nsIEHistoryEnumerator.h +++ b/application/palemoon/components/migration/nsIEHistoryEnumerator.h @@ -1,37 +1,37 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef iehistoryenumerator___h___ -#define iehistoryenumerator___h___ - -#include - -#include "mozilla/Attributes.h" -#include "nsISimpleEnumerator.h" -#include "nsIWritablePropertyBag2.h" -#include "nsAutoPtr.h" - -class nsIEHistoryEnumerator final : public nsISimpleEnumerator -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSISIMPLEENUMERATOR - - nsIEHistoryEnumerator(); - -private: - ~nsIEHistoryEnumerator(); - - /** - * Initializes the history reader, if needed. - */ - void EnsureInitialized(); - - nsRefPtr mIEHistory; - nsRefPtr mURLEnumerator; - - nsCOMPtr mCachedNextEntry; -}; - -#endif +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef iehistoryenumerator___h___ +#define iehistoryenumerator___h___ + +#include + +#include "mozilla/Attributes.h" +#include "nsCOMPtr.h" +#include "nsISimpleEnumerator.h" +#include "nsIWritablePropertyBag2.h" + +class nsIEHistoryEnumerator final : public nsISimpleEnumerator +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSISIMPLEENUMERATOR + + nsIEHistoryEnumerator(); + +private: + ~nsIEHistoryEnumerator(); + + /** + * Initializes the history reader, if needed. + */ + void EnsureInitialized(); + + RefPtr mIEHistory; + RefPtr mURLEnumerator; + + nsCOMPtr mCachedNextEntry; +}; + +#endif diff --git a/application/palemoon/components/migration/nsWindowsMigrationUtils.h b/application/palemoon/components/migration/nsWindowsMigrationUtils.h new file mode 100644 index 000000000..0288d93d3 --- /dev/null +++ b/application/palemoon/components/migration/nsWindowsMigrationUtils.h @@ -0,0 +1,36 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef windowsmigrationutils__h__ +#define windowsmigrationutils__h__ + +#include "prtime.h" + +static +PRTime WinMigrationFileTimeToPRTime(FILETIME* filetime, bool* isValid) +{ + SYSTEMTIME st; + *isValid = ::FileTimeToSystemTime(filetime, &st); + if (!*isValid) { + return 0; + } + PRExplodedTime prt; + prt.tm_year = st.wYear; + // SYSTEMTIME's day-of-month parameter is 1-based, + // PRExplodedTime's is 0-based. + prt.tm_month = st.wMonth - 1; + prt.tm_mday = st.wDay; + prt.tm_hour = st.wHour; + prt.tm_min = st.wMinute; + prt.tm_sec = st.wSecond; + prt.tm_usec = st.wMilliseconds * 1000; + prt.tm_wday = 0; + prt.tm_yday = 0; + prt.tm_params.tp_gmt_offset = 0; + prt.tm_params.tp_dst_offset = 0; + return PR_ImplodeTime(&prt); +} + +#endif + -- cgit v1.2.3