1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "DOMMediaStream.h"
8 #include "mozilla/dom/Promise.h"
9 #include "mozilla/dom/TVCurrentSourceChangedEvent.h"
10 #include "mozilla/dom/TVServiceCallbacks.h"
11 #include "mozilla/dom/TVServiceFactory.h"
12 #include "mozilla/dom/TVSource.h"
13 #include "mozilla/dom/TVUtils.h"
14 #include "nsISupportsPrimitives.h"
15 #include "nsITVService.h"
16 #include "nsServiceManagerUtils.h"
22 NS_IMPL_CYCLE_COLLECTION_INHERITED(TVTuner
, DOMEventTargetHelper
,
23 mTVService
, mStream
, mCurrentSource
, mSources
)
25 NS_IMPL_ADDREF_INHERITED(TVTuner
, DOMEventTargetHelper
)
26 NS_IMPL_RELEASE_INHERITED(TVTuner
, DOMEventTargetHelper
)
28 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TVTuner
)
29 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper
)
31 TVTuner::TVTuner(nsPIDOMWindow
* aWindow
)
32 : DOMEventTargetHelper(aWindow
)
40 /* static */ already_AddRefed
<TVTuner
>
41 TVTuner::Create(nsPIDOMWindow
* aWindow
,
42 nsITVTunerData
* aData
)
44 nsRefPtr
<TVTuner
> tuner
= new TVTuner(aWindow
);
45 return (tuner
->Init(aData
)) ? tuner
.forget() : nullptr;
49 TVTuner::Init(nsITVTunerData
* aData
)
51 NS_ENSURE_TRUE(aData
, false);
53 nsresult rv
= aData
->GetId(mId
);
54 NS_ENSURE_SUCCESS(rv
, false);
55 if (NS_WARN_IF(mId
.IsEmpty())) {
60 char** supportedSourceTypes
;
61 rv
= aData
->GetSupportedSourceTypes(&count
, &supportedSourceTypes
);
62 NS_ENSURE_SUCCESS(rv
, false);
64 for (uint32_t i
= 0; i
< count
; i
++) {
65 TVSourceType sourceType
= ToTVSourceType(supportedSourceTypes
[i
]);
66 if (NS_WARN_IF(sourceType
== TVSourceType::EndGuard_
)) {
70 // Generate the source instance based on the supported source type.
71 nsRefPtr
<TVSource
> source
= TVSource::Create(GetOwner(), sourceType
, this);
72 if (NS_WARN_IF(!source
)) {
76 mSupportedSourceTypes
.AppendElement(sourceType
);
77 mSources
.AppendElement(source
);
79 NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count
, supportedSourceTypes
);
81 mTVService
= TVServiceFactory::AutoCreateTVService();
82 NS_ENSURE_TRUE(mTVService
, false);
87 /* virtual */ JSObject
*
88 TVTuner::WrapObject(JSContext
* aCx
)
90 return TVTunerBinding::Wrap(aCx
, this);
94 TVTuner::SetCurrentSource(TVSourceType aSourceType
)
98 if (aSourceType
== mCurrentSource
->Type()) {
103 // No need to stay tuned for non-current sources.
104 nsresult rv
= mCurrentSource
->UnsetCurrentChannel();
110 for (uint32_t i
= 0; i
< mSources
.Length(); i
++) {
111 if (aSourceType
== mSources
[i
]->Type()) {
112 mCurrentSource
= mSources
[i
];
117 nsresult rv
= InitMediaStream();
122 return DispatchCurrentSourceChangedEvent(mCurrentSource
);
126 TVTuner::DispatchTVEvent(nsIDOMEvent
* aEvent
)
128 return DispatchTrustedEvent(aEvent
);
132 TVTuner::GetSupportedSourceTypes(nsTArray
<TVSourceType
>& aSourceTypes
,
133 ErrorResult
& aRv
) const
135 aSourceTypes
= mSupportedSourceTypes
;
138 already_AddRefed
<Promise
>
139 TVTuner::GetSources(ErrorResult
& aRv
)
141 nsCOMPtr
<nsIGlobalObject
> global
= do_QueryInterface(GetOwner());
144 nsRefPtr
<Promise
> promise
= Promise::Create(global
, aRv
);
145 if (NS_WARN_IF(aRv
.Failed())) {
149 promise
->MaybeResolve(mSources
);
151 return promise
.forget();
154 already_AddRefed
<Promise
>
155 TVTuner::SetCurrentSource(const TVSourceType aSourceType
, ErrorResult
& aRv
)
157 nsCOMPtr
<nsIGlobalObject
> global
= do_QueryInterface(GetOwner());
160 nsRefPtr
<Promise
> promise
= Promise::Create(global
, aRv
);
161 if (NS_WARN_IF(aRv
.Failed())) {
165 // |SetCurrentSource(const TVSourceType)| will be called once |notifySuccess|
166 // of the callback is invoked.
167 nsCOMPtr
<nsITVServiceCallback
> callback
=
168 new TVServiceSourceSetterCallback(this, promise
, aSourceType
);
169 nsresult rv
= mTVService
->SetSource(mId
, ToTVSourceTypeStr(aSourceType
), callback
);
170 if (NS_WARN_IF(NS_FAILED(rv
))) {
171 promise
->MaybeReject(NS_ERROR_DOM_ABORT_ERR
);
174 return promise
.forget();
178 TVTuner::GetId(nsAString
& aId
) const
183 already_AddRefed
<TVSource
>
184 TVTuner::GetCurrentSource() const
186 nsRefPtr
<TVSource
> currentSource
= mCurrentSource
;
187 return currentSource
.forget();
190 already_AddRefed
<DOMMediaStream
>
191 TVTuner::GetStream() const
193 nsRefPtr
<DOMMediaStream
> stream
= mStream
;
194 return stream
.forget();
198 TVTuner::InitMediaStream()
200 // TODO Instantiate |mStream| when bug 987498 is done.
206 TVTuner::DispatchCurrentSourceChangedEvent(TVSource
* aSource
)
208 TVCurrentSourceChangedEventInit init
;
209 init
.mSource
= aSource
;
210 nsCOMPtr
<nsIDOMEvent
> event
=
211 TVCurrentSourceChangedEvent::Constructor(this,
212 NS_LITERAL_STRING("currentsourcechanged"),
214 nsCOMPtr
<nsIRunnable
> runnable
=
215 NS_NewRunnableMethodWithArg
<nsCOMPtr
<nsIDOMEvent
>>(this,
216 &TVTuner::DispatchTVEvent
,
218 return NS_DispatchToCurrentThread(runnable
);
222 } // namespace mozilla