fix for CAB UI and backend. bug #167571. following jglick's spec and mscott's document (http://www.mozilla.org/mailnews/arch/cab.html). also fix #168115. add "IM" button to addressbook, and launch default IM application using screenname attributes of selected cards.

if multiple screennames, launch a chat.


git-svn-id: svn://10.0.0.236/trunk@129298 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
sspitzer%netscape.com
2002-09-12 03:59:14 +00:00
parent 656972473a
commit 19807d05ce
15 changed files with 303 additions and 392 deletions

View File

@@ -5,23 +5,28 @@
<!DOCTYPE window SYSTEM "chrome://messenger/locale/addressbook/pref-addressing.dtd">
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:nc="http://home.netscape.com/NC-rdf#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
onload="onLoad();"
headertitle="&pane.title;">
<script type="application/x-javascript" src="chrome://messenger/content/addressbook/pref-directory.js"/>
<script type="application/x-javascript">
<![CDATA[
var _elementIDs = ["emailCollectionIncoming", "emailCollectionOutgoing",
"emailCollectionNewsgroup", "addressingAutocomplete",
"enableCABsizeLimit", "CABsizeLimit", "autocompleteLDAP",
var _elementIDs = ["emailCollectionOutgoing",
"addressingAutocomplete",
"autocompleteLDAP",
"localDirectoriesList",
"directoriesList"];
function onLoad(){
function onLoad()
{
createDirectoriesList(true);
parent.initPanel('chrome://messenger/content/addressbook/pref-addressing.xul');
}
function Startup(){
function Startup()
{
enableAutocomplete();
}
]]>
@@ -30,27 +35,26 @@
<groupbox>
<caption label="&emailCollectiontitle.label;"/>
<description>&emailCollectiontext.label;</description>
<vbox align="start" class="indent">
<checkbox id="emailCollectionIncoming" label="&emailCollectionIncomingEnable.label;"
prefstring="mail.collect_email_address_incoming"
accesskey="&emailCollectionIncomingEnable.accesskey;"/>
<checkbox id="emailCollectionOutgoing" label="&emailCollectionOutgoingEnable.label;"
prefstring="mail.collect_email_address_outgoing"
accesskey="&emailCollectionOutgoingEnable.accesskey;"/>
<checkbox id="emailCollectionNewsgroup" label="&emailCollectionNewsgroupEnable.label;"
prefstring="mail.collect_email_address_newsgroup"
accesskey="&emailCollectionNewsgroupEnable.accesskey;"/>
</vbox>
<hbox align="center">
<checkbox id="enableCABsizeLimit" label="&useCABSizelimitPart1.label;"
prefstring="mail.collect_email_address_enable_size_limit"
accesskey="&useCABSizelimitPart1.accesskey;"/>
<textbox id="CABsizeLimit" size="6" preftype="int"
prefstring="mail.collect_email_address_size_limit"/>
<label id="useCABSizelimitPart2" class="small-margin" value="&useCABSizelimitPart2.label;"
accesskey="&useCABSizelimitPart2.accesskey;"
control="CABsizeLimit"/>
</hbox>
<checkbox id="emailCollectionOutgoing"
label="&emailCollectionPicker.label;"
prefstring="mail.collect_email_address_outgoing"/>
<menulist id="localDirectoriesList" flex="1"
preftype="string"
prefstring="mail.collect_addressbook">
<menupopup id="abPopup-menupopup" ref="moz-abdirectory://"
datasources="rdf:addressdirectory">
<template>
<rule nc:IsWriteable="false"/>
<rule nc:IsMailList="false">
<menuitem uri="..."
label="rdf:http://home.netscape.com/NC-rdf#DirName"
value="rdf:http://home.netscape.com/NC-rdf#DirUri"/>
</rule>
</template>
</menupopup>
</menulist>
</hbox>
</groupbox>
<groupbox id="addressAutocompletion">
@@ -66,7 +70,7 @@
prefstring="ldap_2.autoComplete.useDirectory"
oncommand="enableAutocomplete();"
accesskey="&directories.accesskey;"/>
<menulist id="directoriesList" flex="1"
<menulist id="directoriesList" flex="1"
preftype="string"
prefstring="ldap_2.autoComplete.directoryServer">
<menupopup id="directoriesListPopup"
@@ -78,13 +82,13 @@
oncommand="onEditDirectories();"
accesskey="&editDirectories.accesskey;"/>
</hbox>
<!--
<!--
<description>&matchText.label;</description>
<hbox align="center">
<checkbox id="autocompleteSkipDirectory"
label="&skipDirectory.label;"
prefstring="ldap_2.autoComplete.skipDirectoryIfLocalMatchFound"/>
</hbox>
-->
-->
</groupbox>
</page>

View File

@@ -35,20 +35,9 @@ Rights Reserved.
<!ENTITY oneMatch.label "If there is one match in your personal address books:">
<!ENTITY useAddress.label "Use the address and do not search in the directory">
<!ENTITY useAddress.accesskey "u">
<!ENTITY emailCollectionEnable.label "Enable Email Address Collection">
<!ENTITY emailCollectionIncomingEnable.label "Incoming Mail Messages">
<!ENTITY emailCollectionIncomingEnable.accesskey "I">
<!ENTITY emailCollectionOutgoingEnable.label "Outgoing Mail Messages">
<!ENTITY emailCollectionOutgoingEnable.accesskey "O">
<!ENTITY emailCollectionNewsgroupEnable.label "Outgoing Newsgroup Messages">
<!ENTITY emailCollectionNewsgroupEnable.accesskey "u">
<!ENTITY emailCollectionTypeText.label "Save email addresses from:">
<!ENTITY emailCollectiontitle.label "Email Address Collection">
<!ENTITY emailCollectiontext.label "Email addresses from messages can be added to a local address book, 'Collected Addresses'. Add email addresses from:">
<!ENTITY useCABSizelimitPart1.label "Limit the Collected Address book to">
<!ENTITY useCABSizelimitPart1.accesskey "L">
<!ENTITY useCABSizelimitPart2.label "cards">
<!ENTITY useCABSizelimitPart2.accesskey "c">
<!ENTITY emailCollectionPicker.label "Add email addresses to my:">
<!ENTITY emailCollectiontext.label "Email addresses from outgoing messages can be automatically added to a local address book.">
<!-- Autocompletion -->
<!ENTITY addressingTitle.label "Address Autocompletion">

View File

@@ -675,42 +675,41 @@ function IsCardViewAndAbResultsPaneSplitterCollapsed()
function LaunchUrl(url)
{
openTopWin(url);
var messenger = Components.classes["@mozilla.org/messenger;1"].createInstance(Components.interfaces.nsIMessenger);
messenger.SetWindow(window,null);
messenger.OpenURL(url);
}
function AbIMSelected()
{
var cards = GetSelectedAbCards();
var count = cards.length;
var url;
if (count == 0) {
url = "aim:goim";
LaunchUrl(url);
return;
}
var screennames;
var screennameCount = 0;
for (var i=0;i<count;i++) {
url = "aim:goim?screenname=" + cards[i].aimScreenName;
LaunchUrl(url);
}
}
var screenname = cards[i].aimScreenName;
if (screenname) {
if (screennameCount == 0)
screennames = screenname;
else
screennames += "," + screenname;
function AbChatSelected()
{
var cards = GetSelectedAbCards();
var count = cards.length;
var url = "aim:SendChatInvite";
if (count == 0) {
LaunchUrl(url);
return;
screennameCount++
}
}
url += "?listofscreennames=" + cards[0].aimScreenName;
for (var i=1;i<count;i++) {
url += "," + cards[i].aimScreenName;
var url = "aim:";
if (screennameCount == 0)
url += "goim";
else if (screennameCount == 1)
url += "goim?screenname=" + screennames;
else {
url += "SendChatInvite?listofscreennames=" + screennames;
url += "&message=" + gAddressBookBundle.getString("joinMeInThisChat");
}
url += "&message=Join+me+in+this+Chat."; // move to properties
LaunchUrl(url);
}

View File

@@ -123,11 +123,6 @@ Contributor(s):
<key id="showHideSidebar"/>
<key id="key_properties" key="&propertiesCmd.key;" command="cmd_properties" modifiers="accel"/>
<!-- not ready yet
<key id="key_chat" key="&newChat.key;" oncommand="AbChatSelected()" modifiers="shift,accel"/>
<key id="key_im" key="&newIM.key;" oncommand="AbIMSelected()" modifiers="shift,accel"/>
-->
<!-- Tab/F6 Keys -->
<key keycode="VK_TAB" oncommand="SwitchPaneFocus(event);" modifiers="control,shift"/>
<key keycode="VK_TAB" oncommand="SwitchPaneFocus(event);" modifiers="control"/>
@@ -150,10 +145,6 @@ Contributor(s):
<menuitem label="&newAddressBookCmd.label;" accesskey="&newAddressBookCmd.accesskey;" oncommand="AbNewAddressBook()"/>
<menuitem label="&newLDAPDirectoryCmd.label;" id="addLDAP" accesskey="&newLDAPDirectoryCmd.accesskey;" oncommand="AbNewLDAPDirectory()"/>
<menuseparator/>
<!-- not ready yet
<menuitem label="&newIM.label;" key="key_im" accesskey="&newIM.accesskey;" oncommand="AbIMSelected()"/>
<menuitem label="&newChat.label;" key="key_chat" accesskey="&newChat.accesskey;" oncommand="AbChatSelected()"/>
-->
<menuitem id="menu_newNavigator"/>
<menuitem id="menu_newEditor"/>
</menupopup>
@@ -315,6 +306,7 @@ Contributor(s):
<toolbarseparator class="toolbarseparator-primary"/>
<toolbarbutton class="toolbarbutton-1" id="button-editcard" label="&editButton.label;" tooltiptext="&editButton.tooltip;" oncommand="goDoCommand('button_edit');"/>
<toolbarbutton class="toolbarbutton-1" id="button-newmessage" label="&newmsgButton.label;" tooltiptext="&newmsgButton.tooltip;" oncommand="AbNewMessage();"/>
<toolbarbutton class="toolbarbutton-1" id="button-newim" label="&newIM.label;" tooltiptext="&newIM.tooltip;" oncommand="AbIMSelected();"/>
<toolbarbutton class="toolbarbutton-1" id="button-delete" observes="button_delete" label="&deleteButton.label;" tooltiptext="&deleteButton.tooltip;" oncommand="goDoCommand('button_delete');"/>
<vbox flex="1">

View File

@@ -33,15 +33,11 @@ Rights Reserved.
<!ENTITY newAddressBookCmd.label "Address Book...">
<!-- LOCALIZATION NOTE (newAddressBookCmd.accesskey) : DONT_TRANSLATE -->
<!ENTITY newAddressBookCmd.accesskey "b">
<!ENTITY newLDAPDirectoryCmd.label "LDAP Directory...">
<!ENTITY newLDAPDirectoryCmd.label "LDAP Directory...">
<!-- LOCALIZATION NOTE (newLDAPDirectoryCmd.accesskey) : DONT_TRANSLATE -->
<!ENTITY newLDAPDirectoryCmd.accesskey "D">
<!ENTITY newIM.label "IM">
<!ENTITY newIM.accesskey "I">
<!ENTITY newIM.key "I">
<!ENTITY newChat.label "Chat">
<!ENTITY newChat.accesskey "h">
<!ENTITY newChat.key "H">
<!ENTITY newLDAPDirectoryCmd.accesskey "D">
<!ENTITY newIM.label "IM">
<!ENTITY newIM.tooltip "IM / Chat selected people">
<!ENTITY importCmd.label "Import...">
<!ENTITY importCmd.accesskey "I">
<!ENTITY exportCmd.label "Export...">

View File

@@ -104,3 +104,7 @@ failedToExportMessageFileAccessDenied=Failed to export addressbook, file access
# For getting authDN for replication using dlg box
AuthDlgTitle=Address Book LDAP Replication
AuthDlgDesc=To access the directory server, enter your user name and password.
# LOCALIZATION NOTE(joinMeInThisChat)
# use + for spaces
joinMeInThisChat=Join+me+in+this+Chat.

View File

@@ -21,7 +21,7 @@
*
* Contributor(s):
* Seth Spitzer <sspitzer@netscape.com>
* Pierre Phaneuf <pp@ludusdesign.com>
* Pierre Phaneuf <pp@ludusdesign.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -52,40 +52,35 @@
#include "nsXPIDLString.h"
#include "nsReadableUtils.h"
#include "prmem.h"
#include "nsIAddressBook.h"
NS_IMPL_ISUPPORTS1(nsAbAddressCollecter, nsIAbAddressCollecter)
#define PREF_COLLECT_EMAIL_ADDRESS_ENABLE_SIZE_LIMIT "mail.collect_email_address_enable_size_limit"
#define PREF_COLLECT_EMAIL_ADDRESS_SIZE_LIMIT "mail.collect_email_address_size_limit"
#define PREF_MAIL_COLLECT_ADDRESSBOOK "mail.collect_addressbook"
nsAbAddressCollecter::nsAbAddressCollecter()
{
NS_INIT_ISUPPORTS();
m_maxCABsize = -1;
m_sizeLimitEnabled = PR_FALSE;
NS_INIT_ISUPPORTS();
}
nsAbAddressCollecter::~nsAbAddressCollecter()
{
if (m_historyAB)
{
m_historyAB->Commit(nsAddrDBCommitType::kSessionCommit);
m_historyAB->Close(PR_FALSE);
m_historyAB = nsnull;
}
if (m_database) {
m_database->Commit(nsAddrDBCommitType::kSessionCommit);
m_database->Close(PR_FALSE);
m_database = nsnull;
}
}
NS_IMETHODIMP nsAbAddressCollecter::CollectUnicodeAddress(const PRUnichar * aAddress)
{
NS_ENSURE_ARG(aAddress);
NS_ENSURE_ARG_POINTER(aAddress);
nsresult rv = NS_OK;
// convert the unicode string to UTF-8...
nsAutoString unicodeString (aAddress);
char * utf8Version = ToNewUTF8String(unicodeString);
if (utf8Version)
{
if (utf8Version) {
rv = CollectAddress(utf8Version);
Recycle(utf8Version);
}
@@ -95,321 +90,217 @@ NS_IMETHODIMP nsAbAddressCollecter::CollectUnicodeAddress(const PRUnichar * aAdd
NS_IMETHODIMP nsAbAddressCollecter::CollectAddress(const char *address)
{
nsresult rv;
nsresult rv;
nsCOMPtr<nsIPref> pPref(do_GetService(NS_PREF_CONTRACTID, &rv));
NS_ENSURE_SUCCESS(rv, rv);
if (!m_historyAB)
{
rv = OpenHistoryAB(getter_AddRefs(m_historyAB));
if (NS_FAILED(rv) || !m_historyAB)
return rv;
}
// note that we're now setting the whole recipient list,
// not just the pretty name of the first recipient.
PRUint32 numAddresses;
char *names;
char *addresses;
rv = OpenDatabase();
NS_ENSURE_SUCCESS(rv, rv);
nsresult res = NS_OK;
nsCOMPtr<nsIMsgHeaderParser> pHeader = do_GetService(NS_MAILNEWS_MIME_HEADER_PARSER_CONTRACTID, &res);
// note that we're now setting the whole recipient list,
// not just the pretty name of the first recipient.
PRUint32 numAddresses;
char *names;
char *addresses;
if (NS_FAILED(res)) return res;
nsCOMPtr<nsIMsgHeaderParser> pHeader = do_GetService(NS_MAILNEWS_MIME_HEADER_PARSER_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsresult ret = pHeader->ParseHeaderAddresses (nsnull, address, &names, &addresses, &numAddresses);
if (ret == NS_OK)
{
char *curName = names;
char *curAddress = addresses;
char *excludeDomainList = nsnull;
rv = pHeader->ParseHeaderAddresses(nsnull, address, &names, &addresses, &numAddresses);
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to parse, so can't collect");
if (NS_FAILED(rv))
return NS_OK;
for (PRUint32 i = 0; i < numAddresses; i++)
{
PRBool exclude;
char *curName = names;
char *curAddress = addresses;
char *excludeDomainList = nsnull;
rv = IsDomainExcluded(curAddress, pPref, &exclude);
if (NS_SUCCEEDED(rv) && !exclude)
{
nsCOMPtr <nsIAbCard> existingCard;
nsCOMPtr <nsIAbCard> cardInstance;
for (PRUint32 i = 0; i < numAddresses; i++)
{
nsCOMPtr <nsIAbCard> existingCard;
nsCOMPtr <nsIAbCard> cardInstance;
// Please DO NOT change the 3rd param of GetCardFromAttribute() call to
// PR_TRUE (ie, case insensitive) without reading bugs #128535 and #121478.
rv = m_historyAB->GetCardFromAttribute(m_historyDirectory, kPriEmailColumn, curAddress, PR_FALSE /* retain case */, getter_AddRefs(existingCard));
// Please DO NOT change the 3rd param of GetCardFromAttribute() call to
// PR_TRUE (ie, case insensitive) without reading bugs #128535 and #121478.
rv = m_database->GetCardFromAttribute(m_directory, kPriEmailColumn, curAddress, PR_FALSE /* retain case */, getter_AddRefs(existingCard));
if (!existingCard)
{
nsCOMPtr<nsIAbCard> senderCard = do_CreateInstance(NS_ABCARDPROPERTY_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv) && senderCard)
{
if (curName && strlen(curName) > 0)
{
SetNamesForCard(senderCard, curName);
}
else
{
nsAutoString senderFromEmail; senderFromEmail.AssignWithConversion(curAddress);
PRInt32 atSignIndex = senderFromEmail.FindChar('@');
if (atSignIndex > 0)
{
senderFromEmail.Truncate(atSignIndex);
senderCard->SetDisplayName(senderFromEmail.get());
}
}
nsAutoString email; email.AssignWithConversion(curAddress);
senderCard->SetPrimaryEmail(email.get());
if (!existingCard)
{
nsCOMPtr<nsIAbCard> senderCard = do_CreateInstance(NS_ABCARDPROPERTY_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv) && senderCard)
{
if (curName && strlen(curName) > 0)
SetNamesForCard(senderCard, curName);
else
{
nsAutoString senderFromEmail(NS_ConvertASCIItoUCS2(curAddress).get());
PRInt32 atSignIndex = senderFromEmail.FindChar('@');
if (atSignIndex > 0)
{
senderFromEmail.Truncate(atSignIndex);
senderCard->SetDisplayName(senderFromEmail.get());
}
}
rv = AddCardToCollectedAddressBook(senderCard);
NS_ENSURE_SUCCESS(rv,rv);
}
}
else //address is already in the CAB
{
if (m_sizeLimitEnabled)
{
// XXX todo
// there has to be a better way to do this, without deleting
// and adding the card. perhaps using modified time
// this doesn't seem like the best way to do LRU
m_historyAB->DeleteCard(existingCard, PR_TRUE /* notify */);
SetNamesForCard(existingCard, curName);
//append it to the bottom.
rv = AddCardToCollectedAddressBook(existingCard);
NS_ENSURE_SUCCESS(rv,rv);
}
else
{
SetNamesForCard(existingCard, curName);
existingCard->EditCardToDatabase(kCollectedAddressbookUri);
}
}
senderCard->SetPrimaryEmail(NS_ConvertASCIItoUCS2(curAddress).get());
if (m_sizeLimitEnabled)
{
PRUint32 count = 0;
rv = m_historyAB->GetCardCount( &count );
rv = AddCardToAddressBook(senderCard);
NS_ENSURE_SUCCESS(rv,rv);
}
}
else // address is already in the AB
{
SetNamesForCard(existingCard, curName);
existingCard->EditCardToDatabase(m_abURI.get());
}
if( count > (PRUint32)m_maxCABsize )
rv = m_historyAB->RemoveExtraCardsInCab(count, m_maxCABsize);
curName += strlen(curName) + 1;
curAddress += strlen(curAddress) + 1;
}
} //if m_sizeLimitEnabled
}
curName += strlen(curName) + 1;
curAddress += strlen(curAddress) + 1;
} //for
PR_FREEIF(addresses);
PR_FREEIF(names);
PR_FREEIF(excludeDomainList);
}
return NS_OK;
PR_FREEIF(addresses);
PR_FREEIF(names);
PR_FREEIF(excludeDomainList);
return NS_OK;
}
nsresult nsAbAddressCollecter::OpenHistoryAB(nsIAddrDatabase **aDatabase)
nsresult nsAbAddressCollecter::OpenDatabase()
{
if (!aDatabase)
return NS_ERROR_NULL_POINTER;
// check if already open
if (m_database)
return NS_OK;
nsresult rv = NS_OK;
nsFileSpec* dbPath = nsnull;
nsresult rv;
nsCOMPtr<nsIAddrBookSession> abSession =
do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrBookSession> abSession =
do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
if(NS_SUCCEEDED(rv))
abSession->GetUserProfileDirectory(&dbPath);
if (dbPath)
{
(*dbPath) += kCollectedAddressbook;
nsCOMPtr<nsIAddressBook> addressBook = do_GetService(NS_ADDRESSBOOK_CONTRACTID
, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = addressBook->GetAbDatabaseFromURI(m_abURI.get(), getter_AddRefs(m_database));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrDatabase> addrDBFactory =
do_GetService(NS_ADDRDATABASE_CONTRACTID, &rv);
nsCOMPtr<nsIRDFService> rdfService = do_GetService("@mozilla.org/rdf/rdf-service;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_SUCCEEDED(rv) && addrDBFactory)
{
rv = addrDBFactory->Open(dbPath, PR_TRUE, aDatabase, PR_TRUE);
if (NS_FAILED(rv))
{
// blow away corrupt db's
dbPath->Delete(PR_FALSE);
}
}
delete dbPath;
}
nsCOMPtr<nsIRDFService> rdfService(do_GetService("@mozilla.org/rdf/rdf-service;1", &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr <nsIRDFResource> resource;
rv = rdfService->GetResource(m_abURI.get(), getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr <nsIRDFResource> resource;
rv = rdfService->GetResource(kCollectedAddressbookUri, getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv, rv);
// query interface
m_historyDirectory = do_QueryInterface(resource, &rv);
return rv;
m_directory = do_QueryInterface(resource, &rv);
NS_ENSURE_SUCCESS(rv, rv);
return rv;
}
nsresult nsAbAddressCollecter::IsDomainExcluded(const char *address, nsIPref *pPref, PRBool *bExclude)
nsresult
nsAbAddressCollecter::SetNamesForCard(nsIAbCard *senderCard, const char *fullName)
{
if (!bExclude)
return NS_ERROR_NULL_POINTER;
char *firstName = nsnull;
char *lastName = nsnull;
*bExclude = PR_FALSE;
senderCard->SetDisplayName(NS_ConvertUTF8toUCS2(fullName).get());
nsXPIDLCString excludedDomainList;
nsresult rv = pPref->CopyCharPref("mail.address_collection_ignore_domain_list",
getter_Copies(excludedDomainList));
if (NS_FAILED(rv) || !excludedDomainList || !excludedDomainList[0])
return NS_OK;
nsCAutoString incomingDomain(address);
PRInt32 atSignIndex = incomingDomain.RFindChar('@');
if (atSignIndex > 0)
{
incomingDomain.Cut(0, atSignIndex + 1);
char *token = nsnull;
char *rest = NS_CONST_CAST(char*,(const char*)excludedDomainList);
nsCAutoString str;
// XXX todo, fix this leak
token = nsCRT::strtok(rest, ",", &rest);
while (token && *token)
{
str = token;
str.StripWhitespace();
if (!str.IsEmpty())
{
if (str.Equals(incomingDomain))
{
*bExclude = PR_TRUE;
break;
}
}
str = "";
token = nsCRT::strtok(rest, ",", &rest);
}
}
return rv;
}
nsresult nsAbAddressCollecter::SetNamesForCard(nsIAbCard *senderCard, const char *fullName)
{
char *firstName = nsnull;
char *lastName = nsnull;
senderCard->SetDisplayName(NS_ConvertUTF8toUCS2(fullName).get());
nsresult rv = SplitFullName (fullName, &firstName, &lastName);
if (NS_SUCCEEDED(rv))
{
senderCard->SetFirstName(NS_ConvertUTF8toUCS2(firstName).get());
nsresult rv = SplitFullName(fullName, &firstName, &lastName);
if (NS_SUCCEEDED(rv))
{
senderCard->SetFirstName(NS_ConvertUTF8toUCS2(firstName).get());
if (lastName)
senderCard->SetLastName(NS_ConvertUTF8toUCS2(lastName).get());
}
PR_FREEIF(firstName);
PR_FREEIF(lastName);
return rv;
PR_FREEIF(firstName);
PR_FREEIF(lastName);
return rv;
}
nsresult nsAbAddressCollecter::SplitFullName (const char *fullName, char **firstName, char **lastName)
nsresult nsAbAddressCollecter::SplitFullName(const char *fullName, char **firstName, char **lastName)
{
if (fullName)
if (fullName)
{
*firstName = nsCRT::strdup(fullName);
if (!*firstName)
return NS_ERROR_OUT_OF_MEMORY;
char *plastSpace = *firstName;
char *walkName = *firstName;
char *plastName = nsnull;
while (walkName && *walkName)
{
*firstName = nsCRT::strdup(fullName);
if (NULL == *firstName)
return NS_ERROR_OUT_OF_MEMORY;
char *plastSpace = *firstName;
char *walkName = *firstName;
char *plastName = nsnull;
while (walkName && *walkName)
{
if (*walkName == ' ')
{
plastSpace = walkName;
plastName = plastSpace + 1;
}
if (*walkName == ' ')
{
plastSpace = walkName;
plastName = plastSpace + 1;
}
walkName++;
}
if (plastName)
{
*plastSpace = '\0';
*lastName = nsCRT::strdup (plastName);
}
walkName++;
}
return NS_OK;
if (plastName)
{
*plastSpace = '\0';
*lastName = nsCRT::strdup(plastName);
}
}
return NS_OK;
}
int PR_CALLBACK
nsAbAddressCollecter::collectEmailAddressEnableSizeLimitPrefChanged(const char *newpref, void *data)
nsAbAddressCollecter::collectAddressBookPrefChanged(const char *aNewpref, void *aData)
{
nsresult rv;
nsAbAddressCollecter *adCol = (nsAbAddressCollecter *) data;
nsCOMPtr<nsIPref> pPref(do_GetService(NS_PREF_CONTRACTID, &rv));
if(NS_FAILED(pPref->GetBoolPref(PREF_COLLECT_EMAIL_ADDRESS_ENABLE_SIZE_LIMIT, &adCol->m_sizeLimitEnabled))){
adCol->m_sizeLimitEnabled = PR_TRUE;
}
return 0;
}
nsresult rv;
nsAbAddressCollecter *adCol = (nsAbAddressCollecter *) aData;
nsCOMPtr<nsIPref> pPref(do_GetService(NS_PREF_CONTRACTID, &rv));
NS_ASSERTION(NS_SUCCEEDED(rv), "failed to get prefs");
int PR_CALLBACK
nsAbAddressCollecter::collectEmailAddressSizeLimitPrefChanged(const char *newpref, void *data)
{
nsresult rv;
nsAbAddressCollecter *adCol = (nsAbAddressCollecter *) data;
nsCOMPtr<nsIPref> pPref(do_GetService(NS_PREF_CONTRACTID, &rv));
if(NS_FAILED(pPref->GetIntPref(PREF_COLLECT_EMAIL_ADDRESS_SIZE_LIMIT, &adCol->m_maxCABsize))){
adCol->m_maxCABsize = 0;
}
return 0;
nsXPIDLCString prefVal;
rv = pPref->GetCharPref(PREF_MAIL_COLLECT_ADDRESSBOOK, getter_Copies(prefVal));
rv = adCol->SetAbURI((NS_FAILED(rv) || prefVal.IsEmpty()) ? kPersonalAddressbook : prefVal.get());
NS_ASSERTION(NS_SUCCEEDED(rv),"failed to change collected ab");
return 0;
}
nsresult nsAbAddressCollecter::Init(void)
{
nsresult rv;
nsCOMPtr<nsIPref> pPref(do_GetService(NS_PREF_CONTRACTID, &rv));
NS_ENSURE_SUCCESS(rv,rv);
nsresult rv;
nsCOMPtr<nsIPref> pPref(do_GetService(NS_PREF_CONTRACTID, &rv));
NS_ENSURE_SUCCESS(rv,rv);
rv = pPref->RegisterCallback(PREF_COLLECT_EMAIL_ADDRESS_ENABLE_SIZE_LIMIT, collectEmailAddressEnableSizeLimitPrefChanged, this);
NS_ENSURE_SUCCESS(rv,rv);
rv = pPref->RegisterCallback(PREF_COLLECT_EMAIL_ADDRESS_SIZE_LIMIT, collectEmailAddressSizeLimitPrefChanged, this);
rv = pPref->RegisterCallback(PREF_MAIL_COLLECT_ADDRESSBOOK, collectAddressBookPrefChanged, this);
NS_ENSURE_SUCCESS(rv,rv);
rv = pPref->GetBoolPref(PREF_COLLECT_EMAIL_ADDRESS_ENABLE_SIZE_LIMIT, &m_sizeLimitEnabled);
NS_ENSURE_SUCCESS(rv,rv);
nsXPIDLCString prefVal;
rv = pPref->GetCharPref(PREF_MAIL_COLLECT_ADDRESSBOOK, getter_Copies(prefVal));
rv = SetAbURI((NS_FAILED(rv) || prefVal.IsEmpty()) ? kPersonalAddressbook : prefVal.get());
NS_ENSURE_SUCCESS(rv,rv);
return NS_OK;
}
rv = pPref->GetIntPref(PREF_COLLECT_EMAIL_ADDRESS_SIZE_LIMIT, &m_maxCABsize);
nsresult nsAbAddressCollecter::AddCardToAddressBook(nsIAbCard *card)
{
NS_ENSURE_ARG_POINTER(card);
nsCOMPtr <nsIAbCard> addedCard;
nsresult rv = m_directory->AddCard(card, getter_AddRefs(addedCard));
NS_ENSURE_SUCCESS(rv,rv);
return rv;
}
nsresult nsAbAddressCollecter::AddCardToCollectedAddressBook(nsIAbCard *card)
nsresult nsAbAddressCollecter::SetAbURI(const char *aURI)
{
NS_ENSURE_ARG_POINTER(card);
if (m_database) {
m_database->Commit(nsAddrDBCommitType::kSessionCommit);
m_database->Close(PR_FALSE);
m_database = nsnull;
}
m_directory = nsnull;
m_abURI = aURI;
nsresult rv = NS_OK;
nsCOMPtr<nsIRDFService> rdf(do_GetService("@mozilla.org/rdf/rdf-service;1", &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIRDFResource> res;
rv = rdf->GetResource(kCollectedAddressbookUri, getter_AddRefs(res));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAbDirectory> directory(do_QueryInterface(res, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr <nsIAbCard> addedCard;
rv = directory->AddCard(card, getter_AddRefs(addedCard));
nsresult rv = OpenDatabase();
NS_ENSURE_SUCCESS(rv,rv);
return rv;
return rv;
}

View File

@@ -51,29 +51,26 @@ class nsIPref;
class nsAbAddressCollecter : public nsIAbAddressCollecter
{
public:
nsAbAddressCollecter();
virtual ~nsAbAddressCollecter();
nsAbAddressCollecter();
virtual ~nsAbAddressCollecter();
NS_DECL_ISUPPORTS
NS_DECL_ISUPPORTS
NS_DECL_NSIABADDRESSCOLLECTER
nsresult OpenHistoryAB(nsIAddrDatabase **aDatabase);
nsresult IsDomainExcluded(const char *address, nsIPref *pPref, PRBool *bExclude);
nsresult SetNamesForCard(nsIAbCard *senderCard, const char *fullName);
nsresult SplitFullName (const char *fullName, char **firstName, char **lastName);
nsresult SetAbURI(const char *aURI);
nsresult OpenDatabase();
nsresult SetNamesForCard(nsIAbCard *senderCard, const char *fullName);
nsresult SplitFullName (const char *fullName, char **firstName, char **lastName);
nsresult Init();
private:
static int PR_CALLBACK collectEmailAddressEnableSizeLimitPrefChanged(const char *newpref, void *data);
static int PR_CALLBACK collectEmailAddressSizeLimitPrefChanged(const char *newpref, void *data);
nsresult AddCardToCollectedAddressBook(nsIAbCard *card);
static int PR_CALLBACK collectAddressBookPrefChanged(const char *newpref, void *data);
nsresult AddCardToAddressBook(nsIAbCard *card);
protected:
nsCOMPtr <nsIAddrDatabase> m_historyAB;
nsCOMPtr <nsIAbDirectory> m_historyDirectory;
PRInt32 m_maxCABsize;
PRBool m_sizeLimitEnabled;
nsCOMPtr <nsIAddrDatabase> m_database;
nsCOMPtr <nsIAbDirectory> m_directory;
nsCString m_abURI;
};
#endif // _nsAbAddressCollecter_H_

View File

@@ -65,17 +65,18 @@ interface nsIMessenger : nsISupports {
void DeleteMessages(in nsIRDFCompositeDataSource database,
in nsIRDFResource srcFolderResource,
in nsISupportsArray messages,
in boolean reallyDelete);
in boolean reallyDelete);
void DeleteFolders(in nsIRDFCompositeDataSource db,
in nsIRDFResource parentFolder,
in nsIRDFResource folder);
void CopyMessages(in nsIRDFCompositeDataSource database,
void CopyMessages(in nsIRDFCompositeDataSource database,
in nsIRDFResource srcResource,
in nsIRDFResource dstResource,
in nsISupportsArray messages,
in boolean isMove);
void CopyFolders(in nsIRDFCompositeDataSource database,
void CopyFolders(in nsIRDFCompositeDataSource database,
in nsIRDFResource dstResource,
in nsISupportsArray folders,
in boolean isMoveFolder);
@@ -95,8 +96,8 @@ interface nsIMessenger : nsISupports {
unsigned long GetRedoTransactionType();
void Undo(in nsIMsgWindow msgWindow);
void Redo(in nsIMsgWindow msgWindow);
void sendUnsentMessages(in nsIMsgIdentity aIdentity, in nsIMsgWindow aMsgWindow);
void SetDocumentCharset(in wstring characterSet);
void sendUnsentMessages(in nsIMsgIdentity aIdentity, in nsIMsgWindow aMsgWindow);
void SetDocumentCharset(in wstring characterSet);
void saveAs(in string url, in boolean asFile, in nsIMsgIdentity identity, in nsIMsgWindow aMsgWindow);
void openAttachment(in string contentTpe, in string url, in string displayName, in string messageUri);
void saveAttachment(in string contentTpe, in string url, in string displayName, in string messageUri);

View File

@@ -401,6 +401,11 @@ nsMessenger::SetWindow(nsIDOMWindowInternal *aWin, nsIMsgWindow *aMsgWindow)
}
}
// we don't always have a message pane, like in the addressbook
// so if we don't havea docshell, use the one for the xul window.
// we do this so OpenURL() will work.
if (!mDocShell)
mDocShell = docShell;
return NS_OK;
}
@@ -556,8 +561,8 @@ nsMessenger::OpenURL(const char * url)
char* unescapedUrl = PL_strdup(url);
if (unescapedUrl)
{
// I don't know why we're unescaping this url - I'll leave it unescaped
// for the web shell, but the message service doesn't need it unescaped.
// I don't know why we're unescaping this url - I'll leave it unescaped
// for the web shell, but the message service doesn't need it unescaped.
nsUnescape(unescapedUrl);
nsCOMPtr <nsIMsgMessageService> messageService;
@@ -572,10 +577,9 @@ nsMessenger::OpenURL(const char * url)
//If it's not something we know about, then just load the url.
else
{
nsAutoString urlStr; urlStr.AssignWithConversion(unescapedUrl);
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(mDocShell));
if(webNav)
webNav->LoadURI(urlStr.get(), // URI string
webNav->LoadURI(NS_ConvertASCIItoUCS2(unescapedUrl).get(), // URI string
nsIWebNavigation::LOAD_FLAGS_NONE, // Load flags
nsnull, // Refering URI
nsnull, // Post stream

View File

@@ -91,17 +91,17 @@ nsresult GetMessageServiceContractIDForURI(const char *uri, nsCString &contractI
nsresult GetMessageServiceFromURI(const char *uri, nsIMsgMessageService **aMessageService)
{
nsresult rv;
nsresult rv;
nsCAutoString contractID;
rv = GetMessageServiceContractIDForURI(uri, contractID);
rv = GetMessageServiceContractIDForURI(uri, contractID);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr <nsIMsgMessageService> msgService = do_GetService(contractID.get(), &rv);
NS_ENSURE_SUCCESS(rv,rv);
NS_IF_ADDREF(*aMessageService = msgService);
return rv;
return rv;
}
nsresult GetMsgDBHdrFromURI(const char *uri, nsIMsgDBHdr **msgHdr)

View File

@@ -286,14 +286,15 @@ pref("mail.identity.default.stationery_folder","mailbox://nobody@Local%20Folders
pref("mail.identity.default.directoryServer","");
pref("mail.identity.default.overrideGlobal_Pref", false);
// by default, only collect addresses the user sends to (outgoing)
// incoming is all spam anyways
pref("mail.collect_email_address_incoming", false);
pref("mail.collect_email_address_outgoing", true);
pref("mail.collect_email_address_newsgroup", false);
pref("mail.collect_email_address_enable_size_limit", true);
pref("mail.collect_email_address_size_limit", 700);
// by default, use the Personal Addressbook for collection
pref("mail.collect_addressbook","moz-abmdbdirectory://abook.mab");
pref("mail.default_sendlater_uri","mailbox://nobody@Local%20Folders/Unsent%20Messages");
pref("mail.server.default.port", -1);

View File

@@ -286,14 +286,15 @@ pref("mail.identity.default.stationery_folder","mailbox://nobody@Local%20Folders
pref("mail.identity.default.directoryServer","");
pref("mail.identity.default.overrideGlobal_Pref", false);
// by default, only collect addresses the user sends to (outgoing)
// incoming is all spam anyways
pref("mail.collect_email_address_incoming", false);
pref("mail.collect_email_address_outgoing", true);
pref("mail.collect_email_address_newsgroup", false);
pref("mail.collect_email_address_enable_size_limit", true);
pref("mail.collect_email_address_size_limit", 700);
// by default, use the Personal Addressbook for collection
pref("mail.collect_addressbook","moz-abmdbdirectory://abook.mab");
pref("mail.default_sendlater_uri","mailbox://nobody@Local%20Folders/Unsent%20Messages");
pref("mail.server.default.port", -1);

View File

@@ -100,6 +100,22 @@
-moz-image-region: rect(126px 92px 147px 69px) !important;
}
#button-newim {
-moz-image-region: rect(126px 23px 147px 0px);
}
#button-newim:hover {
-moz-image-region: rect(126px 46px 147px 23px);
}
#button-newim:hover:active {
-moz-image-region: rect(126px 69px 147px 46px);
}
#button-newim[disabled] {
-moz-image-region: rect(126px 92px 147px 69px) !important;
}
#button-delete {
-moz-image-region: rect(210px 23px 231px 0px);
}

View File

@@ -120,6 +120,22 @@
-moz-image-region: rect(170px 199px 203px 150px) !important;
}
#button-newim {
-moz-image-region: rect(170px 49px 203px 0);
}
#button-newim:hover {
-moz-image-region: rect(170px 99px 203px 50px);
}
#button-newim:hover:active {
-moz-image-region: rect(170px 149px 203px 100px);
}
#button-newim[disabled] {
-moz-image-region: rect(170px 199px 203px 150px) !important;
}
#button-delete {
-moz-image-region: rect(408px 49px 441px 0);
}