michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef DOM_CAMERA_DOMCAMERACONTROL_H michael@0: #define DOM_CAMERA_DOMCAMERACONTROL_H michael@0: michael@0: #include "nsCOMPtr.h" michael@0: #include "nsAutoPtr.h" michael@0: #include "nsCycleCollectionParticipant.h" michael@0: #include "mozilla/dom/CameraControlBinding.h" michael@0: #include "ICameraControl.h" michael@0: #include "CameraCommon.h" michael@0: #include "DOMMediaStream.h" michael@0: #include "AudioChannelAgent.h" michael@0: #include "nsProxyRelease.h" michael@0: #include "nsHashPropertyBag.h" michael@0: #include "DeviceStorage.h" michael@0: #include "DOMCameraControlListener.h" michael@0: michael@0: class nsDOMDeviceStorage; michael@0: class nsPIDOMWindow; michael@0: class nsIDOMBlob; michael@0: michael@0: namespace mozilla { michael@0: michael@0: namespace dom { michael@0: class CameraCapabilities; michael@0: class CameraPictureOptions; michael@0: class CameraStartRecordingOptions; michael@0: template class Optional; michael@0: } michael@0: class ErrorResult; michael@0: class StartRecordingHelper; michael@0: michael@0: // Main camera control. michael@0: class nsDOMCameraControl MOZ_FINAL : public DOMMediaStream michael@0: { michael@0: public: michael@0: NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMCameraControl, DOMMediaStream) michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: michael@0: // Because this header's filename doesn't match its C++ or DOM-facing michael@0: // classname, we can't rely on the [Func="..."] WebIDL tag to implicitly michael@0: // include the right header for us; instead we must explicitly include a michael@0: // HasSupport() method in each header. We can get rid of these with the michael@0: // Great Renaming proposed in bug 983177. michael@0: static bool HasSupport(JSContext* aCx, JSObject* aGlobal); michael@0: michael@0: nsDOMCameraControl(uint32_t aCameraId, michael@0: const dom::CameraConfiguration& aInitialConfig, michael@0: dom::GetCameraCallback* aOnSuccess, michael@0: dom::CameraErrorCallback* aOnError, michael@0: nsPIDOMWindow* aWindow); michael@0: michael@0: void Shutdown(); michael@0: michael@0: nsPIDOMWindow* GetParentObject() const { return mWindow; } michael@0: michael@0: // Attributes. michael@0: void GetEffect(nsString& aEffect, ErrorResult& aRv); michael@0: void SetEffect(const nsAString& aEffect, ErrorResult& aRv); michael@0: void GetWhiteBalanceMode(nsString& aMode, ErrorResult& aRv); michael@0: void SetWhiteBalanceMode(const nsAString& aMode, ErrorResult& aRv); michael@0: void GetSceneMode(nsString& aMode, ErrorResult& aRv); michael@0: void SetSceneMode(const nsAString& aMode, ErrorResult& aRv); michael@0: void GetFlashMode(nsString& aMode, ErrorResult& aRv); michael@0: void SetFlashMode(const nsAString& aMode, ErrorResult& aRv); michael@0: void GetFocusMode(nsString& aMode, ErrorResult& aRv); michael@0: void SetFocusMode(const nsAString& aMode, ErrorResult& aRv); michael@0: double GetZoom(ErrorResult& aRv); michael@0: void SetZoom(double aZoom, ErrorResult& aRv); michael@0: void GetMeteringAreas(JSContext* aCx, michael@0: JS::MutableHandle aMeteringAreas, michael@0: ErrorResult& aRv); michael@0: void SetMeteringAreas(JSContext* aCx, JS::Handle aAreas, ErrorResult& aRv); michael@0: void GetFocusAreas(JSContext* aCx, michael@0: JS::MutableHandle aFocusAreas, michael@0: ErrorResult& aRv); michael@0: void SetFocusAreas(JSContext* aCx, JS::Handle aAreas, ErrorResult& aRv); michael@0: void GetPictureSize(JSContext* aCx, michael@0: JS::MutableHandle aSize, michael@0: ErrorResult& aRv); michael@0: void SetPictureSize(JSContext* aCx, JS::Handle aSize, ErrorResult& aRv); michael@0: void GetThumbnailSize(JSContext* aCx, michael@0: JS::MutableHandle aSize, michael@0: ErrorResult& aRv); michael@0: void SetThumbnailSize(JSContext* aCx, JS::Handle aSize, ErrorResult& aRv); michael@0: double GetFocalLength(ErrorResult& aRv); michael@0: double GetFocusDistanceNear(ErrorResult& aRv); michael@0: double GetFocusDistanceOptimum(ErrorResult& aRv); michael@0: double GetFocusDistanceFar(ErrorResult& aRv); michael@0: void SetExposureCompensation(const dom::Optional& aCompensation, ErrorResult& aRv); michael@0: double GetExposureCompensation(ErrorResult& aRv); michael@0: int32_t SensorAngle(); michael@0: already_AddRefed Capabilities(); michael@0: void GetIsoMode(nsString& aMode, ErrorResult& aRv); michael@0: void SetIsoMode(const nsAString& aMode, ErrorResult& aRv); michael@0: michael@0: // Unsolicited event handlers. michael@0: dom::CameraShutterCallback* GetOnShutter(); michael@0: void SetOnShutter(dom::CameraShutterCallback* aCb); michael@0: dom::CameraClosedCallback* GetOnClosed(); michael@0: void SetOnClosed(dom::CameraClosedCallback* aCb); michael@0: dom::CameraRecorderStateChange* GetOnRecorderStateChange(); michael@0: void SetOnRecorderStateChange(dom::CameraRecorderStateChange* aCb); michael@0: dom::CameraPreviewStateChange* GetOnPreviewStateChange(); michael@0: void SetOnPreviewStateChange(dom::CameraPreviewStateChange* aCb); michael@0: dom::CameraAutoFocusMovingCallback* GetOnAutoFocusMoving(); michael@0: void SetOnAutoFocusMoving(dom::CameraAutoFocusMovingCallback* aCb); michael@0: dom::CameraFaceDetectionCallback* GetOnFacesDetected(); michael@0: void SetOnFacesDetected(dom::CameraFaceDetectionCallback* aCb); michael@0: michael@0: // Methods. michael@0: void SetConfiguration(const dom::CameraConfiguration& aConfiguration, michael@0: const dom::Optional >& aOnSuccess, michael@0: const dom::Optional >& aOnError, michael@0: ErrorResult& aRv); michael@0: void AutoFocus(dom::CameraAutoFocusCallback& aOnSuccess, michael@0: const dom::Optional >& aOnError, michael@0: ErrorResult& aRv); michael@0: void StartFaceDetection(ErrorResult& aRv); michael@0: void StopFaceDetection(ErrorResult& aRv); michael@0: void TakePicture(const dom::CameraPictureOptions& aOptions, michael@0: dom::CameraTakePictureCallback& aOnSuccess, michael@0: const dom::Optional >& aOnError, michael@0: ErrorResult& aRv); michael@0: void StartRecording(const dom::CameraStartRecordingOptions& aOptions, michael@0: nsDOMDeviceStorage& storageArea, michael@0: const nsAString& filename, michael@0: dom::CameraStartRecordingCallback& aOnSuccess, michael@0: const dom::Optional >& aOnError, michael@0: ErrorResult& aRv); michael@0: void StopRecording(ErrorResult& aRv); michael@0: void ResumePreview(ErrorResult& aRv); michael@0: void ReleaseHardware(const dom::Optional >& aOnSuccess, michael@0: const dom::Optional >& aOnError, michael@0: ErrorResult& aRv); michael@0: void ResumeContinuousFocus(ErrorResult& aRv); michael@0: michael@0: virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; michael@0: michael@0: protected: michael@0: virtual ~nsDOMCameraControl(); michael@0: michael@0: class DOMCameraConfiguration MOZ_FINAL : public dom::CameraConfiguration michael@0: { michael@0: public: michael@0: NS_INLINE_DECL_REFCOUNTING(DOMCameraConfiguration) michael@0: michael@0: DOMCameraConfiguration(); michael@0: DOMCameraConfiguration(const dom::CameraConfiguration& aConfiguration); michael@0: michael@0: // Additional configuration options that aren't exposed to the DOM michael@0: uint32_t mMaxFocusAreas; michael@0: uint32_t mMaxMeteringAreas; michael@0: michael@0: private: michael@0: // Private destructor, to discourage deletion outside of Release(): michael@0: ~DOMCameraConfiguration(); michael@0: }; michael@0: michael@0: friend class DOMCameraControlListener; michael@0: friend class mozilla::StartRecordingHelper; michael@0: michael@0: void OnCreatedFileDescriptor(bool aSucceeded); michael@0: michael@0: void OnAutoFocusComplete(bool aAutoFocusSucceeded); michael@0: void OnAutoFocusMoving(bool aIsMoving); michael@0: void OnTakePictureComplete(nsIDOMBlob* aPicture); michael@0: void OnFacesDetected(const nsTArray& aFaces); michael@0: michael@0: void OnHardwareStateChange(DOMCameraControlListener::HardwareState aState); michael@0: void OnPreviewStateChange(DOMCameraControlListener::PreviewState aState); michael@0: void OnRecorderStateChange(CameraControlListener::RecorderState aState, int32_t aStatus, int32_t aTrackNum); michael@0: void OnConfigurationChange(DOMCameraConfiguration* aConfiguration); michael@0: void OnShutter(); michael@0: void OnError(CameraControlListener::CameraErrorContext aContext, const nsAString& mError); michael@0: michael@0: bool IsWindowStillActive(); michael@0: michael@0: nsresult NotifyRecordingStatusChange(const nsString& aMsg); michael@0: michael@0: nsRefPtr mCameraControl; // non-DOM camera control michael@0: michael@0: // An agent used to join audio channel service. michael@0: nsCOMPtr mAudioChannelAgent; michael@0: michael@0: nsresult Set(JSContext* aCx, uint32_t aKey, const JS::Value& aValue, uint32_t aLimit); michael@0: nsresult Get(JSContext* aCx, uint32_t aKey, JS::Value* aValue); michael@0: michael@0: nsRefPtr mCurrentConfiguration; michael@0: nsRefPtr mCapabilities; michael@0: michael@0: // solicited camera control event handlers michael@0: nsRefPtr mGetCameraOnSuccessCb; michael@0: nsRefPtr mGetCameraOnErrorCb; michael@0: nsRefPtr mAutoFocusOnSuccessCb; michael@0: nsRefPtr mAutoFocusOnErrorCb; michael@0: nsRefPtr mTakePictureOnSuccessCb; michael@0: nsRefPtr mTakePictureOnErrorCb; michael@0: nsRefPtr mStartRecordingOnSuccessCb; michael@0: nsRefPtr mStartRecordingOnErrorCb; michael@0: nsRefPtr mReleaseOnSuccessCb; michael@0: nsRefPtr mReleaseOnErrorCb; michael@0: nsRefPtr mSetConfigurationOnSuccessCb; michael@0: nsRefPtr mSetConfigurationOnErrorCb; michael@0: michael@0: // unsolicited event handlers michael@0: nsRefPtr mOnShutterCb; michael@0: nsRefPtr mOnClosedCb; michael@0: nsRefPtr mOnRecorderStateChangeCb; michael@0: nsRefPtr mOnPreviewStateChangeCb; michael@0: nsRefPtr mOnAutoFocusMovingCb; michael@0: nsRefPtr mOnFacesDetectedCb; michael@0: michael@0: // Camera event listener; we only need this weak reference so that michael@0: // we can remove the listener from the camera when we're done michael@0: // with it. michael@0: DOMCameraControlListener* mListener; michael@0: michael@0: // our viewfinder stream michael@0: CameraPreviewMediaStream* mInput; michael@0: michael@0: // set once when this object is created michael@0: nsCOMPtr mWindow; michael@0: michael@0: dom::CameraStartRecordingOptions mOptions; michael@0: nsRefPtr mDSFileDescriptor; michael@0: michael@0: private: michael@0: nsDOMCameraControl(const nsDOMCameraControl&) MOZ_DELETE; michael@0: nsDOMCameraControl& operator=(const nsDOMCameraControl&) MOZ_DELETE; michael@0: }; michael@0: michael@0: } // namespace mozilla michael@0: michael@0: #endif // DOM_CAMERA_DOMCAMERACONTROL_H