From b19703eeec378cd54a522a0b2fe60cd8475fbe26 Mon Sep 17 00:00:00 2001 From: "bienvenu%nventure.com" Date: Mon, 16 Jul 2007 23:47:26 +0000 Subject: [PATCH] add support for opening a message from the command line, 386919, sr=mscott git-svn-id: svn://10.0.0.236/trunk@230077 18797224-902f-48f8-a5cc-f745e15eee43 --- .../base/src/nsMessengerBootstrap.cpp | 147 ++++++++++++++---- .../mailnews/base/src/nsMessengerBootstrap.h | 5 + 2 files changed, 122 insertions(+), 30 deletions(-) diff --git a/mozilla/mailnews/base/src/nsMessengerBootstrap.cpp b/mozilla/mailnews/base/src/nsMessengerBootstrap.cpp index 98dcd7ded66..23d1fe06ddc 100644 --- a/mozilla/mailnews/base/src/nsMessengerBootstrap.cpp +++ b/mozilla/mailnews/base/src/nsMessengerBootstrap.cpp @@ -24,6 +24,7 @@ * Scott Putterman * Seth Spitzer * Pierre Phaneuf + * David Bienvenu * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), @@ -119,7 +120,42 @@ nsMessengerBootstrap::Handle(nsICommandLine* aCmdLine) { nsCOMPtr scriptableURL (do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID)); NS_ENSURE_TRUE(scriptableURL, NS_ERROR_FAILURE); - + if (StringBeginsWith(mailUrl, NS_LITERAL_STRING("mailbox-message://")) || + StringBeginsWith(mailUrl, NS_LITERAL_STRING("imap-message://")) || + StringBeginsWith(mailUrl, NS_LITERAL_STRING("news-message://"))) + { + nsCOMPtr msgHdr; + nsCAutoString nativeArg; + NS_CopyUnicodeToNative(mailUrl, nativeArg); + PRInt32 queryIndex = nativeArg.Find("?messageId=", PR_TRUE); + if (queryIndex > 0) + { + nsCString messageId, folderUri; + nativeArg.Right(messageId, nativeArg.Length() - queryIndex - 11); + nativeArg.Left(folderUri, queryIndex); + folderUri.Cut(folderUri.Find("-message"), 8); + return OpenMessengerWindowForMessageId(folderUri, messageId); + } + else + GetMsgDBHdrFromURI(nativeArg.get(), getter_AddRefs(msgHdr)); + + if (msgHdr) + { + nsCOMPtr folder; + nsCString folderUri; + nsMsgKey msgKey; + msgHdr->GetMessageKey(&msgKey); + msgHdr->GetFolder(getter_AddRefs(folder)); + if (folder) + { + folder->GetURI(folderUri); + rv = DiscoverFoldersIfNeeded(folder); + NS_ENSURE_SUCCESS(rv, rv); + return OpenMessengerWindowWithUri("mail:messageWindow", folderUri.get(), msgKey); + } + } + } + // check if it's a mail message url, and if so, convert it? scriptableURL->SetData((mailUrl)); argsArray->AppendElement(scriptableURL); } @@ -154,32 +190,13 @@ nsMessengerBootstrap::Handle(nsICommandLine* aCmdLine) nsCString folderUri; rv = MsgMailboxGetURI(nativeArg.get(), folderUri); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr rdf(do_GetService("@mozilla.org/rdf/rdf-service;1", &rv)); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr res; - rv = rdf->GetResource(folderUri, getter_AddRefs(res)); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr containingFolder; - containingFolder = do_QueryInterface(res, &rv); - NS_ENSURE_SUCCESS(rv, rv); - // once we have the folder uri, open the db and search for the message id. nsAutoString unicodeMessageid; // strip off .mozeml at the end as well arg.Mid(unicodeMessageid, mozmsgsIndex + 9, arg.Length() - (mozmsgsIndex + 9 + 7)); nsCAutoString messageId; NS_CopyUnicodeToNative(unicodeMessageid, messageId); - nsCOMPtr msgDB; - containingFolder->GetMsgDatabase(nsnull, getter_AddRefs(msgDB)); - nsCOMPtr msgHdr; - if (msgDB) - msgDB->GetMsgHdrForMessageID(messageId.get(), getter_AddRefs(msgHdr)); - if (msgHdr) - { - nsMsgKey msgKey; - msgHdr->GetMessageKey(&msgKey); - rv = OpenMessengerWindowWithUri("mail:messageWindow", folderUri.get(), msgKey); - return rv; - } + return OpenMessengerWindowForMessageId(folderUri, messageId); + } #endif if (StringEndsWith(arg, NS_LITERAL_STRING(".eml"), nsCaseInsensitiveStringComparator())) @@ -224,28 +241,98 @@ nsMessengerBootstrap::GetHelpInfo(nsACString& aResult) return NS_OK; } +nsresult nsMessengerBootstrap::DiscoverFoldersIfNeeded(nsIMsgFolder *folder) +{ + nsCOMPtr parent; + folder->GetParent(getter_AddRefs(parent)); + // check if we've done folder discovery. If not, + // do it so we'll have a real folder. + if (!parent) + { + nsCOMPtr server; + folder->GetServer(getter_AddRefs(server)); + nsresult rv = server->GetRootFolder(getter_AddRefs(parent)); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr enumerator; + parent->GetSubFolders(getter_AddRefs(enumerator)); + } + return NS_OK; +} + +nsresult nsMessengerBootstrap::OpenMessengerWindowForMessageId(nsCString &folderUri, nsCString &messageId) +{ + nsresult rv; + nsCOMPtr rdf(do_GetService("@mozilla.org/rdf/rdf-service;1", &rv)); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr res; + rv = rdf->GetResource(folderUri, getter_AddRefs(res)); + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr containingFolder; + containingFolder = do_QueryInterface(res, &rv); + NS_ENSURE_SUCCESS(rv, rv); + rv = DiscoverFoldersIfNeeded(containingFolder); + NS_ENSURE_SUCCESS(rv, rv); + // once we have the folder uri, open the db and search for the message id. + nsCOMPtr msgDB; + containingFolder->GetMsgDatabase(nsnull, getter_AddRefs(msgDB)); + nsCOMPtr msgHdr; + if (msgDB) + msgDB->GetMsgHdrForMessageID(messageId.get(), getter_AddRefs(msgHdr)); + if (msgHdr) + { + nsMsgKey msgKey; + msgHdr->GetMessageKey(&msgKey); + rv = OpenMessengerWindowWithUri("mail:messageWindow", folderUri.get(), msgKey); + return rv; + } + return NS_ERROR_FAILURE; +} NS_IMETHODIMP nsMessengerBootstrap::OpenMessengerWindowWithUri(const char *windowType, const char * aFolderURI, nsMsgKey aMessageKey) { - nsresult rv; - + PRBool standAloneMsgWindow = PR_FALSE; + nsCAutoString chromeUrl("chrome://messenger/content/"); + if (windowType && !strcmp(windowType, "mail:messageWindow")) + { + chromeUrl.Append("messageWindow.xul"); + standAloneMsgWindow = PR_TRUE; + } nsCOMPtr argsArray; - rv = NS_NewISupportsArray(getter_AddRefs(argsArray)); + nsresult rv = NS_NewISupportsArray(getter_AddRefs(argsArray)); NS_ENSURE_SUCCESS(rv, rv); // create scriptable versions of our strings that we can store in our nsISupportsArray.... if (aFolderURI) { + if (standAloneMsgWindow) + { + nsCOMPtr folder; + rv = GetExistingFolder(nsDependentCString(aFolderURI), getter_AddRefs(folder)); + NS_ENSURE_SUCCESS(rv, rv); + nsXPIDLCString msgUri; + folder->GetBaseMessageURI(msgUri); + + nsCOMPtr scriptableMsgURI (do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID)); + NS_ENSURE_TRUE(scriptableMsgURI, NS_ERROR_FAILURE); + msgUri.Append('#'); + msgUri.AppendInt(aMessageKey, 10); + scriptableMsgURI->SetData(msgUri); + argsArray->AppendElement(scriptableMsgURI); + + } nsCOMPtr scriptableFolderURI (do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID)); NS_ENSURE_TRUE(scriptableFolderURI, NS_ERROR_FAILURE); scriptableFolderURI->SetData(nsDependentCString(aFolderURI)); argsArray->AppendElement(scriptableFolderURI); - nsCOMPtr scriptableMessageKey (do_CreateInstance(NS_SUPPORTS_PRUINT32_CONTRACTID)); - NS_ENSURE_TRUE(scriptableMessageKey, NS_ERROR_FAILURE); - scriptableMessageKey->SetData(aMessageKey); - argsArray->AppendElement(scriptableMessageKey); + if (!standAloneMsgWindow) + { + nsCOMPtr scriptableMessageKey (do_CreateInstance(NS_SUPPORTS_PRUINT32_CONTRACTID)); + NS_ENSURE_TRUE(scriptableMessageKey, NS_ERROR_FAILURE); + scriptableMessageKey->SetData(aMessageKey); + argsArray->AppendElement(scriptableMessageKey); + } } nsCOMPtr wwatch(do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv)); @@ -254,7 +341,7 @@ NS_IMETHODIMP nsMessengerBootstrap::OpenMessengerWindowWithUri(const char *windo // we need to use the "mailnews.reuse_thread_window2" pref // to determine if we should open a new window, or use an existing one. nsCOMPtr newWindow; - return wwatch->OpenWindow(0, "chrome://messenger/content/", "_blank", + return wwatch->OpenWindow(0, chromeUrl.get(), "_blank", "chrome,all,dialog=no", argsArray, getter_AddRefs(newWindow)); } diff --git a/mozilla/mailnews/base/src/nsMessengerBootstrap.h b/mozilla/mailnews/base/src/nsMessengerBootstrap.h index 240d2c01371..1f618006049 100644 --- a/mozilla/mailnews/base/src/nsMessengerBootstrap.h +++ b/mozilla/mailnews/base/src/nsMessengerBootstrap.h @@ -43,6 +43,9 @@ #include "nsIServiceManager.h" #include "nsIMessengerWindowService.h" #include "nsICommandLineHandler.h" +#include "nsString.h" + +class nsIMsgFolder; #define NS_MESSENGERBOOTSTRAP_CID \ { /* 4a85a5d0-cddd-11d2-b7f6-00805f05ffa5 */ \ @@ -57,6 +60,8 @@ class nsMessengerBootstrap : public: nsMessengerBootstrap(); virtual ~nsMessengerBootstrap(); + nsresult DiscoverFoldersIfNeeded(nsIMsgFolder *folder); + nsresult OpenMessengerWindowForMessageId(nsCString &folderUri, nsCString &messageId); NS_DECL_ISUPPORTS NS_DECL_NSIMESSENGERWINDOWSERVICE