nsresult nsMailboxService::ParseMailbox(nsIMsgWindow *aMsgWindow, nsILocalFile *aMailboxPath, nsIStreamListener *aMailboxParser, nsIUrlListener * aUrlListener, nsIURI ** aURL) { NS_ENSURE_ARG_POINTER(aMailboxPath); nsresult rv; nsCOMPtr<nsIMailboxUrl> mailboxurl = do_CreateInstance(NS_MAILBOXURL_CONTRACTID, &rv); if (NS_SUCCEEDED(rv) && mailboxurl) { nsCOMPtr<nsIMsgMailNewsUrl> url = do_QueryInterface(mailboxurl); // okay now generate the url string nsCString mailboxPath; aMailboxPath->GetNativePath(mailboxPath); nsCAutoString buf; MsgEscapeURL(mailboxPath, nsINetUtil::ESCAPE_URL_MINIMAL | nsINetUtil::ESCAPE_URL_FORCED, buf); nsEscapeNativePath(buf); url->SetUpdatingFolder(PR_TRUE); url->SetMsgWindow(aMsgWindow); nsCAutoString uriSpec("mailbox://"); uriSpec.Append(buf); url->SetSpec(uriSpec); mailboxurl->SetMailboxParser(aMailboxParser); if (aUrlListener) url->RegisterListener(aUrlListener); rv = RunMailboxUrl(url, nsnull); NS_ENSURE_SUCCESS(rv, rv); if (aURL) { *aURL = url; NS_IF_ADDREF(*aURL); } } return rv; }
void MaildirStoreParser::TimerCallback(nsITimer *aTimer, void *aClosure) { MaildirStoreParser *parser = (MaildirStoreParser *) aClosure; bool hasMore; parser->m_directoryEnumerator->HasMoreElements(&hasMore); if (!hasMore) { nsCOMPtr<nsIMsgPluggableStore> store; parser->m_folder->GetMsgStore(getter_AddRefs(store)); parser->m_timer->Cancel(); parser->m_db->SetSummaryValid(true); // store->SetSummaryFileValid(parser->m_folder, parser->m_db, true); if (parser->m_listener) { nsresult rv; nsCOMPtr<nsIMailboxUrl> mailboxurl = do_CreateInstance(NS_MAILBOXURL_CONTRACTID, &rv); if (NS_SUCCEEDED(rv) && mailboxurl) { nsCOMPtr<nsIMsgMailNewsUrl> url = do_QueryInterface(mailboxurl); url->SetUpdatingFolder(true); nsAutoCString uriSpec("mailbox://"); // ### TODO - what if SetSpec fails? (void) url->SetSpec(uriSpec); parser->m_listener->OnStopRunningUrl(url, NS_OK); } } return; } nsCOMPtr<nsISupports> aSupport; parser->m_directoryEnumerator->GetNext(getter_AddRefs(aSupport)); nsresult rv; nsCOMPtr<nsIFile> currentFile(do_QueryInterface(aSupport, &rv)); NS_ENSURE_SUCCESS_VOID(rv); parser->ParseNextMessage(currentFile); // ### TODO - what if this fails? }
nsresult nsEnigMimeDecrypt::ProcessEnd(nsIInputStream* plainStream) { DEBUG_LOG(("nsEnigMimeDecrypt::ProcessEnd:\n")); char buf[kCharMax]; nsresult rv; nsString errorMsg; nsCAutoString uriSpec(""); nsCOMPtr<nsIEnigmail> enigmailSvc = do_GetService(NS_ENIGMAIL_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; DEBUG_LOG(("nsEnigMimeDecrypt::ProcessEnd: got Enigmail Svc\n")); if (mCtFound==0) { // add mime boundaries around text/plain message (bug 6627) PR_SetError(0,0); strcpy(buf, "\n\n--enigDummy--\n"); int status = mOutputFun(buf, strlen(buf), mOutputClosure); if (status < 0) { PR_SetError(status, 0); mOutputFun = NULL; mOutputClosure = NULL; DEBUG_LOG(("nsEnigMimeDecrypt::ProcessEnd: error 1\n")); return NS_ERROR_FAILURE; } mOutputLen+=strlen(buf); } else { // add final \n to make sure last line is always displayed (bug 5952) buf[0]='\n'; PR_SetError(0,0); int status = mOutputFun(buf, 1, mOutputClosure); if (status >= 0) { // ignore any errors here mOutputLen++; } } PR_SetError(0,0); // Close input stream if (plainStream) plainStream->Close(); // Close buffer mBuffer->Shutdown(); PRInt32 exitCode; nsString keyId; nsString userId; nsString sigDate; nsString blockSeparation; PRUint32 statusFlags; PRUint32 uiFlags = nsIEnigmail::UI_PGP_MIME; EMBool noOutput = PR_FALSE; rv = enigmailSvc->DecryptMessageEnd(uiFlags, mOutputLen, mPipeTrans, mVerifyOnly, noOutput, &statusFlags, getter_Copies(keyId), getter_Copies(userId), getter_Copies(sigDate), getter_Copies(errorMsg), getter_Copies(blockSeparation), &exitCode); DEBUG_LOG(("nsEnigMimeDecrypt::ProcessEnd: location 2\n")); if (NS_FAILED(rv)) return rv; DEBUG_LOG(("nsEnigMimeDecrypt::ProcessEnd: location 3\n")); if (mSecurityInfo) { nsCOMPtr<nsIEnigMimeHeaderSink> enigHeaderSink = do_QueryInterface(mSecurityInfo); if (enigHeaderSink) { rv = enigHeaderSink->UpdateSecurityStatus(uriSpec, exitCode, statusFlags, keyId.get(), userId.get(), sigDate.get(), errorMsg.get(), blockSeparation.get(), mUri); } } if (exitCode != 0) { DEBUG_LOG(("nsEnigMimeDecrypt::ProcessEnd: 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; }