586 lines
12 KiB
C++
586 lines
12 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Pierre Phaneuf <pp@ludusdesign.com>
|
|
*/
|
|
|
|
|
|
#include "nscore.h"
|
|
#include "nsIStringBundle.h"
|
|
#include "nsImportFieldMap.h"
|
|
#include "nsImportStringBundle.h"
|
|
|
|
#include "ImportDebug.h"
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
NS_METHOD nsImportFieldMap::Create( nsISupports *aOuter, REFNSIID aIID, void **aResult)
|
|
{
|
|
if (aOuter)
|
|
return NS_ERROR_NO_AGGREGATION;
|
|
|
|
nsImportFieldMap *it = new nsImportFieldMap();
|
|
if (it == nsnull)
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
NS_ADDREF( it);
|
|
nsresult rv = it->QueryInterface( aIID, aResult);
|
|
NS_RELEASE( it);
|
|
return rv;
|
|
}
|
|
|
|
NS_IMPL_THREADSAFE_ISUPPORTS(nsImportFieldMap, NS_GET_IID(nsIImportFieldMap));
|
|
|
|
nsImportFieldMap::nsImportFieldMap()
|
|
{
|
|
NS_INIT_ISUPPORTS();
|
|
m_numFields = 0;
|
|
m_pFields = nsnull;
|
|
m_pActive = nsnull;
|
|
m_allocated = 0;
|
|
// need to init the description array
|
|
m_mozFieldCount = 0;
|
|
nsIStringBundle *pBundle = nsImportStringBundle::GetStringBundleProxy();
|
|
|
|
nsString *pStr;
|
|
for (PRInt32 i = IMPORT_FIELD_DESC_START; i <= IMPORT_FIELD_DESC_END; i++, m_mozFieldCount++) {
|
|
pStr = new nsString();
|
|
if (pBundle) {
|
|
nsImportStringBundle::GetStringByID( i, *pStr, pBundle);
|
|
}
|
|
else
|
|
pStr->AppendInt( i);
|
|
m_descriptions.AppendElement( (void *)pStr);
|
|
}
|
|
|
|
NS_IF_RELEASE( pBundle);
|
|
}
|
|
|
|
nsImportFieldMap::~nsImportFieldMap()
|
|
{
|
|
if (m_pFields)
|
|
delete [] m_pFields;
|
|
if (m_pActive)
|
|
delete [] m_pActive;
|
|
|
|
nsString * pStr;
|
|
for (PRInt32 i = 0; i < m_mozFieldCount; i++) {
|
|
pStr = (nsString *) m_descriptions.ElementAt( i);
|
|
delete pStr;
|
|
}
|
|
m_descriptions.Clear();
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::GetNumMozFields(PRInt32 *aNumFields)
|
|
{
|
|
NS_PRECONDITION(aNumFields != nsnull, "null ptr");
|
|
if (!aNumFields)
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
*aNumFields = m_mozFieldCount;
|
|
return( NS_OK);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::GetMapSize(PRInt32 *aNumFields)
|
|
{
|
|
NS_PRECONDITION(aNumFields != nsnull, "null ptr");
|
|
if (!aNumFields)
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
*aNumFields = m_numFields;
|
|
return( NS_OK);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::GetFieldDescription(PRInt32 index, PRUnichar **_retval)
|
|
{
|
|
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
|
if (!_retval)
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
*_retval = nsnull;
|
|
if ((index < 0) || (index >= m_descriptions.Count()))
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
*_retval = ((nsString *)m_descriptions.ElementAt( index))->ToNewUnicode();
|
|
return( NS_OK);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::SetFieldMapSize(PRInt32 size)
|
|
{
|
|
nsresult rv = Allocate( size);
|
|
if (NS_FAILED( rv))
|
|
return( rv);
|
|
|
|
m_numFields = size;
|
|
|
|
return( NS_OK);
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::DefaultFieldMap(PRInt32 size)
|
|
{
|
|
nsresult rv = SetFieldMapSize( size);
|
|
if (NS_FAILED( rv))
|
|
return( rv);
|
|
for (PRInt32 i = 0; i < size; i++) {
|
|
m_pFields[i] = i;
|
|
m_pActive[i] = PR_TRUE;
|
|
}
|
|
|
|
return( NS_OK);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::GetFieldMap(PRInt32 index, PRInt32 *_retval)
|
|
{
|
|
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
|
if (!_retval)
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
|
|
if ((index < 0) || (index >= m_numFields))
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
*_retval = m_pFields[index];
|
|
return( NS_OK);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::SetFieldMap(PRInt32 index, PRInt32 fieldNum)
|
|
{
|
|
if (index == -1) {
|
|
nsresult rv = Allocate( m_numFields + 1);
|
|
if (NS_FAILED( rv))
|
|
return( rv);
|
|
index = m_numFields;
|
|
m_numFields++;
|
|
}
|
|
else {
|
|
if ((index < 0) || (index >= m_numFields))
|
|
return( NS_ERROR_FAILURE);
|
|
}
|
|
|
|
if ((fieldNum != -1) && ((fieldNum < 0) || (fieldNum >= m_mozFieldCount)))
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
m_pFields[index] = fieldNum;
|
|
return( NS_OK);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::SetFieldMapByDescription(PRInt32 index, const PRUnichar *fieldDesc)
|
|
{
|
|
NS_PRECONDITION(fieldDesc != nsnull, "null ptr");
|
|
if (!fieldDesc)
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
PRInt32 i = FindFieldNum( fieldDesc);
|
|
if (i == -1)
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
return( SetFieldMap( index, i));
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::GetFieldActive(PRInt32 index, PRBool *active)
|
|
{
|
|
NS_PRECONDITION(active != nsnull, "null ptr");
|
|
if (!active)
|
|
return NS_ERROR_NULL_POINTER;
|
|
if ((index < 0) || (index >= m_numFields))
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
*active = m_pActive[index];
|
|
return( NS_OK);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::SetFieldActive(PRInt32 index, PRBool active)
|
|
{
|
|
if ((index < 0) || (index >= m_numFields))
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
m_pActive[index] = active;
|
|
return( NS_OK);
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::SetFieldValue(nsIAddrDatabase *database, nsIMdbRow *row, PRInt32 fieldNum, const PRUnichar *value)
|
|
{
|
|
NS_PRECONDITION(database != nsnull, "null ptr");
|
|
NS_PRECONDITION(row != nsnull, "null ptr");
|
|
NS_PRECONDITION(value != nsnull, "null ptr");
|
|
if (!database || !row || !value)
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
// Allow the special value for a null field
|
|
if (fieldNum == -1)
|
|
return( NS_OK);
|
|
|
|
if ((fieldNum < 0) || (fieldNum >= m_mozFieldCount))
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
// UGGG!!!!! lot's of typing here!
|
|
nsresult rv;
|
|
|
|
nsString str(value);
|
|
char *pVal = str.ToNewUTF8String();
|
|
|
|
switch( fieldNum) {
|
|
case 0:
|
|
rv = database->AddFirstName( row, pVal);
|
|
break;
|
|
case 1:
|
|
rv = database->AddLastName( row, pVal);
|
|
break;
|
|
case 2:
|
|
rv = database->AddDisplayName( row, pVal);
|
|
break;
|
|
case 3:
|
|
rv = database->AddNickName( row, pVal);
|
|
break;
|
|
case 4:
|
|
rv = database->AddPrimaryEmail( row, pVal);
|
|
break;
|
|
case 5:
|
|
rv = database->Add2ndEmail( row, pVal);
|
|
break;
|
|
case 6:
|
|
rv = database->AddWorkPhone( row, pVal);
|
|
break;
|
|
case 7:
|
|
rv = database->AddHomePhone( row, pVal);
|
|
break;
|
|
case 8:
|
|
rv = database->AddFaxNumber( row, pVal);
|
|
break;
|
|
case 9:
|
|
rv = database->AddPagerNumber( row, pVal);
|
|
break;
|
|
case 10:
|
|
rv = database->AddCellularNumber( row, pVal);
|
|
break;
|
|
case 11:
|
|
rv = database->AddHomeAddress( row, pVal);
|
|
break;
|
|
case 12:
|
|
rv = database->AddHomeAddress2( row, pVal);
|
|
break;
|
|
case 13:
|
|
rv = database->AddHomeCity( row, pVal);
|
|
break;
|
|
case 14:
|
|
rv = database->AddHomeState( row, pVal);
|
|
break;
|
|
case 15:
|
|
rv = database->AddHomeZipCode( row, pVal);
|
|
break;
|
|
case 16:
|
|
rv = database->AddHomeCountry( row, pVal);
|
|
break;
|
|
case 17:
|
|
rv = database->AddWorkAddress( row, pVal);
|
|
break;
|
|
case 18:
|
|
rv = database->AddWorkAddress2( row, pVal);
|
|
break;
|
|
case 19:
|
|
rv = database->AddWorkCity( row, pVal);
|
|
break;
|
|
case 20:
|
|
rv = database->AddWorkState( row, pVal);
|
|
break;
|
|
case 21:
|
|
rv = database->AddWorkZipCode( row, pVal);
|
|
break;
|
|
case 22:
|
|
rv = database->AddWorkCountry( row, pVal);
|
|
break;
|
|
case 23:
|
|
rv = database->AddJobTitle(row, pVal);
|
|
break;
|
|
case 24:
|
|
rv = database->AddDepartment(row, pVal);
|
|
break;
|
|
case 25:
|
|
rv = database->AddCompany(row, pVal);
|
|
break;
|
|
case 26:
|
|
rv = database->AddWebPage1(row, pVal);
|
|
break;
|
|
case 27:
|
|
rv = database->AddWebPage2(row, pVal);
|
|
break;
|
|
case 28:
|
|
rv = database->AddBirthYear(row, pVal);
|
|
break;
|
|
case 29:
|
|
rv = database->AddBirthMonth(row, pVal);
|
|
break;
|
|
case 30:
|
|
rv = database->AddBirthDay(row, pVal);
|
|
break;
|
|
case 31:
|
|
rv = database->AddCustom1(row, pVal);
|
|
break;
|
|
case 32:
|
|
rv = database->AddCustom2(row, pVal);
|
|
break;
|
|
case 33:
|
|
rv = database->AddCustom3(row, pVal);
|
|
break;
|
|
case 34:
|
|
rv = database->AddCustom4(row, pVal);
|
|
break;
|
|
case 35:
|
|
rv = database->AddNotes(row, pVal);
|
|
break;
|
|
default:
|
|
/* Get the field description, and add it as an anonymous attr? */
|
|
/* OR WHAT???? */
|
|
{
|
|
rv = NS_ERROR_FAILURE;
|
|
}
|
|
}
|
|
|
|
nsCRT::free( pVal);
|
|
|
|
return( rv);
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::SetFieldValueByDescription(nsIAddrDatabase *database, nsIMdbRow *row, const PRUnichar *fieldDesc, const PRUnichar *value)
|
|
{
|
|
NS_PRECONDITION(fieldDesc != nsnull, "null ptr");
|
|
if (!fieldDesc)
|
|
return NS_ERROR_NULL_POINTER;
|
|
PRInt32 i = FindFieldNum( fieldDesc);
|
|
if (i == -1)
|
|
return( NS_ERROR_FAILURE);
|
|
return( SetFieldValue( database, row, i, value));
|
|
}
|
|
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::GetFieldValue(nsIAbCard *card, PRInt32 fieldNum, PRUnichar **_retval)
|
|
{
|
|
NS_PRECONDITION(_retval != nsnull, "null ptr");
|
|
NS_PRECONDITION(card != nsnull, "null ptr");
|
|
if (!_retval || !card)
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
if (fieldNum == -1) {
|
|
PRUnichar c = 0;
|
|
*_retval = nsCRT::strdup( &c);
|
|
return( NS_OK);
|
|
}
|
|
|
|
if ((fieldNum < 0) || (fieldNum >= m_mozFieldCount))
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
// ARRGGG!!! Lots of typing again
|
|
// get the field from the card
|
|
nsresult rv;
|
|
PRUnichar * pVal = nsnull;
|
|
|
|
switch (fieldNum) {
|
|
case 0:
|
|
rv = card->GetFirstName( &pVal);
|
|
break;
|
|
case 1:
|
|
rv = card->GetLastName( &pVal);
|
|
break;
|
|
case 2:
|
|
rv = card->GetDisplayName( &pVal);
|
|
break;
|
|
case 3:
|
|
rv = card->GetNickName( &pVal);
|
|
break;
|
|
case 4:
|
|
rv = card->GetPrimaryEmail( &pVal);
|
|
break;
|
|
case 5:
|
|
rv = card->GetSecondEmail( &pVal);
|
|
break;
|
|
case 6:
|
|
rv = card->GetWorkPhone( &pVal);
|
|
break;
|
|
case 7:
|
|
rv = card->GetHomePhone( &pVal);
|
|
break;
|
|
case 8:
|
|
rv = card->GetFaxNumber( &pVal);
|
|
break;
|
|
case 9:
|
|
rv = card->GetPagerNumber( &pVal);
|
|
break;
|
|
case 10:
|
|
rv = card->GetCellularNumber( &pVal);
|
|
break;
|
|
case 11:
|
|
rv = card->GetHomeAddress( &pVal);
|
|
break;
|
|
case 12:
|
|
rv = card->GetHomeAddress2( &pVal);
|
|
break;
|
|
case 13:
|
|
rv = card->GetHomeCity( &pVal);
|
|
break;
|
|
case 14:
|
|
rv = card->GetHomeState( &pVal);
|
|
break;
|
|
case 15:
|
|
rv = card->GetHomeZipCode( &pVal);
|
|
break;
|
|
case 16:
|
|
rv = card->GetHomeCountry( &pVal);
|
|
break;
|
|
case 17:
|
|
rv = card->GetWorkAddress( &pVal);
|
|
break;
|
|
case 18:
|
|
rv = card->GetWorkAddress2( &pVal);
|
|
break;
|
|
case 19:
|
|
rv = card->GetWorkCity( &pVal);
|
|
break;
|
|
case 20:
|
|
rv = card->GetWorkState( &pVal);
|
|
break;
|
|
case 21:
|
|
rv = card->GetWorkZipCode( &pVal);
|
|
break;
|
|
case 22:
|
|
rv = card->GetWorkCountry( &pVal);
|
|
break;
|
|
case 23:
|
|
rv = card->GetJobTitle( &pVal);
|
|
break;
|
|
case 24:
|
|
rv = card->GetDepartment( &pVal);
|
|
break;
|
|
case 25:
|
|
rv = card->GetCompany( &pVal);
|
|
break;
|
|
case 26:
|
|
rv = card->GetWebPage1( &pVal);
|
|
break;
|
|
case 27:
|
|
rv = card->GetWebPage2( &pVal);
|
|
break;
|
|
case 28:
|
|
rv = card->GetBirthYear( &pVal);
|
|
break;
|
|
case 29:
|
|
rv = card->GetBirthMonth( &pVal);
|
|
break;
|
|
case 30:
|
|
rv = card->GetBirthDay( &pVal);
|
|
break;
|
|
case 31:
|
|
rv = card->GetCustom1( &pVal);
|
|
break;
|
|
case 32:
|
|
rv = card->GetCustom2( &pVal);
|
|
break;
|
|
case 33:
|
|
rv = card->GetCustom3( &pVal);
|
|
break;
|
|
case 34:
|
|
rv = card->GetCustom4( &pVal);
|
|
break;
|
|
case 35:
|
|
rv = card->GetNotes( &pVal);
|
|
break;
|
|
default:
|
|
/* Get the field description, and add it as an anonymous attr? */
|
|
/* OR WHAT???? */
|
|
{
|
|
rv = NS_ERROR_FAILURE;
|
|
}
|
|
}
|
|
|
|
*_retval = pVal;
|
|
|
|
return( rv);
|
|
}
|
|
|
|
NS_IMETHODIMP nsImportFieldMap::GetFieldValueByDescription(nsIAbCard *card, const PRUnichar *fieldDesc, PRUnichar **_retval)
|
|
{
|
|
NS_PRECONDITION(fieldDesc != nsnull, "null ptr");
|
|
if (!fieldDesc)
|
|
return NS_ERROR_NULL_POINTER;
|
|
PRInt32 i = FindFieldNum( fieldDesc);
|
|
if (i == -1)
|
|
return( NS_ERROR_FAILURE);
|
|
return( GetFieldValue( card, i, _retval));
|
|
}
|
|
|
|
|
|
nsresult nsImportFieldMap::Allocate( PRInt32 newSize)
|
|
{
|
|
if (newSize <= m_allocated)
|
|
return( NS_OK);
|
|
|
|
PRInt32 sz = m_allocated;
|
|
while (sz < newSize)
|
|
sz += 30;
|
|
|
|
PRInt32 *pData = new PRInt32[ sz];
|
|
if (!pData)
|
|
return( NS_ERROR_FAILURE);
|
|
PRBool *pActive = new PRBool[sz];
|
|
if (!pActive)
|
|
return( NS_ERROR_FAILURE);
|
|
|
|
|
|
PRInt32 i;
|
|
for (i = 0; i < sz; i++) {
|
|
pData[i] = -1;
|
|
pActive[i] = PR_TRUE;
|
|
}
|
|
if (m_numFields) {
|
|
for (i = 0; i < m_numFields; i++) {
|
|
pData[i] = m_pFields[i];
|
|
pActive[i] = m_pActive[i];
|
|
}
|
|
delete [] m_pFields;
|
|
delete [] m_pActive;
|
|
}
|
|
m_allocated = sz;
|
|
m_pFields = pData;
|
|
m_pActive = pActive;
|
|
return( NS_OK);
|
|
}
|
|
|
|
PRInt32 nsImportFieldMap::FindFieldNum( const PRUnichar *pDesc)
|
|
{
|
|
nsString * pStr;
|
|
for (PRInt32 i = 0; i < m_mozFieldCount; i++) {
|
|
pStr = (nsString *)m_descriptions.ElementAt( i);
|
|
if (!pStr->Compare( nsAutoString(pDesc)))
|
|
return( i);
|
|
}
|
|
|
|
return( -1);
|
|
}
|
|
|
|
|