diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mailnews/import/src/MorkImport.cpp | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/mailnews/import/src/MorkImport.cpp')
-rw-r--r-- | comm/mailnews/import/src/MorkImport.cpp | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/comm/mailnews/import/src/MorkImport.cpp b/comm/mailnews/import/src/MorkImport.cpp new file mode 100644 index 0000000000..4cdecb8067 --- /dev/null +++ b/comm/mailnews/import/src/MorkImport.cpp @@ -0,0 +1,343 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * 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/. */ + +/* + * Mork import addressbook interfaces + */ + +#include "MorkImport.h" + +#include "nsCOMPtr.h" +#include "nsIImportService.h" +#include "nsIImportGeneric.h" +#include "nsIImportAddressBooks.h" +#include "nsIImportABDescriptor.h" +#include "nsIImportFieldMap.h" +#include "nsImportStringBundle.h" +#include "nsIComponentManager.h" +#include "nsIAbDirectory.h" +#include "nsAddrDatabase.h" +#include "nsInterfaceHashtable.h" +#include "nsHashKeys.h" + +static const char kRowIDProperty[] = "DbRowID"; + +class MorkImportAddressImpl final : public nsIImportAddressBooks { + public: + explicit MorkImportAddressImpl(nsIStringBundle* aStringBundle); + + static nsresult Create(nsIImportAddressBooks** aImport, + nsIStringBundle* aStringBundle); + + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_NSIIMPORTADDRESSBOOKS + + private: + ~MorkImportAddressImpl() {} + nsCOMPtr<nsIFile> mFileLocation; + nsCOMPtr<nsIStringBundle> mStringBundle; +}; + +MorkImport::MorkImport() { + nsImportStringBundle::GetStringBundle( + "chrome://messenger/locale/morkImportMsgs.properties", + getter_AddRefs(mStringBundle)); +} + +MorkImport::~MorkImport() {} + +NS_IMPL_ISUPPORTS(MorkImport, nsIImportModule) + +NS_IMETHODIMP MorkImport::GetName(char16_t** name) { + NS_ENSURE_ARG_POINTER(name); + *name = + nsImportStringBundle::GetStringByName("morkImportName", mStringBundle); + return NS_OK; +} + +NS_IMETHODIMP MorkImport::GetDescription(char16_t** description) { + NS_ENSURE_ARG_POINTER(description); + *description = nsImportStringBundle::GetStringByName("morkImportDescription", + mStringBundle); + return NS_OK; +} + +NS_IMETHODIMP MorkImport::GetSupports(char** supports) { + NS_ENSURE_ARG_POINTER(supports); + *supports = strdup(NS_IMPORT_ADDRESS_STR); + return NS_OK; +} + +NS_IMETHODIMP MorkImport::GetSupportsUpgrade(bool* upgrade) { + NS_ENSURE_ARG_POINTER(upgrade); + *upgrade = false; + return NS_OK; +} + +NS_IMETHODIMP MorkImport::GetImportInterface(const char* importType, + nsISupports** interface) { + NS_ENSURE_ARG_POINTER(importType); + NS_ENSURE_ARG_POINTER(interface); + + *interface = nullptr; + nsresult rv; + + if (strcmp(importType, "addressbook")) { + return NS_ERROR_NOT_AVAILABLE; + } + + nsCOMPtr<nsIImportAddressBooks> pAddress; + nsCOMPtr<nsIImportGeneric> pGeneric; + rv = MorkImportAddressImpl::Create(getter_AddRefs(pAddress), mStringBundle); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr<nsIImportService> impSvc( + do_GetService(NS_IMPORTSERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = impSvc->CreateNewGenericAddressBooks(getter_AddRefs(pGeneric)); + NS_ENSURE_SUCCESS(rv, rv); + pGeneric->SetData("addressInterface", pAddress); + nsCOMPtr<nsISupports> pInterface(do_QueryInterface(pGeneric)); + pInterface.forget(interface); + + return NS_OK; +} + +///////////////////////////////////////////////////////////////////////////////// + +nsresult MorkImportAddressImpl::Create(nsIImportAddressBooks** aImport, + nsIStringBundle* aStringBundle) { + NS_ENSURE_ARG_POINTER(aImport); + NS_ADDREF(*aImport = new MorkImportAddressImpl(aStringBundle)); + return NS_OK; +} + +MorkImportAddressImpl::MorkImportAddressImpl(nsIStringBundle* aStringBundle) + : mStringBundle(aStringBundle) {} + +NS_IMPL_ISUPPORTS(MorkImportAddressImpl, nsIImportAddressBooks) + +NS_IMETHODIMP MorkImportAddressImpl::GetSupportsMultiple(bool* _retval) { + NS_ENSURE_ARG_POINTER(_retval); + *_retval = false; + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::GetAutoFind(char16_t** addrDescription, + bool* _retval) { + NS_ENSURE_ARG_POINTER(addrDescription); + NS_ENSURE_ARG_POINTER(_retval); + *_retval = false; + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::GetNeedsFieldMap(nsIFile* aLocation, + bool* _retval) { + NS_ENSURE_ARG_POINTER(_retval); + *_retval = false; + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::GetDefaultLocation(nsIFile** ppLoc, + bool* found, + bool* userVerify) { + NS_ENSURE_ARG_POINTER(ppLoc); + NS_ENSURE_ARG_POINTER(found); + NS_ENSURE_ARG_POINTER(userVerify); + + *ppLoc = nullptr; + *found = false; + *userVerify = true; + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::FindAddressBooks( + nsIFile* pLoc, nsTArray<RefPtr<nsIImportABDescriptor>>& books) { + NS_ENSURE_ARG_POINTER(pLoc); + + books.Clear(); + bool exists = false; + nsresult rv = pLoc->Exists(&exists); + if (NS_FAILED(rv) || !exists) return NS_ERROR_FAILURE; + + bool isFile = false; + rv = pLoc->IsFile(&isFile); + if (NS_FAILED(rv) || !isFile) return NS_ERROR_FAILURE; + + mFileLocation = pLoc; + + /* Build an address book descriptor based on the file passed in! */ + nsString name; + rv = mFileLocation->GetLeafName(name); + NS_ENSURE_SUCCESS(rv, rv); + + int32_t idx = name.RFindChar('.'); + if ((idx != -1) && (idx > 0) && ((name.Length() - idx - 1) < 5)) { + name.SetLength(idx); + } + + nsCOMPtr<nsIImportABDescriptor> desc; + + nsCOMPtr<nsIImportService> impSvc( + do_GetService(NS_IMPORTSERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + + rv = impSvc->CreateNewABDescriptor(getter_AddRefs(desc)); + NS_ENSURE_SUCCESS(rv, rv); + + int64_t sz = 0; + pLoc->GetFileSize(&sz); + desc->SetPreferredName(name); + desc->SetSize((uint32_t)sz); + desc->SetAbFile(mFileLocation); + books.AppendElement(desc); + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::InitFieldMap(nsIImportFieldMap* fieldMap) { + return NS_OK; +} + +NS_IMETHODIMP +MorkImportAddressImpl::ImportAddressBook( + nsIImportABDescriptor* pSource, nsIAbDirectory* pDestination, + nsIImportFieldMap* fieldMap, nsISupports* aSupportService, + char16_t** pErrorLog, char16_t** pSuccessLog, bool* fatalError) { + NS_ENSURE_ARG_POINTER(pSource); + NS_ENSURE_ARG_POINTER(pDestination); + NS_ENSURE_ARG_POINTER(fatalError); + + nsCOMPtr<nsIFile> oldFile; + pSource->GetAbFile(getter_AddRefs(oldFile)); + + nsresult rv = ReadMABToDirectory(oldFile, pDestination); + + *pSuccessLog = + nsImportStringBundle::GetStringByName("morkImportSuccess", mStringBundle); + return rv; +} + +nsresult ReadMABToDirectory(nsIFile* oldFile, nsIAbDirectory* newDirectory) { + nsresult rv; + + nsAddrDatabase database = nsAddrDatabase(); + database.SetDbPath(oldFile); + database.OpenMDB(oldFile, false); + + nsInterfaceHashtable<nsUint32HashKey, nsIAbCard> cardMap; + + nsCOMPtr<nsISimpleEnumerator> enumerator; + database.EnumerateCards(getter_AddRefs(enumerator)); + + nsCOMPtr<nsISupports> supports; + nsCOMPtr<nsIAbCard> card; + bool isMailList; + while (NS_SUCCEEDED(enumerator->GetNext(getter_AddRefs(supports))) && + supports) { + card = do_QueryInterface(supports); + + card->GetIsMailList(&isMailList); + if (isMailList) { + continue; + } + + uint32_t rowId; + card->GetPropertyAsUint32(kRowIDProperty, &rowId); + cardMap.InsertOrUpdate(rowId, card); + + nsIAbCard* outCard; + newDirectory->AddCard(card, &outCard); + } + + database.EnumerateCards(getter_AddRefs(enumerator)); + + while (NS_SUCCEEDED(enumerator->GetNext(getter_AddRefs(supports))) && + supports) { + card = do_QueryInterface(supports); + card->GetIsMailList(&isMailList); + + if (!isMailList) { + continue; + } + + nsCOMPtr<nsIAbDirectory> mailList = + do_CreateInstance("@mozilla.org/addressbook/directoryproperty;1"); + mailList->SetIsMailList(true); + + nsAutoString listName; + card->GetDisplayName(listName); + mailList->SetDirName(listName); + + nsAutoString nickName; + rv = card->GetPropertyAsAString("NickName", nickName); + if (NS_SUCCEEDED(rv)) { + mailList->SetListNickName(nickName); + } + + nsAutoString description; + rv = card->GetPropertyAsAString("Notes", description); + if (NS_SUCCEEDED(rv)) { + mailList->SetDescription(description); + } + + nsIAbDirectory* outList; + rv = newDirectory->AddMailList(mailList, &outList); + if (NS_FAILED(rv)) { + continue; + } + + uint32_t listRowId; + card->GetPropertyAsUint32(kRowIDProperty, &listRowId); + + nsCOMPtr<nsISimpleEnumerator> listEnumerator; + database.EnumerateListAddresses(listRowId, getter_AddRefs(listEnumerator)); + + nsCOMPtr<nsISupports> listSupports; + nsCOMPtr<nsIAbCard> listCard; + while ( + NS_SUCCEEDED(listEnumerator->GetNext(getter_AddRefs(listSupports))) && + listSupports) { + listCard = do_QueryInterface(listSupports); + + uint32_t rowId; + listCard->GetPropertyAsUint32(kRowIDProperty, &rowId); + cardMap.Get(rowId, getter_AddRefs(listCard)); + + nsIAbCard* outCard; + outList->AddCard(listCard, &outCard); + } + } + + database.ForceClosed(); + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::GetImportProgress(uint32_t* _retval) { + NS_ENSURE_ARG_POINTER(_retval); + *_retval = 0; + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::SetSampleLocation(nsIFile* pLocation) { + NS_ENSURE_ARG_POINTER(pLocation); + return NS_OK; +} + +NS_IMETHODIMP MorkImportAddressImpl::GetSampleData(int32_t index, bool* pFound, + char16_t** pStr) { + return NS_OK; +} + +NS_IMPL_ISUPPORTS(nsImportABFromMab, nsIImportABFile) + +nsImportABFromMab::nsImportABFromMab() {} + +NS_IMETHODIMP +nsImportABFromMab::ReadFileToDirectory(nsIFile* sourceFile, + nsIAbDirectory* targetDirectory) { + return ReadMABToDirectory(sourceFile, targetDirectory); +} |