diff options
Diffstat (limited to 'connectivity/source/drivers/macab/MacabAddressBook.cxx')
-rwxr-xr-x | connectivity/source/drivers/macab/MacabAddressBook.cxx | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/connectivity/source/drivers/macab/MacabAddressBook.cxx b/connectivity/source/drivers/macab/MacabAddressBook.cxx new file mode 100755 index 000000000000..6496702adc7a --- /dev/null +++ b/connectivity/source/drivers/macab/MacabAddressBook.cxx @@ -0,0 +1,256 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "MacabAddressBook.hxx" +#include "MacabRecords.hxx" +#include "MacabGroup.hxx" + +#include <vector> + +#include <premac.h> +#include <Carbon/Carbon.h> +#include <AddressBook/ABAddressBookC.h> +#include <postmac.h> +#include "connectivity/CommonTools.hxx" + +using namespace connectivity::macab; +using namespace ::com::sun::star::uno; + +// ----------------------------------------------------------------------------- +MacabAddressBook::MacabAddressBook( ) +{ + m_aAddressBook = ABGetSharedAddressBook(); + m_xMacabRecords = NULL; + m_bRetrievedGroups = sal_False; +} + +// ----------------------------------------------------------------------------- +MacabAddressBook::~MacabAddressBook() +{ + if(m_xMacabRecords != NULL) + { + delete m_xMacabRecords; + m_xMacabRecords = NULL; + } + + if(!m_xMacabGroups.empty()) + { + ::std::vector<MacabGroup *>::iterator iter, end; + iter = m_xMacabGroups.begin(); + end = m_xMacabGroups.end(); + for( ; iter != end; ++iter) + delete (*iter); + } + + m_bRetrievedGroups = sal_False; +} + +// ----------------------------------------------------------------------------- +/* Get the address book's default table name. This is the table name that + * refers to the table containing _all_ records in the address book. + */ +const ::rtl::OUString & MacabAddressBook::getDefaultTableName() +{ + /* This string probably needs to be localized. */ + static const ::rtl::OUString aDefaultTableName + (::rtl::OUString::createFromAscii("Address Book")); + + return aDefaultTableName; +} + +// ----------------------------------------------------------------------------- +MacabRecords *MacabAddressBook::getMacabRecords() +{ + /* If the MacabRecords don't exist, create them. */ + if(m_xMacabRecords == NULL) + { + m_xMacabRecords = new MacabRecords(m_aAddressBook); + m_xMacabRecords->setName(getDefaultTableName()); + m_xMacabRecords->initialize(); + } + + return m_xMacabRecords; +} + +// ----------------------------------------------------------------------------- +/* Get the MacabRecords for a given name: either a group name or the + * default table name. + */ +MacabRecords *MacabAddressBook::getMacabRecords(const ::rtl::OUString _tableName) +{ + if(_tableName == getDefaultTableName()) + { + return getMacabRecords(); + } + else + { + return getMacabGroup(_tableName); + } +} + +// ----------------------------------------------------------------------------- +MacabRecords *MacabAddressBook::getMacabRecordsMatch(const ::rtl::OUString _tableName) +{ + if(match(_tableName, getDefaultTableName(), '\0')) + { + return getMacabRecords(); + } + + return getMacabGroupMatch(_tableName); +} + +// ----------------------------------------------------------------------------- +::std::vector<MacabGroup *> MacabAddressBook::getMacabGroups() +{ + /* If the MacabGroups haven't been created yet, create them. */ + if(m_bRetrievedGroups == sal_False) + { + /* If the MacabRecords haven't been created yet, create them. */ + if(m_xMacabRecords == NULL) + { + m_xMacabRecords = new MacabRecords(m_aAddressBook); + m_xMacabRecords->setName(getDefaultTableName()); + m_xMacabRecords->initialize(); + } + + CFArrayRef allGroups = ABCopyArrayOfAllGroups(m_aAddressBook); + sal_Int32 nGroups = CFArrayGetCount(allGroups); + m_xMacabGroups = ::std::vector<MacabGroup *>(nGroups); + + sal_Int32 i; + ABGroupRef xGroup; + + /* Go through each group and create a MacabGroup out of it. */ + for(i = 0; i < nGroups; i++) + { + xGroup = (ABGroupRef) CFArrayGetValueAtIndex(allGroups, i); + m_xMacabGroups[i] = new MacabGroup(m_aAddressBook, m_xMacabRecords, xGroup); + } + + CFRelease(allGroups); + + /* Manage duplicates. */ + manageDuplicateGroups(m_xMacabGroups); + m_bRetrievedGroups = sal_True; + } + + return m_xMacabGroups; +} + +// ----------------------------------------------------------------------------- +MacabGroup *MacabAddressBook::getMacabGroup(::rtl::OUString _groupName) +{ + // initialize groups if not already initialized + if(m_bRetrievedGroups == sal_False) + getMacabGroups(); + + sal_Int32 nGroups = m_xMacabGroups.size(); + sal_Int32 i; + + for(i = 0; i < nGroups; i++) + { + if(m_xMacabGroups[i] != NULL) + { + if(m_xMacabGroups[i]->getName() == _groupName) + { + return m_xMacabGroups[i]; + } + } + } + + return NULL; +} + +// ----------------------------------------------------------------------------- +MacabGroup *MacabAddressBook::getMacabGroupMatch(::rtl::OUString _groupName) +{ + // initialize groups if not already initialized + if(m_bRetrievedGroups == sal_False) + getMacabGroups(); + + sal_Int32 nGroups = m_xMacabGroups.size(); + sal_Int32 i; + + for(i = 0; i < nGroups; i++) + { + if(m_xMacabGroups[i] != NULL) + { + if(match(m_xMacabGroups[i]->getName(), _groupName, '\0')) + { + return m_xMacabGroups[i]; + } + } + } + + return NULL; +} + +// ------------------------------------------------------------------------- +void MacabAddressBook::manageDuplicateGroups(::std::vector<MacabGroup *> _xGroups) const +{ + /* If we have two cases of groups, say, family, this makes it: + * family + * family (2) + */ + ::std::vector<MacabGroup *>::reverse_iterator iter1, iter2; + sal_Int32 count; + + for(iter1 = _xGroups.rbegin(); iter1 != _xGroups.rend(); ++iter1) + { + /* If the name matches the default table name, there is already + * (obviously) a conflict. So, start the count of groups with this + * name at 2 instead of 1. + */ + if( (*iter1)->getName() == getDefaultTableName() ) + count = 2; + else + count = 1; + + iter2 = iter1; + for( ++iter2; iter2 != _xGroups.rend(); ++iter2) + { + if( (*iter1)->getName() == (*iter2)->getName() ) + { + count++; + } + } + + // duplicate! + if(count != 1) + { + ::rtl::OUString sName = (*iter1)->getName(); + sName += ::rtl::OUString::createFromAscii(" (") + + ::rtl::OUString::valueOf(count) + + ::rtl::OUString::createFromAscii(")"); + (*iter1)->setName(sName); + } + } +} + |