44
44
#include "nsMsgBaseCID.h"
45
45
#include "nsMsgCompCID.h"
46
46
#include "nsIMsgMailSession.h"
47
#include "nsIIPCService.h"
48
47
#include "nsIEnigMsgCompFields.h"
49
48
#include "nsEnigMsgCompose.h"
697
690
if (NS_FAILED(rv)) return rv;
700
// Wait for input event queue to be completely processed
702
nsCOMPtr<nsIOutputStream> outStream = do_QueryInterface(mPipeTrans);
704
nsEnigComposeWriter* dispatchWriter = new nsEnigComposeWriter(outStream, nsnull, 0);
705
dispatchWriter->CompleteEvents();
706
mTargetThread->Dispatch(dispatchWriter, nsIEventTarget::DISPATCH_SYNC);
709
693
// Wait for STDOUT to close
710
694
rv = mPipeTrans->Join();
711
695
if (NS_FAILED(rv)) return rv;
905
889
tmpStr.Assign(aBuf, aLen);
906
890
DEBUG_LOG(("nsEnigMimeWriter::WriteToPipe: data: '%s'\n", tmpStr.get()));
908
if (mMultipartSigned) {
909
rv = mPipeTrans->WriteSync(aBuf, aLen);
912
if (! mTargetThread) {
913
rv = NS_NewThread(&mTargetThread);
914
if (NS_FAILED(rv)) return rv;
917
// dispatch message to different thread to avoid deadlock with input queue
919
nsCOMPtr<nsIOutputStream> outStream = do_QueryInterface(mPipeTrans);
921
nsEnigComposeWriter* dispatchWriter = new nsEnigComposeWriter(outStream, aBuf, aLen);
922
rv = mTargetThread->Dispatch(dispatchWriter, nsIEventTarget::DISPATCH_NORMAL);
892
rv = mPipeTrans->Write(aBuf, aLen);
1141
///////////////////////////////////////////////////////////////////////////////
1142
// nsEnigComposeWriter
1143
///////////////////////////////////////////////////////////////////////////////
1145
NS_IMPL_THREADSAFE_ISUPPORTS1 (nsEnigComposeWriter,
1149
// nsStdinWriter implementation
1150
nsEnigComposeWriter::nsEnigComposeWriter(nsCOMPtr<nsIOutputStream> pipeTrans,
1154
mCompleteEvents(PR_FALSE)
1156
NS_INIT_ISUPPORTS();
1159
nsCOMPtr<nsIThread> myThread;
1160
ENIG_GET_THREAD(myThread);
1161
DEBUG_LOG(("nsEnigComposeWriter:: <<<<<<<<< CTOR(%p): myThread=%p\n",
1162
this, myThread.get()));
1165
mPipeTrans = pipeTrans;
1169
mBuf = reinterpret_cast<char*>(nsMemory::Alloc(count));
1173
memcpy(mBuf, buf, count);
1178
nsEnigComposeWriter::~nsEnigComposeWriter()
1181
nsCOMPtr<nsIThread> myThread;
1182
ENIG_GET_THREAD(myThread);
1183
DEBUG_LOG(("nsEnigComposeWriter:: >>>>>>>>> DTOR(%p): myThread=%p\n",
1184
this, myThread.get()));
1188
// Release references
1189
mPipeTrans = nsnull;
1191
nsMemory::Free(mBuf);
1195
NS_IMETHODIMP nsEnigComposeWriter::Run()
1199
nsCOMPtr<nsIThread> myThread;
1200
rv = ENIG_GET_THREAD(myThread);
1201
NS_ENSURE_SUCCESS(rv, rv);
1202
DEBUG_LOG(("nsEnigComposeWriter::Run: myThread=%p\n", myThread.get()));
1204
if (!mCompleteEvents) {
1205
PRUint32 writeCount;
1206
rv = mPipeTrans->Write(mBuf, mCount, &writeCount);
1207
NS_ENSURE_SUCCESS(rv, rv);
1209
if (writeCount != mCount) {
1210
DEBUG_LOG(("nsEnigComposeWriter::Run: written %d instead of %d bytes\n",
1211
writeCount, mCount));
1212
return NS_ERROR_FAILURE;
1217
DEBUG_LOG(("nsEnigComposeWriter::Run: draining event queue\n"));
1219
EMBool pendingEvents;
1220
rv = myThread->HasPendingEvents(&pendingEvents);
1221
NS_ENSURE_SUCCESS(rv, rv);
1223
// in theory there should be no pending events here be
1225
while(pendingEvents) {
1226
myThread->ProcessNextEvent(PR_FALSE, &pendingEvents);
1232
nsresult nsEnigComposeWriter::CompleteEvents() {
1233
DEBUG_LOG(("nsEnigComposeWriter::CompleteEvents"));
1235
// dispatching of CompleteEvents needs to be done synchronously: this will ensure that
1236
// the event is added at the end of the queue and the queue is emptied automagically
1238
mCompleteEvents = PR_TRUE;