nsresult nsMailboxUrl::ParseSearchPart() { nsAutoCString searchPart; nsresult rv = GetQuery(searchPart); // add code to this function to decompose everything past the '?'..... if (NS_SUCCEEDED(rv) && !searchPart.IsEmpty()) { // the action for this mailbox must be a display message... char * msgPart = extractAttributeValue(searchPart.get(), "part="); if (msgPart) // if we have a part in the url then we must be fetching just the part. m_mailboxAction = nsIMailboxUrl::ActionFetchPart; else m_mailboxAction = nsIMailboxUrl::ActionFetchMessage; char * messageKey = extractAttributeValue(searchPart.get(), "number="); m_messageID = extractAttributeValue(searchPart.get(),"messageid="); if (messageKey) m_messageKey = (nsMsgKey) ParseUint64Str(messageKey); // convert to a uint32_t... PR_Free(msgPart); PR_Free(messageKey); } else m_mailboxAction = nsIMailboxUrl::ActionParseMailbox; return rv; }
NS_IMETHODIMP nsMsgBrkMBoxStore::GetMsgInputStream(nsIMsgFolder *aMsgFolder, const nsACString &aMsgToken, int64_t *aOffset, nsIMsgDBHdr *aMsgHdr, bool *aReusable, nsIInputStream **aResult) { NS_ENSURE_ARG_POINTER(aMsgFolder); NS_ENSURE_ARG_POINTER(aResult); NS_ENSURE_ARG_POINTER(aOffset); // If there is no store token, then we set it to the existing message offset. if (aMsgToken.IsEmpty()) { uint64_t offset; NS_ENSURE_ARG_POINTER(aMsgHdr); aMsgHdr->GetMessageOffset(&offset); *aOffset = int64_t(offset); char storeToken[100]; PR_snprintf(storeToken, sizeof(storeToken), "%lld", *aOffset); aMsgHdr->SetStringProperty("storeToken", storeToken); } else *aOffset = ParseUint64Str(PromiseFlatCString(aMsgToken).get()); *aReusable = true; nsCString URI; nsCOMPtr<nsIFile> mboxFile; aMsgFolder->GetURI(URI); aMsgFolder->GetFilePath(getter_AddRefs(mboxFile)); return NS_NewLocalFileInputStream(aResult, mboxFile); }
/* parses LocalMessageURI * mailbox-message://folder1/folder2#123?header=none or * mailbox-message://folder1/folder2#1234&part=1.2 * * puts folder URI in folderURI (mailbox://folder1/folder2) * message key number in key */ nsresult nsParseLocalMessageURI(const char* uri, nsCString& folderURI, PRUint32 *key) { if(!key) return NS_ERROR_NULL_POINTER; nsCAutoString uriStr(uri); PRInt32 keySeparator = uriStr.FindChar('#'); if(keySeparator != -1) { PRInt32 keyEndSeparator = MsgFindCharInSet(uriStr, "?&", keySeparator); folderURI = StringHead(uriStr, keySeparator); folderURI.Cut(7, 8); // cut out the -message part of mailbox-message: nsCAutoString keyStr; if (keyEndSeparator != -1) keyStr = Substring(uriStr, keySeparator + 1, keyEndSeparator - (keySeparator + 1)); else keyStr = StringTail(uriStr, uriStr.Length() - (keySeparator + 1)); *key = (PRUint32) ParseUint64Str(keyStr.get()); return NS_OK; } return NS_ERROR_FAILURE; }