it's been broken a long time.  r/sr=bienvenu
This commit is contained in:
sspitzer%netscape.com 2002-01-08 03:19:10 +00:00
Родитель 64e1f6729e
Коммит 7f0477179e
19 изменённых файлов: 431 добавлений и 820 удалений

Просмотреть файл

@ -110,4 +110,7 @@ interface nsIAbCard : nsISupports {
void editCardToDatabase(in string uri);
boolean equals(in nsIAbCard card);
string convertToBase64EncodedXML();
wstring convertToXMLData();
};

Просмотреть файл

@ -36,35 +36,15 @@
* ***** END LICENSE BLOCK ***** */
#include "nsIURI.idl"
#include "nsIAbCard.idl"
[scriptable, uuid(6EB9D874-01AA-11d4-8FBE-000064657374)]
interface nsIAddbookUrlOperation
{
const long InvalidUrl = 0;
const long PrintIndividual = 1;
const long PrintAddressBook = 2;
const long ImportCards = 3;
const long ImportMailingLists = 4;
const long ExportCards = 5;
const long AddToAddressBook = 6;
const long ExportTitle = 7;
const long ImportTitle = 8;
const long InvalidUrl = 0;
const long PrintAddressBook = 1;
};
[uuid(ee1d5cc3-5f8c-43f3-b1b8-8d2ea67ce2d8)]
interface nsIAddbookUrl : nsIURI {
///////////////////////////////////////////////////////////////////////////////
// Addbook parse specific getters
// Not sure if this will be used by the outside world, but if it is, at
// least its here
///////////////////////////////////////////////////////////////////////////////
// So what does the user want to do with this particular URL
long GetAddbookOperation();
nsIAbCard GetAbCard();
readonly attribute long addbookOperation;
};

Просмотреть файл

@ -51,8 +51,6 @@ interface nsIAddressBook : nsISupports
{
void newAddressBook(in nsIRDFCompositeDataSource db, in unsigned long prefCount,[array, size_is(prefCount)] in string prefName, [array, size_is(prefCount)] in wstring prefValue);
void deleteAddressBooks(in nsIRDFCompositeDataSource db, in nsISupportsArray parentDir, in nsIDOMNodeList node);
void printCard();
void printAddressbook();
void setDocShellWindow(in nsIDOMWindowInternal win);
void exportAddressBook(in nsIAbDirectory aDirectory);
void convertLDIFtoMAB(in nsIFileSpec fileSpec, in boolean migrating, in nsIAddrDatabase db, in boolean bStoreLocAsHome, in boolean bImportingComm4x);

Просмотреть файл

@ -270,19 +270,18 @@ function AbPrintCard()
if (!uri)
return;
var escapedDirName = escape(addressbook.getAbDatabaseFromURI(uri).directoryName);
var statusFeedback;
statusFeedback = Components.classes["@mozilla.org/messenger/statusfeedback;1"].createInstance();
statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback);
var selectionArray = new Array(numSelected);
var totalCard = 0;
for(var i = 0; i < numSelected; i++)
{
var card = selectedItems[i];
var printCardUrl = CreatePrintCardUrl(escapedDirName, card);
var printCardUrl = CreatePrintCardUrl(card);
if (printCardUrl)
{
selectionArray[totalCard++] = printCardUrl;
@ -297,26 +296,37 @@ function AbPrintCard()
return;
}
function CreatePrintCardUrl(escapedDirName, card)
function CreatePrintCardUrl(card)
{
var url = "";
var email = card.primaryEmail;
if (email) {
url = "addbook:printone?email=" + email + "&folder=" + escapedDirName;
}
var url = "data:text/xml;base64," + card.convertToBase64EncodedXML();
return url;
}
function AbPrintAddressBook()
{
dump("print address book \n");
try {
addressbook.PrintAddressbook();
}
catch (ex) {
dump("failed to print address book\n");
}
var addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook);
var uri = GetAbViewURI();
if (!uri)
return;
var statusFeedback;
statusFeedback = Components.classes["@mozilla.org/messenger/statusfeedback;1"].createInstance();
statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback);
/*
turn "moz-abmdbdirectory://abook.mab" into
"addbook://moz-abmdbdirectory/abook.mab?action=print"
*/
var abURIArr = uri.split("://");
var printUrl = "addbook://" + abURIArr[0] + "/" + abURIArr[1] + "?action=print"
printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",
"",
"chrome,dialog=no,all",
1, [printUrl], statusFeedback);
return;
}
function AbExport()

Просмотреть файл

@ -77,6 +77,7 @@ Contributor(s):
<command id="cmd_newEditor"/>
<command id="cmd_printSetup" oncommand="goPageSetup()"/>
<command id="cmd_printCard" oncommand="AbPrintCard()"/>
<command id="cmd_printAddressBook" oncommand="AbPrintAddressBook()"/>
<command id="cmd_quit"/>
<command id="cmd_close" oncommand="AbClose()"/>
<command id="cmd_properties" oncommand="goDoCommand('button_edit');"/>
@ -135,6 +136,7 @@ Contributor(s):
<menuseparator/>
<!--Page setup gets overlaid here from platformGlobalOverlay.xul / -->
<menuitem id="printMenuItem" label="&printCardViewCmd.label;" accesskey="&printCardViewCmd.accesskey;" key="key_printCard" command="cmd_printCard"/>
<menuitem id="printAddressBook" label="&printAddressBook.label;" command="cmd_printAddressBook"/>
</menupopup>
</menu>

Просмотреть файл

@ -0,0 +1,79 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla addressbook
*
* The Initial Developer of the Original Code is
* Seth Spitzer <sspitzer@netscape.com>
* Portions created by the Initial Developer are Copyright (C) 2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* 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
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
directory {display:table;}
abcard {display:table-row;}
abcard *{display:table-cell; padding:5px;}
GeneratedName {display:block; font-weight:bold;}
FirstName {display:block;}
LastName {display:block;}
DisplayName {display:block;}
NickName {display:block;}
PrimaryEmail {display:block;}
SecondEmail {display:block;}
PreferMailFormat {display:none;}
WorkPhone {display:block;}
HomePhone {display:block;}
FaxNumber {display:block;}
PagerNumber {display:block;}
CellularNumber {display:block;}
HomeAddress {display:block;}
HomeAddress2 {display:block;}
HomeCity {display:block;}
HomeState {display:block;}
HomeZipCode {display:block;}
HomeCountry {display:block;}
WorkAddress {display:block;}
WorkAddress2 {display:block;}
WorkCity {display:block;}
WorkState {display:block;}
WorkZipCode {display:block;}
WorkCountry {display:block;}
JobTitle {display:block;}
Department {display:block;}
Company {display:block;}
WebPage1 {display:block;}
WebPage2 {display:block;}
BirthYear {display:block;}
BirthMonth {display:block;}
BirthDay {display:block;}
Custom1 {display:block;}
Custom2 {display:block;}
Custom3 {display:block;}
Custom4 {display:block;}
Notes {display:block;}
ListName {display:block;}
ListNickName {display:block;}
ListDescription {display:block;}

Просмотреть файл

@ -45,7 +45,7 @@ Rights Reserved.
<!ENTITY printCardViewCmd.accesskey "p">
<!-- LOCALIZATION NOTE (printCardViewCmd.key) : DONT_TRANSLATE -->
<!ENTITY printCardViewCmd.key "P">
<!ENTITY printAddressBook.label ".Print Address Book...">
<!ENTITY printAddressBook.label "Print Address Book...">
<!-- Edit Menu -->
<!ENTITY deleteAbCmd.label "Delete Address Book">

Просмотреть файл

@ -38,20 +38,73 @@
* ***** END LICENSE BLOCK ***** */
#include "nsAbCardProperty.h"
#include "nsIRDFService.h"
#include "nsIServiceManager.h"
#include "nsRDFCID.h"
#include "nsXPIDLString.h"
#include "nsAbBaseCID.h"
#include "prmem.h"
#include "prlog.h"
#include "prprf.h"
#include "rdf.h"
#include "nsCOMPtr.h"
#include "nsReadableUtils.h"
#include "nsUnicharUtils.h"
#include "nsIPref.h"
#include "nsIAbDirectory.h"
#include "plbase64.h"
#include "nsIAddrBookSession.h"
#define PREF_MAIL_ADDR_BOOK_LASTNAMEFIRST "mail.addr_book.lastnamefirst"
#define LIST_ATTRS_COUNT 4
static const char *LIST_ARRTS_ARRAY[] = {
kMailListName,
kMailListNickName,
kMailListDescription,
kMailListTotalAddresses
};
#define CARD_ATTRS_COUNT 37
// XXX todo what about _AimScreenName, or other generic columns?
static const char *CARD_ATTRS_ARRAY[] = {
kFirstNameColumn,
kLastNameColumn,
kDisplayNameColumn,
kNicknameColumn,
kPriEmailColumn,
k2ndEmailColumn,
kPreferMailFormatColumn,
kWorkPhoneColumn,
kHomePhoneColumn,
kFaxColumn,
kPagerColumn,
kCellularColumn,
kHomeAddressColumn,
kHomeAddress2Column,
kHomeCityColumn,
kHomeStateColumn,
kHomeZipCodeColumn,
kHomeCountryColumn,
kWorkAddressColumn,
kWorkAddress2Column,
kWorkCityColumn,
kWorkStateColumn,
kWorkZipCodeColumn,
kWorkCountryColumn,
kJobTitleColumn,
kDepartmentColumn,
kCompanyColumn,
kWebPage1Column,
kWebPage2Column,
kBirthYearColumn,
kBirthMonthColumn,
kBirthDayColumn,
kCustom1Column,
kCustom2Column,
kCustom3Column,
kCustom4Column,
kNotesColumn
};
nsAbCardProperty::nsAbCardProperty(void)
{
@ -943,3 +996,94 @@ NS_IMETHODIMP nsAbCardProperty::Equals(nsIAbCard *card, PRBool *result)
*result = (card == this);
return NS_OK;
}
NS_IMETHODIMP nsAbCardProperty::ConvertToBase64EncodedXML(char **result)
{
nsresult rv;
nsString xmlStr;
xmlStr.Append(NS_LITERAL_STRING("<?xml version=\"1.0\"?>\n").get());
xmlStr.Append(NS_LITERAL_STRING("<?xml-stylesheet type=\"text/css\" href=\"chrome://messenger/content/addressbook/print.css\"?>\n").get());
xmlStr.Append(NS_LITERAL_STRING("<directory>\n").get());
nsXPIDLString xmlSubstr;
rv = ConvertToXMLData(getter_Copies(xmlSubstr));
NS_ENSURE_SUCCESS(rv,rv);
xmlStr.Append(xmlSubstr.get());
xmlStr.Append(NS_LITERAL_STRING("</directory>\n").get());
*result = PL_Base64Encode(NS_ConvertUCS2toUTF8(xmlStr).get(), 0, nsnull);
if (!*result)
return NS_ERROR_OUT_OF_MEMORY;
return NS_OK;
}
NS_IMETHODIMP nsAbCardProperty::ConvertToXMLData(PRUnichar **aXMLSubstr)
{
NS_ENSURE_ARG_POINTER(aXMLSubstr);
nsresult rv;
nsString xmlStr;
xmlStr.Append(NS_LITERAL_STRING("<abcard>\n").get());
// get the generated name
nsCOMPtr<nsIPrefService> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIPrefBranch> prefBranch;
rv = prefs->GetBranch(nsnull, getter_AddRefs(prefBranch));
NS_ENSURE_SUCCESS(rv,rv);
PRInt32 generatedNameFormat;
rv = prefBranch->GetIntPref(PREF_MAIL_ADDR_BOOK_LASTNAMEFIRST, &generatedNameFormat);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIAddrBookSession> abSession = do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsXPIDLString generatedName;
rv = abSession->GenerateNameFromCard(this, generatedNameFormat, getter_Copies(generatedName));
NS_ENSURE_SUCCESS(rv,rv);
xmlStr.Append(NS_LITERAL_STRING("<GeneratedName>\n").get());
xmlStr.Append(generatedName.get());
xmlStr.Append(NS_LITERAL_STRING("</GeneratedName>\n").get());
PRUint32 i;
for (i=0;i<CARD_ATTRS_COUNT;i++) {
rv = AppendData(CARD_ATTRS_ARRAY[i], xmlStr);
NS_ENSURE_SUCCESS(rv,rv);
}
xmlStr.Append(NS_LITERAL_STRING("</abcard>\n").get());
*aXMLSubstr = ToNewUnicode(xmlStr);
return NS_OK;
}
nsresult nsAbCardProperty::AppendData(const char *attrName, nsString &result)
{
nsXPIDLString attrValue;
nsresult rv = GetCardValue(attrName, getter_Copies(attrValue));
NS_ENSURE_SUCCESS(rv,rv);
if (attrValue.IsEmpty())
return NS_OK;
nsAutoString attrNameStr;
attrNameStr.AssignWithConversion(attrName);
result.Append(NS_LITERAL_STRING("<").get());
result.Append(attrNameStr.get());
result.Append(NS_LITERAL_STRING(">").get());
result.Append(attrValue.get());
result.Append(NS_LITERAL_STRING("</").get());
result.Append(attrNameStr.get());
result.Append(NS_LITERAL_STRING(">").get());
return NS_OK;
}

Просмотреть файл

@ -110,6 +110,9 @@ protected:
PRBool m_IsMailList;
char* m_MailListURI;
private:
nsresult AppendData(const char *attrName, nsString &result);
};
#endif

Просмотреть файл

@ -49,7 +49,6 @@
#include "nsAddbookProtocolHandler.h"
#include "nsIFileSpec.h"
#include "nsCOMPtr.h"
#include "nsIMsgIdentity.h"
#include "nsAbBaseCID.h"
#include "nsNetUtil.h"
#include "nsIStringStream.h"
@ -64,18 +63,14 @@
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
extern const char *kWorkAddressBook;
nsAddbookProtocolHandler::nsAddbookProtocolHandler()
{
NS_INIT_REFCNT();
mReportColumns = nsnull;
mAddbookOperation = nsIAddbookUrlOperation::InvalidUrl;
}
nsAddbookProtocolHandler::~nsAddbookProtocolHandler()
{
PR_FREEIF(mReportColumns);
mReportColumns = nsnull;
}
NS_IMPL_ISUPPORTS1(nsAddbookProtocolHandler, nsIProtocolHandler);
@ -103,20 +98,18 @@ NS_IMETHODIMP nsAddbookProtocolHandler::GetProtocolFlags(PRUint32 *aUritype)
NS_IMETHODIMP nsAddbookProtocolHandler::NewURI(const char *aSpec, nsIURI *aBaseURI, nsIURI **_retval)
{
// get a new addrbook url
nsresult rv = NS_OK;
nsCOMPtr <nsIURI> addbookUrl = do_CreateInstance(NS_ADDBOOKURL_CONTRACTID, &rv);
nsCOMPtr <nsIAddbookUrl> addbookUrl = do_CreateInstance(NS_ADDBOOKURL_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
if (NS_SUCCEEDED(rv))
{
rv = addbookUrl->SetSpec(aSpec);
if (NS_SUCCEEDED(rv))
{
rv = addbookUrl->QueryInterface(NS_GET_IID(nsIURI), (void **) _retval);
}
}
rv = addbookUrl->SetSpec(aSpec);
NS_ENSURE_SUCCESS(rv,rv);
return rv;
nsCOMPtr <nsIURI> uri = do_QueryInterface(addbookUrl, &rv);
NS_ENSURE_SUCCESS(rv,rv);
NS_IF_ADDREF(*_retval = uri);
return NS_OK;
}
NS_IMETHODIMP
@ -127,9 +120,8 @@ nsAddbookProtocolHandler::AllowPort(PRInt32 port, const char *scheme, PRBool *_r
return NS_OK;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::GenerateHTMLOutputChannel( const char *aHtmlOutput,
PRInt32 aHtmlOutputSize,
nsresult
nsAddbookProtocolHandler::GenerateXMLOutputChannel( nsString &aOutput,
nsIAddbookUrl *addbookUrl,
nsIURI *aURI,
nsIChannel **_retval)
@ -138,16 +130,13 @@ nsAddbookProtocolHandler::GenerateHTMLOutputChannel( const char *aHtmlOutput,
nsIChannel *channel;
nsCOMPtr<nsIInputStream> inStr;
nsCOMPtr<nsISupports> s;
if (!aHtmlOutput)
return NS_ERROR_FAILURE;
rv = NS_NewStringInputStream(getter_AddRefs(s), NS_ConvertASCIItoUCS2(aHtmlOutput));
rv = NS_NewStringInputStream(getter_AddRefs(s), aOutput);
NS_ENSURE_SUCCESS(rv, rv);
inStr = do_QueryInterface(s, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = NS_NewInputStreamChannel(&channel, aURI, inStr, "text/html", aHtmlOutputSize);
rv = NS_NewInputStreamChannel(&channel, aURI, inStr, "text/xml", aOutput.Length());
NS_ENSURE_SUCCESS(rv, rv);
*_retval = channel;
@ -157,502 +146,139 @@ nsAddbookProtocolHandler::GenerateHTMLOutputChannel( const char *aHtmlOutput,
NS_IMETHODIMP
nsAddbookProtocolHandler::NewChannel(nsIURI *aURI, nsIChannel **_retval)
{
nsresult rv = NS_OK;
char *outBuf = nsnull;
nsresult rv;
nsCOMPtr <nsIAddbookUrl> addbookUrl = do_QueryInterface(aURI, &rv);
NS_ENSURE_SUCCESS(rv,rv);
rv = addbookUrl->GetAddbookOperation(&mAddbookOperation);
NS_ENSURE_SUCCESS(rv,rv);
//
// Ok, now that we are here, we need to figure out what oprations we
// are going to perform...create a stream of buffered data if necessary
// or launch the UI dialog window and go from there.
//
mAddbookOperation = nsIAddbookUrlOperation::InvalidUrl;
nsCOMPtr <nsIAddbookUrl> addbookUrl = do_QueryInterface(aURI);
if (!addbookUrl)
return NS_ERROR_ABORT;
if (mAddbookOperation == nsIAddbookUrlOperation::InvalidUrl) {
nsString errorString;
errorString.Append(NS_LITERAL_STRING("Unsupported format/operation requested for ").get());
nsXPIDLCString spec;
rv = aURI->GetSpec(getter_Copies(spec));
NS_ENSURE_SUCCESS(rv,rv);
//
// Ok, first, lets see what we need to do here and then call the appropriate
// method to handle the operation
//
addbookUrl->GetAddbookOperation(&mAddbookOperation);
switch (mAddbookOperation)
{
case nsIAddbookUrlOperation::PrintIndividual:
case nsIAddbookUrlOperation::PrintAddressBook:
rv = GeneratePrintOutput(addbookUrl, &outBuf);
if ((NS_FAILED(rv) || (!outBuf)))
{
const char *eMsg = "Unsupported format/operation requested for \"addbook:\" URL.";
PRInt32 eSize = nsCRT::strlen(eMsg);
rv = GenerateHTMLOutputChannel(eMsg, eSize, addbookUrl, aURI, _retval);
break;
}
else
{
rv = GenerateHTMLOutputChannel(outBuf, nsCRT::strlen(outBuf), addbookUrl, aURI, _retval);
PR_FREEIF(outBuf);
}
break;
case nsIAddbookUrlOperation::ImportCards:
case nsIAddbookUrlOperation::ImportMailingLists:
case nsIAddbookUrlOperation::ExportCards:
case nsIAddbookUrlOperation::AddToAddressBook:
case nsIAddbookUrlOperation::ExportTitle:
case nsIAddbookUrlOperation::ImportTitle:
case nsIAddbookUrlOperation::InvalidUrl:
default:
const char *eMsg = "Unsupported format/operation requested for \"addbook:\" URL.";
PRInt32 eSize = nsCRT::strlen(eMsg);
rv = GenerateHTMLOutputChannel(eMsg, eSize, addbookUrl, aURI, _retval);
break;
errorString.AppendWithConversion(spec.get());
rv = GenerateXMLOutputChannel(errorString, addbookUrl, aURI, _retval);
NS_ENSURE_SUCCESS(rv,rv);
return NS_OK;
}
return rv;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::OpenAB(char *aAbName, nsIAddrDatabase **aDatabase)
{
if (!aDatabase)
return NS_ERROR_FAILURE;
nsresult rv = NS_OK;
nsFileSpec* dbPath = nsnull;
nsCOMPtr<nsIAddrBookSession> abSession =
do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
if(NS_SUCCEEDED(rv))
abSession->GetUserProfileDirectory(&dbPath);
if (dbPath)
{
if (!aAbName)
(*dbPath) += kPersonalAddressbook;
else
(*dbPath) += aAbName;
nsCOMPtr<nsIAddrDatabase> addrDBFactory =
do_GetService(NS_ADDRDATABASE_CONTRACTID, &rv);
if (NS_SUCCEEDED(rv) && addrDBFactory)
rv = addrDBFactory->Open(dbPath, PR_TRUE, aDatabase, PR_TRUE);
delete dbPath;
}
else
rv = NS_ERROR_FAILURE;
return rv;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::AddIndividualUserAttribPair(nsString &aString, const char *aColumn, nsIAbCard *aCard)
{
PRUnichar *aName = nsnull;
if (NS_SUCCEEDED(aCard->GetCardValue(aColumn, &aName)) && (aName) && (*aName))
{
aString.Append(NS_LITERAL_STRING("<tr>"));
aString.Append(NS_LITERAL_STRING("<td><b>"));
// RICHIE - Should really convert this to some string bundled thing?
aString.AppendWithConversion(aColumn);
aString.Append(NS_LITERAL_STRING("</b></td>"));
aString.Append(NS_LITERAL_STRING("<td>"));
aString.Append(aName);
aString.Append(NS_LITERAL_STRING("</td>"));
aString.Append(NS_LITERAL_STRING("</tr>"));
nsString output;
rv = GeneratePrintOutput(addbookUrl, output);
if (NS_FAILED(rv)) {
output.Assign(NS_LITERAL_STRING("failed to print. url=").get());
nsXPIDLCString spec;
rv = aURI->GetSpec(getter_Copies(spec));
NS_ENSURE_SUCCESS(rv,rv);
output.AppendWithConversion(spec.get());
}
rv = GenerateXMLOutputChannel(output, addbookUrl, aURI, _retval);
NS_ENSURE_SUCCESS(rv,rv);
return NS_OK;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::FindPossibleAbName(nsIAbCard *aCard,
PRUnichar **retName)
{
nsresult rv = NS_ERROR_FAILURE;
nsCOMPtr<nsIAbMDBCard> dbaCard(do_QueryInterface(aCard, &rv));
NS_ENSURE_SUCCESS(rv, rv);
NS_ASSERTION(0, "fix me, FindPossibleAbName");
return rv;
}
NS_IMETHODIMP
nsresult
nsAddbookProtocolHandler::GeneratePrintOutput(nsIAddbookUrl *addbookUrl,
char **outBuf)
nsString &aOutput)
{
nsresult rv = NS_OK;
nsString workBuffer;
nsIAddrDatabase *aDatabase = nsnull;
if (!outBuf)
return NS_ERROR_OUT_OF_MEMORY;
NS_ENSURE_ARG_POINTER(addbookUrl);
// Get the address book entry
nsCOMPtr <nsIRDFResource> resource = nsnull;
nsCOMPtr <nsIAbDirectory> directory = nsnull;
nsIAbCard *urlArgCard;
PRUnichar *workEmail = nsnull;
char *charEmail = nsnull;
PRUnichar *workAb = nsnull;
char *charAb = nsnull;
char *abFileName = nsnull;
rv = NS_OK;
// Get the RDF service...
nsCOMPtr<nsIRDFService> rdfService(do_GetService("@mozilla.org/rdf/rdf-service;1", &rv));
if (NS_FAILED(rv))
goto EarlyExit;
// Get the AB card that has all of the URL arguments
rv = addbookUrl->GetAbCard(&urlArgCard);
if (NS_FAILED(rv))
goto EarlyExit;
// Get the email of interest if this is for a specific email message
if (mAddbookOperation == nsIAddbookUrlOperation::PrintIndividual)
{
rv = urlArgCard->GetCardValue(kPriEmailColumn, &workEmail);
if ( (NS_FAILED(rv)) || (!workEmail) || (!*workEmail))
goto EarlyExit;
// Make it a char *
charEmail = ToNewCString(nsDependentString(workEmail));
if (!charEmail)
goto EarlyExit;
}
// Ok, we need to see if a particular address book was passed in on the
// URL string. If not, then we will use the default, but if there was one
// specified, we need to do a prefs lookup and get the file name of interest
// The pref format is: user_pref("ldap_2.servers.Richie.filename", "abook-1.mab");
//
rv = FindPossibleAbName(urlArgCard, &workAb);
if ( (NS_SUCCEEDED(rv)) && (workAb) && (*workAb))
{
// Make it a char *
charAb = ToNewCString(nsDependentString(workAb));
if (!charAb)
goto EarlyExit;
nsCOMPtr<nsIPref> pPref(do_GetService(NS_PREF_CONTRACTID, &rv));
if (NS_FAILED(rv) || !pPref)
goto EarlyExit;
nsCString prefId("ldap_2.servers.");
prefId.Append(charAb);
prefId.Append(".filename");
rv = pPref->CopyCharPref(prefId.get(), &abFileName);
if (NS_FAILED(rv))
abFileName = nsnull;
}
// Now, open the database...for now, make it the default
rv = OpenAB(abFileName, &aDatabase);
NS_ENSURE_SUCCESS(rv, rv);
// RICHIE - this works for any address book...not sure why
rv = rdfService->GetResource(kPersonalAddressbookUri, getter_AddRefs(resource));
if (NS_FAILED(rv))
goto EarlyExit;
// query interface
directory = do_QueryInterface(resource, &rv);
if (NS_FAILED(rv))
goto EarlyExit;
// Ok, this is the place where we need to generate output for either a single entry
// or the entire table...
//
if (mAddbookOperation == nsIAddbookUrlOperation::PrintIndividual)
rv = BuildSingleHTML(aDatabase, directory, charEmail, workBuffer);
else
rv = BuildAllHTML(aDatabase, directory, workBuffer);
*outBuf = ToNewUTF8String(workBuffer);
EarlyExit:
// Database is open...make sure to close it
if (aDatabase)
{
aDatabase->Close(PR_TRUE);
// aDatabase->RemoveListener(??? listeners are hanging...I think);
}
NS_IF_RELEASE(aDatabase);
NS_IF_RELEASE(urlArgCard);
PR_FREEIF(charEmail);
PR_FREEIF(charAb);
PR_FREEIF(abFileName);
return rv;
}
#define PREF_MAIL_ADDR_BOOK_LASTNAMEFIRST "mail.addr_book.lastnamefirst"
NS_IMETHODIMP
nsAddbookProtocolHandler::BuildSingleHTML(nsIAddrDatabase *aDatabase, nsIAbDirectory *directory,
char *charEmail, nsString &workBuffer)
{
PRUnichar *aName = nsnull;
nsCOMPtr <nsIAbCard> workCard;
if (NS_FAILED(InitPrintColumns()))
return NS_ERROR_FAILURE;
nsresult rv = aDatabase->GetCardFromAttribute(directory, kPriEmailColumn, charEmail, PR_TRUE /* caseInsensitive */, getter_AddRefs(workCard));
NS_ENSURE_SUCCESS(rv, rv);
if (!workCard)
return NS_ERROR_FAILURE;
// Ok, build a little HTML for output...
workBuffer.Append(NS_LITERAL_STRING("<HTML><BODY>"));
workBuffer.Append(NS_LITERAL_STRING("<CENTER>"));
workBuffer.Append(NS_LITERAL_STRING("<TABLE BORDER>"));
nsCOMPtr<nsIPrefService> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIPrefBranch> prefBranch;
rv = prefs->GetBranch(nsnull, getter_AddRefs(prefBranch));
NS_ENSURE_SUCCESS(rv,rv);
PRInt32 format;
rv = prefBranch->GetIntPref(PREF_MAIL_ADDR_BOOK_LASTNAMEFIRST, &format);
nsXPIDLCString pathStr;
nsresult rv = addbookUrl->GetPath(getter_Copies(pathStr));
NS_ENSURE_SUCCESS(rv,rv);
nsCOMPtr<nsIAddrBookSession> abSession = do_GetService(NS_ADDRBOOKSESSION_CONTRACTID, &rv);
nsCOMPtr<nsIRDFService> rdfService = do_GetService("@mozilla.org/rdf/rdf-service;1", &rv);
NS_ENSURE_SUCCESS(rv,rv);
/* turn
"//moz-abmdbdirectory/abook.mab?action=print"
into "moz-abmdbdirectory://abook.mab"
*/
nsCAutoString uri;
uri.Assign(pathStr.get());
/* step 1:
turn "//moz-abmdbdirectory/abook.mab?action=print"
into "moz-abmdbdirectory/abook.mab?action=print"
*/
if (uri[0] != '/' && uri[1] != '/')
return NS_ERROR_UNEXPECTED;
uri.Cut(0,2);
/* step 2:
turn "moz-abmdbdirectory/abook.mab?action=print"
into "moz-abmdbdirectory/abook.mab"
*/
PRInt32 pos = uri.Find("?action=print");
if (pos == kNotFound)
return NS_ERROR_UNEXPECTED;
uri.Truncate(pos);
/* step 2:
turn "moz-abmdbdirectory/abook.mab"
into "moz-abmdbdirectory://abook.mab"
*/
pos = uri.Find("/");
if (pos == kNotFound)
return NS_ERROR_UNEXPECTED;
uri.InsertWithConversion(PRUnichar('/'), pos);
uri.InsertWithConversion(PRUnichar(':'), pos);
nsCOMPtr <nsIRDFResource> resource;
rv = rdfService->GetResource(uri.get(), getter_AddRefs(resource));
NS_ENSURE_SUCCESS(rv,rv);
if (NS_SUCCEEDED(abSession->GenerateNameFromCard(workCard, format, &aName)) && (aName))
{
workBuffer.Append(NS_LITERAL_STRING("<caption><b>"));
workBuffer.Append(aName);
workBuffer.Append(NS_LITERAL_STRING("</b></caption>"));
}
nsCOMPtr <nsIAbDirectory> directory = do_QueryInterface(resource, &rv);
NS_ENSURE_SUCCESS(rv,rv);
for (PRInt32 i=0; i<kMaxReportColumns; i++)
AddIndividualUserAttribPair(workBuffer, mReportColumns[i].abField, workCard);
rv = BuildDirectoryXML(directory, aOutput);
NS_ENSURE_SUCCESS(rv,rv);
workBuffer.Append(NS_LITERAL_STRING("</TABLE>"));
workBuffer.Append(NS_LITERAL_STRING("<CENTER>"));
workBuffer.Append(NS_LITERAL_STRING("</BODY></HTML>"));
return rv;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::BuildAllHTML(nsIAddrDatabase *aDatabase, nsIAbDirectory *directory,
nsString &workBuffer)
{
nsresult rv = NS_OK;
if (NS_FAILED(InitPrintColumns()))
return NS_ERROR_FAILURE;
nsIEnumerator *cardEnum = nsnull;
rv = aDatabase->EnumerateCards(directory, &cardEnum);
NS_ENSURE_SUCCESS(rv, rv);
if (!cardEnum)
return NS_ERROR_FAILURE;
InitPrintColumns();
// Ok, we make 2 passes at this enumerator. The first is to
// check the columns that we should output and the second is
// to actually generate the output
//
nsCOMPtr<nsISupports> obj = nsnull;
cardEnum->First();
do
{
if (NS_FAILED(cardEnum->CurrentItem(getter_AddRefs(obj))))
break;
else
{
nsCOMPtr<nsIAbCard> card;
card = do_QueryInterface(obj, &rv);
if ( NS_SUCCEEDED(rv) && (card) )
{
CheckColumnValidity(card);
}
}
} while (NS_SUCCEEDED(cardEnum->Next()));
// Now, we need to generate some fun output!
//
// Ok, build a little HTML for output...
workBuffer.Append(NS_LITERAL_STRING("<HTML><BODY>"));
workBuffer.Append(NS_LITERAL_STRING("<CENTER>"));
workBuffer.Append(NS_LITERAL_STRING("<TABLE BORDER>"));
GenerateColumnHeadings(workBuffer);
cardEnum->First();
do
{
if (NS_FAILED(cardEnum->CurrentItem(getter_AddRefs(obj))))
break;
else
{
nsCOMPtr<nsIAbCard> card;
card = do_QueryInterface(obj, &rv);
if ( NS_SUCCEEDED(rv) && (card) )
{
GenerateRowForCard(workBuffer, card);
}
}
} while (NS_SUCCEEDED(cardEnum->Next()));
delete cardEnum;
// Finish up and get out!
//
workBuffer.Append(NS_LITERAL_STRING("</TABLE>"));
workBuffer.Append(NS_LITERAL_STRING("<CENTER>"));
workBuffer.Append(NS_LITERAL_STRING("</BODY></HTML>"));
return rv;
}
PRBool
ValidColumn(nsIAbCard *aCard, const char *aColumn)
{
PRUnichar *aName = nsnull;
if (NS_SUCCEEDED(aCard->GetCardValue(aColumn, &aName)) && (aName) && (*aName))
return PR_TRUE;
else
return PR_FALSE;
return NS_OK;
}
nsresult
TackOnColumn(nsIAbCard *aCard, const char *aColumn, nsString &aString)
nsAddbookProtocolHandler::BuildDirectoryXML(nsIAbDirectory *aDirectory,
nsString &aOutput)
{
PRUnichar *aName = nsnull;
NS_ENSURE_ARG_POINTER(aDirectory);
aString.Append(NS_LITERAL_STRING("<td>"));
nsresult rv;
nsCOMPtr<nsIEnumerator> cardsEnumerator;
nsCOMPtr<nsIAbCard> card;
if (NS_SUCCEEDED(aCard->GetCardValue(aColumn, &aName)) && (aName) && (*aName))
aOutput.Append(NS_LITERAL_STRING("<?xml version=\"1.0\"?>\n").get());
aOutput.Append(NS_LITERAL_STRING("<?xml-stylesheet type=\"text/css\" href=\"chrome://messenger/content/addressbook/print.css\"?>\n").get());
aOutput.Append(NS_LITERAL_STRING("<directory>\n").get());
rv = aDirectory->GetChildCards(getter_AddRefs(cardsEnumerator));
if (NS_SUCCEEDED(rv) && cardsEnumerator)
{
aString.Append(aName);
}
aString.Append(NS_LITERAL_STRING("</td>"));
return NS_OK;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::CheckColumnValidity(nsIAbCard *aCard)
{
for (PRInt32 i=0; i<kMaxReportColumns; i++)
{
if (!mReportColumns[i].includeIt)
mReportColumns[i].includeIt = ValidColumn(aCard, mReportColumns[i].abField);
}
return NS_OK;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::GenerateColumnHeadings(nsString &aString)
{
aString.Append(NS_LITERAL_STRING("<tr>"));
for (PRInt32 i=0; i<kMaxReportColumns; i++)
{
if (mReportColumns[i].includeIt)
nsCOMPtr<nsISupports> item;
for (rv = cardsEnumerator->First(); NS_SUCCEEDED(rv); rv = cardsEnumerator->Next())
{
aString.Append(NS_LITERAL_STRING("<td>"));
aString.Append(NS_LITERAL_STRING("<B>"));
// RICHIE - Should really convert this to some string bundled thing?
aString.AppendWithConversion(mReportColumns[i].abField);
aString.Append(NS_LITERAL_STRING("</B>"));
aString.Append(NS_LITERAL_STRING("</td>"));
rv = cardsEnumerator->CurrentItem(getter_AddRefs(item));
if (NS_SUCCEEDED(rv))
{
nsCOMPtr <nsIAbCard> card = do_QueryInterface(item);
nsXPIDLString xmlSubstr;
rv = card->ConvertToXMLData(getter_Copies(xmlSubstr));
NS_ENSURE_SUCCESS(rv,rv);
aOutput.Append(xmlSubstr.get());
}
}
}
aString.Append(NS_LITERAL_STRING("</tr>"));
return NS_OK;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::GenerateRowForCard(nsString &aString,
nsIAbCard *aCard)
{
aString.Append(NS_LITERAL_STRING("<tr>"));
for (PRInt32 i=0; i<kMaxReportColumns; i++)
{
if (mReportColumns[i].includeIt)
TackOnColumn(aCard, mReportColumns[i].abField, aString);
}
aString.Append(NS_LITERAL_STRING("</tr>"));
return NS_OK;
}
NS_IMETHODIMP
nsAddbookProtocolHandler::InitPrintColumns()
{
if (!mReportColumns)
{
mReportColumns = (reportColumnStruct *) PR_Malloc(sizeof(reportColumnStruct) * kMaxReportColumns);
if (mReportColumns == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
mReportColumns[0].abField = kFirstNameColumn;
mReportColumns[1].abField = kLastNameColumn;
mReportColumns[2].abField = kDisplayNameColumn;
mReportColumns[3].abField = kNicknameColumn;
mReportColumns[4].abField = kPriEmailColumn;
mReportColumns[5].abField = k2ndEmailColumn;
mReportColumns[6].abField = kPreferMailFormatColumn;
mReportColumns[7].abField = kWorkPhoneColumn;
mReportColumns[8].abField = kHomePhoneColumn;
mReportColumns[9].abField = kFaxColumn;
mReportColumns[10].abField = kPagerColumn;
mReportColumns[11].abField = kCellularColumn;
mReportColumns[12].abField = kHomeAddressColumn;
mReportColumns[13].abField = kHomeAddress2Column;
mReportColumns[14].abField = kHomeCityColumn;
mReportColumns[15].abField = kHomeStateColumn;
mReportColumns[16].abField = kHomeZipCodeColumn;
mReportColumns[17].abField = kHomeCountryColumn;
mReportColumns[18].abField = kWorkAddressColumn;
mReportColumns[19].abField = kWorkAddress2Column;
mReportColumns[20].abField = kWorkCityColumn;
mReportColumns[21].abField = kWorkStateColumn;
mReportColumns[22].abField = kWorkZipCodeColumn;
mReportColumns[23].abField = kWorkCountryColumn;
mReportColumns[24].abField = kJobTitleColumn;
mReportColumns[25].abField = kDepartmentColumn;
mReportColumns[26].abField = kCompanyColumn;
mReportColumns[27].abField = kWebPage1Column;
mReportColumns[28].abField = kWebPage2Column;
mReportColumns[29].abField = kBirthYearColumn;
mReportColumns[30].abField = kBirthMonthColumn;
mReportColumns[31].abField = kBirthDayColumn;
mReportColumns[32].abField = kCustom1Column;
mReportColumns[33].abField = kCustom2Column;
mReportColumns[34].abField = kCustom3Column;
mReportColumns[35].abField = kCustom4Column;
mReportColumns[36].abField = kNotesColumn;
mReportColumns[37].abField = kLastModifiedDateColumn;
mReportColumns[38].abField = nsnull;
}
for (PRInt32 i=0; i<kMaxReportColumns; i++)
{
mReportColumns[i].includeIt = PR_FALSE;
}
aOutput.Append(NS_LITERAL_STRING("</directory>\n").get());
return NS_OK;
}

Просмотреть файл

@ -46,13 +46,6 @@
#include "nsIAddbookUrl.h"
#include "nsIAddrDatabase.h"
typedef struct {
const char *abField;
PRBool includeIt;
} reportColumnStruct;
#define kMaxReportColumns 39
class nsAddbookProtocolHandler : public nsIProtocolHandler
{
public:
@ -67,37 +60,18 @@ public:
NS_DECL_NSIPROTOCOLHANDLER
private:
// Output Generation calls to create the HTML output
NS_METHOD GenerateHTMLOutputChannel(const char *aHtmlOutput,
PRInt32 aHtmlOutputSize,
nsresult GenerateXMLOutputChannel(nsString &aOutput,
nsIAddbookUrl *addbookUrl,
nsIURI *aURI,
nsIChannel **_retval);
NS_METHOD GeneratePrintOutput(nsIAddbookUrl *addbookUrl,
char **outBuf);
NS_METHOD BuildSingleHTML(nsIAddrDatabase *aDatabase, nsIAbDirectory *directory,
char *charEmail, nsString &workBuffer);
nsresult GeneratePrintOutput(nsIAddbookUrl *addbookUrl,
nsString &aOutput);
NS_METHOD BuildAllHTML(nsIAddrDatabase *aDatabase, nsIAbDirectory *directory,
nsString &workBuffer);
nsresult BuildDirectoryXML(nsIAbDirectory *aDirectory,
nsString &aOutput);
NS_METHOD AddIndividualUserAttribPair(nsString &aString, const char *aColumn, nsIAbCard *workCard);
// Database access calls...
NS_METHOD OpenAB(char *aAbName, nsIAddrDatabase **aDatabase);
NS_METHOD FindPossibleAbName(nsIAbCard *aCard,
PRUnichar **retName);
NS_METHOD CheckColumnValidity(nsIAbCard *aCard);
NS_METHOD GenerateRowForCard(nsString &aString,
nsIAbCard *aCard);
NS_METHOD GenerateColumnHeadings(nsString &aString);
NS_METHOD InitPrintColumns();
// Member vars...
PRInt32 mAddbookOperation;
reportColumnStruct *mReportColumns;
PRInt32 mAddbookOperation;
};
#endif /* nsAddbookProtocolHandler_h___ */

Просмотреть файл

@ -43,8 +43,6 @@
#include "nsAbBaseCID.h"
#include "nsEscape.h"
const char *kWorkAddressBook = "AddbookWorkAddressBook";
/////////////////////////////////////////////////////////////////////////////////////
// addbook url definition
/////////////////////////////////////////////////////////////////////////////////////
@ -53,7 +51,6 @@ nsAddbookUrl::nsAddbookUrl()
NS_INIT_ISUPPORTS();
m_baseURL = do_CreateInstance(NS_SIMPLEURI_CONTRACTID);
mAbCardProperty = do_CreateInstance(NS_ABCARDPROPERTY_CONTRACTID);
mOperationType = nsIAddbookUrlOperation::InvalidUrl;
}
@ -62,91 +59,7 @@ nsAddbookUrl::~nsAddbookUrl()
{
}
NS_IMPL_ISUPPORTS1(nsAddbookUrl, nsIURI)
//
// This will do the parsing for a single address book entry print operation.
// In this case, you will have address book folder and email:
//
// addbook:add?vcard=begin%3Avcard%0Afn%3ARichard%20Pizzarro%0Aemail%3Binternet%3Arhp%40netscape.com%0Aend%3Avcard%0A
//
NS_IMETHODIMP
nsAddbookUrl::CrackAddURL(const char *searchPart)
{
return NS_OK;
}
//
// This will do the parsing for a single address book entry print operation.
// In this case, you will have address book folder and email:
//
// addbook:printall?folder=Netscape%20Address%20Book
// addbook:printall?email=rhp@netscape.com&folder=Netscape%20Address%20Book
//
NS_IMETHODIMP
nsAddbookUrl::CrackPrintURL(const char *searchPart, PRInt32 aOperation)
{
nsCString emailAddr;
nsCString folderName;
char *rest = NS_CONST_CAST(char*, searchPart);
// okay, first, free up all of our old search part state.....
CleanupAddbookState();
// Start past the '?'...
if (rest && *rest == '?')
rest++;
if (rest)
{
char *token = nsCRT::strtok(rest, "&", &rest);
while (token && *token)
{
char *value = 0;
char *eq = PL_strchr(token, '=');
if (eq)
{
value = eq+1;
*eq = 0;
}
switch (nsCRT::ToUpper(*token))
{
case 'E':
if (!nsCRT::strcasecmp (token, "email"))
emailAddr = value;
break;
case 'F':
if (!nsCRT::strcasecmp (token, "folder"))
folderName = value;
break;
} // end of switch statement...
if (eq)
*eq = '='; // put it back
token = nsCRT::strtok(rest, "&", &rest);
} // while we still have part of the url to parse...
} // if rest && *rest
// Now unescape any fields that need escaped...
if (emailAddr.IsEmpty() && (aOperation == nsIAddbookUrlOperation::PrintIndividual))
return NS_ERROR_FAILURE;
if (!emailAddr.IsEmpty())
{
nsUnescape(NS_CONST_CAST(char*, emailAddr.get()));
mAbCardProperty->SetCardValue(kPriEmailColumn, NS_ConvertASCIItoUCS2(emailAddr).get());
}
if (!folderName.IsEmpty())
{
nsUnescape(NS_CONST_CAST(char*, folderName.get()));
mAbCardProperty->SetCardValue(kWorkAddressBook, NS_ConvertASCIItoUCS2(folderName).get());
}
return NS_OK;
}
NS_IMPL_ISUPPORTS2(nsAddbookUrl, nsIAddbookUrl, nsIURI)
NS_IMETHODIMP
nsAddbookUrl::SetSpec(const char * aSpec)
@ -155,105 +68,19 @@ nsAddbookUrl::SetSpec(const char * aSpec)
return ParseUrl();
}
nsresult nsAddbookUrl::CleanupAddbookState()
{
PRUnichar *tString = nsnull;
mAbCardProperty->SetCardValue(kFirstNameColumn, tString);
mAbCardProperty->SetCardValue(kLastNameColumn, tString);
mAbCardProperty->SetCardValue(kDisplayNameColumn, tString);
mAbCardProperty->SetCardValue(kNicknameColumn, tString);
mAbCardProperty->SetCardValue(kPriEmailColumn, tString);
mAbCardProperty->SetCardValue(k2ndEmailColumn, tString);
mAbCardProperty->SetCardValue(kPreferMailFormatColumn, tString);
mAbCardProperty->SetCardValue(kWorkPhoneColumn, tString);
mAbCardProperty->SetCardValue(kHomePhoneColumn, tString);
mAbCardProperty->SetCardValue(kFaxColumn, tString);
mAbCardProperty->SetCardValue(kPagerColumn, tString);
mAbCardProperty->SetCardValue(kCellularColumn, tString);
mAbCardProperty->SetCardValue(kHomeAddressColumn, tString);
mAbCardProperty->SetCardValue(kHomeAddress2Column, tString);
mAbCardProperty->SetCardValue(kHomeCityColumn, tString);
mAbCardProperty->SetCardValue(kHomeStateColumn, tString);
mAbCardProperty->SetCardValue(kHomeZipCodeColumn, tString);
mAbCardProperty->SetCardValue(kHomeCountryColumn, tString);
mAbCardProperty->SetCardValue(kWorkAddressColumn, tString);
mAbCardProperty->SetCardValue(kWorkAddress2Column, tString);
mAbCardProperty->SetCardValue(kWorkCityColumn, tString);
mAbCardProperty->SetCardValue(kWorkStateColumn, tString);
mAbCardProperty->SetCardValue(kWorkZipCodeColumn, tString);
mAbCardProperty->SetCardValue(kWorkCountryColumn, tString);
mAbCardProperty->SetCardValue(kJobTitleColumn, tString);
mAbCardProperty->SetCardValue(kDepartmentColumn, tString);
mAbCardProperty->SetCardValue(kCompanyColumn, tString);
mAbCardProperty->SetCardValue(kWebPage1Column, tString);
mAbCardProperty->SetCardValue(kWebPage2Column, tString);
mAbCardProperty->SetCardValue(kBirthYearColumn, tString);
mAbCardProperty->SetCardValue(kBirthMonthColumn, tString);
mAbCardProperty->SetCardValue(kBirthDayColumn, tString);
mAbCardProperty->SetCardValue(kCustom1Column, tString);
mAbCardProperty->SetCardValue(kCustom2Column, tString);
mAbCardProperty->SetCardValue(kCustom3Column, tString);
mAbCardProperty->SetCardValue(kCustom4Column, tString);
mAbCardProperty->SetCardValue(kNotesColumn, tString);
mAbCardProperty->SetCardValue(kLastModifiedDateColumn, tString);
return NS_OK;
}
nsresult nsAddbookUrl::ParseUrl()
{
nsresult rv = NS_OK;
nsCAutoString searchPart;
nsresult rv;
// we can get the path from the simple url.....
nsXPIDLCString aPath;
m_baseURL->GetPath(getter_Copies(aPath));
if (aPath)
mOperationPart.Assign(aPath);
nsXPIDLCString pathStr;
rv = m_baseURL->GetPath(getter_Copies(pathStr));
NS_ENSURE_SUCCESS(rv,rv);
PRInt32 startOfSearchPart = mOperationPart.FindChar('?');
if (startOfSearchPart > 0)
{
// now parse out the search field...
PRUint32 numExtraChars = mOperationPart.Right(searchPart,
mOperationPart.Length() -
startOfSearchPart);
if (!searchPart.IsEmpty())
{
// now we need to strip off the search part from the
// to part....
mOperationPart.Cut(startOfSearchPart, numExtraChars);
}
}
else if (!mOperationPart.IsEmpty())
{
nsUnescape(NS_CONST_CAST(char*, mOperationPart.get()));
}
ToLowerCase(mOperationPart);
// Now, figure out what we are supposed to be doing?
if (!nsCRT::strcmp(mOperationPart.get(), "printone"))
{
mOperationType = nsIAddbookUrlOperation::PrintIndividual;
rv = CrackPrintURL(searchPart.get(), mOperationType);
}
else if (!nsCRT::strcmp(mOperationPart.get(), "printall"))
{
if (PL_strstr(pathStr.get(), "?action=print"))
mOperationType = nsIAddbookUrlOperation::PrintAddressBook;
rv = CrackPrintURL(searchPart.get(), mOperationType);
}
else if (!nsCRT::strcmp(mOperationPart.get(), "add"))
{
mOperationType = nsIAddbookUrlOperation::AddToAddressBook;
rv = CrackAddURL(searchPart.get());
}
else
mOperationType = nsIAddbookUrlOperation::InvalidUrl;
if (NS_FAILED(rv))
mOperationType = nsIAddbookUrlOperation::InvalidUrl;
return rv;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////////
@ -375,18 +202,3 @@ nsAddbookUrl::GetAddbookOperation(PRInt32 *_retval)
*_retval = mOperationType;
return NS_OK;
}
NS_IMETHODIMP
nsAddbookUrl::GetAbCard(nsIAbCard **aAbCard)
{
if (!mAbCardProperty)
return NS_ERROR_FAILURE;
nsCOMPtr<nsIAbCard> tCard = do_QueryInterface(mAbCardProperty);
if (!tCard)
return NS_ERROR_FAILURE;
*aAbCard = tCard;
NS_ADDREF(*aAbCard);
return NS_OK;
}

Просмотреть файл

@ -38,15 +38,9 @@
#ifndef nsAddbookUrl_h__
#define nsAddbookUrl_h__
#include "nsISmtpUrl.h"
#include "nsIURI.h"
#include "nsIFileSpec.h"
#include "nsIMsgIdentity.h"
#include "nsCOMPtr.h"
#include "nsISmtpServer.h"
#include "nsIAddbookUrl.h"
#include "nsAbCardProperty.h"
#include "nsIAbCard.h"
class nsAddbookUrl : public nsIAddbookUrl
{
@ -59,20 +53,10 @@ public:
virtual ~nsAddbookUrl();
protected:
nsresult CleanupAddbookState();
nsresult ParseUrl(); // This gets the ball rolling...
NS_METHOD CrackAddURL(const char *searchPart);
NS_METHOD CrackPrintURL(const char *searchPart, PRInt32 aOperation);
NS_METHOD GetAbCardProperty(nsAbCardProperty **aAbCardProp);
nsCString mOperationPart; // string name of operation requested
nsresult ParseUrl();
PRInt32 mOperationType; // the internal ID for the operation
nsCOMPtr<nsIURI> m_baseURL; // the base URL for the object
nsCOMPtr<nsAbCardProperty> mAbCardProperty; // Hold all parsed user info here
};
#endif // nsAddbookUrl_h__

Просмотреть файл

@ -247,33 +247,6 @@ nsresult nsAddressBook::DoCommand(nsIRDFCompositeDataSource* db,
}
NS_IMETHODIMP nsAddressBook::PrintCard()
{
nsresult rv = NS_ERROR_FAILURE;
nsCOMPtr<nsIContentViewer> viewer;
if (!mDocShell) {
return NS_ERROR_FAILURE;
}
mDocShell->GetContentViewer(getter_AddRefs(viewer));
if (viewer)
{
nsCOMPtr<nsIContentViewerFile> viewerFile = do_QueryInterface(viewer);
if (viewerFile) {
rv = viewerFile->Print(PR_FALSE, nsnull, (nsIWebProgressListener*)nsnull);
}
}
return rv;
}
NS_IMETHODIMP nsAddressBook::PrintAddressbook()
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsAddressBook::SetDocShellWindow(nsIDOMWindowInternal *aWin)
{
NS_PRECONDITION(aWin != nsnull, "null ptr");

Просмотреть файл

@ -87,6 +87,10 @@ function StopUrls()
function PrintEnginePrint()
{
// XXX fix me
// instead of moving this offscreen (which doesn't work)
// and the user can close it from the task bar
// we should hide the window
var left = screen.width + 50;
var top = screen.height + 50;
printEngineWindow = window.openDialog("chrome://messenger/content/msgPrintEngine.xul",

Просмотреть файл

@ -256,7 +256,7 @@ NS_IMETHODIMP
nsMsgPrintEngine::StartPrintOperation()
{
// Load the about:blank on the tail end...
nsresult rv = AddPrintURI((const PRUnichar*)NS_LITERAL_STRING("about:blank").get());
nsresult rv = AddPrintURI(NS_LITERAL_STRING("about:blank").get());
if (NS_FAILED(rv)) return rv;
return StartNextPrintOperation();
}
@ -304,18 +304,37 @@ nsMsgPrintEngine::SetStatusFeedback(nsIMsgStatusFeedback *aFeedback)
return NS_OK;
}
#define DATA_URL_PREFIX "data:"
#define DATA_URL_PREFIX_LEN 5
#define ADDBOOK_URL_PREFIX "addbook:"
#define ADDBOOK_URL_PREFIX_LEN 8
NS_IMETHODIMP
nsMsgPrintEngine::FireThatLoadOperation(nsString *uri)
{
nsresult rv = NS_OK;
nsresult rv = NS_OK;
char *tString = ToNewCString(*uri);
if (!tString)
return NS_ERROR_OUT_OF_MEMORY;
nsCOMPtr <nsIMsgMessageService> messageService;
rv = GetMessageServiceFromURI(tString, getter_AddRefs(messageService));
// if this is a data: url, skip it, because
// we've already got something we can print
// and we know it is not a message.
//
// if this an about:blank url, skip it, because
//
// if this is an addbook: url, skip it, because
// we know that isn't a message.
if (PL_strncmp(tString, DATA_URL_PREFIX, DATA_URL_PREFIX_LEN) &&
PL_strncmp(tString, ADDBOOK_URL_PREFIX, ADDBOOK_URL_PREFIX_LEN) &&
PL_strcmp(tString, "about:blank")) {
rv = GetMessageServiceFromURI(tString, getter_AddRefs(messageService));
}
if (NS_SUCCEEDED(rv) && messageService)
{
nsCOMPtr<nsIWebShell> webShell(do_QueryInterface(mDocShell));

Просмотреть файл

@ -710,3 +710,4 @@ NS_IMETHODIMP nsMsgMailNewsUrl:: GetMemCacheEntry(nsICacheEntryDescriptor **memC
return rv;
}

Просмотреть файл

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

Просмотреть файл

@ -30,6 +30,7 @@ messenger.jar:
content/messenger/addressbook/abEditListDialog.xul (addrbook/resources/content/abEditListDialog.xul)
content/messenger/addressbook/addressbook-panel.xul (addrbook/resources/content/addressbook-panel.xul)
content/messenger/addressbook/addressbook-panel.js (addrbook/resources/content/addressbook-panel.js)
content/messenger/addressbook/print.css (addrbook/resources/content/print.css)
content/messenger/AccountManager.xul (base/prefs/resources/content/AccountManager.xul)
content/messenger/AccountManager.js (base/prefs/resources/content/AccountManager.js)
content/messenger/am-main.xul (base/prefs/resources/content/am-main.xul)