Bumping manifests a=b2g-bump
[gecko.git] / dom / tv / TVTuner.cpp
blob970d943dc0e686363308d64acf80eb6ff7724a95
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"
17 #include "TVTuner.h"
19 namespace mozilla {
20 namespace dom {
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)
36 TVTuner::~TVTuner()
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;
48 bool
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())) {
56 return false;
59 uint32_t count;
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_)) {
67 continue;
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)) {
73 continue;
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);
84 return true;
87 /* virtual */ JSObject*
88 TVTuner::WrapObject(JSContext* aCx)
90 return TVTunerBinding::Wrap(aCx, this);
93 nsresult
94 TVTuner::SetCurrentSource(TVSourceType aSourceType)
96 ErrorResult error;
97 if (mCurrentSource) {
98 if (aSourceType == mCurrentSource->Type()) {
99 // No actual change.
100 return NS_OK;
103 // No need to stay tuned for non-current sources.
104 nsresult rv = mCurrentSource->UnsetCurrentChannel();
105 if (NS_FAILED(rv)) {
106 return rv;
110 for (uint32_t i = 0; i < mSources.Length(); i++) {
111 if (aSourceType == mSources[i]->Type()) {
112 mCurrentSource = mSources[i];
113 break;
117 nsresult rv = InitMediaStream();
118 if (NS_FAILED(rv)) {
119 return rv;
122 return DispatchCurrentSourceChangedEvent(mCurrentSource);
125 nsresult
126 TVTuner::DispatchTVEvent(nsIDOMEvent* aEvent)
128 return DispatchTrustedEvent(aEvent);
131 void
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());
142 MOZ_ASSERT(global);
144 nsRefPtr<Promise> promise = Promise::Create(global, aRv);
145 if (NS_WARN_IF(aRv.Failed())) {
146 return nullptr;
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());
158 MOZ_ASSERT(global);
160 nsRefPtr<Promise> promise = Promise::Create(global, aRv);
161 if (NS_WARN_IF(aRv.Failed())) {
162 return nullptr;
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();
177 void
178 TVTuner::GetId(nsAString& aId) const
180 aId = mId;
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();
197 nsresult
198 TVTuner::InitMediaStream()
200 // TODO Instantiate |mStream| when bug 987498 is done.
202 return NS_OK;
205 nsresult
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"),
213 init);
214 nsCOMPtr<nsIRunnable> runnable =
215 NS_NewRunnableMethodWithArg<nsCOMPtr<nsIDOMEvent>>(this,
216 &TVTuner::DispatchTVEvent,
217 event);
218 return NS_DispatchToCurrentThread(runnable);
221 } // namespace dom
222 } // namespace mozilla