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:
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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...">
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user