123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #include "plstr.h"
- #include "nsDeviceChannel.h"
- #include "nsDeviceCaptureProvider.h"
- using namespace mozilla;
- // Copied from image/decoders/icon/nsIconURI.cpp
- // takes a string like ?size=32&contentType=text/html and returns a new string
- // containing just the attribute values. i.e you could pass in this string with
- // an attribute name of "size=", this will return 32
- // Assumption: attribute pairs are separated by &
- void extractAttributeValue(const char* searchString, const char* attributeName, nsCString& result)
- {
- result.Truncate();
- if (!searchString || !attributeName)
- return;
- uint32_t attributeNameSize = strlen(attributeName);
- const char *startOfAttribute = PL_strcasestr(searchString, attributeName);
- if (!startOfAttribute ||
- !( *(startOfAttribute-1) == '?' || *(startOfAttribute-1) == '&') )
- return;
- startOfAttribute += attributeNameSize; // Skip the attributeName
- if (!*startOfAttribute)
- return;
- const char *endOfAttribute = strchr(startOfAttribute, '&');
- if (endOfAttribute) {
- result.Assign(Substring(startOfAttribute, endOfAttribute));
- } else {
- result.Assign(startOfAttribute);
- }
- }
- NS_IMPL_ISUPPORTS_INHERITED(nsDeviceChannel,
- nsBaseChannel,
- nsIChannel)
- // nsDeviceChannel methods
- nsDeviceChannel::nsDeviceChannel()
- {
- SetContentType(NS_LITERAL_CSTRING("image/png"));
- }
- nsDeviceChannel::~nsDeviceChannel()
- {
- }
- nsresult
- nsDeviceChannel::Init(nsIURI* aUri)
- {
- nsBaseChannel::Init();
- nsBaseChannel::SetURI(aUri);
- return NS_OK;
- }
- nsresult
- nsDeviceChannel::OpenContentStream(bool aAsync,
- nsIInputStream** aStream,
- nsIChannel** aChannel)
- {
- if (!aAsync)
- return NS_ERROR_NOT_IMPLEMENTED;
- nsCOMPtr<nsIURI> uri = nsBaseChannel::URI();
- *aStream = nullptr;
- *aChannel = nullptr;
- NS_NAMED_LITERAL_CSTRING(width, "width=");
- NS_NAMED_LITERAL_CSTRING(height, "height=");
- nsAutoCString spec;
- nsresult rv = uri->GetSpec(spec);
- NS_ENSURE_SUCCESS(rv, rv);
- nsAutoCString type;
- RefPtr<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;
- nsAutoCString 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;
- extractAttributeValue(spec.get(), "camera=", buffer);
- captureParams.camera = buffer.ToInteger(&err);
- captureParams.bpp = 32;
- } 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;
- nsAutoCString 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;
- extractAttributeValue(spec.get(), "camera=", buffer);
- captureParams.camera = buffer.ToInteger(&err);
- captureParams.bpp = 32;
- captureParams.timeLimit = 0;
- captureParams.frameLimit = 60000;
- } else {
- return NS_ERROR_NOT_IMPLEMENTED;
- }
- if (!capture)
- return NS_ERROR_FAILURE;
- return capture->Init(type, &captureParams, aStream);
- }
|