blob: 456017f0c9d53e7b764ceddd0f600abccdb18b08 [file] [edit]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "BaseServiceThread.h"
#include "IThread.h"
PUBLIC
BaseServiceThread::BaseServiceThread() :
BaseThread(),
m_nNativeObject(0),
m_pfnSendDataToJava(IMS_NULL)
{
}
PUBLIC
void BaseServiceThread::SetCallback(
IN IMS_SINTP nNativeObject, Jni_SendDataToJava pfnSendDataToJava)
{
m_nNativeObject = nNativeObject;
m_pfnSendDataToJava = pfnSendDataToJava;
}
PROTECTED VIRTUAL IMS_BOOL BaseServiceThread::OnMessage(IN ImsMessage& objMsg)
{
switch (objMsg.GetName())
{
case MESSAGE_THREAD_SWITCHING:
{
android::Parcel* pParcel = reinterpret_cast<android::Parcel*>(objMsg.nLparam);
SendData2Java(*pParcel, IMS_TRUE);
delete pParcel;
break;
}
default:
break;
}
return IMS_TRUE;
}
PROTECTED
IMS_BOOL BaseServiceThread::SendData2Java(
IN const android::Parcel& objParcel, IN IMS_BOOL bThreadSwitched /*= IMS_FALSE*/)
{
if (m_nNativeObject == 0)
{
return IMS_FALSE;
}
if (m_pfnSendDataToJava == IMS_NULL)
{
return IMS_FALSE;
}
int nMsg = objParcel.readInt32();
objParcel.setDataPosition(0);
IMS_BOOL bSendCurrentThread = bThreadSwitched || !IsThreadSwitchingRequired(nMsg);
if (bSendCurrentThread)
{
(*m_pfnSendDataToJava)(m_nNativeObject, objParcel);
return IMS_TRUE;
}
android::Parcel* pParcelOut = new android::Parcel();
pParcelOut->write(objParcel.data(), objParcel.dataSize());
pParcelOut->setDataPosition(0);
IThread* piThread = GetThread();
if (piThread != IMS_NULL)
{
piThread->PostMessageI(
MESSAGE_THREAD_SWITCHING, 0, reinterpret_cast<IMS_UINTP>(pParcelOut));
}
return IMS_TRUE;
}
PROTECTED VIRTUAL IMS_BOOL BaseServiceThread::IsThreadSwitchingRequired(
IN IMS_SINT32 /*nMsg*/) const
{
return IMS_TRUE;
}