diff options
Diffstat (limited to '')
-rw-r--r-- | src/net/imap/IMAPMessage.cpp | 73 |
1 files changed, 44 insertions, 29 deletions
diff --git a/src/net/imap/IMAPMessage.cpp b/src/net/imap/IMAPMessage.cpp index e7778b95..e796afaf 100644 --- a/src/net/imap/IMAPMessage.cpp +++ b/src/net/imap/IMAPMessage.cpp @@ -53,7 +53,7 @@ public: ref <const structure> getStructure() const; ref <structure> getStructure(); - weak_ref <const IMAPpart> getParent() const { return (m_parent); } + ref <const IMAPpart> getParent() const { return m_parent.acquire(); } const mediaType& getType() const { return (m_mediaType); } const int getSize() const { return (m_size); } @@ -272,18 +272,20 @@ private: // -IMAPMessage::IMAPMessage(IMAPFolder* folder, const int num) +IMAPMessage::IMAPMessage(ref <IMAPFolder> folder, const int num) : m_folder(folder), m_num(num), m_size(-1), m_flags(FLAG_UNDEFINED), m_expunged(false), m_structure(NULL) { - m_folder->registerMessage(this); + folder->registerMessage(this); } IMAPMessage::~IMAPMessage() { - if (m_folder) - m_folder->unregisterMessage(this); + ref <IMAPFolder> folder = m_folder.acquire(); + + if (folder) + folder->unregisterMessage(this); } @@ -359,7 +361,9 @@ ref <const header> IMAPMessage::getHeader() const void IMAPMessage::extract(utility::outputStream& os, utility::progressListener* progress, const int start, const int length, const bool peek) const { - if (!m_folder) + ref <const IMAPFolder> folder = m_folder.acquire(); + + if (!folder) throw exceptions::folder_not_found(); extract(NULL, os, progress, start, length, false, peek); @@ -370,7 +374,9 @@ void IMAPMessage::extractPart (ref <const part> p, utility::outputStream& os, utility::progressListener* progress, const int start, const int length, const bool peek) const { - if (!m_folder) + ref <const IMAPFolder> folder = m_folder.acquire(); + + if (!folder) throw exceptions::folder_not_found(); extract(p, os, progress, start, length, false, peek); @@ -379,7 +385,9 @@ void IMAPMessage::extractPart void IMAPMessage::fetchPartHeader(ref <part> p) { - if (!m_folder) + ref <IMAPFolder> folder = m_folder.acquire(); + + if (!folder) throw exceptions::folder_not_found(); std::ostringstream oss; @@ -395,6 +403,8 @@ void IMAPMessage::extract(ref <const part> p, utility::outputStream& os, utility::progressListener* progress, const int start, const int length, const bool headerOnly, const bool peek) const { + ref <const IMAPFolder> folder = m_folder.acquire(); + IMAPMessage_literalHandler literalHandler(os, progress); // Construct section identifier @@ -402,7 +412,7 @@ void IMAPMessage::extract(ref <const part> p, utility::outputStream& os, if (p != NULL) { - weak_ref <const IMAPpart> currentPart = p.dynamicCast <const IMAPpart>(); + ref <const IMAPpart> currentPart = p.dynamicCast <const IMAPpart>(); std::vector <int> numbers; numbers.push_back(currentPart->getNumber()); @@ -437,17 +447,17 @@ void IMAPMessage::extract(ref <const part> p, utility::outputStream& os, command << "<" << start << "." << length << ">"; // Send the request - m_folder->m_connection->send(true, command.str(), true); + folder.constCast <IMAPFolder>()->m_connection->send(true, command.str(), true); // Get the response utility::auto_ptr <IMAPParser::response> resp - (m_folder->m_connection->readResponse(&literalHandler)); + (folder.constCast <IMAPFolder>()->m_connection->readResponse(&literalHandler)); if (resp->isBad() || resp->response_done()->response_tagged()-> resp_cond_state()->status() != IMAPParser::resp_cond_state::OK) { throw exceptions::command_error("FETCH", - m_folder->m_connection->getParser()->lastLine(), "bad response"); + folder.constCast <IMAPFolder>()->m_connection->getParser()->lastLine(), "bad response"); } @@ -458,9 +468,11 @@ void IMAPMessage::extract(ref <const part> p, utility::outputStream& os, } -void IMAPMessage::fetch(IMAPFolder* folder, const int options) +void IMAPMessage::fetch(ref <IMAPFolder> msgFolder, const int options) { - if (m_folder != folder) + ref <IMAPFolder> folder = m_folder.acquire(); + + if (folder != msgFolder) throw exceptions::folder_not_found(); // Send the request @@ -469,16 +481,16 @@ void IMAPMessage::fetch(IMAPFolder* folder, const int options) const string command = IMAPUtils::buildFetchRequest(list, options); - m_folder->m_connection->send(true, command, true); + folder->m_connection->send(true, command, true); // Get the response - utility::auto_ptr <IMAPParser::response> resp(m_folder->m_connection->readResponse()); + utility::auto_ptr <IMAPParser::response> resp(folder->m_connection->readResponse()); if (resp->isBad() || resp->response_done()->response_tagged()-> resp_cond_state()->status() != IMAPParser::resp_cond_state::OK) { throw exceptions::command_error("FETCH", - m_folder->m_connection->getParser()->lastLine(), "bad response"); + folder->m_connection->getParser()->lastLine(), "bad response"); } const std::vector <IMAPParser::continue_req_or_response_data*>& respDataList = @@ -490,7 +502,7 @@ void IMAPMessage::fetch(IMAPFolder* folder, const int options) if ((*it)->response_data() == NULL) { throw exceptions::command_error("FETCH", - m_folder->m_connection->getParser()->lastLine(), "invalid response"); + folder->m_connection->getParser()->lastLine(), "invalid response"); } const IMAPParser::message_data* messageData = @@ -512,6 +524,8 @@ void IMAPMessage::fetch(IMAPFolder* folder, const int options) void IMAPMessage::processFetchResponse (const int options, const IMAPParser::msg_att* msgAtt) { + ref <IMAPFolder> folder = m_folder.acquire(); + // Get message attributes const std::vector <IMAPParser::msg_att_item*> atts = msgAtt->items(); @@ -531,7 +545,7 @@ void IMAPMessage::processFetchResponse case IMAPParser::msg_att_item::UID: { std::ostringstream oss; - oss << m_folder->m_uidValidity << ":" << (*it)->unique_id()->value(); + oss << folder->m_uidValidity << ":" << (*it)->unique_id()->value(); m_uid = oss.str(); break; @@ -681,9 +695,11 @@ void IMAPMessage::convertAddressList void IMAPMessage::setFlags(const int flags, const int mode) { - if (!m_folder) + ref <IMAPFolder> folder = m_folder.acquire(); + + if (!folder) throw exceptions::folder_not_found(); - else if (m_folder->m_mode == folder::MODE_READ_ONLY) + else if (folder->m_mode == folder::MODE_READ_ONLY) throw exceptions::illegal_state("Folder is read-only"); // Build the request text @@ -723,16 +739,16 @@ void IMAPMessage::setFlags(const int flags, const int mode) command << *(flagList.end() - 1) << ")"; // Send the request - m_folder->m_connection->send(true, command.str(), true); + folder->m_connection->send(true, command.str(), true); // Get the response - utility::auto_ptr <IMAPParser::response> resp(m_folder->m_connection->readResponse()); + utility::auto_ptr <IMAPParser::response> resp(folder->m_connection->readResponse()); if (resp->isBad() || resp->response_done()->response_tagged()-> resp_cond_state()->status() != IMAPParser::resp_cond_state::OK) { throw exceptions::command_error("STORE", - m_folder->m_connection->getParser()->lastLine(), "bad response"); + folder->m_connection->getParser()->lastLine(), "bad response"); } // Update the local flags for this message @@ -776,13 +792,12 @@ void IMAPMessage::setFlags(const int flags, const int mode) nums.push_back(m_num); events::messageChangedEvent event - (m_folder->thisRef().dynamicCast <folder>(), - events::messageChangedEvent::TYPE_FLAGS, nums); + (folder, events::messageChangedEvent::TYPE_FLAGS, nums); - for (std::list <IMAPFolder*>::iterator it = m_folder->m_store->m_folders.begin() ; - it != m_folder->m_store->m_folders.end() ; ++it) + for (std::list <IMAPFolder*>::iterator it = folder->m_store.acquire()->m_folders.begin() ; + it != folder->m_store.acquire()->m_folders.end() ; ++it) { - if ((*it)->getFullPath() == m_folder->m_path) + if ((*it)->getFullPath() == folder->m_path) (*it)->notifyMessageChanged(event); } } |