diff --git a/mailnews/addrbook/build/nsAbFactory.cpp b/mailnews/addrbook/build/nsAbFactory.cpp index 6838de3b470b..9ec879c7ba71 100644 --- a/mailnews/addrbook/build/nsAbFactory.cpp +++ b/mailnews/addrbook/build/nsAbFactory.cpp @@ -210,6 +210,11 @@ static const nsModuleComponentInfo components[] = NS_CONTENT_HANDLER_CONTRACTID_PREFIX"x-application-addvcard", nsAddressBookConstructor }, + { "add vCard content handler", + NS_ADDRESSBOOK_CID, + NS_CONTENT_HANDLER_CONTRACTID_PREFIX"text/x-vcard", + nsAddressBookConstructor }, + { "The directory factory service interface", NS_ABDIRFACTORYSERVICE_CID, NS_ABDIRFACTORYSERVICE_CONTRACTID, diff --git a/mailnews/addrbook/src/nsAbBaseCID.h b/mailnews/addrbook/src/nsAbBaseCID.h index 0eae38af9b55..697c705d9190 100644 --- a/mailnews/addrbook/src/nsAbBaseCID.h +++ b/mailnews/addrbook/src/nsAbBaseCID.h @@ -451,11 +451,4 @@ #define NS_MSGVCARDSERVICE_CONTRACTID \ "@mozilla.org/addressbook/msgvcardservice;1" -#define NS_MSGVCARDSTREAMLISTENER_CID \ -{ 0xf4045da, 0x6187, 0x42ff, \ - { 0x9d, 0xf4, 0x80, 0x65, 0x44, 0xf, 0x76, 0x21 }} - -#define NS_MSGVCARDSTREAMLISTENER_CONTRACTID \ - "@mozilla.org/addressbook/msgvcardstreamlistener;1" - #endif // nsAbBaseCID_h__ diff --git a/mailnews/addrbook/src/nsAddressBook.cpp b/mailnews/addrbook/src/nsAddressBook.cpp index 4dc08f813812..dbd19d202a2b 100644 --- a/mailnews/addrbook/src/nsAddressBook.cpp +++ b/mailnews/addrbook/src/nsAddressBook.cpp @@ -86,8 +86,8 @@ #include "nsIInterfaceRequestor.h" #include "nsIInterfaceRequestorUtils.h" #include "nsIDocShell.h" -#include "nsNetCID.h" -#include "nsIIOService.h" +#include "nsAutoPtr.h" +#include "nsIMsgVCardService.h" // according to RFC 2849 // SEP = (CR LF / LF) @@ -177,7 +177,7 @@ nsAddressBook::~nsAddressBook() NS_IMPL_THREADSAFE_ADDREF(nsAddressBook) NS_IMPL_THREADSAFE_RELEASE(nsAddressBook) -NS_IMPL_QUERY_INTERFACE3(nsAddressBook, nsIAddressBook, nsICmdLineHandler, nsIContentHandler) +NS_IMPL_QUERY_INTERFACE4(nsAddressBook, nsIAddressBook, nsICmdLineHandler, nsIContentHandler, nsIStreamLoaderObserver) // // nsIAddressBook @@ -2081,19 +2081,11 @@ NS_IMETHODIMP nsAddressBook::HandleContent(const char * aContentType, rv = channel->GetURI(getter_AddRefs(uri)); NS_ENSURE_SUCCESS(rv, rv); - // create a stream listener to handle the v-card data - nsCOMPtr strListener = do_CreateInstance(NS_MSGVCARDSTREAMLISTENER_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, NS_ERROR_WONT_HANDLE_CONTENT); // no registered v-card handler so just return that we won't handle the content - - // create a new channel and run the url again - nsCOMPtr netService(do_GetService(NS_IOSERVICE_CONTRACTID, &rv)); + // create a stream loader to handle the v-card data + nsCOMPtr streamLoader; + rv = NS_NewStreamLoader(getter_AddRefs(streamLoader), uri, this, aWindowContext); NS_ENSURE_SUCCESS(rv, rv); - rv = netService->NewChannelFromURI(uri, getter_AddRefs(channel)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = channel->AsyncOpen(strListener, aWindowContext); - } else // The content-type was not x-application-addvcard... return NS_ERROR_WONT_HANDLE_CONTENT; @@ -2101,6 +2093,41 @@ NS_IMETHODIMP nsAddressBook::HandleContent(const char * aContentType, return rv; } +NS_IMETHODIMP nsAddressBook::OnStreamComplete(nsIStreamLoader *aLoader, nsISupports *aContext, nsresult aStatus, PRUint32 datalen, const PRUint8 *data) +{ + NS_ENSURE_ARG_POINTER(aContext); + NS_ENSURE_SUCCESS(aStatus, aStatus); // don't process the vcard if we got a status error + nsresult rv = NS_OK; + + // take our vCard string and open up an address book window based on it + nsCOMPtr vCardService = do_GetService(NS_MSGVCARDSERVICE_CONTRACTID); + if (vCardService) + { + nsAutoPtr vObj(vCardService->Parse_MIME((const char *)data, datalen)); + if (vObj) + { + PRInt32 len = 0; + nsAdoptingCString vCard(vCardService->WriteMemoryVObjects(0, &len, vObj, PR_FALSE)); + + nsCOMPtr cardFromVCard; + rv = EscapedVCardToAbCard(vCard.get(), getter_AddRefs(cardFromVCard)); + NS_ENSURE_SUCCESS(rv, rv); + + nsCOMPtr parentWindow = do_GetInterface(aContext); + NS_ENSURE_TRUE(parentWindow, NS_ERROR_FAILURE); + + nsCOMPtr dialogWindow; + rv = parentWindow->OpenDialog( + NS_LITERAL_STRING("chrome://messenger/content/addressbook/abNewCardDialog.xul"), + EmptyString(), + NS_LITERAL_STRING("chrome,resizable=no,titlebar,modal,centerscreen"), + cardFromVCard, getter_AddRefs(dialogWindow)); + } + } + + return rv; +} + NS_IMETHODIMP nsAddressBook::EscapedVCardToAbCard(const char *aEscapedVCardStr, nsIAbCard **aCard) { NS_ENSURE_ARG_POINTER(aEscapedVCardStr); diff --git a/mailnews/addrbook/src/nsAddressBook.h b/mailnews/addrbook/src/nsAddressBook.h index 98452210ee65..a9145d8fedca 100644 --- a/mailnews/addrbook/src/nsAddressBook.h +++ b/mailnews/addrbook/src/nsAddressBook.h @@ -46,6 +46,7 @@ #include "nsICmdLineHandler.h" #include "nsIComponentManager.h" #include "nsIContentHandler.h" +#include "nsIStreamLoader.h" #include "rdf.h" class nsILocalFile; @@ -82,7 +83,7 @@ const extern ExportAttributesTableStruct EXPORT_ATTRIBUTES_TABLE[EXPORT_ATTRIBUT // are probably out there that can handle 4.x LDIF) // else use the MOZ_AB_LDIF_PREFIX prefix, see nsIAddrDatabase.idl -class nsAddressBook : public nsIAddressBook, public nsICmdLineHandler, public nsIContentHandler +class nsAddressBook : public nsIAddressBook, public nsICmdLineHandler, public nsIContentHandler, public nsIStreamLoaderObserver { public: @@ -93,6 +94,7 @@ public: NS_DECL_NSIADDRESSBOOK NS_DECL_NSICMDLINEHANDLER NS_DECL_NSICONTENTHANDLER + NS_DECL_NSISTREAMLOADEROBSERVER CMDLINEHANDLER_REGISTERPROC_DECLS diff --git a/mailnews/addrbook/src/nsMsgVCardService.cpp b/mailnews/addrbook/src/nsMsgVCardService.cpp index c0965b5dd66a..566bc35c79f4 100644 --- a/mailnews/addrbook/src/nsMsgVCardService.cpp +++ b/mailnews/addrbook/src/nsMsgVCardService.cpp @@ -36,21 +36,9 @@ * ***** END LICENSE BLOCK ***** */ #include "nsMsgVCardService.h" -#include "nsIDOMWindowInternal.h" - -#include "nsVCardObj.h" -#include "nsISupportsPrimitives.h" -#include "nsIInterfaceRequestor.h" -#include "nsIInterfaceRequestorUtils.h" -#include "nsIAbCard.h" -#include "nsIAddressBook.h" -#include "nsAbBaseCID.h" - #include "prmem.h" #include "plstr.h" -#define FOUR_K 4096 - NS_IMPL_ISUPPORTS1(nsMsgVCardService, nsIMsgVCardService) nsMsgVCardService::nsMsgVCardService() @@ -118,103 +106,3 @@ NS_IMETHODIMP_(char *) nsMsgVCardService::VObjectAnyValue(VObject * o) PL_strcpy(retval, (char *) vObjectAnyValue(o)); return retval; } - -// helper class used to process a stream of vcard data - -NS_IMPL_ISUPPORTS1(nsMsgVCardStreamListener, nsIStreamListener) - -nsMsgVCardStreamListener::nsMsgVCardStreamListener() -{ - m_dataBuffer = nsnull; -} - -nsMsgVCardStreamListener::~nsMsgVCardStreamListener() -{ - PR_Free(m_dataBuffer); -} - -NS_IMETHODIMP -nsMsgVCardStreamListener::OnStartRequest(nsIRequest* request, nsISupports* aSupport) -{ - if (!m_dataBuffer) - m_dataBuffer = (char*) PR_CALLOC(FOUR_K+1); - return NS_OK; -} - -NS_IMETHODIMP -nsMsgVCardStreamListener::OnStopRequest(nsIRequest* request, nsISupports* aSupport, - nsresult status) -{ - NS_ENSURE_ARG_POINTER(aSupport); - NS_ENSURE_SUCCESS(status, status); // don't process the vcard if we got a status error - nsresult rv = NS_OK; - - // take our vCard string and open up an address book window based on it - nsCOMPtr vCardService = do_GetService(NS_MSGVCARDSERVICE_CONTRACTID); - if (vCardService) - { - VObject * vObj = vCardService->Parse_MIME(mVCardData.get(), mVCardData.Length()); - if (vObj) - { - nsCAutoString vCard; - int len = 0; - - vCard.Adopt(vCardService->WriteMemoryVObjects(0, &len, vObj, PR_FALSE)); - delete vObj; - - nsCOMPtr parentWindow = do_GetInterface(aSupport); - NS_ENSURE_TRUE(parentWindow, NS_ERROR_FAILURE); - - nsCOMPtr addressbook = do_CreateInstance(NS_ADDRESSBOOK_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr cardFromVCard; - rv = addressbook->EscapedVCardToAbCard(vCard.get(), getter_AddRefs(cardFromVCard)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr ifptr = do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - ifptr->SetData(cardFromVCard); - ifptr->SetDataIID(&NS_GET_IID(nsIAbCard)); - - nsCOMPtr dialogWindow; - - rv = parentWindow->OpenDialog( - NS_LITERAL_STRING("chrome://messenger/content/addressbook/abNewCardDialog.xul"), - EmptyString(), - NS_LITERAL_STRING("chrome,resizable=no,titlebar,modal,centerscreen"), - ifptr, getter_AddRefs(dialogWindow)); - } - } - - PR_FREEIF(m_dataBuffer); - - return rv; -} - -NS_IMETHODIMP nsMsgVCardStreamListener::OnDataAvailable(nsIRequest* request, nsISupports* aSupport, - nsIInputStream* inStream, - PRUint32 srcOffset, - PRUint32 count) -{ - PRUint32 available, readCount, maxReadCount = FOUR_K; - PRUint32 writeCount; - nsresult rv = inStream->Available(&available); - while (NS_SUCCEEDED(rv) && available) - { - if (maxReadCount > available) - maxReadCount = available; - memset(m_dataBuffer, 0, FOUR_K+1); - rv = inStream->Read(m_dataBuffer, maxReadCount, &readCount); - - if (NS_SUCCEEDED(rv)) - { - // m_dataBuffer is null terminated so we can safely just append it to our vcard string - mVCardData += m_dataBuffer; - available -= readCount; - } - } - - return rv; -} diff --git a/mailnews/addrbook/src/nsMsgVCardService.h b/mailnews/addrbook/src/nsMsgVCardService.h index cba2646d7f7d..847f42a8e142 100644 --- a/mailnews/addrbook/src/nsMsgVCardService.h +++ b/mailnews/addrbook/src/nsMsgVCardService.h @@ -40,7 +40,6 @@ #include "nsIMsgVCardService.h" #include "nsISupports.h" -#include "nsIStreamListener.h" class nsMsgVCardService : public nsIMsgVCardService { @@ -52,23 +51,4 @@ public: virtual ~nsMsgVCardService(); }; -// a helper class for the vcard service which can process a vcard as an incoming -// stream and open it. - -class nsMsgVCardStreamListener : public nsIStreamListener -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSISTREAMLISTENER - NS_DECL_NSIREQUESTOBSERVER - - nsMsgVCardStreamListener(); - virtual ~nsMsgVCardStreamListener(); - -protected: - char *m_dataBuffer; - nsCString mVCardData; - -}; - #endif /* nsMsgVCardService_h___ */ diff --git a/mailnews/build/nsMailModule.cpp b/mailnews/build/nsMailModule.cpp index 37514f3745e0..2b97febec821 100644 --- a/mailnews/build/nsMailModule.cpp +++ b/mailnews/build/nsMailModule.cpp @@ -375,7 +375,6 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbLDAPProcessChangeLogData) NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbDirectoryQueryProxy) NS_GENERIC_FACTORY_CONSTRUCTOR(nsAbView) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgVCardService) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsMsgVCardStreamListener) //////////////////////////////////////////////////////////////////////////////// // bayesian spam filter factories @@ -856,8 +855,6 @@ static const nsModuleComponentInfo gComponents[] = { NS_ABDIRECTORYQUERYPROXY_CONTRACTID, nsAbDirectoryQueryProxyConstructor}, { "addressbook view", NS_ABVIEW_CID, NS_ABVIEW_CONTRACTID, nsAbViewConstructor}, { "vcard helper service", NS_MSGVCARDSERVICE_CID, NS_MSGVCARDSERVICE_CONTRACTID, nsMsgVCardServiceConstructor }, - { "vcard stream listener", NS_MSGVCARDSTREAMLISTENER_CID, NS_MSGVCARDSTREAMLISTENER_CONTRACTID, - nsMsgVCardStreamListenerConstructor }, //////////////////////////////////////////////////////////////////////////////// // bayesian spam filter components