nsAbAddressCollector::~nsAbAddressCollector() { nsresult rv; nsCOMPtr<nsIPrefBranch> pPrefBranchInt(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (NS_SUCCEEDED(rv)) pPrefBranchInt->RemoveObserver(PREF_MAIL_COLLECT_ADDRESSBOOK, this); }
nsresult nsAbAddressCollecter::Init(void) { nsresult rv; nsCOMPtr<nsIPrefBranch2> pPrefBranchInt(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv,rv); rv = pPrefBranchInt->AddObserver(PREF_MAIL_COLLECT_ADDRESSBOOK, this, PR_FALSE); nsXPIDLCString prefVal; pPrefBranchInt->GetCharPref(PREF_MAIL_COLLECT_ADDRESSBOOK, getter_Copies(prefVal)); return SetAbURI(prefVal.IsEmpty() ? kPersonalAddressbookUri : prefVal.get()); }
nsAbAddressCollecter::~nsAbAddressCollecter() { if (m_database) { m_database->Commit(nsAddrDBCommitType::kSessionCommit); m_database->Close(PR_FALSE); m_database = nsnull; } nsresult rv; nsCOMPtr<nsIPrefBranch2> pPrefBranchInt(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if(NS_SUCCEEDED(rv)) pPrefBranchInt->RemoveObserver(PREF_MAIL_COLLECT_ADDRESSBOOK, this); }
NS_IMETHODIMP nsAbView::SwapFirstNameLastName() { if (!mTreeSelection) return NS_OK; PRInt32 selectionCount; nsresult rv = mTreeSelection->GetRangeCount(&selectionCount); NS_ENSURE_SUCCESS(rv, rv); if (!selectionCount) return NS_OK; // Prepare for displayname generation // No cache for pref and bundle since the swap operation is not executed frequently bool displayNameAutoGeneration; bool displayNameLastnamefirst = false; nsCOMPtr<nsIPrefBranch2> pPrefBranchInt(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); rv = pPrefBranchInt->GetBoolPref(PREF_MAIL_ADDR_BOOK_DISPLAYNAME_AUTOGENERATION, &displayNameAutoGeneration); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIStringBundle> bundle; if (displayNameAutoGeneration) { nsCOMPtr<nsIPrefLocalizedString> pls; rv = pPrefBranchInt->GetComplexValue(PREF_MAIL_ADDR_BOOK_DISPLAYNAME_LASTNAMEFIRST, NS_GET_IID(nsIPrefLocalizedString), getter_AddRefs(pls)); NS_ENSURE_SUCCESS(rv, rv); nsString str; pls->ToString(getter_Copies(str)); displayNameLastnamefirst = str.EqualsLiteral("true"); nsCOMPtr<nsIStringBundleService> bundleService = do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); rv = bundleService->CreateBundle("chrome://messenger/locale/addressbook/addressBook.properties", getter_AddRefs(bundle)); NS_ENSURE_SUCCESS(rv, rv); } for (PRInt32 i = 0; i < selectionCount; i++) { PRInt32 startRange; PRInt32 endRange; rv = mTreeSelection->GetRangeAt(i, &startRange, &endRange); NS_ENSURE_SUCCESS(rv, NS_OK); PRInt32 totalCards = mCards.Count(); if (startRange >= 0 && startRange < totalCards) { for (PRInt32 rangeIndex = startRange; rangeIndex <= endRange && rangeIndex < totalCards; rangeIndex++) { nsCOMPtr<nsIAbCard> abCard; rv = GetCardFromRow(rangeIndex, getter_AddRefs(abCard)); NS_ENSURE_SUCCESS(rv, rv); // Swap FN/LN nsAutoString fn, ln; abCard->GetFirstName(fn); abCard->GetLastName(ln); if (!fn.IsEmpty() || !ln.IsEmpty()) { abCard->SetFirstName(ln); abCard->SetLastName(fn); // Generate display name using the new order if (displayNameAutoGeneration && !fn.IsEmpty() && !ln.IsEmpty()) { nsString dnLnFn; nsString dnFnLn; const PRUnichar *nameString[2]; const PRUnichar *formatString; // The format should stays the same before/after we swap the names formatString = displayNameLastnamefirst ? NS_LITERAL_STRING("lastFirstFormat").get() : NS_LITERAL_STRING("firstLastFormat").get(); // Generate both ln/fn and fn/ln combination since we need both later // to check to see if the current display name was edited // note that fn/ln still hold the values before the swap nameString[0] = ln.get(); nameString[1] = fn.get(); rv = bundle->FormatStringFromName(formatString, nameString, 2, getter_Copies(dnLnFn)); NS_ENSURE_SUCCESS(rv, rv); nameString[0] = fn.get(); nameString[1] = ln.get(); rv = bundle->FormatStringFromName(formatString, nameString, 2, getter_Copies(dnFnLn)); NS_ENSURE_SUCCESS(rv, rv); // Get the current display name nsAutoString dn; rv = abCard->GetDisplayName(dn); NS_ENSURE_SUCCESS(rv, rv); // Swap the display name if not edited if (displayNameLastnamefirst) { if (dn.Equals(dnLnFn)) abCard->SetDisplayName(dnFnLn); } else { if (dn.Equals(dnFnLn)) abCard->SetDisplayName(dnLnFn); } } // Swap phonetic names rv = abCard->GetPropertyAsAString(kPhoneticFirstNameProperty, fn); NS_ENSURE_SUCCESS(rv, rv); rv = abCard->GetPropertyAsAString(kPhoneticLastNameProperty, ln); NS_ENSURE_SUCCESS(rv, rv); if (!fn.IsEmpty() || !ln.IsEmpty()) { abCard->SetPropertyAsAString(kPhoneticFirstNameProperty, ln); abCard->SetPropertyAsAString(kPhoneticLastNameProperty, fn); } } } } } // Update the tree // Re-sort if either generated or phonetic name is primary or secondary sort, // otherwise invalidate to reflect the change rv = RefreshTree(); return rv; }