// Stream is done...drive on! NS_IMETHODIMP nsMsgSendLater::OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresult status) { nsresult rv; // First, this shouldn't happen, but if // it does, flush the buffer and move on. if (mLeftoverBuffer) { DeliverQueuedLine(mLeftoverBuffer, PL_strlen(mLeftoverBuffer)); } if (mOutFile) mOutFile->Close(); // See if we succeeded on reading the message from the message store? // if (NS_SUCCEEDED(status)) { // Message is done...send it! rv = CompleteMailFileSend(); #ifdef NS_DEBUG printf("nsMsgSendLater: Success on getting message...\n"); #endif // If the send operation failed..try the next one... if (NS_FAILED(rv)) { rv = StartNextMailFileSend(rv); if (NS_FAILED(rv)) EndSendMessages(rv, nullptr, mTotalSendCount, mTotalSentSuccessfully); } } else { nsCOMPtr<nsIChannel> channel = do_QueryInterface(request); if(!channel) return NS_ERROR_FAILURE; // extract the prompt object to use for the alert from the url.... nsCOMPtr<nsIURI> uri; nsCOMPtr<nsIPrompt> promptObject; if (channel) { channel->GetURI(getter_AddRefs(uri)); nsCOMPtr<nsISmtpUrl> smtpUrl (do_QueryInterface(uri)); if (smtpUrl) smtpUrl->GetPrompt(getter_AddRefs(promptObject)); } nsMsgDisplayMessageByID(promptObject, NS_ERROR_QUEUED_DELIVERY_FAILED); // Getting the data failed, but we will still keep trying to send the rest... rv = StartNextMailFileSend(status); if (NS_FAILED(rv)) EndSendMessages(rv, nullptr, mTotalSendCount, mTotalSentSuccessfully); } return rv; }
nsresult NS_MsgLoadSmtpUrl(nsIURI * aUrl, nsISupports * aConsumer, nsIRequest ** aRequest) { NS_ENSURE_ARG_POINTER(aUrl); // For now, assume the url is an smtp url and load it. nsresult rv; nsCOMPtr<nsISmtpUrl> smtpUrl(do_QueryInterface(aUrl, &rv)); NS_ENSURE_SUCCESS(rv, rv); // Create a smtp protocol instance to run the url in. RefPtr<nsSmtpProtocol> smtpProtocol = new nsSmtpProtocol(aUrl); if (!smtpProtocol) return NS_ERROR_OUT_OF_MEMORY; // Protocol will get destroyed when url is completed. rv = smtpProtocol->LoadUrl(aUrl, aConsumer); NS_ENSURE_SUCCESS(rv, rv); return CallQueryInterface(smtpProtocol.get(), aRequest); }
// short cut function for creating a mailto url... nsresult NS_MsgBuildSmtpUrl(nsIFile * aFilePath, const nsCString &aSmtpHostName, PRInt32 aSmtpPort, const nsCString &aSmtpUserName, const char * aRecipients, nsIMsgIdentity * aSenderIdentity, nsIUrlListener * aUrlListener, nsIMsgStatusFeedback *aStatusFeedback, nsIInterfaceRequestor* aNotificationCallbacks, nsIURI ** aUrl, PRBool aRequestDSN) { // mscott: this function is a convience hack until netlib actually dispatches // smtp urls. in addition until we have a session to get a password, host and // other stuff from, we need to use default values.... // ..for testing purposes.... nsresult rv; nsCOMPtr<nsISmtpUrl> smtpUrl(do_CreateInstance(kCSmtpUrlCID, &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString urlSpec("smtp://"); if (!aSmtpUserName.IsEmpty()) { nsCString escapedUsername; MsgEscapeString(aSmtpUserName, nsINetUtil::ESCAPE_XALPHAS, escapedUsername); urlSpec.Append(escapedUsername); urlSpec.Append('@'); } urlSpec.Append(aSmtpHostName); if (aSmtpHostName.FindChar(':') == -1) { urlSpec.Append(':'); urlSpec.AppendInt(aSmtpPort); } nsCOMPtr<nsIMsgMailNewsUrl> url(do_QueryInterface(smtpUrl, &rv)); NS_ENSURE_SUCCESS(rv, rv); url->SetSpec(urlSpec); smtpUrl->SetRecipients(aRecipients); smtpUrl->SetRequestDSN(aRequestDSN); smtpUrl->SetPostMessageFile(aFilePath); smtpUrl->SetSenderIdentity(aSenderIdentity); smtpUrl->SetNotificationCallbacks(aNotificationCallbacks); nsCOMPtr<nsIPrompt> smtpPrompt(do_GetInterface(aNotificationCallbacks)); nsCOMPtr<nsIAuthPrompt> smtpAuthPrompt(do_GetInterface(aNotificationCallbacks)); if (!smtpPrompt || !smtpAuthPrompt) { nsCOMPtr<nsIWindowWatcher> wwatch(do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); if (!smtpPrompt) wwatch->GetNewPrompter(0, getter_AddRefs(smtpPrompt)); if (!smtpAuthPrompt) wwatch->GetNewAuthPrompter(0, getter_AddRefs(smtpAuthPrompt)); } smtpUrl->SetPrompt(smtpPrompt); smtpUrl->SetAuthPrompt(smtpAuthPrompt); url->RegisterListener(aUrlListener); if (aStatusFeedback) url->SetStatusFeedback(aStatusFeedback); return CallQueryInterface(smtpUrl, aUrl); }