void DownloadEmailPartsCommand::RunImpl()
{
	m_emailParser->Begin();

	try{
		// determine part's original mime type first if this download request is for
		// on-demand download
		if (!m_request->GetPartId().null() && !m_request->GetPartId().undefined()) {
			EmailPartList parts =  m_email->GetPartList();
			EmailPartList::iterator itr;
			for (itr = parts.begin(); itr != parts.end(); itr++) {
				EmailPartPtr part = *itr;
				if (part->GetId() == m_request->GetPartId()) {
					m_partMimeType = part->GetMimeType();
					break;
				}
			}
		}

		// Command syntax: "RETR <msg_num>".
		std::ostringstream command;
		command << COMMAND_STRING << " " << m_msgNum;
		SendCommand(command.str());
	}
	catch (const std::exception& e) {
		MojLogError(m_log, "Exception in preparing download email parts request: '%s'", e.what());
		m_parseFailed = true;
		Failure(e);
	} catch (...) {
		MojLogError(m_log, "Unknown exception in preparing download email parts request");
		m_parseFailed = true;
		Failure(MailException("Unknown exception in preparing download email parts request", __FILE__, __LINE__));
	}
}
TEST(AsyncEmailWriterTest, TestMissingFile)
{
	Email email;
	InitEmail(email);
	
	fprintf(stderr, "Testing missing part file\n");
	
	MojRefCountedPtr<AsyncEmailWriter> writer( new AsyncEmailWriter(email) );

	// Create a body part
	EmailPartList partList;
	partList.push_back( CreateBodyPart("does-not-exist") );
	writer->SetPartList(partList);

	MojRefCountedPtr<ByteBufferOutputStream> bbos( new ByteBufferOutputStream() );
	writer->SetOutputStream(bbos);

	boost::shared_ptr<MockAsyncIOChannelFactory> ioFactory( new MockAsyncIOChannelFactory() );
	writer->SetAsyncIOChannelFactory(ioFactory);
	
	MojRefCountedPtr<AsyncEmailWriterResult> writeResult(new AsyncEmailWriterResult());
	writer->WriteEmail(writeResult->GetSlot());
	
	// Make sure it's done writing
	ASSERT_TRUE( writeResult->Done() );

	// Should have reported an exception
	ASSERT_TRUE( writeResult->GetException() );
}
Esempio n. 3
0
void EmailAdapter::SerializeParts(const EmailPartList& partsList, MojObject& partsArrayObj)
{
	EmailPartList::const_iterator it;
	
	for(it = partsList.begin(); it != partsList.end(); ++it) {
		EmailPartPtr emailPart = *it;
		if (!emailPart.get()) {
			throw MailException("Unable to serialize email: one of the parts is null", __FILE__, __LINE__);
		}

		MojObject partObj;
		MojErr err;
		
		// Add part information to the part object
		err = partObj.putString(Part::TYPE, GetPartTypeAsString(emailPart));
		ErrorToException(err);
		
		err = partObj.putString(Part::MIME_TYPE, emailPart->GetMimeType().c_str());
		ErrorToException(err);
		
		DatabaseAdapter::PutOptionalString(partObj, Part::PATH, emailPart->GetLocalFilePath());
		DatabaseAdapter::PutOptionalString(partObj, Part::NAME, emailPart->GetDisplayName());
		DatabaseAdapter::PutOptionalString(partObj, Part::CONTENT_ID, emailPart->GetContentId());
		DatabaseAdapter::PutOptionalString(partObj, Part::ENCODING, emailPart->GetEncoding());
		DatabaseAdapter::PutOptionalString(partObj, Part::CHARSET, emailPart->GetCharset());
		DatabaseAdapter::PutOptionalString(partObj, Part::SECTION, emailPart->GetSection());

		if(emailPart->GetEstimatedSize() >= 0) {
			err = partObj.put(Part::ESTIMATED_SIZE, emailPart->GetEstimatedSize());
			ErrorToException(err);
		}

		if(emailPart->GetEncodedSize() >= 0) {
			err = partObj.put(Part::ENCODED_SIZE, emailPart->GetEncodedSize());
			ErrorToException(err);
		}

		// Add to partsArrayObject
		err = partsArrayObj.push(partObj);
		ErrorToException(err);
	}
}
void TestWriteEmail(int numAttachments)
{
	Email email;
	InitEmail(email);
	
	MojRefCountedPtr<AsyncEmailWriter> writer( new AsyncEmailWriter(email) );
	
	// Create a body part
	EmailPartList partList;
	partList.push_back( CreateBodyPart("test1") );
	
	// Create some attachments
	for(int i = 0; i < numAttachments; i++) {
		std::stringstream name;
		name << "attach" << i;
		
		EmailPartPtr attachmentPart( new EmailPart(EmailPart::ATTACHMENT) );
		attachmentPart->SetLocalFilePath(name.str());
		partList.push_back(attachmentPart);
	}
	writer->SetPartList(partList);
	
	// Set up a fake file "test1" in our mock factory
	boost::shared_ptr<MockAsyncIOChannelFactory> ioFactory( new MockAsyncIOChannelFactory() );
	writer->SetAsyncIOChannelFactory(ioFactory);
	ioFactory->SetFileData("test1", "Email body");
	
	// Make some fake attachments
	for(int i = 0; i < numAttachments; i++) {
		std::stringstream name, data;
		name << "attach" << i;
		data << "Attachment data " << i;
		ioFactory->SetFileData(name.str().c_str(), data.str());
	}
	
	std::string output;
	WriteEmail(writer, output);
	
	//fprintf(stderr, "Email:\n%s\n", output.c_str());
}
Esempio n. 5
0
void EmailAdapter::ParseParts(const MojObject& partsArray, EmailPartList& partList)
{
	MojObject::ConstArrayIterator it = partsArray.arrayBegin();

	for (; it != partsArray.arrayEnd(); ++it) {
		const MojObject& partObj = *it;

		EmailPartPtr emailPart = ParseEmailPart(partObj);

		// Add to the part list
		partList.push_back(emailPart);
	}
}
void DownloadEmailPartsCommand::CompleteDownloadListener()
{
	try{
		if (m_listener.get()) {
			if (m_parseFailed) {
				MojLogError(m_log, "Replying download body error back to caller");
				m_listener->ReportError("Failed to download email");
			} else {
				if (!m_email->IsDownloaded()) {
					// Get first text part's mime type as the mime type to complete
					// the download request in download listener.
					EmailPartList parts = m_email->GetPartList();
					EmailPartList::iterator itr;
					for (itr = parts.begin(); itr != parts.end(); itr++) {
						EmailPartPtr part = *itr;
						if (part->GetMimeType().find("text") != std::string::npos) {
							m_partMimeType = part->GetMimeType();
							m_partPath = part->GetLocalFilePath();
						}
					}
				}

				MojLogInfo(m_log, "Replying download email completion to caller");
				m_listener->ReportComplete(m_msgSize, m_msgSize, m_partPath, m_partMimeType);
			}
		}
	} catch (const std::exception& e) {
		MojLogError(m_log, "Encountered error in downloading email parts: '%s'", e.what());
		m_parseFailed = true;
		Failure(e);
	} catch (...) {
		MojLogError(m_log, "Encountered error in downloading email parts");
		m_parseFailed = true;
		Failure(MailException("Encountered error in downloading email parts", __FILE__, __LINE__));
	}
}