// This function takes a message uri, converts it into a file path & msgKey // pair. It then turns that into a mailbox url object. It also registers a url // listener if appropriate. AND it can take in a mailbox action and set that field // on the returned url as well. nsresult nsMailboxService::PrepareMessageUrl(const char * aSrcMsgMailboxURI, nsIUrlListener * aUrlListener, nsMailboxAction aMailboxAction, nsIMailboxUrl ** aMailboxUrl, nsIMsgWindow *msgWindow) { nsresult rv = CallCreateInstance(kCMailboxUrl, aMailboxUrl); if (NS_SUCCEEDED(rv) && aMailboxUrl && *aMailboxUrl) { // okay now generate the url string char * urlSpec; nsCAutoString folderURI; nsFileSpec folderPath; nsMsgKey msgKey; const char *part = PL_strstr(aSrcMsgMailboxURI, "part="); const char *header = PL_strstr(aSrcMsgMailboxURI, "header="); rv = nsParseLocalMessageURI(aSrcMsgMailboxURI, folderURI, &msgKey); NS_ENSURE_SUCCESS(rv,rv); rv = nsLocalURI2Path(kMailboxRootURI, folderURI.get(), folderPath); if (NS_SUCCEEDED(rv)) { // set up the url spec and initialize the url with it. nsFilePath filePath(folderPath); // convert to file url representation... nsCAutoString buf; NS_EscapeURL((const char *)filePath,-1, esc_Directory|esc_Forced|esc_AlwaysCopy,buf); if (mPrintingOperation) urlSpec = PR_smprintf("mailbox://%s?number=%d&header=print", buf.get(), msgKey); else if (part) urlSpec = PR_smprintf("mailbox://%s?number=%d&%s", buf.get(), msgKey, part); else if (header) urlSpec = PR_smprintf("mailbox://%s?number=%d&%s", buf.get(), msgKey, header); else urlSpec = PR_smprintf("mailbox://%s?number=%d", buf.get(), msgKey); nsCOMPtr <nsIMsgMailNewsUrl> url = do_QueryInterface(*aMailboxUrl); url->SetSpec(nsDependentCString(urlSpec)); PR_Free(urlSpec); (*aMailboxUrl)->SetMailboxAction(aMailboxAction); // set up the url listener if (aUrlListener) rv = url->RegisterListener(aUrlListener); url->SetMsgWindow(msgWindow); nsCOMPtr<nsIMsgMessageUrl> msgUrl = do_QueryInterface(url); if (msgUrl) { msgUrl->SetOriginalSpec(aSrcMsgMailboxURI); msgUrl->SetUri(aSrcMsgMailboxURI); } } // if we got a url } // if we got a url return rv; }
// This function takes a message uri, converts it into a file path & msgKey // pair. It then turns that into a mailbox url object. It also registers a url // listener if appropriate. AND it can take in a mailbox action and set that field // on the returned url as well. nsresult nsMailboxService::PrepareMessageUrl(const char * aSrcMsgMailboxURI, nsIUrlListener * aUrlListener, nsMailboxAction aMailboxAction, nsIMailboxUrl ** aMailboxUrl, nsIMsgWindow *msgWindow) { nsresult rv = CallCreateInstance(NS_MAILBOXURL_CONTRACTID, aMailboxUrl); if (NS_SUCCEEDED(rv) && aMailboxUrl && *aMailboxUrl) { // okay now generate the url string char * urlSpec; nsCAutoString folderURI; nsMsgKey msgKey; nsCString folderPath; const char *part = PL_strstr(aSrcMsgMailboxURI, "part="); const char *header = PL_strstr(aSrcMsgMailboxURI, "header="); rv = nsParseLocalMessageURI(aSrcMsgMailboxURI, folderURI, &msgKey); NS_ENSURE_SUCCESS(rv,rv); rv = nsLocalURI2Path(kMailboxRootURI, folderURI.get(), folderPath); if (NS_SUCCEEDED(rv)) { // set up the url spec and initialize the url with it. nsCAutoString buf; MsgEscapeURL(folderPath, nsINetUtil::ESCAPE_URL_DIRECTORY | nsINetUtil::ESCAPE_URL_FORCED, buf); if (mPrintingOperation) urlSpec = PR_smprintf("mailbox://%s?number=%lu&header=print", buf.get(), msgKey); else if (part) urlSpec = PR_smprintf("mailbox://%s?number=%lu&%s", buf.get(), msgKey, part); else if (header) urlSpec = PR_smprintf("mailbox://%s?number=%lu&%s", buf.get(), msgKey, header); else urlSpec = PR_smprintf("mailbox://%s?number=%lu", buf.get(), msgKey); nsCOMPtr <nsIMsgMailNewsUrl> url = do_QueryInterface(*aMailboxUrl); url->SetSpec(nsDependentCString(urlSpec)); PR_smprintf_free(urlSpec); (*aMailboxUrl)->SetMailboxAction(aMailboxAction); // set up the url listener if (aUrlListener) rv = url->RegisterListener(aUrlListener); url->SetMsgWindow(msgWindow); nsCOMPtr<nsIMsgMessageUrl> msgUrl = do_QueryInterface(url); if (msgUrl) { msgUrl->SetOriginalSpec(aSrcMsgMailboxURI); msgUrl->SetUri(aSrcMsgMailboxURI); } } // if we got a url } // if we got a url return rv; }
nsresult nsMailboxService::DecomposeMailboxURI(const char * aMessageURI, nsIMsgFolder ** aFolder, nsMsgKey *aMsgKey) { NS_ENSURE_ARG_POINTER(aMessageURI); NS_ENSURE_ARG_POINTER(aFolder); NS_ENSURE_ARG_POINTER(aMsgKey); nsresult rv = NS_OK; nsCAutoString folderURI; rv = nsParseLocalMessageURI(aMessageURI, folderURI, aMsgKey); NS_ENSURE_SUCCESS(rv,rv); nsCOMPtr <nsIRDFService> rdf = do_GetService("@mozilla.org/rdf/rdf-service;1",&rv); NS_ENSURE_SUCCESS(rv,rv); nsCOMPtr<nsIRDFResource> res; rv = rdf->GetResource(folderURI, getter_AddRefs(res)); NS_ENSURE_SUCCESS(rv,rv); rv = res->QueryInterface(NS_GET_IID(nsIMsgFolder), (void **) aFolder); NS_ENSURE_SUCCESS(rv,rv); return NS_OK; }