aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-06-22 00:56:18 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-06-22 00:56:18 -0700
commit25eecd728036f8a4a07d639cb0a7a07a9ad5bdd5 (patch)
treec3d7b0ef9f253c745b7b7bd61ebc5bcf24685281 /src
parent2620bd74c9cd635d8a552a9eecb467968ff2ba2d (diff)
Cleaned implementation of STATUS. Added support for CONDSTORE.
Diffstat (limited to 'src')
-rw-r--r--src/core/imap/MCIMAPFolderStatus.cc39
-rw-r--r--src/core/imap/MCIMAPFolderStatus.h34
-rw-r--r--src/core/imap/MCIMAPSession.cc23
-rw-r--r--src/objc/imap/MCOIMAPFolderStatus.h7
-rw-r--r--src/objc/imap/MCOIMAPFolderStatus.mm1
5 files changed, 66 insertions, 38 deletions
diff --git a/src/core/imap/MCIMAPFolderStatus.cc b/src/core/imap/MCIMAPFolderStatus.cc
index 4b75c1ae..d2cb2281 100644
--- a/src/core/imap/MCIMAPFolderStatus.cc
+++ b/src/core/imap/MCIMAPFolderStatus.cc
@@ -17,6 +17,7 @@ void IMAPFolderStatus::init()
mRecentCount = 0;
mUidNext = 0;
mUidValidity = 0;
+ mHighestModSeqValue = 0;
}
IMAPFolderStatus::IMAPFolderStatus()
@@ -32,7 +33,8 @@ IMAPFolderStatus::IMAPFolderStatus(IMAPFolderStatus * other)
setMessageCount(other->messageCount());
setRecentCount(other->recentCount());
setUidNext(other->uidNext());
- setUidValidity(other->uidValidity());
+ setUidValidity(other->uidValidity());
+ setHighestModSeqValue(other->highestModSeqValue());
}
IMAPFolderStatus::~IMAPFolderStatus()
@@ -44,66 +46,77 @@ Object * IMAPFolderStatus::copy()
return new IMAPFolderStatus(this);
}
-void IMAPFolderStatus::setUnseenCount(u_int32_t unseen)
+void IMAPFolderStatus::setUnseenCount(uint32_t unseen)
{
mUnseenCount = unseen;
}
-u_int32_t IMAPFolderStatus::unseenCount()
+uint32_t IMAPFolderStatus::unseenCount()
{
return mUnseenCount;
}
-void IMAPFolderStatus::setMessageCount(u_int32_t messages)
+void IMAPFolderStatus::setMessageCount(uint32_t messages)
{
mMessageCount = messages;
}
-u_int32_t IMAPFolderStatus::messageCount()
+uint32_t IMAPFolderStatus::messageCount()
{
return mMessageCount;
}
-void IMAPFolderStatus::setRecentCount(u_int32_t recent)
+void IMAPFolderStatus::setRecentCount(uint32_t recent)
{
mRecentCount = recent;
}
-u_int32_t IMAPFolderStatus::recentCount()
+uint32_t IMAPFolderStatus::recentCount()
{
return mRecentCount;
}
-void IMAPFolderStatus::setUidNext(u_int32_t uidNext)
+void IMAPFolderStatus::setUidNext(uint32_t uidNext)
{
mUidNext = uidNext;
}
-u_int32_t IMAPFolderStatus::uidNext()
+uint32_t IMAPFolderStatus::uidNext()
{
return mUidNext;
}
-void IMAPFolderStatus::setUidValidity(u_int32_t uidValidity)
+void IMAPFolderStatus::setUidValidity(uint32_t uidValidity)
{
mUidValidity = uidValidity;
}
-u_int32_t IMAPFolderStatus::uidValidity()
+uint32_t IMAPFolderStatus::uidValidity()
{
return mUidValidity;
}
+void IMAPFolderStatus::setHighestModSeqValue(uint64_t highestModSeqValue)
+{
+ mHighestModSeqValue = highestModSeqValue;
+}
+
+uint64_t IMAPFolderStatus::highestModSeqValue()
+{
+ return mHighestModSeqValue;
+}
+
String * IMAPFolderStatus::description()
{
String * result = String::string();
- result->appendUTF8Format("<%s:%p msg_count: %u, unseen_count: %u, recent_count: %u, uid_next: %u, uid_validity: %u>",
+ result->appendUTF8Format("<%s:%p msg_count: %u, unseen_count: %u, recent_count: %u, uid_next: %u, uid_validity: %u, highestmodseqvalue :%llu>",
className()->UTF8Characters(),
this,
(unsigned int) messageCount(),
(unsigned int) unseenCount(),
(unsigned int) recentCount(),
(unsigned int) uidNext(),
- (unsigned int) uidValidity());
+ (unsigned int) uidValidity(),
+ (unsigned long long) highestModSeqValue());
return result;
}
diff --git a/src/core/imap/MCIMAPFolderStatus.h b/src/core/imap/MCIMAPFolderStatus.h
index 2343c5d5..5a6dbac2 100644
--- a/src/core/imap/MCIMAPFolderStatus.h
+++ b/src/core/imap/MCIMAPFolderStatus.h
@@ -23,20 +23,23 @@ namespace mailcore {
IMAPFolderStatus();
virtual ~IMAPFolderStatus();
- virtual void setUnseenCount(u_int32_t unseen);
- virtual u_int32_t unseenCount();
+ virtual void setUnseenCount(uint32_t unseen);
+ virtual uint32_t unseenCount();
- virtual void setMessageCount(u_int32_t messages);
- virtual u_int32_t messageCount();
+ virtual void setMessageCount(uint32_t messages);
+ virtual uint32_t messageCount();
- virtual void setRecentCount(u_int32_t recent);
- virtual u_int32_t recentCount();
+ virtual void setRecentCount(uint32_t recent);
+ virtual uint32_t recentCount();
- virtual void setUidNext(u_int32_t uidNext);
- virtual u_int32_t uidNext();
+ virtual void setUidNext(uint32_t uidNext);
+ virtual uint32_t uidNext();
- virtual void setUidValidity(u_int32_t uidValidity);
- virtual u_int32_t uidValidity();
+ virtual void setUidValidity(uint32_t uidValidity);
+ virtual uint32_t uidValidity();
+
+ virtual void setHighestModSeqValue(uint64_t highestModSeqValue);
+ virtual uint64_t highestModSeqValue();
public: // subclass behavior
IMAPFolderStatus(IMAPFolderStatus * other);
@@ -44,11 +47,12 @@ namespace mailcore {
virtual String * description();
private:
- u_int32_t mUnseenCount;
- u_int32_t mMessageCount;
- u_int32_t mRecentCount;
- u_int32_t mUidNext;
- u_int32_t mUidValidity;
+ uint32_t mUnseenCount;
+ uint32_t mMessageCount;
+ uint32_t mRecentCount;
+ uint32_t mUidNext;
+ uint32_t mUidValidity;
+ uint64_t mHighestModSeqValue;
void init();
};
diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc
index cdbe6004..52e819d9 100644
--- a/src/core/imap/MCIMAPSession.cc
+++ b/src/core/imap/MCIMAPSession.cc
@@ -881,11 +881,14 @@ IMAPFolderStatus * IMAPSession::folderStatus(String * folder, ErrorCode * pError
struct mailimap_status_att_list * status_att_list;
status_att_list = mailimap_status_att_list_new_empty();
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_UNSEEN);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_MESSAGES);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_RECENT);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_UIDNEXT);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_UIDVALIDITY);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_UNSEEN);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_MESSAGES);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_RECENT);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_UIDNEXT);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_UIDVALIDITY);
+ if (mCondstoreEnabled) {
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_HIGHESTMODSEQ);
+ }
r = mailimap_status(mImap, MCUTF8(folder), status_att_list, &status);
@@ -934,7 +937,15 @@ IMAPFolderStatus * IMAPSession::folderStatus(String * folder, ErrorCode * pError
break;
case MAILIMAP_STATUS_ATT_UIDVALIDITY:
fs->setUidValidity(status_info->st_value);
- break;
+ break;
+ case MAILIMAP_STATUS_ATT_EXTENSION: {
+ struct mailimap_extension_data * ext_data = status_info->st_ext_data;
+ if (ext_data->ext_extension == &mailimap_extension_condstore) {
+ struct mailimap_condstore_status_info * status_info = (struct mailimap_condstore_status_info *) ext_data->ext_data;
+ fs->setHighestModSeqValue(status_info->cs_highestmodseq_value);
+ }
+ break;
+ }
}
}
diff --git a/src/objc/imap/MCOIMAPFolderStatus.h b/src/objc/imap/MCOIMAPFolderStatus.h
index 3d64f009..d39e1fc5 100644
--- a/src/objc/imap/MCOIMAPFolderStatus.h
+++ b/src/objc/imap/MCOIMAPFolderStatus.h
@@ -28,12 +28,11 @@
/** Number of unseen messages in the folder */
@property (nonatomic, assign) uint32_t unseenCount;
-// Number of messages in the folder
+/** Number of messages in the folder */
@property (nonatomic, assign) uint32_t messageCount;
-// We need also the the folder path
-
-
+/** Highest modification sequence value for this folder. See CONDSTORE RFC 4551. */
+@property (nonatomic, assign) uint64_t setHighestModSeqValue;
@end
diff --git a/src/objc/imap/MCOIMAPFolderStatus.mm b/src/objc/imap/MCOIMAPFolderStatus.mm
index 3f2126a9..7cd1597d 100644
--- a/src/objc/imap/MCOIMAPFolderStatus.mm
+++ b/src/objc/imap/MCOIMAPFolderStatus.mm
@@ -67,5 +67,6 @@ MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setMessageCount, messageCount)
MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setRecentCount, recentCount)
MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setUidNext, uidNext)
MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setUidValidity, uidValidity)
+MCO_OBJC_SYNTHESIZE_SCALAR(uint64_t, uint64_t, setHighestModSeqValue, highestModSeqValue)
@end