From 42a6f709a132bc7fc9eab9bff5af903e78a5db0c Mon Sep 17 00:00:00 2001 From: "bienvenu%netscape.com" Date: Tue, 12 Dec 2000 03:07:21 +0000 Subject: [PATCH] implement downloading of messages for offline use r=sspitzer, sr=mscott 15865 git-svn-id: svn://10.0.0.236/trunk@83519 18797224-902f-48f8-a5cc-f745e15eee43 --- .../base/src/nsMsgMessageDataSource.cpp | 74 ++++++++++++++++--- .../base/src/nsMsgMessageDataSource.h | 3 + mozilla/mailnews/base/src/nsMsgRDFUtils.h | 1 + 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/mozilla/mailnews/base/src/nsMsgMessageDataSource.cpp b/mozilla/mailnews/base/src/nsMsgMessageDataSource.cpp index a2ccee39618..1c057e481d7 100644 --- a/mozilla/mailnews/base/src/nsMsgMessageDataSource.cpp +++ b/mozilla/mailnews/base/src/nsMsgMessageDataSource.cpp @@ -71,6 +71,7 @@ nsIRDFResource* nsMsgMessageDataSource::kNC_Unread = nsnull; nsIRDFResource* nsMsgMessageDataSource::kNC_MessageChild = nsnull; nsIRDFResource* nsMsgMessageDataSource::kNC_IsUnread = nsnull; nsIRDFResource* nsMsgMessageDataSource::kNC_IsUnreadSort = nsnull; +nsIRDFResource* nsMsgMessageDataSource::kNC_IsOffline = nsnull; nsIRDFResource* nsMsgMessageDataSource::kNC_HasAttachment = nsnull; nsIRDFResource* nsMsgMessageDataSource::kNC_IsImapDeleted = nsnull; nsIRDFResource* nsMsgMessageDataSource::kNC_MessageType = nsnull; @@ -126,6 +127,7 @@ nsMsgMessageDataSource::nsMsgMessageDataSource() rdf->GetResource(NC_RDF_MESSAGECHILD, &kNC_MessageChild); rdf->GetResource(NC_RDF_ISUNREAD, &kNC_IsUnread); rdf->GetResource(NC_RDF_ISUNREAD_SORT, &kNC_IsUnreadSort); + rdf->GetResource(NC_RDF_ISOFFLINE, &kNC_IsOffline); rdf->GetResource(NC_RDF_HASATTACHMENT, &kNC_HasAttachment); rdf->GetResource(NC_RDF_ISIMAPDELETED, &kNC_IsImapDeleted); rdf->GetResource(NC_RDF_MESSAGETYPE, &kNC_MessageType); @@ -178,6 +180,7 @@ nsMsgMessageDataSource::~nsMsgMessageDataSource (void) NS_RELEASE2(kNC_MessageChild, refcnt); NS_RELEASE2(kNC_IsUnread, refcnt); NS_RELEASE2(kNC_IsUnreadSort, refcnt); + NS_RELEASE2(kNC_IsOffline, refcnt); NS_RELEASE2(kNC_HasAttachment, refcnt); NS_RELEASE2(kNC_IsImapDeleted, refcnt); NS_RELEASE2(kNC_MessageType, refcnt); @@ -463,6 +466,7 @@ NS_IMETHODIMP nsMsgMessageDataSource::GetTargets(nsIRDFResource* source, (kNC_PriorityString == property) || (kNC_StatusString) || (kNC_Priority == property) || (kNC_Size == property) || (kNC_Lines == property ) || (kNC_IsUnread == property) || + (kNC_IsOffline == property) || (kNC_IsImapDeleted == property) || (kNC_OrderReceived == property) || (kNC_HasAttachment == property) || (kNC_MessageType == property) || (kNC_ThreadState == property)) @@ -544,6 +548,7 @@ nsMsgMessageDataSource::HasArcOut(nsIRDFResource *source, nsIRDFResource *aArc, aArc == kNC_Size || aArc == kNC_Lines || aArc == kNC_IsUnread || + aArc == kNC_IsOffline || aArc == kNC_HasAttachment || aArc == kNC_IsImapDeleted || aArc == kNC_MessageType || @@ -638,6 +643,7 @@ nsMsgMessageDataSource::getMessageArcLabelsOut(PRBool showThreads, (*arcs)->AppendElement(kNC_Size); (*arcs)->AppendElement(kNC_Lines); (*arcs)->AppendElement(kNC_IsUnread); + (*arcs)->AppendElement(kNC_IsOffline); (*arcs)->AppendElement(kNC_HasAttachment); (*arcs)->AppendElement(kNC_IsImapDeleted); (*arcs)->AppendElement(kNC_MessageType); @@ -950,6 +956,10 @@ nsresult nsMsgMessageDataSource::OnChangeStatus(nsIRDFResource *resource, PRUint else if(changedFlag & MSG_FLAG_IMAP_DELETED) { OnChangeIsImapDeleted(resource, oldFlag, newFlag); + } + else if (changedFlag & MSG_FLAG_OFFLINE) + { + OnChangeIsOffline(resource, oldFlag, newFlag); } return NS_OK; } @@ -987,6 +997,19 @@ nsresult nsMsgMessageDataSource::OnChangeIsUnread(nsIRDFResource *resource, PRUi return rv; } +nsresult nsMsgMessageDataSource::OnChangeIsOffline(nsIRDFResource *resource, PRUint32 oldFlag, PRUint32 newFlag) +{ + nsresult rv; + nsCOMPtr newIsOfflineNode; + + newIsOfflineNode = (newFlag & MSG_FLAG_OFFLINE) ? kTrueLiteral : kFalseLiteral; + + rv = NotifyPropertyChanged(resource, kNC_IsOffline, newIsOfflineNode); + + return rv; +} + + nsresult nsMsgMessageDataSource::OnChangeIsImapDeleted(nsIRDFResource *resource, PRUint32 oldFlag, PRUint32 newFlag) { nsresult rv; @@ -1148,6 +1171,8 @@ nsMsgMessageDataSource::createMessageNode(nsIMessage *message, rv = createMessageUnreadNode(message, target); else if((kNC_IsUnread == property)) rv = createMessageIsUnreadNode(message, target, PR_FALSE); + else if((kNC_IsOffline == property)) + rv = createMessageIsOfflineNode(message, target); else if((kNC_IsUnreadSort == property)) rv = createMessageIsUnreadNode(message, target, PR_TRUE); else if((kNC_HasAttachment == property)) @@ -1338,6 +1363,24 @@ nsMsgMessageDataSource::createMessageIsUnreadNode(nsIMessage *message, nsIRDFNod return NS_OK; } +nsresult +nsMsgMessageDataSource::createMessageIsOfflineNode(nsIMessage *message, nsIRDFNode **target) +{ + nsresult rv; + PRUint32 flags; + rv = message->GetFlags(&flags); + if(NS_FAILED(rv)) + return rv; + if(flags & MSG_FLAG_OFFLINE) + *target = kTrueLiteral; + else + *target = kFalseLiteral; + + NS_IF_ADDREF(*target); + return NS_OK; +} + + nsresult nsMsgMessageDataSource::createMessageHasAttachmentNode(nsIMessage *message, nsIRDFNode **target) { @@ -1959,19 +2002,26 @@ nsMsgMessageDataSource::DoDownloadSelectedMessages(nsISupportsArray *messages) return rv; while(count > 0) { - nsCOMPtr messageArray; - nsCOMPtr folder; - - rv = GetMessagesAndFirstFolder(messages, getter_AddRefs(folder), getter_AddRefs(messageArray)); - if(NS_FAILED(rv)) - return rv; + // remove messages that we already have offline + nsCOMPtr messageSupports = getter_AddRefs(messages->ElementAt(count - 1)); + nsCOMPtr message = do_QueryInterface(messageSupports); + if (message) + { + PRUint32 flags; + rv = message->GetFlags(&flags); + if (NS_SUCCEEDED(rv) && (flags & MSG_FLAG_OFFLINE)) + messages->RemoveElementAt(count - 1); + } + count--; + } + nsCOMPtr messageArray; + nsCOMPtr folder; - folder->DownloadMessagesForOffline(messageArray); - rv = messages->Count(&count); - if(NS_FAILED(rv)) - return rv; - } - return rv; + rv = GetMessagesAndFirstFolder(messages, getter_AddRefs(folder), getter_AddRefs(messageArray)); + if(NS_FAILED(rv)) + return rv; + + return folder->DownloadMessagesForOffline(messageArray); } nsresult nsMsgMessageDataSource::DoMessageHasAssertion(nsIMessage *message, nsIRDFResource *property, nsIRDFNode *target, diff --git a/mozilla/mailnews/base/src/nsMsgMessageDataSource.h b/mozilla/mailnews/base/src/nsMsgMessageDataSource.h index eaafbd83d8d..25c8e694625 100644 --- a/mozilla/mailnews/base/src/nsMsgMessageDataSource.h +++ b/mozilla/mailnews/base/src/nsMsgMessageDataSource.h @@ -161,6 +161,7 @@ protected: nsresult createMessageLinesNode(nsIMessage *message, nsIRDFNode **target); nsresult createMessageIsUnreadNode(nsIMessage *message, nsIRDFNode **target, PRBool sort); + nsresult createMessageIsOfflineNode(nsIMessage *message, nsIRDFNode **target); nsresult createMessageHasAttachmentNode(nsIMessage *message, nsIRDFNode **target); nsresult createMessageIsImapDeletedNode(nsIMessage *message, nsIRDFNode **target); nsresult createMessageMessageTypeNode(nsIMessage *message, nsIRDFNode **target); @@ -213,6 +214,7 @@ protected: nsresult OnChangeStatus(nsIRDFResource *resource, PRUint32 oldFlag, PRUint32 newFlag); nsresult OnChangeStatusString(nsIRDFResource *resource, PRUint32 oldFlag, PRUint32 newFlag); nsresult OnChangeIsUnread(nsIRDFResource *resource, PRUint32 oldFlag, PRUint32 newFlag); + nsresult OnChangeIsOffline(nsIRDFResource *resource, PRUint32 oldFlag, PRUint32 newFlag); nsresult OnChangeIsImapDeleted(nsIRDFResource *resource, PRUint32 oldFlag, PRUint32 newFlag); nsresult OnChangeUnreadMessageCount(nsIMessage *message); nsresult OnChangeTotalMessageCount(nsIMessage *message); @@ -246,6 +248,7 @@ protected: static nsIRDFResource* kNC_MessageChild; static nsIRDFResource* kNC_IsUnread; static nsIRDFResource* kNC_IsUnreadSort; + static nsIRDFResource* kNC_IsOffline; static nsIRDFResource* kNC_HasAttachment; static nsIRDFResource* kNC_IsImapDeleted; static nsIRDFResource* kNC_MessageType; diff --git a/mozilla/mailnews/base/src/nsMsgRDFUtils.h b/mozilla/mailnews/base/src/nsMsgRDFUtils.h index 6c01d75bd13..1dfc4cdc1b4 100644 --- a/mozilla/mailnews/base/src/nsMsgRDFUtils.h +++ b/mozilla/mailnews/base/src/nsMsgRDFUtils.h @@ -52,6 +52,7 @@ typedef struct _nsMsgRDFNotification { #define NC_RDF_LINES NC_NAMESPACE_URI "Lines" #define NC_RDF_ISUNREAD NC_NAMESPACE_URI "IsUnread" #define NC_RDF_ISIMAPDELETED NC_NAMESPACE_URI "IsImapDeleted" +#define NC_RDF_ISOFFLINE NC_NAMESPACE_URI "IsOffline" #define NC_RDF_ORDERRECEIVED NC_NAMESPACE_URI "OrderReceived" #define NC_RDF_HASATTACHMENT NC_NAMESPACE_URI "HasAttachment" #define NC_RDF_MESSAGETYPE NC_NAMESPACE_URI "MessageType"