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; }
nsresult nsDeviceChannel::OpenContentStream(bool aAsync, nsIInputStream** aStream, nsIChannel** aChannel) { if (!aAsync) return NS_ERROR_NOT_IMPLEMENTED; nsCOMPtr<nsIURI> uri = nsBaseChannel::URI(); *aStream = nsnull; *aChannel = nsnull; NS_NAMED_LITERAL_CSTRING(width, "width="); NS_NAMED_LITERAL_CSTRING(height, "height="); nsCAutoString spec; uri->GetSpec(spec); nsCAutoString type; nsRefPtr<nsDeviceCaptureProvider> capture; nsCaptureParams captureParams; captureParams.camera = 0; if (kNotFound != spec.Find(NS_LITERAL_CSTRING("type=image/png"), true, 0, -1)) { type.AssignLiteral("image/png"); SetContentType(type); captureParams.captureAudio = false; captureParams.captureVideo = true; captureParams.timeLimit = 0; captureParams.frameLimit = 1; nsCAutoString buffer; extractAttributeValue(spec.get(), "width=", buffer); nsresult err; captureParams.width = buffer.ToInteger(&err); if (!captureParams.width) captureParams.width = 640; extractAttributeValue(spec.get(), "height=", buffer); captureParams.height = buffer.ToInteger(&err); if (!captureParams.height) captureParams.height = 480; captureParams.bpp = 32; #ifdef MOZ_WIDGET_ANDROID capture = GetAndroidCaptureProvider(); #endif } else if (kNotFound != spec.Find(NS_LITERAL_CSTRING("type=video/x-raw-yuv"), true, 0, -1)) { type.AssignLiteral("video/x-raw-yuv"); SetContentType(type); captureParams.captureAudio = false; captureParams.captureVideo = true; nsCAutoString buffer; extractAttributeValue(spec.get(), "width=", buffer); nsresult err; captureParams.width = buffer.ToInteger(&err); if (!captureParams.width) captureParams.width = 640; extractAttributeValue(spec.get(), "height=", buffer); captureParams.height = buffer.ToInteger(&err); if (!captureParams.height) captureParams.height = 480; captureParams.bpp = 32; captureParams.timeLimit = 0; captureParams.frameLimit = 60000; #ifdef MOZ_WIDGET_ANDROID // only enable if "device.camera.enabled" is true. if (mozilla::Preferences::GetBool("device.camera.enabled", false) == true) capture = GetAndroidCaptureProvider(); #endif } else { return NS_ERROR_NOT_IMPLEMENTED; } if (!capture) return NS_ERROR_FAILURE; return capture->Init(type, &captureParams, aStream); }
NS_IMETHODIMP nsMozIconURI::SetSpec(const nsACString &aSpec) { nsresult rv; nsCOMPtr<nsIIOService> ioService (do_GetService(NS_IOSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCAutoString scheme; rv = ioService->ExtractScheme(aSpec, scheme); NS_ENSURE_SUCCESS(rv, rv); if (strcmp("moz-icon", scheme.get()) != 0) return NS_ERROR_MALFORMED_URI; nsCAutoString sizeString; nsCAutoString stateString; nsCAutoString mozIconPath(aSpec); // guaranteed to exist! const char *path = strchr(mozIconPath.get(), ':') + 1; const char *question = strchr(mozIconPath.get(), NS_MOZ_ICON_DELIMITER); if (!question) // no size or content type specified { mDummyFilePath.Assign(path); } else { mDummyFilePath.Assign(Substring(path, question)); // fill in any size and content type values... extractAttributeValue(question, "size=", sizeString); extractAttributeValue(question, "state=", stateString); extractAttributeValue(question, "contentType=", mContentType); } if (!sizeString.IsEmpty()) { const char *sizeStr = sizeString.get(); for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(kSizeStrings); i++) { if (PL_strcasecmp(sizeStr, kSizeStrings[i]) == 0) { mIconSize = i; break; } } } if (!stateString.IsEmpty()) { const char *stateStr = stateString.get(); for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(kStateStrings); i++) { if (PL_strcasecmp(stateStr, kStateStrings[i]) == 0) { mIconState = i; break; } } } // Okay now we have a bit of a hack here...filePath can have three forms: // (1) file://<some valid platform specific file url> // (2) //<some dummy file with an extension> // (3) stock/<icon-identifier> // We need to determine which case we are and behave accordingly... if (mDummyFilePath.Length() > 2) { if (!strncmp("//stock/", mDummyFilePath.get(), 8)) { // we have a stock icon mStockIcon = Substring(mDummyFilePath, 8); } else { if (!strncmp("//", mDummyFilePath.get(), 2))// must not have a url here.. { // in this case the string looks like //somefile.html or // somefile.extension. So throw away the "//" part // and remember the rest in mDummyFilePath mDummyFilePath.Cut(0, 2); // cut the first 2 bytes.... } if (!strncmp("file://", mDummyFilePath.get(), 7)) { // we have a file url, let the IOService normalize it nsCOMPtr<nsIURI> tmpURI; rv = ioService->NewURI(mDummyFilePath, nsnull, nsnull, getter_AddRefs(tmpURI)); if (NS_SUCCEEDED(rv) && tmpURI) { mFileIcon = tmpURI; } } if (!sizeString.IsEmpty()) { PRInt32 sizeValue = atoi(sizeString.get()); // if the size value we got back is > 0 then use it if (sizeValue) mSize = sizeValue; } } } else rv = NS_ERROR_MALFORMED_URI; // they didn't include a file path... return rv; }
NS_IMETHODIMP nsMozIconURI::SetSpec(const nsACString &aSpec) { // Reset everything to default values. mIconURL = nsnull; mSize = DEFAULT_IMAGE_SIZE; mContentType.Truncate(); mFileName.Truncate(); mStockIcon.Truncate(); mIconSize = -1; mIconState = -1; nsCAutoString iconSpec(aSpec); if (!Substring(iconSpec, 0, MOZICON_SCHEME_LEN).EqualsLiteral(MOZICON_SCHEME)) return NS_ERROR_MALFORMED_URI; PRInt32 questionMarkPos = iconSpec.Find("?"); if (questionMarkPos != -1 && static_cast<PRInt32>(iconSpec.Length()) > (questionMarkPos + 1)) { extractAttributeValue(iconSpec.get(), "contentType=", mContentType); nsCAutoString sizeString; extractAttributeValue(iconSpec.get(), "size=", sizeString); if (!sizeString.IsEmpty()) { const char *sizeStr = sizeString.get(); for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(kSizeStrings); i++) { if (PL_strcasecmp(sizeStr, kSizeStrings[i]) == 0) { mIconSize = i; break; } } PRInt32 sizeValue = atoi(sizeString.get()); if (sizeValue) mSize = sizeValue; } nsCAutoString stateString; extractAttributeValue(iconSpec.get(), "state=", stateString); if (!stateString.IsEmpty()) { const char *stateStr = stateString.get(); for (PRUint32 i = 0; i < NS_ARRAY_LENGTH(kStateStrings); i++) { if (PL_strcasecmp(stateStr, kStateStrings[i]) == 0) { mIconState = i; break; } } } } PRInt32 pathLength = iconSpec.Length() - MOZICON_SCHEME_LEN; if (questionMarkPos != -1) pathLength = questionMarkPos - MOZICON_SCHEME_LEN; if (pathLength < 3) return NS_ERROR_MALFORMED_URI; nsCAutoString iconPath(Substring(iconSpec, MOZICON_SCHEME_LEN, pathLength)); // Icon URI path can have three forms: // (1) //stock/<icon-identifier> // (2) //<some dummy file with an extension> // (3) a valid URL if (!strncmp("//stock/", iconPath.get(), 8)) { mStockIcon.Assign(Substring(iconPath, 8)); // An icon identifier must always be specified. if (mStockIcon.IsEmpty()) return NS_ERROR_MALFORMED_URI; return NS_OK; } if (StringBeginsWith(iconPath, NS_LITERAL_CSTRING("//"))) { // Sanity check this supposed dummy file name. if (iconPath.Length() > SANE_FILE_NAME_LEN) return NS_ERROR_MALFORMED_URI; iconPath.Cut(0, 2); mFileName.Assign(iconPath); } nsresult rv; nsCOMPtr<nsIIOService> ioService(do_GetService(NS_IOSERVICE_CONTRACTID, &rv)); NS_ENSURE_SUCCESS(rv, rv); nsCOMPtr<nsIURI> uri; ioService->NewURI(iconPath, nsnull, nsnull, getter_AddRefs(uri)); mIconURL = do_QueryInterface(uri); if (mIconURL) mFileName.Truncate(); else if (mFileName.IsEmpty()) return NS_ERROR_MALFORMED_URI; return NS_OK; }