bool CMapiMessage::CopyBinAttachToFile(LPATTACH lpAttach, nsIFile **tmp_file) { nsCOMPtr<nsIFile> _tmp_file; nsresult rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "mapiattach.tmp", getter_AddRefs(_tmp_file)); NS_ENSURE_SUCCESS(rv, false); rv = _tmp_file->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); NS_ENSURE_SUCCESS(rv, false); nsCString tmpPath; _tmp_file->GetNativePath(tmpPath); LPSTREAM lpStreamFile; HRESULT hr = CMapiApi::OpenStreamOnFile(gpMapiAllocateBuffer, gpMapiFreeBuffer, STGM_READWRITE | STGM_CREATE, const_cast<char*>(tmpPath.get()), NULL, &lpStreamFile); if (HR_FAILED(hr)) { MAPI_TRACE1("~~ERROR~~ OpenStreamOnFile failed - temp path: %s\r\n", tmpPath.get()); return false; } bool bResult = true; LPSTREAM lpAttachStream; hr = lpAttach->OpenProperty(PR_ATTACH_DATA_BIN, &IID_IStream, 0, 0, (LPUNKNOWN *)&lpAttachStream); if (HR_FAILED(hr)) { MAPI_TRACE0("~~ERROR~~ OpenProperty failed for PR_ATTACH_DATA_BIN.\r\n"); lpAttachStream = NULL; bResult = false; } else { STATSTG st; hr = lpAttachStream->Stat(&st, STATFLAG_NONAME); if (HR_FAILED(hr)) { MAPI_TRACE0("~~ERROR~~ Stat failed for attachment stream\r\n"); bResult = false; } else { hr = lpAttachStream->CopyTo(lpStreamFile, st.cbSize, NULL, NULL); if (HR_FAILED(hr)) { MAPI_TRACE0("~~ERROR~~ Attach Stream CopyTo temp file failed.\r\n"); bResult = false; } } } if (lpAttachStream) lpAttachStream->Release(); lpStreamFile->Release(); if (!bResult) _tmp_file->Remove(false); else CallQueryInterface(_tmp_file, tmp_file); return bResult; }
nsresult nsEudoraMailbox::CreateTempFile(nsIFile **ppFile) { nsresult rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "impmail.txt", ppFile); NS_ENSURE_SUCCESS(rv, rv); return (*ppFile)->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); }
bool CMapiMessage::GetTmpFile(/*out*/ nsIFile **aResult) { nsCOMPtr<nsIFile> tmpFile; nsresult rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "mapiattach.tmp", getter_AddRefs(tmpFile)); if (NS_FAILED(rv)) return false; rv = tmpFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); if (NS_FAILED(rv)) return false; return NS_SUCCEEDED(CallQueryInterface(tmpFile, aResult)); }
nsresult nsMsgMdnGenerator::CreateMdnMsg() { DEBUG_MDN("nsMsgMdnGenerator::CreateMdnMsg"); nsresult rv; nsCOMPtr<nsIFile> tmpFile; rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "mdnmsg", getter_AddRefs(m_file)); NS_ENSURE_SUCCESS(rv, rv); rv = m_file->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); nsCOMPtr <nsILocalFile> localFile = do_QueryInterface(m_file); NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewLocalFileOutputStream(getter_AddRefs(m_outputStream), localFile, PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE, 0664); NS_ASSERTION(NS_SUCCEEDED(rv),"creating mdn: failed to output stream"); if (NS_FAILED(rv)) return NS_OK; rv = CreateFirstPart(); if (NS_SUCCEEDED(rv)) { rv = CreateSecondPart(); if (NS_SUCCEEDED(rv)) rv = CreateThirdPart(); } if (m_outputStream) { m_outputStream->Flush(); m_outputStream->Close(); } if (NS_FAILED(rv)) m_file->Remove(false); else rv = SendMdnMsg(); return NS_OK; }
BOOL CMapiMessage::CopyBinAttachToFile( LPATTACH lpAttach) { LPSTREAM lpStreamFile; m_ownsAttachFile = FALSE; m_attachPath.Truncate(); nsCOMPtr<nsIFile> tmpFile; nsresult rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "mapiattach.tmp", getter_AddRefs(tmpFile)); NS_ENSURE_SUCCESS(rv, rv); rv = tmpFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); NS_ENSURE_SUCCESS(rv, rv); nsCString tmpPath; tmpFile->GetNativePath(tmpPath); HRESULT hr = CMapiApi::OpenStreamOnFile( gpMapiAllocateBuffer, gpMapiFreeBuffer, STGM_READWRITE | STGM_CREATE, (char *) tmpPath.get(), NULL, &lpStreamFile); if (HR_FAILED(hr)) { MAPI_TRACE1("~~ERROR~~ OpenStreamOnFile failed - temp path: %s\r\n", tmpPath.get()); return( FALSE); } MAPI_TRACE1("\t\t** Attachment extracted to temp file: %s\r\n", m_attachPath.get()); BOOL bResult = TRUE; LPSTREAM lpAttachStream; hr = lpAttach->OpenProperty( PR_ATTACH_DATA_BIN, &IID_IStream, 0, 0, (LPUNKNOWN *)&lpAttachStream); if (HR_FAILED( hr)) { MAPI_TRACE0( "~~ERROR~~ OpenProperty failed for PR_ATTACH_DATA_BIN.\r\n"); lpAttachStream = NULL; bResult = FALSE; } else { STATSTG st; hr = lpAttachStream->Stat( &st, STATFLAG_NONAME); if (HR_FAILED( hr)) { MAPI_TRACE0( "~~ERROR~~ Stat failed for attachment stream\r\n"); bResult = FALSE; } else { hr = lpAttachStream->CopyTo( lpStreamFile, st.cbSize, NULL, NULL); if (HR_FAILED( hr)) { MAPI_TRACE0( "~~ERROR~~ Attach Stream CopyTo temp file failed.\r\n"); bResult = FALSE; } } } m_attachPath = tmpPath; if (lpAttachStream) lpAttachStream->Release(); lpStreamFile->Release(); if (!bResult) tmpFile->Remove(PR_FALSE); else m_ownsAttachFile = TRUE; return( bResult); }
NS_IMETHODIMP nsPop3Sink::IncorporateBegin(const char* uidlString, nsIURI* aURL, uint32_t flags, void** closure) { #ifdef DEBUG printf("Incorporate message begin:\n"); if (uidlString) printf("uidl string: %s\n", uidlString); #endif nsCOMPtr<nsIFile> path; m_folder->GetFilePath(getter_AddRefs(path)); nsresult rv; nsCOMPtr<nsIPrefBranch> pPrefBranch(do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); if (pPrefBranch) { nsCOMPtr<nsIMsgIncomingServer> server; m_folder->GetServer(getter_AddRefs(server)); nsCString plugStoreContract; server->GetCharValue("storeContractID", plugStoreContract); // Maildir doesn't care about quaranting, but other stores besides berkeley // mailbox might. We should probably make this an attribute on the pluggable // store, though. if (plugStoreContract.Equals( NS_LITERAL_CSTRING("@mozilla.org/msgstore/berkeleystore;1"))) pPrefBranch->GetBoolPref("mailnews.downloadToTempFile", &m_downloadingToTempFile); } nsCOMPtr<nsIMsgDBHdr> newHdr; nsCOMPtr<nsIMsgIncomingServer> server = do_QueryInterface(m_popServer); if (!server) return NS_ERROR_UNEXPECTED; if (m_downloadingToTempFile) { // need to create an nsIOFileStream from a temp file... nsCOMPtr<nsIFile> tmpDownloadFile; rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "newmsg", getter_AddRefs(tmpDownloadFile)); NS_ASSERTION(NS_SUCCEEDED(rv), "writing tmp pop3 download file: failed to append filename"); if (NS_FAILED(rv)) return rv; if (!m_tmpDownloadFile) { //need a unique tmp file to prevent dataloss in multiuser environment rv = tmpDownloadFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); NS_ENSURE_SUCCESS(rv, rv); m_tmpDownloadFile = do_QueryInterface(tmpDownloadFile, &rv); } if (NS_SUCCEEDED(rv)) { rv = MsgGetFileStream(m_tmpDownloadFile, getter_AddRefs(m_outFileStream)); NS_ENSURE_SUCCESS(rv, rv); } } else { rv = server->GetMsgStore(getter_AddRefs(m_msgStore)); bool reusable; NS_ENSURE_SUCCESS(rv, rv); m_msgStore->GetNewMsgOutputStream(m_folder, getter_AddRefs(newHdr), &reusable, getter_AddRefs(m_outFileStream)); } // The following (!m_outFileStream etc) was added to make sure that we don't // write somewhere where for some reason or another we can't write to and // lose the messages. See bug 62480 if (!m_outFileStream) return NS_ERROR_OUT_OF_MEMORY; nsCOMPtr<nsISeekableStream> seekableOutStream = do_QueryInterface(m_outFileStream); // create a new mail parser if (!m_newMailParser) m_newMailParser = new nsParseNewMailState; NS_ENSURE_TRUE(m_newMailParser, NS_ERROR_OUT_OF_MEMORY); if (m_uidlDownload) m_newMailParser->DisableFilters(); nsCOMPtr <nsIMsgFolder> serverFolder; rv = GetServerFolder(getter_AddRefs(serverFolder)); if (NS_FAILED(rv)) return rv; rv = m_newMailParser->Init(serverFolder, m_folder, m_window, newHdr, m_outFileStream); // If we failed to initialize the parser, then just don't use it!!! // We can still continue without one. if (NS_FAILED(rv)) { m_newMailParser = nullptr; rv = NS_OK; } if (closure) *closure = (void*) this; nsCString outputString(GetDummyEnvelope()); rv = WriteLineToMailbox(outputString); NS_ENSURE_SUCCESS(rv, rv); // Write out account-key before UIDL so the code that looks for // UIDL will find the account first and know it can stop looking // once it finds the UIDL line. if (!m_accountKey.IsEmpty()) { outputString.AssignLiteral(HEADER_X_MOZILLA_ACCOUNT_KEY ": "); outputString.Append(m_accountKey); outputString.AppendLiteral(MSG_LINEBREAK); rv = WriteLineToMailbox(outputString); NS_ENSURE_SUCCESS(rv, rv); } if (uidlString) { outputString.AssignLiteral("X-UIDL: "); outputString.Append(uidlString); outputString.AppendLiteral(MSG_LINEBREAK); rv = WriteLineToMailbox(outputString); NS_ENSURE_SUCCESS(rv, rv); } // WriteLineToMailbox("X-Mozilla-Status: 8000" MSG_LINEBREAK); char *statusLine = PR_smprintf(X_MOZILLA_STATUS_FORMAT MSG_LINEBREAK, flags); outputString.Assign(statusLine); rv = WriteLineToMailbox(outputString); PR_smprintf_free(statusLine); NS_ENSURE_SUCCESS(rv, rv); rv = WriteLineToMailbox(NS_LITERAL_CSTRING("X-Mozilla-Status2: 00000000" MSG_LINEBREAK)); NS_ENSURE_SUCCESS(rv, rv); // leave space for 60 bytes worth of keys/tags rv = WriteLineToMailbox(NS_LITERAL_CSTRING(X_MOZILLA_KEYWORDS)); return NS_OK; }
nsresult nsMsgMdnGenerator::CreateMdnMsg() { DEBUG_MDN("nsMsgMdnGenerator::CreateMdnMsg"); nsresult rv; if (!m_autoSend) { nsCOMPtr<nsIPrompt> dialog; rv = m_window->GetPromptDialog(getter_AddRefs(dialog)); if (NS_SUCCEEDED(rv)) { nsString wishToSend; nsString ignoreRequest; nsString sendReceipt; PRInt32 buttonPressed = 0; rv = GetStringFromName(NS_LITERAL_STRING("MsgMdnWishToSend").get(), getter_Copies(wishToSend)); NS_ENSURE_SUCCESS(rv, rv); rv = GetStringFromName(NS_LITERAL_STRING("MsgMdnIgnoreRequest").get(), getter_Copies(ignoreRequest)); NS_ENSURE_SUCCESS(rv, rv); rv = GetStringFromName(NS_LITERAL_STRING("MsgMdnSendReceipt").get(), getter_Copies(sendReceipt)); NS_ENSURE_SUCCESS(rv, rv); // Default the dialog to "Ignore Request". rv = dialog->ConfirmEx(nsnull, wishToSend.get(), (nsIPrompt::BUTTON_POS_1_DEFAULT) + (nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_0) + (nsIPrompt::BUTTON_TITLE_IS_STRING * nsIPrompt::BUTTON_POS_1), sendReceipt.get(), ignoreRequest.get(), nsnull, nsnull, nsnull, &buttonPressed); NS_ENSURE_SUCCESS(rv, rv); m_reallySendMdn = !buttonPressed; // "Send Receipt" is in position 0 } } if (!m_reallySendMdn) return NS_OK; nsCOMPtr<nsIFile> tmpFile; rv = GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "mdnmsg", getter_AddRefs(m_file)); NS_ENSURE_SUCCESS(rv, rv); rv = m_file->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600); nsCOMPtr <nsILocalFile> localFile = do_QueryInterface(m_file); NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewLocalFileOutputStream(getter_AddRefs(m_outputStream), localFile, PR_CREATE_FILE | PR_WRONLY | PR_TRUNCATE, 0664); NS_ASSERTION(NS_SUCCEEDED(rv),"creating mdn: failed to output stream"); if (NS_FAILED(rv)) return NS_OK; rv = CreateFirstPart(); if (NS_SUCCEEDED(rv)) { rv = CreateSecondPart(); if (NS_SUCCEEDED(rv)) rv = CreateThirdPart(); } if (m_outputStream) { m_outputStream->Flush(); m_outputStream->Close(); } if (NS_FAILED(rv)) m_file->Remove(PR_FALSE); else rv = SendMdnMsg(); return NS_OK; }
void nsImapOfflineSync::ProcessAppendMsgOperation(nsIMsgOfflineImapOperation *currentOp, PRInt32 opType) { nsCOMPtr <nsIMsgDBHdr> mailHdr; nsMsgKey msgKey; currentOp->GetMessageKey(&msgKey); nsresult rv = m_currentDB->GetMsgHdrForKey(msgKey, getter_AddRefs(mailHdr)); if (NS_SUCCEEDED(rv) && mailHdr) { nsMsgKey messageOffset; PRUint32 messageSize; mailHdr->GetMessageOffset(&messageOffset); mailHdr->GetOfflineMessageSize(&messageSize); nsCOMPtr<nsIFile> tmpFile; if (NS_FAILED(GetSpecialDirectoryWithFileName(NS_OS_TEMP_DIR, "nscpmsg.txt", getter_AddRefs(tmpFile)))) return; if (NS_FAILED(tmpFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 00600))) return; nsCOMPtr <nsIOutputStream> outputStream; rv = MsgNewBufferedFileOutputStream(getter_AddRefs(outputStream), tmpFile, PR_WRONLY | PR_CREATE_FILE, 00600); if (NS_SUCCEEDED(rv) && outputStream) { nsCString moveDestination; currentOp->GetDestinationFolderURI(getter_Copies(moveDestination)); nsCOMPtr<nsIRDFService> rdf(do_GetService(kRDFServiceCID, &rv)); nsCOMPtr<nsIRDFResource> res; if (NS_FAILED(rv)) return ; // ### return error code. rv = rdf->GetResource(moveDestination, getter_AddRefs(res)); if (NS_SUCCEEDED(rv)) { nsCOMPtr<nsIMsgFolder> destFolder(do_QueryInterface(res, &rv)); if (NS_SUCCEEDED(rv) && destFolder) { nsCOMPtr <nsIInputStream> offlineStoreInputStream; rv = destFolder->GetOfflineStoreInputStream(getter_AddRefs(offlineStoreInputStream)); if (NS_SUCCEEDED(rv) && offlineStoreInputStream) { nsCOMPtr<nsISeekableStream> seekStream = do_QueryInterface(offlineStoreInputStream); NS_ASSERTION(seekStream, "non seekable stream - can't read from offline msg"); if (seekStream) { rv = seekStream->Seek(PR_SEEK_SET, messageOffset); if (NS_SUCCEEDED(rv)) { // now, copy the dest folder offline store msg to the temp file PRInt32 inputBufferSize = 10240; char *inputBuffer = nsnull; while (!inputBuffer && (inputBufferSize >= 512)) { inputBuffer = (char *) PR_Malloc(inputBufferSize); if (!inputBuffer) inputBufferSize /= 2; } PRInt32 bytesLeft; PRUint32 bytesRead, bytesWritten; bytesLeft = messageSize; rv = NS_OK; while (bytesLeft > 0 && NS_SUCCEEDED(rv)) { PRInt32 bytesToRead = PR_MIN(inputBufferSize, bytesLeft); rv = offlineStoreInputStream->Read(inputBuffer, bytesToRead, &bytesRead); if (NS_SUCCEEDED(rv) && bytesRead > 0) { rv = outputStream->Write(inputBuffer, bytesRead, &bytesWritten); NS_ASSERTION(bytesWritten == bytesRead, "wrote out correct number of bytes"); } else break; bytesLeft -= bytesRead; } outputStream->Flush(); outputStream->Close(); if (NS_SUCCEEDED(rv)) { m_curTempFile = do_QueryInterface(tmpFile); nsCOMPtr<nsIMsgCopyService> copyService = do_GetService(NS_MSGCOPYSERVICE_CONTRACTID); if (copyService) rv = copyService->CopyFileMessage(tmpFile, destFolder, /* nsIMsgDBHdr* msgToReplace */ nsnull, PR_TRUE /* isDraftOrTemplate */, 0, // new msg flags - are there interesting flags here? EmptyCString(), /* are there keywords we should get? */ this, m_window); } else tmpFile->Remove(PR_FALSE); } currentOp->SetPlayingBack(PR_TRUE); m_currentOpsToClear.AppendObject(currentOp); m_currentDB->DeleteHeader(mailHdr, nsnull, PR_TRUE, PR_TRUE); } } // want to close in failure case too outputStream->Close(); } } } } }