зеркало из https://github.com/mozilla/gecko-dev.git
implement downloading of messages for offline use r=sspitzer, sr=mscott 15865
This commit is contained in:
Родитель
b0977cf05a
Коммит
08cd5decc2
|
@ -173,6 +173,8 @@ interface nsIImapService : nsISupports
|
||||||
out nsIURI aURL,
|
out nsIURI aURL,
|
||||||
in nsISupports aCopyState);
|
in nsISupports aCopyState);
|
||||||
|
|
||||||
|
void downloadMessagesForOffline(in string aMessageIds, in nsIMsgFolder aSrcFolder,
|
||||||
|
in nsIMsgWindow aMsgWindow);
|
||||||
nsIURI moveFolder(in nsIEventQueue aClientEventQueue,
|
nsIURI moveFolder(in nsIEventQueue aClientEventQueue,
|
||||||
in nsIMsgFolder aSrcFolder,
|
in nsIMsgFolder aSrcFolder,
|
||||||
in nsIMsgFolder aDstFolder,
|
in nsIMsgFolder aDstFolder,
|
||||||
|
|
|
@ -138,6 +138,7 @@ NS_IMPL_QUERY_HEAD(nsImapMailFolder)
|
||||||
NS_IMPL_QUERY_BODY(nsIImapMiscellaneousSink)
|
NS_IMPL_QUERY_BODY(nsIImapMiscellaneousSink)
|
||||||
NS_IMPL_QUERY_BODY(nsIUrlListener)
|
NS_IMPL_QUERY_BODY(nsIUrlListener)
|
||||||
NS_IMPL_QUERY_BODY(nsIMsgFilterHitNotify)
|
NS_IMPL_QUERY_BODY(nsIMsgFilterHitNotify)
|
||||||
|
NS_IMPL_QUERY_BODY(nsIStreamListener)
|
||||||
NS_IMPL_QUERY_TAIL_INHERITING(nsMsgDBFolder)
|
NS_IMPL_QUERY_TAIL_INHERITING(nsMsgDBFolder)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2942,7 +2943,17 @@ nsImapMailFolder::SetupMsgWriteStream(const char * aNativeString, PRBool addDumm
|
||||||
|
|
||||||
NS_IMETHODIMP nsImapMailFolder::DownloadMessagesForOffline(nsISupportsArray *messages)
|
NS_IMETHODIMP nsImapMailFolder::DownloadMessagesForOffline(nsISupportsArray *messages)
|
||||||
{
|
{
|
||||||
return NS_OK;
|
nsCAutoString messageIds;
|
||||||
|
nsMsgKeyArray srcKeyArray;
|
||||||
|
|
||||||
|
nsresult rv = BuildIdsAndKeyArray(messages, messageIds, srcKeyArray);
|
||||||
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
NS_WITH_SERVICE(nsIImapService, imapService, kCImapService, &rv);
|
||||||
|
if (NS_FAILED(rv)) return rv;
|
||||||
|
|
||||||
|
SetNotifyDownloadedLines(PR_TRUE); // ### TODO need to clear this when we've finished
|
||||||
|
rv = imapService->DownloadMessagesForOffline(messageIds, this, nsnull);
|
||||||
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
|
@ -3041,16 +3052,16 @@ nsImapMailFolder::NormalEndMsgWriteStream(nsMsgKey uidOfMessage, PRBool markRead
|
||||||
|
|
||||||
if (m_offlineHeader)
|
if (m_offlineHeader)
|
||||||
{
|
{
|
||||||
PRUint32 newFlags;
|
|
||||||
|
|
||||||
nsCOMPtr <nsIRandomAccessStore> randomStore;
|
nsCOMPtr <nsIRandomAccessStore> randomStore;
|
||||||
PRInt32 curStorePos;
|
PRInt32 curStorePos;
|
||||||
PRUint32 messageOffset;
|
PRUint32 messageOffset;
|
||||||
|
nsMsgKey messageKey;
|
||||||
|
|
||||||
if (m_offlineHeader)
|
m_offlineHeader->GetMessageKey(&messageKey);
|
||||||
|
if (m_tempMessageStream)
|
||||||
randomStore = do_QueryInterface(m_tempMessageStream);
|
randomStore = do_QueryInterface(m_tempMessageStream);
|
||||||
|
|
||||||
m_offlineHeader->OrFlags(MSG_FLAG_OFFLINE, &newFlags);
|
mDatabase->MarkOffline(messageKey, PR_TRUE, nsnull);
|
||||||
if (randomStore)
|
if (randomStore)
|
||||||
{
|
{
|
||||||
m_tempMessageStream->Flush();
|
m_tempMessageStream->Flush();
|
||||||
|
@ -3456,6 +3467,26 @@ nsImapMailFolder::SetContentModified(nsIImapUrl *aImapUrl, nsImapContentModified
|
||||||
return aImapUrl->SetContentModified(modified);
|
return aImapUrl->SetContentModified(modified);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we provide this interface (nsIStreamListener) because the nsImapProtocol wants us to, in order
|
||||||
|
// to hook up the mock channel and other stuff when downloading messages for offline use.
|
||||||
|
// But we don't really need to do anything with these notifications because we use
|
||||||
|
// the nsIImapMesageSink interfaces ParseAdoptedMessageLine and NormalEndMsgWriteStream
|
||||||
|
NS_IMETHODIMP nsImapMailFolder::OnDataAvailable(nsIChannel * /* aChannel */, nsISupports *ctxt, nsIInputStream *aIStream, PRUint32 sourceOffset, PRUint32 aLength)
|
||||||
|
{
|
||||||
|
nsresult rv = NS_OK;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP nsImapMailFolder::OnStartRequest(nsIChannel * aChannel, nsISupports *ctxt)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP nsImapMailFolder::OnStopRequest(nsIChannel * aChannel, nsISupports *ctxt, nsresult aStatus, const PRUnichar *aMsg)
|
||||||
|
{
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsImapMailFolder::OnStartRunningUrl(nsIURI *aUrl)
|
nsImapMailFolder::OnStartRunningUrl(nsIURI *aUrl)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#include "nsIMsgImapMailFolder.h"
|
#include "nsIMsgImapMailFolder.h"
|
||||||
#include "nsIImapMailFolderSink.h"
|
#include "nsIImapMailFolderSink.h"
|
||||||
#include "nsIImapServerSink.h"
|
#include "nsIImapServerSink.h"
|
||||||
|
#include "nsIStreamListener.h"
|
||||||
class nsImapMoveCoalescer;
|
class nsImapMoveCoalescer;
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,7 +99,8 @@ class nsImapMailFolder : public nsMsgDBFolder,
|
||||||
public nsIImapExtensionSink,
|
public nsIImapExtensionSink,
|
||||||
public nsIImapMiscellaneousSink,
|
public nsIImapMiscellaneousSink,
|
||||||
public nsICopyMessageListener,
|
public nsICopyMessageListener,
|
||||||
public nsIMsgFilterHitNotify
|
public nsIMsgFilterHitNotify,
|
||||||
|
public nsIStreamListener
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
nsImapMailFolder();
|
nsImapMailFolder();
|
||||||
|
@ -195,6 +196,9 @@ public:
|
||||||
//nsICopyMessageListener
|
//nsICopyMessageListener
|
||||||
NS_DECL_NSICOPYMESSAGELISTENER
|
NS_DECL_NSICOPYMESSAGELISTENER
|
||||||
|
|
||||||
|
NS_DECL_NSISTREAMOBSERVER
|
||||||
|
|
||||||
|
NS_DECL_NSISTREAMLISTENER
|
||||||
// nsIUrlListener methods
|
// nsIUrlListener methods
|
||||||
NS_IMETHOD OnStartRunningUrl(nsIURI * aUrl);
|
NS_IMETHOD OnStartRunningUrl(nsIURI * aUrl);
|
||||||
NS_IMETHOD OnStopRunningUrl(nsIURI * aUrl, nsresult aExitCode);
|
NS_IMETHOD OnStopRunningUrl(nsIURI * aUrl, nsresult aExitCode);
|
||||||
|
|
|
@ -878,7 +878,7 @@ NS_IMETHODIMP nsImapService::SaveMessageToDisk(const char *aMessageURI,
|
||||||
msgUrl->SetAddDummyEnvelope(aAddDummyEnvelope);
|
msgUrl->SetAddDummyEnvelope(aAddDummyEnvelope);
|
||||||
msgUrl->SetCanonicalLineEnding(canonicalLineEnding);
|
msgUrl->SetCanonicalLineEnding(canonicalLineEnding);
|
||||||
|
|
||||||
return FetchMessage(imapUrl, nsIImapUrl::nsImapSaveMessageToDisk, folder, imapMessageSink, aMsgWindow, aURL, imapMessageSink, msgKey, PR_TRUE);
|
return FetchMessage(imapUrl, nsIImapUrl::nsImapSaveMessageToDisk, folder, imapMessageSink, aMsgWindow, aURL, nsnull, msgKey, PR_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
@ -3149,3 +3149,29 @@ nsImapService::UnsubscribeFolder(nsIEventQueue* eventQueue,
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsImapService::DownloadMessagesForOffline(const char *messageIds, nsIMsgFolder *aFolder, nsIMsgWindow *aMsgWindow)
|
||||||
|
{
|
||||||
|
NS_ENSURE_ARG_POINTER(aFolder);
|
||||||
|
NS_ENSURE_ARG_POINTER(messageIds);
|
||||||
|
|
||||||
|
nsCOMPtr<nsIImapUrl> imapUrl;
|
||||||
|
nsCAutoString urlSpec;
|
||||||
|
nsresult rv;
|
||||||
|
PRUnichar hierarchySeparator = GetHierarchyDelimiter(aFolder);
|
||||||
|
rv = CreateStartOfImapUrl(nsnull, getter_AddRefs(imapUrl), aFolder, nsnull,
|
||||||
|
urlSpec, hierarchySeparator);
|
||||||
|
if (NS_SUCCEEDED(rv) && imapUrl)
|
||||||
|
{
|
||||||
|
if (NS_SUCCEEDED(rv))
|
||||||
|
{
|
||||||
|
// need to pass in stream listener in order to get the channel created correctly
|
||||||
|
nsCOMPtr<nsIImapMessageSink> imapMessageSink(do_QueryInterface(aFolder, &rv));
|
||||||
|
nsCOMPtr<nsIStreamListener> folderStreamListener(do_QueryInterface(aFolder, &rv));
|
||||||
|
rv = FetchMessage(imapUrl, nsImapUrl::nsImapMsgFetch,aFolder, imapMessageSink,
|
||||||
|
aMsgWindow, nsnull, folderStreamListener, messageIds, PR_TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче