static void openMailWindow(const nsACString& aFolderUri) { nsresult rv; nsCOMPtr<nsIMsgMailSession> mailSession ( do_GetService(NS_MSGMAILSESSION_CONTRACTID, &rv)); if (NS_FAILED(rv)) return; nsCOMPtr<nsIMsgWindow> topMostMsgWindow; rv = mailSession->GetTopmostMsgWindow(getter_AddRefs(topMostMsgWindow)); if (topMostMsgWindow) { if (!aFolderUri.IsEmpty()) { nsCOMPtr<nsIMsgWindowCommands> windowCommands; topMostMsgWindow->GetWindowCommands(getter_AddRefs(windowCommands)); if (windowCommands) windowCommands->SelectFolder(aFolderUri); } nsCOMPtr<nsIDOMWindow> domWindow; topMostMsgWindow->GetDomWindow(getter_AddRefs(domWindow)); domWindow->Focus(); } else { // the user doesn't have a mail window open already so open one for them... nsCOMPtr<nsIMessengerWindowService> messengerWindowService = do_GetService(NS_MESSENGERWINDOWSERVICE_CONTRACTID); // if we want to preselect the first account with new mail, // here is where we would try to generate a uri to pass in // (and add code to the messenger window service to make that work) if (messengerWindowService) messengerWindowService->OpenMessengerWindowWithUri( "mail:3pane", nsCString(aFolderUri).get(), nsMsgKey_None); } }
nsresult nsEnigMsgCompose::Init() { nsresult rv; DEBUG_LOG(("nsEnigMsgCompose::Init: sendFlags=%p\n", mSendFlags)); EMBool signMsg = mSendFlags & nsIEnigmail::SEND_SIGNED; EMBool encryptMsg = mSendFlags & nsIEnigmail::SEND_ENCRYPTED; EMBool usePgpMime = mSendFlags & nsIEnigmail::SEND_PGP_MIME; mMultipartSigned = usePgpMime && signMsg && !encryptMsg; mWriter = do_CreateInstance(NS_ENIGMIMEWRITER_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; rv = mWriter->Init(mStream, PR_TRUE); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIPrompt> prompter; nsCOMPtr <nsIMsgMailSession> mailSession (do_GetService(NS_MSGMAILSESSION_CONTRACTID)); if (mailSession) { nsCOMPtr<nsIMsgWindow> msgWindow; mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow)); if (msgWindow) msgWindow->GetPromptDialog(getter_AddRefs(prompter)); } nsCOMPtr<nsIEnigmail> enigmailSvc = do_GetService(NS_ENIGMAIL_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; if (usePgpMime && signMsg && (! encryptMsg)) { // determine hash algorithm to use for PGP/MIME signed msg PRInt32 exitCode; PRUnichar* ha; rv = enigmailSvc->DetermineHashAlgorithm(prompter, mUIFlags, mSenderEmailAddr.get(), &ha, &exitCode); DEBUG_LOG(("nsEnigMsgCompose::Init: DetermineHash: rv=%d, exitCode=%d\n", rv, exitCode)); if (NS_FAILED(rv)) return rv; if (exitCode != 0) return NS_ERROR_SMTP_PASSWORD_UNDEFINED; mHashAlgorithm = NS_ConvertUTF16toUTF8(ha).get(); DEBUG_LOG(("nsEnigMsgCompose::Init: hashAlgorithm=%s\n", mHashAlgorithm.get())); } nsString errorMsg; PRUint32 statusFlags; rv = enigmailSvc->EncryptMessageStart(nsnull, prompter, mUIFlags, mSenderEmailAddr.get(), mRecipients.get(), mBccAddr.get(), mHashAlgorithm.get(), mSendFlags, (nsIStreamListener*)(mWriter), &statusFlags, getter_Copies(errorMsg), getter_AddRefs(mPipeTrans) ); if (NS_FAILED(rv)) return rv; if (statusFlags & nsIEnigmail::MISSING_PASSPHRASE) return NS_ERROR_SMTP_PASSWORD_UNDEFINED; if (!mPipeTrans) return NS_OK; rv = enigmailSvc->StripWhitespace(mSendFlags, &mStripWhitespace); if (NS_FAILED(rv)) return rv; mInitialized = PR_TRUE; return NS_OK; }
nsresult nsEnigMsgCompose::FinishAux(EMBool aAbort, nsIMsgSendReport* sendReport) { nsresult rv; if (mMatchFrom > 0) { // Flush "buffer" for detecting lines beginning with "From " rv = WriteCopy(FromStr, mMatchFrom); if (NS_FAILED(rv)) return rv; } DEBUG_LOG(("nsEnigMsgCompose::FinishAux: \n")); if (mMultipartSigned) { rv = WriteSignedHeaders2(); if (NS_FAILED(rv)) return rv; } // Wait for STDOUT to close rv = mPipeTrans->Join(); if (NS_FAILED(rv)) return rv; if (aAbort) { // Terminate process mPipeTrans->Terminate(); mPipeTrans = nsnull; return NS_ERROR_FAILURE; } rv = WriteFinalSeparator(); if (NS_FAILED(rv)) return rv; // Count total bytes sent to writer PRUint32 cmdOutputLen; rv = mWriter->GetBytesWritten(&cmdOutputLen); if (NS_FAILED(rv)) return rv; // Exclude passthru bytes to determine STDOUT bytes cmdOutputLen -= mOutputLen; // Close STDOUT writer mWriter->Close(); mWriter = nsnull; nsCOMPtr<nsIPrompt> prompter; nsCOMPtr <nsIMsgMailSession> mailSession (do_GetService(NS_MSGMAILSESSION_CONTRACTID)); if (mailSession) { nsCOMPtr<nsIMsgWindow> msgWindow; mailSession->GetTopmostMsgWindow(getter_AddRefs(msgWindow)); if (msgWindow) msgWindow->GetPromptDialog(getter_AddRefs(prompter)); } nsCOMPtr<nsIEnigmail> enigmailSvc = do_GetService(NS_ENIGMAIL_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; PRInt32 exitCode; PRUint32 statusFlags; nsString errorMsg; rv = enigmailSvc->EncryptMessageEnd(nsnull, prompter, mUIFlags, mSendFlags, cmdOutputLen, mPipeTrans, &statusFlags, getter_Copies(errorMsg), &exitCode); if (NS_FAILED(rv)) return rv; if (exitCode != 0) { DEBUG_LOG(("nsEnigMsgCompose::FinishAux: ERROR EXIT %d\n", exitCode)); return NS_ERROR_FAILURE; } return NS_OK; }
nsresult nsEnigMimeDecrypt::FinishAux(nsIMsgWindow* msgWindow, nsIURI* uri) { // Enigmail stuff nsresult rv; nsCOMPtr<nsIThread> myThread; rv = ENIG_GET_THREAD(myThread); mUri = uri; nsCAutoString uriSpec(""); if (mListener) { rv = mListener->OnStopRequest(nsnull, nsnull, 0); if (NS_FAILED(rv)) return rv; nsCAutoString endLine; rv = mListener->GetEndLine(endLine); if (NS_FAILED(rv)) return rv; if (endLine.IsEmpty()) { ERROR_LOG(("nsEnigMimeDecrypt::FinishAux: ERROR MIME part not terminated\n")); return NS_ERROR_FAILURE; } mListener = nsnull; } rv = mBuffer->OnStopRequest(nsnull, nsnull, 0); if (NS_FAILED(rv)) return rv; if (msgWindow) { nsCOMPtr<nsIMsgHeaderSink> headerSink; msgWindow->GetMsgHeaderSink(getter_AddRefs(headerSink)); if (headerSink) headerSink->GetSecurityInfo(getter_AddRefs(mSecurityInfo)); } DEBUG_LOG(("nsEnigMimeDecrypt::FinishAux: securityInfo=%p\n", mSecurityInfo.get())); nsCOMPtr<nsIPrompt> prompter; if (msgWindow) { msgWindow->GetPromptDialog(getter_AddRefs(prompter)); } if (!prompter) { nsCOMPtr <nsIMsgMailSession> mailSession (do_GetService(NS_MSGMAILSESSION_CONTRACTID)); if (mailSession) { nsCOMPtr<nsIMsgWindow> msgwin; mailSession->GetTopmostMsgWindow(getter_AddRefs(msgwin)); if (msgwin) msgwin->GetPromptDialog(getter_AddRefs(prompter)); } } DEBUG_LOG(("nsEnigMimeDecrypt::FinishAux: prompter=%p\n", prompter.get())); nsCOMPtr<nsIEnigmail> enigmailSvc = do_GetService(NS_ENIGMAIL_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; nsString errorMsg; EMBool noOutput = PR_FALSE; PRUint32 statusFlags; rv = enigmailSvc->DecryptMessageStart(nsnull, prompter, mVerifyOnly, noOutput, nsnull, &statusFlags, getter_Copies(errorMsg), getter_AddRefs(mPipeTrans) ); if (NS_FAILED(rv)) return rv; if (!mPipeTrans) { if (mSecurityInfo) { nsCOMPtr<nsIEnigMimeHeaderSink> enigHeaderSink = do_QueryInterface(mSecurityInfo); if (enigHeaderSink) { NS_NAMED_LITERAL_STRING(nullString, ""); rv = enigHeaderSink->UpdateSecurityStatus(uriSpec, -1, statusFlags, nullString.get(), nullString.get(), nullString.get(), errorMsg.get(), nullString.get(), mUri); } } return NS_ERROR_FAILURE; } mIterations = 0; mCtFound = -1; nsCOMPtr<nsIInputStream> plainStream = nsnull; // read via pipeTransport.jsm nsCOMPtr<nsIRequest> request; rv = mPipeTrans->ReadInputStream(this, getter_AddRefs(request)); NS_ENSURE_SUCCESS(rv, rv); // Write buffered data asyncronously to process nsCOMPtr<nsIInputStream> bufStream; rv = mBuffer->OpenInputStream(getter_AddRefs(bufStream)); if (NS_FAILED(rv)) return rv; PRUint32 available; rv = bufStream->Available(&available); if (NS_FAILED(rv)) return rv; DEBUG_LOG(("nsEnigMimeDecrypt::FinishAux: available=%d\n", available)); rv = mPipeTrans->WriteAsync(bufStream, available, PR_TRUE); if (NS_FAILED(rv)) return rv; // read via pipeTransport.jsm nsCOMPtr<nsIThread> currentThread; rv = ENIG_GET_THREAD(currentThread); NS_ENSURE_SUCCESS(rv, rv); mDone = PR_FALSE; // wait with returning until message is completely processed // (simulate synchronous function) while (! mDone) { EMBool pendingEvents; rv = currentThread->ProcessNextEvent(PR_TRUE, &pendingEvents); NS_ENSURE_SUCCESS(rv, rv); } return NS_OK; }