bool EmailHeaderFieldParser::ParseEmailHeaderField(Email& email, const string& fieldNameLower, const string& fieldValue) { if (fieldNameLower == "subject") { // decode subject string subject; ParseTextField(fieldValue, subject); email.SetSubject(subject); } else if (fieldNameLower == "date") { time_t date; ParseDateField(fieldValue, date); // Technically this is the date sent, not received email.SetDateReceived( MojInt64(date) * 1000L); } else if (fieldNameLower == "from" || fieldNameLower == "reply-to" || fieldNameLower == "to" || fieldNameLower == "cc" || fieldNameLower == "bcc") { EmailAddressListPtr addressListPtr(new EmailAddressList()); ParseAddressListField(fieldValue, *addressListPtr); if (fieldNameLower == "to") { email.SetTo(addressListPtr); } else if (fieldNameLower == "cc") { email.SetCc(addressListPtr); } else if (fieldNameLower == "bcc") { email.SetBcc(addressListPtr); } else if (fieldNameLower == "from") { // get first address if (!addressListPtr->empty()) { email.SetFrom(addressListPtr->at(0)); } } else if (fieldNameLower == "reply-to") { // get first address if (!addressListPtr->empty()) { email.SetReplyTo(addressListPtr->at(0)); } } } else if (fieldNameLower == "in-reply-to") { email.SetInReplyTo( StringUtils::GetSanitizedASCII(fieldValue) ); } else if (fieldNameLower == "x-priority") { if(fieldValue == "1" || fieldValue == "2") { email.SetPriority(Email::Priority_High); } else if (fieldValue == "4" || fieldValue == "5") { email.SetPriority(Email::Priority_Low); } } else { // no match return false; } return true; }
void EmailAdapter::ParseDatabaseObject(const MojObject& obj, Email& email) { MojErr err; MojObject folderId; err = obj.getRequired(FOLDER_ID, folderId); ErrorToException(err); email.SetFolderId(folderId); MojString subject; err = obj.getRequired(SUBJECT, subject); ErrorToException(err); email.SetSubject( std::string(subject) ); MojObject fromAddress; err = obj.getRequired(FROM, fromAddress); ErrorToException(err); email.SetFrom( ParseAddress(fromAddress) ); // Optional replyTo address MojObject replyTo; if(obj.get(REPLY_TO, replyTo) && !replyTo.null()) { email.SetReplyTo( ParseAddress(replyTo) ); } MojInt64 timestamp; err = obj.getRequired(TIMESTAMP, timestamp); ErrorToException(err); email.SetDateReceived(timestamp); // Parse recipients MojObject recipients; err = obj.getRequired(RECIPIENTS, recipients); ErrorToException(err); ParseRecipients(recipients, email); // Parse flags MojObject flags; if (obj.get(FLAGS, flags)) { ParseFlags(flags, email); } // Parse parts MojObject parts; err = obj.getRequired(PARTS, parts); ErrorToException(err); EmailPartList partList; ParseParts(parts, partList); email.SetPartList(partList); MojObject originalMsgId; if (obj.get(ORIGINAL_MSG_ID, originalMsgId)) { email.SetOriginalMsgId(originalMsgId); } MojString draftType; bool hasDraftType = false; err = obj.get(DRAFT_TYPE, draftType, hasDraftType); ErrorToException(err); if (hasDraftType) { email.SetDraftType( ParseDraftType(draftType) ); } MojString priority; bool hasPriority = false; err = obj.get(PRIORITY, priority, hasPriority); ErrorToException(err); // If no priority exists, this will default to normal email.SetPriority(ParsePriority(priority)); email.SetMessageId( DatabaseAdapter::GetOptionalString(obj, MESSAGE_ID) ); email.SetInReplyTo( DatabaseAdapter::GetOptionalString(obj, IN_REPLY_TO) ); // SendStatus // NOTE: This is not being serialized back to the database in SerializeToDatabaseObject MojObject sendStatus; if (obj.get(SEND_STATUS, sendStatus)) { bool isSent = false; if (sendStatus.get(SendStatus::SENT, isSent)) { email.SetSent(isSent); } bool hasFatalError = false; if (sendStatus.get(SendStatus::FATAL_ERROR, hasFatalError)) { email.SetHasFatalError(hasFatalError); } MojInt64 retryCount; if (sendStatus.get(SendStatus::RETRY_COUNT, retryCount)) { email.SetRetryCount(retryCount); } MojObject sendError; if (sendStatus.get(SendStatus::ERROR, sendError)) { MojObject errorCode; if (sendError.get(SendStatusError::ERROR_CODE, errorCode) && !errorCode.null() && !errorCode.undefined()) { email.SetSendError(static_cast<MailError::ErrorCode>(errorCode.intValue())); } } } }