blob: 91bd5657573845f1cd9b50763f3911a5e45bc10f [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* 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 "tsc_statemanager.h"
#include "tsc_lc.h"
#include "tsc_blc.h"
#include "tsc_clc.h"
#include "tsc_constants.h"
#include "tsc_mt.h"
#include "tsc_component.h"
#include "tsc_capability.h"
#include "tsc_channelcontrol.h"
TSC_channelcontrol::TSC_channelcontrol(OlcList& aOlcs,
TSC_statemanager& aTSCStateManager,
TSC_blc& aTSCblc,
TSC_mt& aTSCmt,
TSC_lc& aTSClc,
TSC_capability& aTSCcapability,
TSC_clc& aTSCclc,
TSC_component& aTSCcomponent) :
iOlcs(aOlcs),
iH223(NULL),
iTSCstatemanager(aTSCStateManager),
iTSCblc(aTSCblc),
iTSCmt(aTSCmt),
iTSClc(aTSClc),
iTSCcapability(aTSCcapability),
iTSCclc(aTSCclc),
iTSCcomponent(aTSCcomponent)
{
iLogger = PVLogger::GetLoggerObject("3g324m.h245user");
};
LogicalChannelInfo* TSC_channelcontrol::GetLogicalChannelInfo(PVMFPortInterface& port)
{
if (port.GetPortTag() == PV_MULTIPLEXED)
{
OSCL_LEAVE(PVMFErrArgument);
}
return OSCL_STATIC_CAST(LogicalChannelInfo*, &port);
}
TPVStatusCode TSC_channelcontrol::RequestIncomingChannelClose(TPVChannelId lcn)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_channelcontrol: Requesting incoming channel close (%d).\n", lcn));
/* Initiate RequestChannelClose Command */
iTSCclc.ClcClsReq(lcn);
return EPVT_Pending;
}
bool TSC_channelcontrol::IsEstablishedLogicalChannel(TPVDirection aDir, TPVChannelId aChannelId)
{
OlcParam* param = iOlcs.FindOlcGivenChannel(aDir, aChannelId);
if (param)
{
if (param->GetState() == OLC_PENDING ||
param->GetState() == OLC_ESTABLISHED)
{
return true;
}
return false;
}
OlcList::iterator it = iOlcs.begin();
while (it != iOlcs.end())
{
OlcList::value_type& val = (*it++);
OlcParam* olc = val.second;
if (olc->GetDirection() == REVERSE_DIR(aDir) &&
olc->GetReverseParams() &&
olc->GetReverseParams()->GetChannelId() == aChannelId)
{
return true;
}
}
return false;
}
void TSC_channelcontrol::ReceivedFormatSpecificInfo(TPVChannelId channel_id,
uint8* fsi,
uint32 fsi_len)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_channelcontrol::ReceivedFormatSpecificInfo lcn=%d, len=%d",
channel_id, fsi_len));
OlcParam* param = iOlcs.FindOlcGivenChannel(OUTGOING, channel_id);
if (param == NULL)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_channelcontrol::ReceivedFormatSpecificInfo - Failed to lookup channel"));
return;
}
if (param->GetState() != OLC_PENDING)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_channelcontrol::ReceivedFormatSpecificInfo - Channel not in pending state. Not sending OLC."));
return;
}
PVMFStatus status = SetFormatSpecificInfo(param->GetForwardParams()->GetDataType(),
fsi, fsi_len);
if (status != PVMFSuccess)
{
PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG, iLogger, PVLOGMSG_STACK_TRACE,
(0, "TSC_channelcontrol::ReceivedFormatSpecificInfo - Failed to set FormatSpecificInfo, status=%d.",
status));
return;
}
if (param->GetDirectionality() == EPVT_BI_DIRECTIONAL)
{
// Check FSI in reverse parameters. Set it to fsi if its different from filler fsi
uint8* rvs_fsi = NULL;
unsigned rvs_fsi_len =
::GetFormatSpecificInfo(param->GetReverseParams()->GetDataType(),
rvs_fsi);
if (IsFillerFsi(rvs_fsi, rvs_fsi_len))
{
SetFormatSpecificInfo(param->GetReverseParams()->GetDataType(),
fsi, fsi_len);
}
iTSCblc.BlcEtbReq(channel_id,
param->GetForwardParams()->GetDataType(),
param->GetForwardParams()->GetLcnParams(),
param->GetReverseParams()->GetDataType(),
param->GetReverseParams()->GetLcnParams());
}
else
{
iTSClc.LcEtbReq(channel_id,
param->GetForwardParams()->GetDataType(),
param->GetForwardParams()->GetLcnParams());
}
}