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 "mozilla/dom/Promise.h"
8 #include "mozilla/dom/TVServiceCallbacks.h"
9 #include "mozilla/dom/TVServiceFactory.h"
10 #include "mozilla/dom/TVSource.h"
11 #include "mozilla/dom/TVTuner.h"
12 #include "mozilla/dom/TVUtils.h"
13 #include "nsITVService.h"
14 #include "nsServiceManagerUtils.h"
15 #include "TVChannel.h"
20 NS_IMPL_CYCLE_COLLECTION_INHERITED(TVChannel
, DOMEventTargetHelper
,
23 NS_IMPL_ADDREF_INHERITED(TVChannel
, DOMEventTargetHelper
)
24 NS_IMPL_RELEASE_INHERITED(TVChannel
, DOMEventTargetHelper
)
26 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TVChannel
)
27 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper
)
29 TVChannel::TVChannel(nsPIDOMWindow
* aWindow
,
31 : DOMEventTargetHelper(aWindow
)
37 TVChannel::~TVChannel()
41 /* static */ already_AddRefed
<TVChannel
>
42 TVChannel::Create(nsPIDOMWindow
* aWindow
,
44 nsITVChannelData
* aData
)
46 nsRefPtr
<TVChannel
> channel
= new TVChannel(aWindow
, aSource
);
47 return (channel
->Init(aData
)) ? channel
.forget() : nullptr;
51 TVChannel::Init(nsITVChannelData
* aData
)
53 NS_ENSURE_TRUE(aData
, false);
56 aData
->GetType(channelType
);
57 mType
= ToTVChannelType(channelType
);
58 if (NS_WARN_IF(mType
== TVChannelType::EndGuard_
)) {
62 aData
->GetNetworkId(mNetworkId
);
63 aData
->GetTransportStreamId(mTransportStreamId
);
64 aData
->GetServiceId(mServiceId
);
65 aData
->GetName(mName
);
66 aData
->GetNumber(mNumber
);
67 aData
->GetIsEmergency(&mIsEmergency
);
68 aData
->GetIsFree(&mIsFree
);
70 mTVService
= TVServiceFactory::AutoCreateTVService();
71 NS_ENSURE_TRUE(mTVService
, false);
76 /* virtual */ JSObject
*
77 TVChannel::WrapObject(JSContext
* aCx
)
79 return TVChannelBinding::Wrap(aCx
, this);
83 TVChannel::DispatchTVEvent(nsIDOMEvent
* aEvent
)
85 return DispatchTrustedEvent(aEvent
);
88 already_AddRefed
<Promise
>
89 TVChannel::GetPrograms(const TVGetProgramsOptions
& aOptions
, ErrorResult
& aRv
)
91 nsCOMPtr
<nsIGlobalObject
> global
= do_QueryInterface(GetOwner());
94 nsRefPtr
<Promise
> promise
= Promise::Create(global
, aRv
);
95 if (NS_WARN_IF(aRv
.Failed())) {
99 nsRefPtr
<TVTuner
> tuner
= mSource
->Tuner();
101 tuner
->GetId(tunerId
);
103 uint64_t startTime
= aOptions
.mStartTime
.WasPassed() ?
104 aOptions
.mStartTime
.Value() :
106 uint64_t endTime
= aOptions
.mDuration
.WasPassed() ?
107 (startTime
+ aOptions
.mDuration
.Value()) :
108 std::numeric_limits
<uint64_t>::max();
109 nsCOMPtr
<nsITVServiceCallback
> callback
=
110 new TVServiceProgramGetterCallback(this, promise
, false);
112 mTVService
->GetPrograms(tunerId
,
113 ToTVSourceTypeStr(mSource
->Type()),
118 if (NS_WARN_IF(NS_FAILED(rv
))) {
119 promise
->MaybeReject(NS_ERROR_DOM_ABORT_ERR
);
122 return promise
.forget();
126 TVChannel::GetNetworkId(nsAString
& aNetworkId
) const
128 aNetworkId
= mNetworkId
;
132 TVChannel::GetTransportStreamId(nsAString
& aTransportStreamId
) const
134 aTransportStreamId
= mTransportStreamId
;
138 TVChannel::GetServiceId(nsAString
& aServiceId
) const
140 aServiceId
= mServiceId
;
143 already_AddRefed
<TVSource
>
144 TVChannel::Source() const
146 nsRefPtr
<TVSource
> source
= mSource
;
147 return source
.forget();
151 TVChannel::Type() const
157 TVChannel::GetName(nsAString
& aName
) const
163 TVChannel::GetNumber(nsAString
& aNumber
) const
169 TVChannel::IsEmergency() const
175 TVChannel::IsFree() const
180 already_AddRefed
<Promise
>
181 TVChannel::GetCurrentProgram(ErrorResult
& aRv
)
183 nsCOMPtr
<nsIGlobalObject
> global
= do_QueryInterface(GetOwner());
186 nsRefPtr
<Promise
> promise
= Promise::Create(global
, aRv
);
191 nsRefPtr
<TVTuner
> tuner
= mSource
->Tuner();
193 tuner
->GetId(tunerId
);
195 // Get only one program from now on.
196 nsCOMPtr
<nsITVServiceCallback
> callback
=
197 new TVServiceProgramGetterCallback(this, promise
, true);
199 mTVService
->GetPrograms(tunerId
,
200 ToTVSourceTypeStr(mSource
->Type()),
203 std::numeric_limits
<uint64_t>::max(),
205 if (NS_WARN_IF(NS_FAILED(rv
))) {
206 promise
->MaybeReject(NS_ERROR_DOM_ABORT_ERR
);
209 return promise
.forget();
213 } // namespace mozilla