diff --git a/mailnews/addrbook/public/nsIAbDirectory.idl b/mailnews/addrbook/public/nsIAbDirectory.idl index e6471d80eaf8..de8e1b8b0514 100644 --- a/mailnews/addrbook/public/nsIAbDirectory.idl +++ b/mailnews/addrbook/public/nsIAbDirectory.idl @@ -45,6 +45,6 @@ interface nsIAbDirectory : nsISupports { void HasCard(in nsIAbCard cards, out boolean hasCard); void HasDirectory(in nsIAbDirectory dir, out boolean hasDir); void GetMailingList(out nsIEnumerator mailingList); - void CreateNewDirectory(in string dirName); + void CreateNewDirectory(in string dirName, in string fileName); }; diff --git a/mailnews/addrbook/public/nsIAddrDatabase.idl b/mailnews/addrbook/public/nsIAddrDatabase.idl index a54b7023024c..c296fb09a479 100644 --- a/mailnews/addrbook/public/nsIAddrDatabase.idl +++ b/mailnews/addrbook/public/nsIAddrDatabase.idl @@ -23,6 +23,8 @@ [ptr] native nsIMdbTableRowCursor(nsIMdbTableRowCursor); [ptr] native nsIMdbEnv(nsIMdbEnv); +[ptr] native nsIMdbRow(nsIMdbRow); +[ptr] native nsString(nsString); %{C++ #include "mdb.h" @@ -66,5 +68,43 @@ interface nsIAddrDatabase : nsIAddrDBAnnouncer { void AddAnonymousAttributesFromCard(in nsIAbCard card); void RemoveAnonymousAttributesFromCard(in nsIAbCard card); void EditAnonymousAttributesFromCard(in nsIAbCard card); - + + [noscript] void GetNewRow(out nsIMdbRow newRow); + [noscript] void AddCardRowToDB(in nsIMdbRow newRow); + [noscript] void AddFirstName(in nsIMdbRow row, in nsString value); + [noscript] void AddLastName(in nsIMdbRow row, in nsString value); + [noscript] void AddDisplayName(in nsIMdbRow row, in nsString value); + [noscript] void AddNickName(in nsIMdbRow row, in nsString value); + [noscript] void AddPrimaryEmail(in nsIMdbRow row, in nsString value); + [noscript] void Add2ndEmail(in nsIMdbRow row, in nsString value); + [noscript] void AddWorkPhone(in nsIMdbRow row, in nsString value); + [noscript] void AddHomePhone(in nsIMdbRow row, in nsString value); + [noscript] void AddFaxNumber(in nsIMdbRow row, in nsString value); + [noscript] void AddPagerNumber(in nsIMdbRow row, in nsString value); + [noscript] void AddCellularNumber(in nsIMdbRow row, in nsString value); + [noscript] void AddHomeAddress(in nsIMdbRow row, in nsString value); + [noscript] void AddHomeAddress2(in nsIMdbRow row, in nsString value); + [noscript] void AddHomeCity(in nsIMdbRow row, in nsString value); + [noscript] void AddHomeState(in nsIMdbRow row, in nsString value); + [noscript] void AddHomeZipCode(in nsIMdbRow row, in nsString value); + [noscript] void AddHomeCountry(in nsIMdbRow row, in nsString value); + [noscript] void AddWorkAddress(in nsIMdbRow row, in nsString value); + [noscript] void AddWorkAddress2(in nsIMdbRow row, in nsString value); + [noscript] void AddWorkCity(in nsIMdbRow row, in nsString value); + [noscript] void AddWorkState(in nsIMdbRow row, in nsString value); + [noscript] void AddWorkZipCode(in nsIMdbRow row, in nsString value); + [noscript] void AddWorkCountry(in nsIMdbRow row, in nsString value); + [noscript] void AddJobTitle(in nsIMdbRow row, in nsString value); + [noscript] void AddDepartment(in nsIMdbRow row, in nsString value); + [noscript] void AddCompany(in nsIMdbRow row, in nsString value); + [noscript] void AddWebPage1(in nsIMdbRow row, in nsString value); + [noscript] void AddWebPage2(in nsIMdbRow row, in nsString value); + [noscript] void AddBirthYear(in nsIMdbRow row, in nsString value); + [noscript] void AddBirthMonth(in nsIMdbRow row, in nsString value); + [noscript] void AddBirthDay(in nsIMdbRow row, in nsString value); + [noscript] void AddCustom1(in nsIMdbRow row, in nsString value); + [noscript] void AddCustom2(in nsIMdbRow row, in nsString value); + [noscript] void AddCustom3(in nsIMdbRow row, in nsString value); + [noscript] void AddCustom4(in nsIMdbRow row, in nsString value); + [noscript] void AddNotes(in nsIMdbRow row, in nsString value); }; diff --git a/mailnews/addrbook/public/nsIAddressBook.idl b/mailnews/addrbook/public/nsIAddressBook.idl index e749de836e3b..8708a319e68e 100644 --- a/mailnews/addrbook/public/nsIAddressBook.idl +++ b/mailnews/addrbook/public/nsIAddressBook.idl @@ -38,5 +38,6 @@ interface nsIAddressBook : nsISupports { void PrintCard(); void PrintAddressbook(); void SetWebShellWindow(in nsIDOMWindow win); + void ImportAddressBook(); }; diff --git a/mailnews/addrbook/src/nsAbDirProperty.h b/mailnews/addrbook/src/nsAbDirProperty.h index 94629dd1f3be..ee00671582b1 100644 --- a/mailnews/addrbook/src/nsAbDirProperty.h +++ b/mailnews/addrbook/src/nsAbDirProperty.h @@ -62,7 +62,7 @@ public: NS_IMETHOD HasCard(nsIAbCard *cards, PRBool *hasCard) { return NS_OK; } NS_IMETHOD HasDirectory(nsIAbDirectory *dir, PRBool *hasDir) { return NS_OK; } NS_IMETHOD GetMailingList(nsIEnumerator **mailingList) { return NS_OK; } - NS_IMETHOD CreateNewDirectory(const char *dirName) { return NS_OK; } + NS_IMETHOD CreateNewDirectory(const char *dirName, const char *fileName) { return NS_OK; } protected: diff --git a/mailnews/addrbook/src/nsAbDirectory.cpp b/mailnews/addrbook/src/nsAbDirectory.cpp index 1d78fcedfc98..f1ac9ad8292b 100644 --- a/mailnews/addrbook/src/nsAbDirectory.cpp +++ b/mailnews/addrbook/src/nsAbDirectory.cpp @@ -217,13 +217,13 @@ NS_IMETHODIMP nsAbDirectory::GetMailingList(nsIEnumerator **mailingList) return rv; } -NS_IMETHODIMP nsAbDirectory::CreateNewDirectory(const char *dirName) +NS_IMETHODIMP nsAbDirectory::CreateNewDirectory(const char *dirName, const char *fileName) { if (!dirName) return NS_ERROR_NULL_POINTER; DIR_Server * server = nsnull; - nsresult rv = DIR_AddNewAddressBook(dirName, &server); + nsresult rv = DIR_AddNewAddressBook(dirName, fileName, &server); nsCOMPtr newDir; char *uri = PR_smprintf("%s%s", kDirectoryDataSourceRoot, server->fileName); @@ -236,9 +236,9 @@ NS_IMETHODIMP nsAbDirectory::CreateNewDirectory(const char *dirName) newDir->SetDirName(server->description); newDir->SetServer(server); - nsCOMPtr dirSupports(do_QueryInterface(newDir, &rv)); +// nsCOMPtr dirSupports(do_QueryInterface(newDir, &rv)); - if (NS_SUCCEEDED(rv)) +// if (NS_SUCCEEDED(rv)) NotifyItemAdded(newDir); return rv; } @@ -317,6 +317,76 @@ NS_IMETHODIMP nsAbDirectory::DeleteCards(nsISupportsArray *cards) return rv; } +nsresult nsAbDirectory::DeleteDirectoryCards(nsIAbDirectory* directory, DIR_Server *server) +{ + nsresult rv = NS_OK; + nsFileSpec* dbPath = nsnull; + nsCOMPtr database; + + + NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); + if(NS_SUCCEEDED(rv)) + abSession->GetUserProfileDirectory(&dbPath); + + if (dbPath) + { + (*dbPath) += server->fileName; + + // close file before delete it + NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); + + if (NS_SUCCEEDED(rv) && addrDBFactory) + rv = addrDBFactory->Open(dbPath, PR_FALSE, getter_AddRefs(database), PR_TRUE); + } + + /* delete cards */ + nsCOMPtr cardArray; + nsCOMPtr cardChild; + + NS_NewISupportsArray(getter_AddRefs(cardArray)); + rv = directory->GetChildCards(getter_AddRefs(cardChild)); + + if (NS_SUCCEEDED(rv) && cardChild) + { + nsCOMPtr item; + rv = cardChild->First(); + if (NS_SUCCEEDED(rv)) + { + do + { + cardChild->CurrentItem(getter_AddRefs(item)); + if (item) + { + nsCOMPtr card; + card = do_QueryInterface(item, &rv); + if (card) + { + cardArray->AppendElement(card); + } + } + rv = cardChild->Next(); + } while (NS_SUCCEEDED(rv)); + + if (database) + { + PRUint32 cardCount; + rv = cardArray->Count(&cardCount); + if (NS_FAILED(rv)) return rv; + for(PRUint32 i = 0; i < cardCount; i++) + { + nsISupports* cardSupports = cardArray->ElementAt(i); + nsIAbCard* card = (nsIAbCard*)cardSupports; + if (card) + { + database->DeleteCard(card, PR_TRUE); + } + } + } + } + } + return rv; +} + NS_IMETHODIMP nsAbDirectory::DeleteDirectories(nsISupportsArray *dierctories) { nsresult rv = NS_ERROR_FAILURE; @@ -336,6 +406,8 @@ NS_IMETHODIMP nsAbDirectory::DeleteDirectories(nsISupportsArray *dierctories) rv = directory->GetServer(&server); if (server) { + DeleteDirectoryCards(directory, server); + DIR_DeleteServerFromList(server); rv = mSubDirectories->RemoveElement(directory); diff --git a/mailnews/addrbook/src/nsAbDirectory.h b/mailnews/addrbook/src/nsAbDirectory.h index 29ea6ccd9766..27c6db6c1663 100644 --- a/mailnews/addrbook/src/nsAbDirectory.h +++ b/mailnews/addrbook/src/nsAbDirectory.h @@ -54,7 +54,7 @@ public: NS_IMETHOD HasCard(nsIAbCard *cards, PRBool *hasCard); NS_IMETHOD HasDirectory(nsIAbDirectory *dir, PRBool *hasDir); NS_IMETHOD GetMailingList(nsIEnumerator **mailingList); - NS_IMETHOD CreateNewDirectory(const char *dirName); + NS_IMETHOD CreateNewDirectory(const char *dirName, const char *fileName); // nsIAddrDBListener methods: NS_IMETHOD OnCardAttribChange(PRUint32 abCode, nsIAddrDBListener *instigator); @@ -65,6 +65,7 @@ protected: nsresult NotifyItemAdded(nsISupports *item); nsresult NotifyItemDeleted(nsISupports *item); nsresult AddChildCards(nsAutoString name, nsIAbCard **childDir); + nsresult DeleteDirectoryCards(nsIAbDirectory* directory, DIR_Server *server); nsVoidArray* GetDirList(){ return DIR_GetDirectories(); } diff --git a/mailnews/addrbook/src/nsAddrDatabase.cpp b/mailnews/addrbook/src/nsAddrDatabase.cpp index 4b19dc051cf9..b539e608b037 100644 --- a/mailnews/addrbook/src/nsAddrDatabase.cpp +++ b/mailnews/addrbook/src/nsAddrDatabase.cpp @@ -926,182 +926,290 @@ nsresult nsAddrDatabase::AddAttributeColumnsToRow(nsIAbCard *card, nsIMdbRow *ca char* pStr = nsnull; card->GetFirstName(&pStr); if (pStr) - AddStringColumn(cardRow, m_FirstNameColumnToken, pStr); + { + nsString nameStr(pStr); + AddFirstName(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetLastName(&pStr); if (pStr) - AddStringColumn(cardRow, m_LastNameColumnToken, pStr); + { + nsString nameStr(pStr); + AddLastName(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetDisplayName(&pStr); if (pStr) - AddStringColumn(cardRow, m_DisplayNameColumnToken, pStr); + { + nsString nameStr(pStr); + AddDisplayName(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetNickName(&pStr); if (pStr) - AddStringColumn(cardRow, m_NickNameColumnToken, pStr); + { + nsString nameStr(pStr); + AddNickName(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetPrimaryEmail(&pStr); if (pStr) - AddStringColumn(cardRow, m_PriEmailColumnToken, pStr); + { + nsString nameStr(pStr); + AddPrimaryEmail(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetSecondEmail(&pStr); if (pStr) - AddStringColumn(cardRow, m_2ndEmailColumnToken, pStr); + { + nsString nameStr(pStr); + Add2ndEmail(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWorkPhone(&pStr); if (pStr) - AddStringColumn(cardRow, m_WorkPhoneColumnToken, pStr); + { + nsString nameStr(pStr); + AddWorkPhone(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetHomePhone(&pStr); if (pStr) - AddStringColumn(cardRow, m_HomePhoneColumnToken, pStr); + { + nsString nameStr(pStr); + AddHomePhone(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetFaxNumber(&pStr); if (pStr) - AddStringColumn(cardRow, m_FaxColumnToken, pStr); + { + nsString nameStr(pStr); + AddFaxNumber(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetPagerNumber(&pStr); if (pStr) - AddStringColumn(cardRow, m_PagerColumnToken, pStr); + { + nsString nameStr(pStr); + AddPagerNumber(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetCellularNumber(&pStr); if (pStr) - AddStringColumn(cardRow, m_CellularColumnToken, pStr); + { + nsString nameStr(pStr); + AddCellularNumber(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetHomeAddress(&pStr); if (pStr) - AddStringColumn(cardRow, m_HomeAddressColumnToken, pStr); + { + nsString nameStr(pStr); + AddHomeAddress(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetHomeAddress2(&pStr); if (pStr) - AddStringColumn(cardRow, m_HomeAddress2ColumnToken, pStr); + { + nsString nameStr(pStr); + AddHomeAddress2(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetHomeCity(&pStr); if (pStr) - AddStringColumn(cardRow, m_HomeCityColumnToken, pStr); + { + nsString nameStr(pStr); + AddHomeCity(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetHomeState(&pStr); if (pStr) - AddStringColumn(cardRow, m_HomeStateColumnToken, pStr); + { + nsString nameStr(pStr); + AddHomeState(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetHomeZipCode(&pStr); if (pStr) - AddStringColumn(cardRow, m_HomeZipCodeColumnToken, pStr); + { + nsString nameStr(pStr); + AddHomeZipCode(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetHomeCountry(&pStr); if (pStr) - AddStringColumn(cardRow, m_HomeCountryColumnToken, pStr); + { + nsString nameStr(pStr); + AddHomeCountry(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWorkAddress(&pStr); if (pStr) - AddStringColumn(cardRow, m_WorkAddressColumnToken, pStr); + { + nsString nameStr(pStr); + AddWorkAddress(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWorkAddress2(&pStr); if (pStr) - AddStringColumn(cardRow, m_WorkAddress2ColumnToken, pStr); + { + nsString nameStr(pStr); + AddWorkAddress2(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWorkCity(&pStr); if (pStr) - AddStringColumn(cardRow, m_WorkCityColumnToken, pStr); + { + nsString nameStr(pStr); + AddWorkCity(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWorkState(&pStr); if (pStr) - AddStringColumn(cardRow, m_WorkStateColumnToken, pStr); + { + nsString nameStr(pStr); + AddWorkState(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWorkZipCode(&pStr); if (pStr) - AddStringColumn(cardRow, m_WorkZipCodeColumnToken, pStr); + { + nsString nameStr(pStr); + AddWorkZipCode(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWorkCountry(&pStr); if (pStr) - AddStringColumn(cardRow, m_WorkCountryColumnToken, pStr); + { + nsString nameStr(pStr); + AddWorkCountry(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetJobTitle(&pStr); if (pStr) - AddStringColumn(cardRow, m_JobTitleColumnToken, pStr); + { + nsString nameStr(pStr); + AddJobTitle(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetDepartment(&pStr); if (pStr) - AddStringColumn(cardRow, m_DepartmentColumnToken, pStr); + { + nsString nameStr(pStr); + AddDepartment(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetCompany(&pStr); if (pStr) - AddStringColumn(cardRow, m_CompanyColumnToken, pStr); + { + nsString nameStr(pStr); + AddCompany(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWebPage1(&pStr); if (pStr) - AddStringColumn(cardRow, m_WebPage1ColumnToken, pStr); + { + nsString nameStr(pStr); + AddWebPage1(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetWebPage2(&pStr); if (pStr) - AddStringColumn(cardRow, m_WebPage2ColumnToken, pStr); + { + nsString nameStr(pStr); + AddWebPage2(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetBirthYear(&pStr); if (pStr) - AddStringColumn(cardRow, m_BirthYearColumnToken, pStr); + { + nsString nameStr(pStr); + AddBirthYear(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetBirthMonth(&pStr); if (pStr) - AddStringColumn(cardRow, m_BirthMonthColumnToken, pStr); + { + nsString nameStr(pStr); + AddBirthMonth(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetBirthDay(&pStr); if (pStr) - AddStringColumn(cardRow, m_BirthDayColumnToken, pStr); + { + nsString nameStr(pStr); + AddBirthDay(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetCustom1(&pStr); if (pStr) - AddStringColumn(cardRow, m_Custom1ColumnToken, pStr); + { + nsString nameStr(pStr); + AddCustom1(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetCustom2(&pStr); if (pStr) - AddStringColumn(cardRow, m_Custom2ColumnToken, pStr); + { + nsString nameStr(pStr); + AddCustom2(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetCustom3(&pStr); if (pStr) - AddStringColumn(cardRow, m_Custom3ColumnToken, pStr); + { + nsString nameStr(pStr); + AddCustom3(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetCustom4(&pStr); if (pStr) - AddStringColumn(cardRow, m_Custom4ColumnToken, pStr); + { + nsString nameStr(pStr); + AddCustom4(cardRow, &nameStr); + } PR_FREEIF(pStr); card->GetNotes(&pStr); if (pStr) - AddStringColumn(cardRow, m_NotesColumnToken, pStr); + { + nsString nameStr(pStr); + AddNotes(cardRow, &nameStr); + } PR_FREEIF(pStr); } return NS_OK; @@ -1115,7 +1223,7 @@ NS_IMETHODIMP nsAddrDatabase::CreateNewCardAndAddToDB(nsIAbCard *newCard, PRBool if (!newCard || !m_mdbPabTable) return NS_ERROR_NULL_POINTER; - err = GetStore()->NewRow(GetEnv(), m_CardRowScopeToken, &cardRow); + err = GetNewRow(&cardRow); if (NS_SUCCEEDED(err) && cardRow) { @@ -1180,10 +1288,10 @@ nsresult nsAddrDatabase::DoStringAnonymousTransaction nsIMdbRow *anonymousRow = nsnull; if (code == AB_NotifyInserted) { - err = GetStore()->NewRow(GetEnv(), m_CardRowScopeToken, &anonymousRow); + err = GetNewRow(&anonymousRow); if (NS_SUCCEEDED(err) && anonymousRow) { - AddStringColumn(anonymousRow, anonymousColumnToken, pValueStr); + AddCharStringColumn(anonymousRow, anonymousColumnToken, pValueStr); err = m_mdbAnonymousTable->AddRow(GetEnv(), anonymousRow); } } @@ -1192,7 +1300,7 @@ nsresult nsAddrDatabase::DoStringAnonymousTransaction struct mdbYarn yarn; mdbOid rowOid; - GetStringYarn(pValueStr, &yarn); + GetCharStringYarn(pValueStr, &yarn); err = GetStore()->FindRow(GetEnv(), m_CardRowScopeToken, anonymousColumnToken, &yarn, &rowOid, &anonymousRow); if (NS_SUCCEEDED(err) && anonymousRow) @@ -1203,7 +1311,7 @@ nsresult nsAddrDatabase::DoStringAnonymousTransaction err = FindAttributeRow(m_mdbAnonymousTable, anonymousColumnToken, &anonymousRow); if (NS_SUCCEEDED(err) && anonymousRow) { - AddStringColumn(anonymousRow, anonymousColumnToken, pValueStr); + AddCharStringColumn(anonymousRow, anonymousColumnToken, pValueStr); err = m_mdbAnonymousTable->AddRow(GetEnv(), anonymousRow); return NS_OK; } @@ -1233,7 +1341,7 @@ nsresult nsAddrDatabase::DoIntAnonymousTransaction nsIMdbRow *anonymousRow = nsnull; if (code == AB_NotifyInserted) { - err = GetStore()->NewRow(GetEnv(), m_CardRowScopeToken, &anonymousRow); + err = GetNewRow(&anonymousRow); if (NS_SUCCEEDED(err) && anonymousRow) { AddIntColumn(anonymousRow, anonymousColumnToken, value); @@ -1293,7 +1401,7 @@ nsresult nsAddrDatabase::DoBoolAnonymousTransaction nsIMdbRow *anonymousRow = nsnull; if (code == AB_NotifyInserted) { - err = GetStore()->NewRow(GetEnv(), m_CardRowScopeToken, &anonymousRow); + err = GetNewRow(&anonymousRow); if (NS_SUCCEEDED(err) && anonymousRow) { AddIntColumn(anonymousRow, anonymousColumnToken, nBoolValue); @@ -1469,7 +1577,24 @@ NS_IMETHODIMP nsAddrDatabase::ContainsCard(nsIAbCard *card, PRBool *hasCard) return err; } -void nsAddrDatabase::GetStringYarn(char* str, struct mdbYarn* strYarn) +NS_IMETHODIMP nsAddrDatabase::GetNewRow(nsIMdbRow * *newRow) +{ + nsresult err = NS_OK; + nsIMdbRow *row = nsnull; + err = GetStore()->NewRow(GetEnv(), m_CardRowScopeToken, &row); + *newRow = row; + return err; +} + +NS_IMETHODIMP nsAddrDatabase::AddCardRowToDB(nsIMdbRow *newRow) +{ + if (m_mdbPabTable) + return m_mdbPabTable->AddRow(GetEnv(), newRow); + else + return NS_ERROR_FAILURE; +} + +void nsAddrDatabase::GetCharStringYarn(char* str, struct mdbYarn* strYarn) { strYarn->mYarn_Grow = NULL; strYarn->mYarn_Buf = str; @@ -1478,6 +1603,14 @@ void nsAddrDatabase::GetStringYarn(char* str, struct mdbYarn* strYarn) strYarn->mYarn_Form = 0; } +void nsAddrDatabase::GetStringYarn(nsString* str, struct mdbYarn* strYarn) +{ + strYarn->mYarn_Buf = str->ToNewCString(); + strYarn->mYarn_Size = PL_strlen((const char *) strYarn->mYarn_Buf) + 1; + strYarn->mYarn_Fill = strYarn->mYarn_Size - 1; + strYarn->mYarn_Form = 0; +} + void nsAddrDatabase::GetIntYarn(PRUint32 nValue, struct mdbYarn* intYarn) { intYarn->mYarn_Size = sizeof(intYarn->mYarn_Buf); @@ -1489,7 +1622,17 @@ void nsAddrDatabase::GetIntYarn(PRUint32 nValue, struct mdbYarn* intYarn) intYarn->mYarn_Fill = PL_strlen((const char *) intYarn->mYarn_Buf); } -mdb_err nsAddrDatabase::AddStringColumn(nsIMdbRow* cardRow, mdb_column inColumn, char* str) +mdb_err nsAddrDatabase::AddCharStringColumn(nsIMdbRow* cardRow, mdb_column inColumn, char* str) +{ + struct mdbYarn yarn; + + GetCharStringYarn(str, &yarn); + mdb_err err = cardRow->AddColumn(GetEnv(), inColumn, &yarn); + + return err; +} + +mdb_err nsAddrDatabase::AddStringColumn(nsIMdbRow* cardRow, mdb_column inColumn, nsString* str) { struct mdbYarn yarn; @@ -1726,8 +1869,8 @@ NS_IMETHODIMP nsAddrDatabase::GetAnonymousStringAttribute(const char *attrname, if (NS_SUCCEEDED(err) && cardRow) { - GetStringColumn(cardRow, anonymousColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, anonymousColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); *value = PL_strdup(tempCString); @@ -1816,288 +1959,288 @@ nsresult nsAddrDatabase::GetCardFromDB(nsIAbCard *newCard, nsIMdbRow* cardRow) nsAutoString tempString; char *tempCString = nsnull; - GetStringColumn(cardRow, m_FirstNameColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_FirstNameColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetFirstName(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_LastNameColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_LastNameColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetLastName(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_DisplayNameColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_DisplayNameColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetDisplayName(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_NickNameColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_NickNameColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetNickName(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_PriEmailColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_PriEmailColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetPrimaryEmail(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_2ndEmailColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_2ndEmailColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetSecondEmail(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WorkPhoneColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WorkPhoneColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWorkPhone(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_HomePhoneColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_HomePhoneColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetHomePhone(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_FaxColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_FaxColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetFaxNumber(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_PagerColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_PagerColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetPagerNumber(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_CellularColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_CellularColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetCellularNumber(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_HomeAddressColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_HomeAddressColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetHomeAddress(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_HomeAddress2ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_HomeAddress2ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetHomeAddress2(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_HomeCityColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_HomeCityColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetHomeCity(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_HomeStateColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_HomeStateColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetHomeState(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_HomeZipCodeColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_HomeZipCodeColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetHomeZipCode(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_HomeCountryColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_HomeCountryColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetHomeCountry(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WorkAddressColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WorkAddressColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWorkAddress(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WorkAddress2ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WorkAddress2ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWorkAddress2(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WorkCityColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WorkCityColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWorkCity(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WorkStateColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WorkStateColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWorkState(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WorkZipCodeColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WorkZipCodeColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWorkZipCode(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WorkCountryColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WorkCountryColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWorkCountry(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_JobTitleColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_JobTitleColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetJobTitle(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_DepartmentColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_DepartmentColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetDepartment(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_CompanyColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_CompanyColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetCompany(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WebPage1ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WebPage1ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWebPage1(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_WebPage2ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_WebPage2ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetWebPage2(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_BirthYearColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_BirthYearColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetBirthYear(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_BirthMonthColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_BirthMonthColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetBirthMonth(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_BirthDayColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_BirthDayColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetBirthDay(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_Custom1ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_Custom1ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetCustom1(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_Custom2ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_Custom2ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetCustom2(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_Custom3ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_Custom3ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetCustom3(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_Custom4ColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_Custom4ColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetCustom4(tempCString); delete [] tempCString; } - GetStringColumn(cardRow, m_NotesColumnToken, tempString); - if (tempString.Length()) + err = GetStringColumn(cardRow, m_NotesColumnToken, tempString); + if (NS_SUCCEEDED(err) && tempString.Length()) { tempCString = tempString.ToNewCString(); newCard->SetNotes(tempCString); diff --git a/mailnews/addrbook/src/nsAddrDatabase.h b/mailnews/addrbook/src/nsAddrDatabase.h index b9d9e071271f..54840f414008 100644 --- a/mailnews/addrbook/src/nsAddrDatabase.h +++ b/mailnews/addrbook/src/nsAddrDatabase.h @@ -103,6 +103,117 @@ public: NS_IMETHOD RemoveAnonymousAttributesFromCard(nsIAbCard *card); NS_IMETHOD EditAnonymousAttributesFromCard(nsIAbCard *card); + NS_IMETHOD GetNewRow(nsIMdbRow * *newRow); + NS_IMETHOD AddCardRowToDB(nsIMdbRow *newRow); + + NS_IMETHOD AddFirstName(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_FirstNameColumnToken, value); } + + NS_IMETHOD AddLastName(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_LastNameColumnToken, value); } + + NS_IMETHOD AddDisplayName(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_DisplayNameColumnToken, value); } + + NS_IMETHOD AddNickName(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_NickNameColumnToken, value); } + + NS_IMETHOD AddPrimaryEmail(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_PriEmailColumnToken, value); } + + NS_IMETHOD Add2ndEmail(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_2ndEmailColumnToken, value); } + + NS_IMETHOD AddWorkPhone(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WorkPhoneColumnToken, value); } + + NS_IMETHOD AddHomePhone(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_HomePhoneColumnToken, value); } + + NS_IMETHOD AddFaxNumber(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_FaxColumnToken, value); } + + NS_IMETHOD AddPagerNumber(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_PagerColumnToken, value); } + + NS_IMETHOD AddCellularNumber(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_CellularColumnToken, value); } + + NS_IMETHOD AddHomeAddress(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_HomeAddressColumnToken, value); } + + NS_IMETHOD AddHomeAddress2(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_HomeAddress2ColumnToken, value); } + + NS_IMETHOD AddHomeCity(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_HomeCityColumnToken, value); } + + NS_IMETHOD AddHomeState(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_HomeStateColumnToken, value); } + + NS_IMETHOD AddHomeZipCode(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_HomeZipCodeColumnToken, value); } + + NS_IMETHOD AddHomeCountry(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_HomeCountryColumnToken, value); } + + NS_IMETHOD AddWorkAddress(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WorkAddressColumnToken, value); } + + NS_IMETHOD AddWorkAddress2(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WorkAddress2ColumnToken, value); } + + NS_IMETHOD AddWorkCity(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WorkCityColumnToken, value); } + + NS_IMETHOD AddWorkState(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WorkStateColumnToken, value); } + + NS_IMETHOD AddWorkZipCode(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WorkZipCodeColumnToken, value); } + + NS_IMETHOD AddWorkCountry(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WorkCountryColumnToken, value); } + + NS_IMETHOD AddJobTitle(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_JobTitleColumnToken, value); } + + NS_IMETHOD AddDepartment(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_DepartmentColumnToken, value); } + + NS_IMETHOD AddCompany(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_CompanyColumnToken, value); } + + NS_IMETHOD AddWebPage1(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WebPage1ColumnToken, value); } + + NS_IMETHOD AddWebPage2(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_WebPage2ColumnToken, value); } + + NS_IMETHOD AddBirthYear(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_BirthYearColumnToken, value); } + + NS_IMETHOD AddBirthMonth(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_BirthMonthColumnToken, value); } + + NS_IMETHOD AddBirthDay(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_BirthDayColumnToken, value); } + + NS_IMETHOD AddCustom1(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_Custom1ColumnToken, value); } + + NS_IMETHOD AddCustom2(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_Custom2ColumnToken, value); } + + NS_IMETHOD AddCustom3(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_Custom3ColumnToken, value); } + + NS_IMETHOD AddCustom4(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_Custom4ColumnToken, value); } + + NS_IMETHOD AddNotes(nsIMdbRow * row, nsString * value) + { return AddStringColumn(row, m_NotesColumnToken, value); } + ////////////////////////////////////////////////////////////////////////////// // nsAddrDatabase methods: @@ -140,9 +251,11 @@ protected: void YarnToUInt32(struct mdbYarn *yarn, PRUint32 *pResult); - void GetStringYarn(char* str, struct mdbYarn* strYarn); + void GetCharStringYarn(char* str, struct mdbYarn* strYarn); + void GetStringYarn(nsString* str, struct mdbYarn* strYarn); void GetIntYarn(PRUint32 nValue, struct mdbYarn* intYarn); - mdb_err AddStringColumn(nsIMdbRow* cardRow, mdb_column inColumn, char* str); + mdb_err AddCharStringColumn(nsIMdbRow* cardRow, mdb_column inColumn, char* str); + mdb_err AddStringColumn(nsIMdbRow* cardRow, mdb_column inColumn, nsString* str); mdb_err AddIntColumn(nsIMdbRow* cardRow, mdb_column inColumn, PRUint32 nValue); nsresult GetStringColumn(nsIMdbRow *cardRow, mdb_token outToken, nsString& str); nsresult GetIntColumn(nsIMdbRow *cardRow, mdb_token outToken, diff --git a/mailnews/addrbook/src/nsAddressBook.cpp b/mailnews/addrbook/src/nsAddressBook.cpp index 7d84f2c81c63..9f0e7e652d60 100644 --- a/mailnews/addrbook/src/nsAddressBook.cpp +++ b/mailnews/addrbook/src/nsAddressBook.cpp @@ -22,6 +22,7 @@ #include "nsDirPrefs.h" #include "nsIAddrBookSession.h" #include "nsAbRDFResource.h" +#include "nsIAddrDatabase.h" #include "prmem.h" #include "prprf.h" @@ -40,11 +41,14 @@ #include "nsIDOMWindow.h" #include "nsIContentViewer.h" + static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_IID(kAppShellServiceCID, NS_APPSHELL_SERVICE_CID); static NS_DEFINE_CID(kAddressBookDBCID, NS_ADDRESSBOOKDB_CID); static NS_DEFINE_CID(kFileLocatorCID, NS_FILELOCATOR_CID); static NS_DEFINE_CID(kAddrBookSessionCID, NS_ADDRBOOKSESSION_CID); +static NS_DEFINE_CID(kAbDirectoryCID, NS_ABDIRECTORYRESOURCE_CID); +static NS_DEFINE_CID(kAbCardPropertyCID, NS_ABCARDPROPERTY_CID); const char *kDirectoryDataSourceRoot = "abdirectory://"; @@ -164,6 +168,7 @@ NS_IMETHODIMP nsAddressBook::NewAddressBook rv = NS_NewISupportsArray(getter_AddRefs(dirArray)); if(NS_FAILED(rv)) return NS_ERROR_OUT_OF_MEMORY; + nsCOMPtr parentResource; char *parentUri = PR_smprintf("%s", kDirectoryDataSourceRoot); rv = rdfService->GetResource(parentUri, getter_AddRefs(parentResource)); @@ -172,7 +177,6 @@ NS_IMETHODIMP nsAddressBook::NewAddressBook return NS_ERROR_NULL_POINTER; if (parentUri) PR_smprintf_free(parentUri); - dirArray->AppendElement(parentResource); rv = NS_NewISupportsArray(getter_AddRefs(nameArray)); @@ -204,6 +208,7 @@ NS_IMETHODIMP nsAddressBook::DeleteAddressBooks rv = NS_NewISupportsArray(getter_AddRefs(dirArray)); if(NS_FAILED(rv)) return NS_ERROR_OUT_OF_MEMORY; + nsCOMPtr parentResource; char *parentUri = PR_smprintf("%s", kDirectoryDataSourceRoot); rv = rdfService->GetResource(parentUri, getter_AddRefs(parentResource)); @@ -247,7 +252,7 @@ nsresult nsAddressBook::DoCommand(nsIRDFCompositeDataSource* db, char *command, } -nsresult nsAddressBook::PrintCard() +NS_IMETHODIMP nsAddressBook::PrintCard() { #ifdef DEBUG_seth printf("nsAddressBook::PrintCard()\n"); @@ -277,7 +282,7 @@ nsresult nsAddressBook::PrintCard() return rv; } -nsresult nsAddressBook::PrintAddressbook() +NS_IMETHODIMP nsAddressBook::PrintAddressbook() { #ifdef DEBUG_seth printf("nsAddressBook::PrintAddressbook()\n"); @@ -285,7 +290,7 @@ nsresult nsAddressBook::PrintAddressbook() return NS_ERROR_NOT_IMPLEMENTED; } -nsresult nsAddressBook::SetWebShellWindow(nsIDOMWindow *aWin) +NS_IMETHODIMP nsAddressBook::SetWebShellWindow(nsIDOMWindow *aWin) { NS_PRECONDITION(aWin != nsnull, "null ptr"); if (!aWin) @@ -305,3 +310,756 @@ nsresult nsAddressBook::SetWebShellWindow(nsIDOMWindow *aWin) return NS_OK; } + + +typedef enum +{ + TABFile, + LDIFFile, + UnknownFile +} ImportFileType; + +class AddressBookParser +{ +protected: + + nsAutoString mLine; + nsIFileSpecWithUI* mFileSpec; + char* mDbUri; + nsCOMPtr mDatabase; + PRInt32 mFileType; + + nsresult ParseTabFile(PRFileDesc* file); + nsresult ParseLdifFile(PRFileDesc* file); + void AddTabRowToDatabase(); + void AddLdifColToDatabase(nsIMdbRow* newRow); + +public: + AddressBookParser(nsIFileSpecWithUI* fileSpec); + ~AddressBookParser(); + + nsresult ParseFile(PRFileDesc* file); +}; + +AddressBookParser::AddressBookParser(nsIFileSpecWithUI* fileSpec) + :mLine(eOneByte) +{ + mFileSpec = fileSpec; + mDbUri = nsnull; + mFileType = UnknownFile; +} + +AddressBookParser::~AddressBookParser(void) +{ + if(mDbUri) + PR_smprintf_free(mDbUri); + if (mDatabase) + { + mDatabase->Close(PR_TRUE); + mDatabase = null_nsCOMPtr(); + } +} + +const char *kTabExtension = ".txt"; +const char *kLdifExtension = ".ldi"; + +nsresult AddressBookParser::ParseFile(PRFileDesc* file) +{ + if (! file) + return NS_ERROR_NULL_POINTER; + + char *leafName = nsnull; + if (mFileSpec) + { + mFileSpec->GetLeafName(&leafName); + nsString fileString(leafName); + if (-1 != fileString.Find(kTabExtension)) + mFileType = TABFile; + else if (-1 != fileString.Find(kLdifExtension)) + mFileType = LDIFFile; + else + return NS_ERROR_FAILURE; + + PRInt32 i = 0; + while (leafName[i] != '\0') + { + if (leafName[i] == '.') + { + leafName[i] = '\0'; + break; + } + else + i++; + } + if (leafName) + mDbUri = PR_smprintf("%s%s.mab", kDirectoryDataSourceRoot, leafName); + } + + nsresult rv = NS_OK; + nsFileSpec* dbPath = nsnull; + char* fileName = PR_smprintf("%s.mab", leafName); + + NS_WITH_SERVICE(nsIAddrBookSession, abSession, kAddrBookSessionCID, &rv); + if(NS_SUCCEEDED(rv)) + abSession->GetUserProfileDirectory(&dbPath); + + if (dbPath) + { + (*dbPath) += fileName; + NS_WITH_SERVICE(nsIAddrDatabase, addrDBFactory, kAddressBookDBCID, &rv); + if (NS_SUCCEEDED(rv) && addrDBFactory) + rv = addrDBFactory->Open(dbPath, PR_TRUE, getter_AddRefs(mDatabase), PR_TRUE); + } + + if (NS_FAILED(rv)) + return NS_ERROR_FAILURE; + + // Initialize the parser for a run... + mLine.Truncate(); + + if (mFileType == TABFile) + ParseTabFile(file); + if (mFileType == LDIFFile) + ParseLdifFile(file); + + NS_WITH_SERVICE(nsIRDFService, rdfService, kRDFServiceCID, &rv); + if(NS_FAILED(rv)) + return rv; + nsCOMPtr parentResource; + char *parentUri = PR_smprintf("%s", kDirectoryDataSourceRoot); + rv = rdfService->GetResource(parentUri, getter_AddRefs(parentResource)); + nsCOMPtr parentDir = do_QueryInterface(parentResource); + if (!parentDir) + return NS_ERROR_NULL_POINTER; + if (parentUri) + PR_smprintf_free(parentUri); + + parentDir->CreateNewDirectory(leafName, fileName); + + if (leafName) + nsCRT::free(leafName); + if (fileName) + PR_smprintf_free(fileName); + return NS_OK; +} + +nsresult AddressBookParser::ParseTabFile(PRFileDesc* file) +{ + if (! file) + return NS_ERROR_NULL_POINTER; + + char buf[1024]; + PRInt32 len; + + while ((len = PR_Read(file, buf, sizeof(buf))) > 0) + { + for (PRInt32 i = 0; i < len; i++) + { + char c = buf[i]; + if (c != '\r' && c != '\n') + { + mLine.Append(c); + } + else + { + if (mLine.Length()) + { + if (mDatabase) + { + AddTabRowToDatabase(); + } + } + } + } + } + return NS_OK; +} + +#define POS_DISPLAY_NAME 1 +#define POS_LAST_NAME 2 +#define POS_FIRST_NAME 3 +#define POS_NOTE 4 +#define POS_CITY 5 +#define POS_STATE 6 +#define POS_EMAIL 7 +#define POS_TITLE 8 +#define POS_UNKNOWN 9 +#define POS_ADDRESS 10 +#define POS_ZIP 11 +#define POS_COUNTRY 12 +#define POS_WORK_NUMBER 13 +#define POS_FAX_NUMBER 14 +#define POS_HOME_NUMBER 15 +#define POS_ORGANIZATION 16 +#define POS_NICK_NAME 17 +#define POS_CELLULAR_NUMBER 18 +#define POS_PAGE_NUMBER 19 + +void AddressBookParser::AddTabRowToDatabase() +{ + nsAutoString column(eOneByte); + + nsIMdbRow* newRow; + mDatabase->GetNewRow(&newRow); + + if (!newRow) + return; + +// const PRUnichar *str = nsnull; +// const char *str = nsnull; + int nCol = 0; + int nSize = mLine.Length(); + + for (int i = 0; i < nSize; i++) + { +// PRUnichar c = mLine[i]; + char c = mLine[i]; + while (c != '\t') + { + column.Append(c); + c = mLine[++i]; + } + + nCol += 1; + + switch (nCol) + { + case POS_FIRST_NAME: + if (column.Length() > 0) + mDatabase->AddFirstName(newRow, &column); + break; + case POS_LAST_NAME: + if (column.Length() > 0) + mDatabase->AddLastName(newRow, &column); + break; + case POS_DISPLAY_NAME: + if (column.Length() > 0) + mDatabase ->AddDisplayName(newRow, &column); + break; + case POS_NICK_NAME: + if (column.Length() > 0) + mDatabase->AddNickName(newRow, &column); + break; + case POS_EMAIL: + if (column.Length() > 0) + mDatabase->AddPrimaryEmail(newRow, &column); + break; + case POS_WORK_NUMBER: + if (column.Length() > 0) + mDatabase->AddWorkPhone(newRow, &column); + break; + case POS_HOME_NUMBER: + if (column.Length() > 0) + mDatabase->AddHomePhone(newRow, &column); + break; + case POS_PAGE_NUMBER: + if (column.Length() > 0) + mDatabase->AddPagerNumber(newRow, &column); + break; + case POS_CELLULAR_NUMBER: + if (column.Length() > 0) + mDatabase->AddCellularNumber(newRow, &column); + break; + case POS_FAX_NUMBER: + if (column.Length() > 0) + mDatabase->AddFaxNumber(newRow, &column); + break; + case POS_ADDRESS: + if (column.Length() > 0) + mDatabase->AddWorkAddress(newRow, &column); + break; + case POS_CITY: + if (column.Length() > 0) + mDatabase->AddWorkCity(newRow, &column); + break; + case POS_STATE: + if (column.Length() > 0) + mDatabase->AddWorkState(newRow, &column); + break; + case POS_ZIP: + if (column.Length() > 0) + mDatabase->AddWorkZipCode(newRow, &column); + break; + case POS_COUNTRY: + if (column.Length() > 0) + mDatabase->AddWorkCountry(newRow, &column); + break; + case POS_TITLE: + if (column.Length() > 0) + mDatabase->AddJobTitle(newRow, &column); + break; + case POS_ORGANIZATION: + if (column.Length() > 0) + mDatabase->AddDepartment(newRow, &column); + break; + case POS_NOTE: + if (column.Length() > 0) + mDatabase->AddNotes(newRow, &column); + break; + case POS_UNKNOWN: + default: + break; + } + + if (column.Length() > 0) + column.Truncate(); + } + if (mLine.Length() > 0) + mLine.Truncate(); + if (nSize) + mDatabase->AddCardRowToDB(newRow); +} + + +nsresult AddressBookParser::ParseLdifFile(PRFileDesc* file) +{ + if (! file) + return NS_ERROR_NULL_POINTER; + + char buf[1024]; + PRInt32 len = 0; + PRInt32 LFCount = 0; + PRInt32 CRCount = 0; + nsIMdbRow* newRow = nsnull; + + if (mDatabase) + { + mDatabase->GetNewRow(&newRow); + + if (!newRow) + return NS_ERROR_FAILURE; + } + else + return NS_ERROR_FAILURE; + + while ((len = PR_Read(file, buf, sizeof(buf))) > 0) + { + for (PRInt32 i = 0; i < len; i++) + { + char c = buf[i]; + + if (c == 0xA) + { + LFCount++; + } + else if (c == 0xD) + { + CRCount++; + } + else if ( c != 0xA && c != 0xD) + { + if (LFCount ==0 && CRCount ==0) + mLine.Append(c); + else if (LFCount == 1 || CRCount == 1) + { + AddLdifColToDatabase(newRow); + if (c != ' ') + mLine.Append(c); + LFCount = 0; + CRCount = 0; + } + else if (c != ' ' && (( LFCount > 1) || ( CRCount > 2 && LFCount ) || + ( !LFCount && CRCount > 1 ))) + { + mDatabase->AddCardRowToDB(newRow); + if (c != ' ') + mLine.Append(c); + LFCount = 0; + CRCount = 0; + } + } + } + } + + return NS_OK; +} + +void AddressBookParser::AddLdifColToDatabase(nsIMdbRow* newRow) +{ + nsAutoString colType(eOneByte); + nsAutoString column(eOneByte); + +// const PRUnichar *str = nsnull; +// const char *str = nsnull; + PRInt32 nSize = mLine.Length(); + PRBool bGetType = PR_TRUE; + + for (int i = 0; i < nSize; i++) + { +// PRUnichar c = mLine[i]; + char c = mLine[i]; + if (!bGetType) + { + column.Append(c); + continue; + } + while (bGetType && c != ':' && i < nSize) + { + colType.Append(c); + c = mLine[++i]; + } + if (c != ':') + { + bGetType = PR_FALSE; + c = mLine[++i]; + if (c == ':') + i++; + } + } + + mdb_u1 firstByte = (mdb_u1)colType[0]; + switch ( firstByte ) + { + case 'b': + if ( -1 != colType.Find("birthyear") ) + mDatabase->AddBirthYear(newRow, &column); + break; // 'b' + + case 'c': + if ( -1 != colType.Find("cn") || -1 != colType.Find("commonname") ) + mDatabase->AddDisplayName(newRow, &column); + + else if ( -1 != colType.Find("countryName") ) + mDatabase->AddWorkCountry(newRow, &column); + + // else if ( -1 != colType.Find("charset") ) + // ioRow->AddColumn(ev, this->ColCharset(), yarn); + + else if ( -1 != colType.Find("cellphone") ) + mDatabase->AddCellularNumber(newRow, &column); + +// else if ( -1 != colType.Find("calendar") ) +// ioRow->AddColumn(ev, this->ColCalendar(), yarn); + +// else if ( -1 != colType.Find("car") ) +// ioRow->AddColumn(ev, this->ColCar(), yarn); + + else if ( -1 != colType.Find("carphone") ) + mDatabase->AddCellularNumber(newRow, &column); +// ioRow->AddColumn(ev, this->ColCarPhone(), yarn); + +// else if ( -1 != colType.Find("carlicense") ) +// ioRow->AddColumn(ev, this->ColCarLicense(), yarn); + + else if ( -1 != colType.Find("custom1") ) + mDatabase->AddCustom1(newRow, &column); + + else if ( -1 != colType.Find("custom2") ) + mDatabase->AddCustom2(newRow, &column); + + else if ( -1 != colType.Find("custom3") ) + mDatabase->AddCustom3(newRow, &column); + + else if ( -1 != colType.Find("custom4") ) + mDatabase->AddCustom4(newRow, &column); + + else if ( -1 != colType.Find("company") ) + mDatabase->AddCompany(newRow, &column); + break; // 'c' + + case 'd': + if ( -1 != colType.Find("description") ) + mDatabase->AddNotes(newRow, &column); + +// else if ( -1 != colType.Find("dn") ) // distinuished name +// ioRow->AddColumn(ev, this->ColDistName(), yarn); + + else if ( -1 != colType.Find("department") ) + mDatabase->AddDepartment(newRow, &column); + +// else if ( -1 != colType.Find("departmentnumber") ) +// ioRow->AddColumn(ev, this->ColDepartmentNumber(), yarn); + +// else if ( -1 != colType.Find("date") ) +// ioRow->AddColumn(ev, this->ColDate(), yarn); + break; // 'd' + + case 'e': + +// if ( -1 != colType.Find("employeeid") ) +// ioRow->AddColumn(ev, this->ColEmployeeId(), yarn); + +// else if ( -1 != colType.Find("employeetype") ) +// ioRow->AddColumn(ev, this->ColEmployeeType(), yarn); + break; // 'e' + + case 'f': + + if ( -1 != colType.Find("fax") || + -1 != colType.Find("facsimiletelephonenumber") ) + mDatabase->AddFaxNumber(newRow, &column); + break; // 'f' + + case 'g': + if ( -1 != colType.Find("givenname") ) + mDatabase->AddFirstName(newRow, &column); + +// else if ( -1 != colType.Find("gif") ) +// ioRow->AddColumn(ev, this->ColGif(), yarn); + +// else if ( -1 != colType.Find("geo") ) +// ioRow->AddColumn(ev, this->ColGeo(), yarn); + + break; // 'g' + + case 'h': + if ( -1 != colType.Find("homephone") ) + mDatabase->AddHomePhone(newRow, &column); + + else if ( -1 != colType.Find("homeurl") ) + mDatabase->AddWebPage1(newRow, &column); + break; // 'h' + + case 'i': +// if ( -1 != colType.Find("imapurl") ) +// ioRow->AddColumn(ev, this->ColImapUrl(), yarn); + break; // 'i' + + case 'j': +// if ( -1 != colType.Find("jpeg") || -1 != colType.Find("jpegfile") ) +// ioRow->AddColumn(ev, this->ColJpegFile(), yarn); + + break; // 'j' + + case 'k': +// if ( -1 != colType.Find("key") ) +// ioRow->AddColumn(ev, this->ColKey(), yarn); + +// else if ( -1 != colType.Find("keywords") ) +// ioRow->AddColumn(ev, this->ColKeywords(), yarn); + + break; // 'k' + + case 'l': + if ( -1 != colType.Find("l") || -1 != colType.Find("locality") ) + mDatabase->AddWorkCity(newRow, &column); + +// else if ( -1 != colType.Find("language") ) +// ioRow->AddColumn(ev, this->ColLanguage(), yarn); + +// else if ( -1 != colType.Find("logo") ) +// ioRow->AddColumn(ev, this->ColLogo(), yarn); + +// else if ( -1 != colType.Find("location") ) +// ioRow->AddColumn(ev, this->ColLocation(), yarn); + + break; // 'l' + + case 'm': + if ( -1 != colType.Find("mail") ) + mDatabase->AddPrimaryEmail(newRow, &column); + +// else if ( -1 != colType.Find("member") && list ) +// { +// this->add-list-member(list, yarn); // see also "uniquemember" +// } + +// else if ( -1 != colType.Find("manager") ) +// ioRow->AddColumn(ev, this->ColManager(), yarn); + +// else if ( -1 != colType.Find("modem") ) +// ioRow->AddColumn(ev, this->ColModem(), yarn); + +// else if ( -1 != colType.Find("msgphone") ) +// ioRow->AddColumn(ev, this->ColMessagePhone(), yarn); + + break; // 'm' + + case 'n': +// if ( -1 != colType.Find("note") ) +// ioRow->AddColumn(ev, this->ColNote(), yarn); + + if ( -1 != colType.Find("notes") ) + mDatabase->AddNotes(newRow, &column); + +// else if ( -1 != colType.Find("n") ) +// ioRow->AddColumn(ev, this->ColN(), yarn); + +// else if ( -1 != colType.Find("notifyurl") ) +// ioRow->AddColumn(ev, this->ColNotifyUrl(), yarn); + + break; // 'n' + + case 'o': +// if ( -1 != colType.Find("o") ) // organization +// ioRow->AddColumn(ev, this->ColCompany(), yarn); + +// else if ( -1 != colType.Find("objectclass") ) +// { +// if ( strcasecomp(inVal, "person") ) // objectclass == person? +// { +// this->put-bool-row-col(row, this->ColPerson(), mdbBool_kTrue); +// } +// else if ( strcasecomp(inVal, "groupofuniquenames") || +// strcasecomp(inVal, "groupOfNames") ) // objectclass == list? +// { +// this->put-bool-row-col(row, this->ColPerson(), mdbBool_kFalse); +// isList = mdbBool_kTrue; +// if ( !list ) +// list = this->make-new-mdb-list-table-for-row(ioRow); +// } +// } + +// else if ( -1 != colType.Find("ou") || -1 != colType.Find("orgunit") ) +// ioRow->AddColumn(ev, this->ColDepartment(), yarn); + + break; // 'o' + + case 'p': + if ( -1 != colType.Find("postalcode") ) + mDatabase->AddWorkZipCode(newRow, &column); + + else if ( -1 != colType.Find("postOfficeBox") ) + mDatabase->AddWorkAddress(newRow, &column); + + else if ( -1 != colType.Find("pager") || + -1 != colType.Find("pagerphone") ) + mDatabase->AddPagerNumber(newRow, &column); + +// else if ( -1 != colType.Find("photo") ) +// ioRow->AddColumn(ev, this->ColPhoto(), yarn); + +// else if ( -1 != colType.Find("parentphone") ) +// ioRow->AddColumn(ev, this->ColParentPhone(), yarn); + +// else if ( -1 != colType.Find("pageremail") ) +// ioRow->AddColumn(ev, this->ColPagerEmail(), yarn); + +// else if ( -1 != colType.Find("prefurl") ) +// ioRow->AddColumn(ev, this->ColPrefUrl(), yarn); + +// else if ( -1 != colType.Find("priority") ) +// ioRow->AddColumn(ev, this->ColPriority(), yarn); + + break; // 'p' + + case 'r': + if ( -1 != colType.Find("region") ) + mDatabase->AddWorkState(newRow, &column); + +// else if ( -1 != colType.Find("rfc822mailbox") ) +// ioRow->AddColumn(ev, this->ColPrimaryEmail(), yarn); + +// else if ( -1 != colType.Find("rev") ) +// ioRow->AddColumn(ev, this->ColRev(), yarn); + +// else if ( -1 != colType.Find("role") ) +// ioRow->AddColumn(ev, this->ColRole(), yarn); + break; // 'r' + + case 's': + if ( -1 != colType.Find("sn") || -1 != colType.Find("surname") ) + mDatabase->AddLastName(newRow, &column); + + else if ( -1 != colType.Find("st") ) + mDatabase->AddWorkState(newRow, &column); + + else if ( -1 != colType.Find("streetaddress") ) + mDatabase->AddWorkAddress2(newRow, &column); + +// else if ( -1 != colType.Find("secretary") ) +// ioRow->AddColumn(ev, this->ColSecretary(), yarn); + +// else if ( -1 != colType.Find("sound") ) +// ioRow->AddColumn(ev, this->ColSound(), yarn); + +// else if ( -1 != colType.Find("sortstring") ) +// ioRow->AddColumn(ev, this->ColSortString(), yarn); + + break; // 's' + + case 't': + if ( -1 != colType.Find("title") ) + mDatabase->AddJobTitle(newRow, &column); + + else if ( -1 != colType.Find("telephonenumber") ) + mDatabase->AddWorkPhone(newRow, &column); + +// else if ( -1 != colType.Find("tiff") ) +// ioRow->AddColumn(ev, this->ColTiff(), yarn); + +// else if ( -1 != colType.Find("tz") ) +// ioRow->AddColumn(ev, this->ColTz(), yarn); + break; // 't' + + case 'u': + +// if ( -1 != colType.Find("uniquemember") && list ) +// { +// this->add-list-member(list, yarn); // see also "member" +// } + +// else if ( -1 != colType.Find("uid") ) +// ioRow->AddColumn(ev, this->ColUid(), yarn); + + break; // 'u' + + case 'v': +// if ( -1 != colType.Find("version") ) +// ioRow->AddColumn(ev, this->ColVersion(), yarn); + +// else if ( -1 != colType.Find("voice") ) +// ioRow->AddColumn(ev, this->ColVoice(), yarn); + + break; // 'v' + + case 'w': + if ( -1 != colType.Find("workurl") ) + mDatabase->AddWebPage2(newRow, &column); + + break; // 'w' + + case 'x': + if ( -1 != colType.Find("xmozillanickname") ) + mDatabase->AddNickName(newRow, &column); + + else if ( -1 != colType.Find("xmozillausehtmlmail") ) + { + ; //add use plain text + } + + break; // 'x' + + case 'z': + if ( -1 != colType.Find("zip") ) // alias for postalcode + mDatabase->AddWorkZipCode(newRow, &column); + + break; // 'z' + + default: + break; // default + } + + if (mLine.Length() > 0) + mLine.Truncate(); +} + +NS_IMETHODIMP nsAddressBook::ImportAddressBook() +{ + nsresult rv = NS_ERROR_FAILURE; + + nsCOMPtr fileSpec(getter_AddRefs(NS_CreateFileSpecWithUI())); + if (!fileSpec) + return NS_ERROR_FAILURE; + + rv = fileSpec->ChooseInputFile( + "Open File", nsIFileSpecWithUI::eAllFiles, nsnull, nsnull); + if (NS_FAILED(rv)) + return rv; + + char* filePath; + rv = fileSpec->GetNativePath(&filePath); + if (NS_FAILED(rv)) + return rv; + + PRFileDesc* abFile; + if ((abFile = PR_Open(filePath, PR_RDONLY, 0644))) { + AddressBookParser abParser(fileSpec); + rv = abParser.ParseFile(abFile); + PR_Close(abFile); + } + nsCRT::free(filePath); + + return rv; +} + diff --git a/mailnews/addrbook/src/nsAddressBook.h b/mailnews/addrbook/src/nsAddressBook.h index 23adcc557df0..5b771bf85722 100644 --- a/mailnews/addrbook/src/nsAddressBook.h +++ b/mailnews/addrbook/src/nsAddressBook.h @@ -25,6 +25,8 @@ #include "nsIAddrDatabase.h" #include "nsIWebShell.h" #include "nsIScriptGlobalObject.h" +#include "nsIFileSpecWithUI.h" + #define NC_RDF_NEWABCARD "http://home.netscape.com/NC-rdf#NewCard" #define NC_RDF_DELETE "http://home.netscape.com/NC-rdf#Delete" @@ -44,12 +46,14 @@ public: NS_IMETHOD NewAddressBook(nsIRDFCompositeDataSource* db, nsIDOMXULElement *srcDirectory, const char *name); NS_IMETHOD DeleteAddressBooks(nsIRDFCompositeDataSource* db, nsIDOMXULElement *srcDirectory, nsIDOMNodeList *nodeList); NS_IMETHOD PrintCard(); - NS_IMETHOD PrintAddressbook(); + NS_IMETHOD PrintAddressbook(); NS_IMETHOD SetWebShellWindow(nsIDOMWindow *win); + NS_IMETHOD ImportAddressBook(); protected: nsresult DoCommand(nsIRDFCompositeDataSource *db, char * command, nsISupportsArray *srcArray, nsISupportsArray *arguments); + private: nsIWebShell *mWebShell; // weak reference }; diff --git a/mailnews/addrbook/src/nsDirPrefs.cpp b/mailnews/addrbook/src/nsDirPrefs.cpp index d9b1808bb2a4..3d1b1590c611 100644 --- a/mailnews/addrbook/src/nsDirPrefs.cpp +++ b/mailnews/addrbook/src/nsDirPrefs.cpp @@ -403,20 +403,29 @@ nsresult DIR_ContainsServer(DIR_Server* pServer, PRBool *hasDir) return NS_OK; } -nsresult DIR_AddNewAddressBook(const char *name, DIR_Server** pServer) +nsresult DIR_AddNewAddressBook(const char *dirName, const char *fileName, DIR_Server** pServer) { DIR_Server * server = (DIR_Server *) PR_Malloc(sizeof(DIR_Server)); DIR_InitServerWithType (server, PABDirectory); - PRInt32 count = dir_ServerList->Count(); - server->description = PL_strdup(name); - server->position = count + 1; + if (!dir_ServerList) + DIR_GetDirServers(); + if (dir_ServerList) + { + PRInt32 count = dir_ServerList->Count(); + server->description = PL_strdup(dirName); + server->position = count + 1; - DIR_SetFileName(&server->fileName, kMainPersonalAddressBook); + if (fileName) + server->fileName = PL_strdup(fileName); + else + DIR_SetFileName(&server->fileName, kMainPersonalAddressBook); - dir_ServerList->AppendElement(server); - DIR_SavePrefsForOneServer(server); - *pServer = server; - return NS_OK; + dir_ServerList->AppendElement(server); + DIR_SavePrefsForOneServer(server); + *pServer = server; + return NS_OK; + } + return NS_ERROR_FAILURE; } nsresult DIR_DecrementServerRefCount (DIR_Server *server) @@ -2401,7 +2410,8 @@ nsresult DIR_GetAttributeIDsForColumns(DIR_Server *server, DIR_AttributeId ** id idName = AB_pstrtok_r(nil,", ",&marker); if (idName) { - if (DIR_AttributeNameToId(server, idName, &idArray[numAdded]) >= 0) + status = DIR_AttributeNameToId(server, idName, &idArray[numAdded]); + if (NS_SUCCEEDED(status)) numAdded++; } else diff --git a/mailnews/addrbook/src/nsDirPrefs.h b/mailnews/addrbook/src/nsDirPrefs.h index 5f09a7321225..aae7b226967b 100644 --- a/mailnews/addrbook/src/nsDirPrefs.h +++ b/mailnews/addrbook/src/nsDirPrefs.h @@ -232,7 +232,7 @@ nsVoidArray* DIR_GetDirectories(); nsresult DIR_GetDirServers(); nsresult DIR_ShutDown(void); /* FEs should call this when the app is shutting down. It frees all DIR_Servers regardless of ref count values! */ -nsresult DIR_AddNewAddressBook(const char *name, DIR_Server** pServer); +nsresult DIR_AddNewAddressBook(const char *dirName, const char *fileName, DIR_Server** pServer); nsresult DIR_ContainsServer(DIR_Server* pServer, PRBool *hasDir); nsresult DIR_DecrementServerRefCount (DIR_Server *); diff --git a/mailnews/addrbook/src/nsDirectoryDataSource.cpp b/mailnews/addrbook/src/nsDirectoryDataSource.cpp index bf64f1bf2a7e..b37004afe727 100644 --- a/mailnews/addrbook/src/nsDirectoryDataSource.cpp +++ b/mailnews/addrbook/src/nsDirectoryDataSource.cpp @@ -603,25 +603,8 @@ nsresult nsAbDirectoryDataSource::DoNewDirectory(nsIAbDirectory *directory, nsIS nsString tempStr = name; nsAutoCString nameStr(tempStr); - rv = directory->CreateNewDirectory(nameStr); + rv = directory->CreateNewDirectory(nameStr, nsnull); } -/* - nsresult rv = NS_OK; - nsCOMPtr dirArray; - NS_NewISupportsArray(getter_AddRefs(dirArray)); - PRUint32 itemCount; - rv = arguments->Count(&itemCount); - for(PRUint32 item = 0; item < itemCount; item++) - { - nsCOMPtr supports = getter_AddRefs(arguments->ElementAt(item)); - nsCOMPtr newDir(do_QueryInterface(supports)); - if (newDir) - { - nsCOMPtr dirSupports(do_QueryInterface(newDir)); - OnItemAdded(directory, dirSupports); - } - } -*/ return rv; }