michael@0: /* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ 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: #include "base/basictypes.h" michael@0: michael@0: #include "BluetoothParent.h" michael@0: michael@0: #include "mozilla/Assertions.h" michael@0: #include "mozilla/unused.h" michael@0: #include "nsDebug.h" michael@0: #include "nsISupportsImpl.h" michael@0: #include "nsThreadUtils.h" michael@0: michael@0: #include "BluetoothReplyRunnable.h" michael@0: #include "BluetoothService.h" michael@0: michael@0: using mozilla::unused; michael@0: USING_BLUETOOTH_NAMESPACE michael@0: michael@0: /******************************************************************************* michael@0: * BluetoothRequestParent::ReplyRunnable michael@0: ******************************************************************************/ michael@0: michael@0: class BluetoothRequestParent::ReplyRunnable : public BluetoothReplyRunnable michael@0: { michael@0: BluetoothRequestParent* mRequest; michael@0: michael@0: public: michael@0: ReplyRunnable(BluetoothRequestParent* aRequest) michael@0: : BluetoothReplyRunnable(nullptr), mRequest(aRequest) michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread()); michael@0: MOZ_ASSERT(aRequest); michael@0: } michael@0: michael@0: NS_IMETHOD michael@0: Run() MOZ_OVERRIDE michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread()); michael@0: MOZ_ASSERT(mReply); michael@0: michael@0: if (mRequest) { michael@0: // Must do this first because Send__delete__ will delete mRequest. michael@0: mRequest->RequestComplete(); michael@0: michael@0: if (!mRequest->Send__delete__(mRequest, *mReply)) { michael@0: BT_WARNING("Failed to send response to child process!"); michael@0: return NS_ERROR_FAILURE; michael@0: } michael@0: } michael@0: michael@0: ReleaseMembers(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: void michael@0: Revoke() michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread()); michael@0: mRequest = nullptr; michael@0: } michael@0: michael@0: virtual bool michael@0: ParseSuccessfulReply(JS::MutableHandle aValue) MOZ_OVERRIDE michael@0: { michael@0: MOZ_CRASH("This should never be called!"); michael@0: } michael@0: }; michael@0: michael@0: /******************************************************************************* michael@0: * BluetoothParent michael@0: ******************************************************************************/ michael@0: michael@0: BluetoothParent::BluetoothParent() michael@0: : mShutdownState(Running) michael@0: { michael@0: MOZ_COUNT_CTOR(BluetoothParent); michael@0: } michael@0: michael@0: BluetoothParent::~BluetoothParent() michael@0: { michael@0: MOZ_COUNT_DTOR(BluetoothParent); michael@0: MOZ_ASSERT(!mService); michael@0: MOZ_ASSERT(mShutdownState == Dead); michael@0: } michael@0: michael@0: void michael@0: BluetoothParent::BeginShutdown() michael@0: { michael@0: // Only do something here if we haven't yet begun the shutdown sequence. michael@0: if (mShutdownState == Running) { michael@0: unused << SendBeginShutdown(); michael@0: mShutdownState = SentBeginShutdown; michael@0: } michael@0: } michael@0: michael@0: bool michael@0: BluetoothParent::InitWithService(BluetoothService* aService) michael@0: { michael@0: MOZ_ASSERT(aService); michael@0: MOZ_ASSERT(!mService); michael@0: michael@0: if (!SendEnabled(aService->IsEnabled())) { michael@0: return false; michael@0: } michael@0: michael@0: mService = aService; michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: BluetoothParent::UnregisterAllSignalHandlers() michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: mService->UnregisterAllSignalHandlers(this); michael@0: } michael@0: michael@0: void michael@0: BluetoothParent::ActorDestroy(ActorDestroyReason aWhy) michael@0: { michael@0: if (mService) { michael@0: UnregisterAllSignalHandlers(); michael@0: #ifdef DEBUG michael@0: mService = nullptr; michael@0: #endif michael@0: } michael@0: michael@0: #ifdef DEBUG michael@0: mShutdownState = Dead; michael@0: #endif michael@0: } michael@0: michael@0: bool michael@0: BluetoothParent::RecvRegisterSignalHandler(const nsString& aNode) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: mService->RegisterBluetoothSignalHandler(aNode, this); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothParent::RecvUnregisterSignalHandler(const nsString& aNode) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: mService->UnregisterBluetoothSignalHandler(aNode, this); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothParent::RecvStopNotifying() michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: michael@0: if (mShutdownState != Running && mShutdownState != SentBeginShutdown) { michael@0: MOZ_ASSERT(false, "Bad state!"); michael@0: return false; michael@0: } michael@0: michael@0: mShutdownState = ReceivedStopNotifying; michael@0: michael@0: UnregisterAllSignalHandlers(); michael@0: michael@0: if (SendNotificationsStopped()) { michael@0: mShutdownState = SentNotificationsStopped; michael@0: return true; michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: michael@0: bool michael@0: BluetoothParent::RecvPBluetoothRequestConstructor( michael@0: PBluetoothRequestParent* aActor, michael@0: const Request& aRequest) michael@0: { michael@0: BluetoothRequestParent* actor = static_cast(aActor); michael@0: michael@0: #ifdef DEBUG michael@0: actor->mRequestType = aRequest.type(); michael@0: #endif michael@0: michael@0: switch (aRequest.type()) { michael@0: case Request::TDefaultAdapterPathRequest: michael@0: return actor->DoRequest(aRequest.get_DefaultAdapterPathRequest()); michael@0: case Request::TSetPropertyRequest: michael@0: return actor->DoRequest(aRequest.get_SetPropertyRequest()); michael@0: case Request::TStartDiscoveryRequest: michael@0: return actor->DoRequest(aRequest.get_StartDiscoveryRequest()); michael@0: case Request::TStopDiscoveryRequest: michael@0: return actor->DoRequest(aRequest.get_StopDiscoveryRequest()); michael@0: case Request::TPairRequest: michael@0: return actor->DoRequest(aRequest.get_PairRequest()); michael@0: case Request::TUnpairRequest: michael@0: return actor->DoRequest(aRequest.get_UnpairRequest()); michael@0: case Request::TPairedDevicePropertiesRequest: michael@0: return actor->DoRequest(aRequest.get_PairedDevicePropertiesRequest()); michael@0: case Request::TConnectedDevicePropertiesRequest: michael@0: return actor->DoRequest(aRequest.get_ConnectedDevicePropertiesRequest()); michael@0: case Request::TSetPinCodeRequest: michael@0: return actor->DoRequest(aRequest.get_SetPinCodeRequest()); michael@0: case Request::TSetPasskeyRequest: michael@0: return actor->DoRequest(aRequest.get_SetPasskeyRequest()); michael@0: case Request::TConfirmPairingConfirmationRequest: michael@0: return actor->DoRequest(aRequest.get_ConfirmPairingConfirmationRequest()); michael@0: case Request::TDenyPairingConfirmationRequest: michael@0: return actor->DoRequest(aRequest.get_DenyPairingConfirmationRequest()); michael@0: case Request::TConnectRequest: michael@0: return actor->DoRequest(aRequest.get_ConnectRequest()); michael@0: case Request::TDisconnectRequest: michael@0: return actor->DoRequest(aRequest.get_DisconnectRequest()); michael@0: case Request::TSendFileRequest: michael@0: return actor->DoRequest(aRequest.get_SendFileRequest()); michael@0: case Request::TStopSendingFileRequest: michael@0: return actor->DoRequest(aRequest.get_StopSendingFileRequest()); michael@0: case Request::TConfirmReceivingFileRequest: michael@0: return actor->DoRequest(aRequest.get_ConfirmReceivingFileRequest()); michael@0: case Request::TDenyReceivingFileRequest: michael@0: return actor->DoRequest(aRequest.get_DenyReceivingFileRequest()); michael@0: case Request::TConnectScoRequest: michael@0: return actor->DoRequest(aRequest.get_ConnectScoRequest()); michael@0: case Request::TDisconnectScoRequest: michael@0: return actor->DoRequest(aRequest.get_DisconnectScoRequest()); michael@0: case Request::TIsScoConnectedRequest: michael@0: return actor->DoRequest(aRequest.get_IsScoConnectedRequest()); michael@0: #ifdef MOZ_B2G_RIL michael@0: case Request::TAnswerWaitingCallRequest: michael@0: return actor->DoRequest(aRequest.get_AnswerWaitingCallRequest()); michael@0: case Request::TIgnoreWaitingCallRequest: michael@0: return actor->DoRequest(aRequest.get_IgnoreWaitingCallRequest()); michael@0: case Request::TToggleCallsRequest: michael@0: return actor->DoRequest(aRequest.get_ToggleCallsRequest()); michael@0: #endif michael@0: case Request::TSendMetaDataRequest: michael@0: return actor->DoRequest(aRequest.get_SendMetaDataRequest()); michael@0: case Request::TSendPlayStatusRequest: michael@0: return actor->DoRequest(aRequest.get_SendPlayStatusRequest()); michael@0: default: michael@0: MOZ_CRASH("Unknown type!"); michael@0: } michael@0: michael@0: MOZ_CRASH("Should never get here!"); michael@0: } michael@0: michael@0: PBluetoothRequestParent* michael@0: BluetoothParent::AllocPBluetoothRequestParent(const Request& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: return new BluetoothRequestParent(mService); michael@0: } michael@0: michael@0: bool michael@0: BluetoothParent::DeallocPBluetoothRequestParent(PBluetoothRequestParent* aActor) michael@0: { michael@0: delete aActor; michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: BluetoothParent::Notify(const BluetoothSignal& aSignal) michael@0: { michael@0: unused << SendNotify(aSignal); michael@0: } michael@0: michael@0: /******************************************************************************* michael@0: * BluetoothRequestParent michael@0: ******************************************************************************/ michael@0: michael@0: BluetoothRequestParent::BluetoothRequestParent(BluetoothService* aService) michael@0: : mService(aService) michael@0: #ifdef DEBUG michael@0: , mRequestType(Request::T__None) michael@0: #endif michael@0: { michael@0: MOZ_COUNT_CTOR(BluetoothRequestParent); michael@0: MOZ_ASSERT(aService); michael@0: michael@0: mReplyRunnable = new ReplyRunnable(this); michael@0: } michael@0: michael@0: BluetoothRequestParent::~BluetoothRequestParent() michael@0: { michael@0: MOZ_COUNT_DTOR(BluetoothRequestParent); michael@0: michael@0: // mReplyRunnable will be automatically revoked. michael@0: } michael@0: michael@0: void michael@0: BluetoothRequestParent::ActorDestroy(ActorDestroyReason aWhy) michael@0: { michael@0: mReplyRunnable.Revoke(); michael@0: } michael@0: michael@0: void michael@0: BluetoothRequestParent::RequestComplete() michael@0: { michael@0: MOZ_ASSERT(NS_IsMainThread()); michael@0: MOZ_ASSERT(mReplyRunnable.IsPending()); michael@0: michael@0: mReplyRunnable.Forget(); michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const DefaultAdapterPathRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TDefaultAdapterPathRequest); michael@0: michael@0: nsresult rv = mService->GetDefaultAdapterPathInternal(mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const SetPropertyRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TSetPropertyRequest); michael@0: michael@0: nsresult rv = michael@0: mService->SetProperty(aRequest.type(), aRequest.value(), michael@0: mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const StartDiscoveryRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TStartDiscoveryRequest); michael@0: michael@0: nsresult rv = michael@0: mService->StartDiscoveryInternal(mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const StopDiscoveryRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TStopDiscoveryRequest); michael@0: michael@0: nsresult rv = michael@0: mService->StopDiscoveryInternal(mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const PairRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TPairRequest); michael@0: michael@0: nsresult rv = michael@0: mService->CreatePairedDeviceInternal(aRequest.address(), michael@0: aRequest.timeoutMS(), michael@0: mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const UnpairRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TUnpairRequest); michael@0: michael@0: nsresult rv = michael@0: mService->RemoveDeviceInternal(aRequest.address(), michael@0: mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const PairedDevicePropertiesRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TPairedDevicePropertiesRequest); michael@0: michael@0: nsresult rv = michael@0: mService->GetPairedDevicePropertiesInternal(aRequest.addresses(), michael@0: mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const ConnectedDevicePropertiesRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TConnectedDevicePropertiesRequest); michael@0: nsresult rv = michael@0: mService->GetConnectedDevicePropertiesInternal(aRequest.serviceUuid(), michael@0: mReplyRunnable.get()); michael@0: NS_ENSURE_SUCCESS(rv, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const SetPinCodeRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TSetPinCodeRequest); michael@0: michael@0: bool result = michael@0: mService->SetPinCodeInternal(aRequest.path(), michael@0: aRequest.pincode(), michael@0: mReplyRunnable.get()); michael@0: michael@0: NS_ENSURE_TRUE(result, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const SetPasskeyRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TSetPasskeyRequest); michael@0: michael@0: bool result = michael@0: mService->SetPasskeyInternal(aRequest.path(), michael@0: aRequest.passkey(), michael@0: mReplyRunnable.get()); michael@0: michael@0: NS_ENSURE_TRUE(result, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const ConfirmPairingConfirmationRequest& michael@0: aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TConfirmPairingConfirmationRequest); michael@0: michael@0: bool result = michael@0: mService->SetPairingConfirmationInternal(aRequest.path(), michael@0: true, michael@0: mReplyRunnable.get()); michael@0: michael@0: NS_ENSURE_TRUE(result, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const DenyPairingConfirmationRequest& michael@0: aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TDenyPairingConfirmationRequest); michael@0: michael@0: bool result = michael@0: mService->SetPairingConfirmationInternal(aRequest.path(), michael@0: false, michael@0: mReplyRunnable.get()); michael@0: michael@0: NS_ENSURE_TRUE(result, false); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const ConnectRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TConnectRequest); michael@0: michael@0: mService->Connect(aRequest.address(), michael@0: aRequest.cod(), michael@0: aRequest.serviceUuid(), michael@0: mReplyRunnable.get()); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const DisconnectRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TDisconnectRequest); michael@0: michael@0: mService->Disconnect(aRequest.address(), michael@0: aRequest.serviceUuid(), michael@0: mReplyRunnable.get()); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const SendFileRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TSendFileRequest); michael@0: michael@0: mService->SendFile(aRequest.devicePath(), michael@0: (BlobParent*)aRequest.blobParent(), michael@0: (BlobChild*)aRequest.blobChild(), michael@0: mReplyRunnable.get()); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const StopSendingFileRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TStopSendingFileRequest); michael@0: michael@0: mService->StopSendingFile(aRequest.devicePath(), michael@0: mReplyRunnable.get()); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const ConfirmReceivingFileRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TConfirmReceivingFileRequest); michael@0: michael@0: mService->ConfirmReceivingFile(aRequest.devicePath(), michael@0: true, michael@0: mReplyRunnable.get()); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const DenyReceivingFileRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TDenyReceivingFileRequest); michael@0: michael@0: mService->ConfirmReceivingFile(aRequest.devicePath(), michael@0: false, michael@0: mReplyRunnable.get()); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const ConnectScoRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TConnectScoRequest); michael@0: michael@0: mService->ConnectSco(mReplyRunnable.get()); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const DisconnectScoRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TDisconnectScoRequest); michael@0: michael@0: mService->DisconnectSco(mReplyRunnable.get()); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const IsScoConnectedRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TIsScoConnectedRequest); michael@0: michael@0: mService->IsScoConnected(mReplyRunnable.get()); michael@0: return true; michael@0: } michael@0: michael@0: #ifdef MOZ_B2G_RIL michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const AnswerWaitingCallRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TAnswerWaitingCallRequest); michael@0: michael@0: mService->AnswerWaitingCall(mReplyRunnable.get()); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const IgnoreWaitingCallRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TAnswerWaitingCallRequest); michael@0: michael@0: mService->IgnoreWaitingCall(mReplyRunnable.get()); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const ToggleCallsRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TAnswerWaitingCallRequest); michael@0: michael@0: mService->ToggleCalls(mReplyRunnable.get()); michael@0: michael@0: return true; michael@0: } michael@0: #endif // MOZ_B2G_RIL michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const SendMetaDataRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TSendMetaDataRequest); michael@0: michael@0: mService->SendMetaData(aRequest.title(), michael@0: aRequest.artist(), michael@0: aRequest.album(), michael@0: aRequest.mediaNumber(), michael@0: aRequest.totalMediaCount(), michael@0: aRequest.duration(), michael@0: mReplyRunnable.get()); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: BluetoothRequestParent::DoRequest(const SendPlayStatusRequest& aRequest) michael@0: { michael@0: MOZ_ASSERT(mService); michael@0: MOZ_ASSERT(mRequestType == Request::TSendPlayStatusRequest); michael@0: michael@0: mService->SendPlayStatus(aRequest.duration(), michael@0: aRequest.position(), michael@0: aRequest.playStatus(), michael@0: mReplyRunnable.get()); michael@0: return true; michael@0: }