// given rootURI and rootURI##folder, return on-disk path of folder nsresult nsLocalURI2Path(const char* rootURI, const char* uriStr, nsCString& pathResult) { nsresult rv; // verify that rootURI starts with "mailbox:/" or "mailbox-message:/" if ((PL_strcmp(rootURI, kMailboxRootURI) != 0) && (PL_strcmp(rootURI, kMailboxMessageRootURI) != 0)) { return NS_ERROR_FAILURE; } // verify that uristr starts with rooturi nsCAutoString uri(uriStr); if (uri.Find(rootURI) != 0) return NS_ERROR_FAILURE; nsCOMPtr<nsIMsgIncomingServer> server; rv = nsLocalURI2Server(uriStr, getter_AddRefs(server)); if (NS_FAILED(rv)) return rv; // now ask the server what it's root is // and begin pathResult with the mailbox root nsCOMPtr<nsIFile> localPath; rv = server->GetLocalPath(getter_AddRefs(localPath)); NS_ENSURE_SUCCESS(rv, rv); nsCString localNativePath; localPath->GetNativePath(localNativePath); nsEscapeNativePath(localNativePath); pathResult = localNativePath.get(); const char *curPos = uriStr + PL_strlen(rootURI); if (curPos) { // advance past hostname while ((*curPos)=='/') curPos++; while (*curPos && (*curPos)!='/') curPos++; nsCAutoString newPath(""); // Unescape folder name if (curPos) { nsCString unescapedStr; MsgUnescapeString(nsDependentCString(curPos), 0, unescapedStr); NS_MsgCreatePathStringFromFolderURI(unescapedStr.get(), newPath, NS_LITERAL_CSTRING("none")); } else NS_MsgCreatePathStringFromFolderURI(curPos, newPath, NS_LITERAL_CSTRING("none")); pathResult.Append('/'); pathResult.Append(newPath); } return NS_OK; }
nsresult nsMailboxService::ParseMailbox(nsIMsgWindow *aMsgWindow, nsILocalFile *aMailboxPath, nsIStreamListener *aMailboxParser, nsIUrlListener * aUrlListener, nsIURI ** aURL) { NS_ENSURE_ARG_POINTER(aMailboxPath); nsresult rv; nsCOMPtr<nsIMailboxUrl> mailboxurl = do_CreateInstance(NS_MAILBOXURL_CONTRACTID, &rv); if (NS_SUCCEEDED(rv) && mailboxurl) { nsCOMPtr<nsIMsgMailNewsUrl> url = do_QueryInterface(mailboxurl); // okay now generate the url string nsCString mailboxPath; aMailboxPath->GetNativePath(mailboxPath); nsCAutoString buf; MsgEscapeURL(mailboxPath, nsINetUtil::ESCAPE_URL_MINIMAL | nsINetUtil::ESCAPE_URL_FORCED, buf); nsEscapeNativePath(buf); url->SetUpdatingFolder(PR_TRUE); url->SetMsgWindow(aMsgWindow); nsCAutoString uriSpec("mailbox://"); uriSpec.Append(buf); url->SetSpec(uriSpec); mailboxurl->SetMailboxParser(aMailboxParser); if (aUrlListener) url->RegisterListener(aUrlListener); rv = RunMailboxUrl(url, nsnull); NS_ENSURE_SUCCESS(rv, rv); if (aURL) { *aURL = url; NS_IF_ADDREF(*aURL); } } return rv; }