diff -r 000000000000 -r 71ca22bcf22a mmserv/tms/tmsserver/src/tmsserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/tms/tmsserver/src/tmsserversession.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Telephony Multimedia Service + * + */ + +#include +#include "tmsutility.h" +#include "tmsclientserver.h" +#include "tmsshared.h" +#include "tmsserversession.h" + +using namespace TMS; + +const TUint KArrayExpandSize = 8; + +// ----------------------------------------------------------------------------- +// TMSServerSession::NewL +// Symbian constructor. +// ----------------------------------------------------------------------------- +// +TMSServerSession* TMSServerSession::NewL(TMSServer &aServer) + { + TMSServerSession* self = new (ELeave) TMSServerSession(aServer); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::~TMSServerSession +// The destructor +// ----------------------------------------------------------------------------- +// +TMSServerSession::~TMSServerSession() + { + TRACE_PRN_FN_ENT; + + iServer.DropSession(); // will start shutdown if no more sessions left + delete iDevSound; + + if (iMsgQueue.Handle() > 0) + { + iMsgQueue.Close(); + } + + if (iTMSCallSessionHandle.Handle() > 0) + { + iTMSCallSessionHandle.Close(); + } + + // Release memory and close handles to unused plug-ins held by the DevSound + REComSession::FinalClose(); + + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::ConstructL +// 2-nd phase constructor. +// ----------------------------------------------------------------------------- +// +void TMSServerSession::ConstructL() + { + TRACE_PRN_FN_ENT; + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::TMSServerSession +// ----------------------------------------------------------------------------- +// +TMSServerSession::TMSServerSession(TMSServer &aServer) : + iServer(aServer) + { + TRACE_PRN_FN_ENT; + iServer.AddSession(); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::ServiceL +// Service request handler. +// ----------------------------------------------------------------------------- +// +void TMSServerSession::ServiceL(const RMessage2& aMessage) + { + TRAPD(err, DispatchMessageL(aMessage)); + + if (err != KErrNone) + { + aMessage.Complete(err); + } + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::DispatchMessageL +// Service request handler. +// ----------------------------------------------------------------------------- +// +void TMSServerSession::DispatchMessageL(const RMessage2& aMessage) + { + switch (aMessage.Function()) + { + case ETMSCallSessionHandle: + GetTMSCallSessionHandleL(aMessage); + break; + case ETMSGetSupportedEncodersCount: + GetCodecsCountL(aMessage, TMS_STREAM_UPLINK); + break; + case ETMSGetSupportedDecodersCount: + GetCodecsCountL(aMessage, TMS_STREAM_DOWNLINK); + break; + case ETMSGetSupportedEncoders: + GetSupportedCodecsL(aMessage, TMS_STREAM_UPLINK); + break; + case ETMSGetSupportedDecoders: + GetSupportedCodecsL(aMessage, TMS_STREAM_DOWNLINK); + break; + case ETMSSetOutput: + SetOutput(aMessage); + break; + case ETMSGetOutput: + iServer.GetOutput(aMessage); + break; + case ETMSGetPreviousOutput: + iServer.GetPreviousOutput(aMessage); + break; + case ETMSGetAvailableOutputs: + iServer.GetAvailableOutputs(aMessage); + break; + case ETMSStartRoutingNotifier: + iServer.StartRoutingNotifierL(); + aMessage.Complete(KErrNone); + break; + case ETMSCancelRoutingNotifier: + iServer.CancelRoutingNotifier(); + aMessage.Complete(KErrNone); + break; + case ETMSStartGlobalEffectNotifier: + iServer.StartCenRepHandlerL(); + aMessage.Complete(KErrNone); + break; + case ETMSCancelGlobalEffectNotifier: + iServer.CancelCenRepHandler(); + aMessage.Complete(KErrNone); + break; + case ETMSSetMsgQueueHandle: + SetMessageQueueHandleL(aMessage); + break; + case ETMSSetGlobalVol: + SetVolLevel(aMessage); + break; + case ETMSGetGlobalVol: + iServer.GetLevel(aMessage); + break; + case ETMSGetMaxGlobalVol: + iServer.GetMaxLevel(aMessage); + break; + case ETMSSetGlobalGain: + SetMicGain(aMessage); + break; + case ETMSGetGlobalGain: + iServer.GetGain(aMessage); + break; + case ETMSGetMaxGlobalGain: + iServer.GetMaxGain(aMessage); + break; + default: + User::Leave(KErrNotSupported); + break; + } + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::SetMessageQueueHandleL +// +// Open message queue for handling server notifications back to the client. +// ----------------------------------------------------------------------------- +// +void TMSServerSession::SetMessageQueueHandleL(const RMessage2& aMessage) + { + gint status = KErrNone; + if (iMsgQueue.Handle() <= 0) + { + status = iMsgQueue.Open(aMessage, 0); + } + if (status != KErrNone) + { + User::Leave(KErrArgument); + } + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::SetVolLevel +// ----------------------------------------------------------------------------- +// +void TMSServerSession::SetVolLevel(const RMessage2& aMessage) + { + TInt level = aMessage.Int0(); + iServer.SetLevel(this, TRUE, level); + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::SetMicGain +// ----------------------------------------------------------------------------- +// +void TMSServerSession::SetMicGain(const RMessage2& aMessage) + { + TInt gain = aMessage.Int0(); + iServer.SetGain(this, gain); + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::HandleGlobalEffectChange +// ----------------------------------------------------------------------------- +// +void TMSServerSession::HandleGlobalEffectChange(TInt globalevent) + { + TRACE_PRN_FN_ENT; + iMsgBuffer.iRequest = ECmdGlobalEffectChange; + iMsgBuffer.iStatus = KErrNone; + iMsgBuffer.iInt = globalevent; + NotifyClient(); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::HandleRoutingChange +// ----------------------------------------------------------------------------- +// +void TMSServerSession::HandleRoutingChange(TRoutingMsgBufPckg routinginfo) + { + TRACE_PRN_FN_ENT; + iMsgBuffer.iRequest = ECmdGlobalRoutingChange; + iMsgBuffer.iStatus = KErrNone; + iMsgBuffer.iInt = routinginfo().iEvent; + iMsgBuffer.iUint = routinginfo().iOutput; + NotifyClient(); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::GetTMSCallSessionHandleL +// ----------------------------------------------------------------------------- +// +void TMSServerSession::GetTMSCallSessionHandleL(const RMessage2& aMessage) + { + TRACE_PRN_FN_ENT; + if (iTMSCallSessionHandle.Handle() == 0) + { + iServer.GetNewTMSCallSessionHandleL(iTMSCallSessionHandle); + } + aMessage.Complete(iTMSCallSessionHandle); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::GetCodecsCountL +// +// Note: Currently, no data persists as a new session is created each time +// before calling this method. +// ----------------------------------------------------------------------------- +// +void TMSServerSession::GetCodecsCountL(const RMessage2& aMessage, + TMSStreamType strmType) + { + TInt err = KErrNone; + TInt codecsCount = 0; + + RArray* codecs; + iServer.GetSupportedCodecs(strmType, codecs); + + if (codecs) + { + codecsCount = codecs->Count(); + } + + if (codecsCount <= 0) + { + delete iDevSound; + iDevSound = NULL; + iDevSound = CMMFDevSound::NewL(); + + if (iDevSound) + { + codecs->Reset(); + TMMFPrioritySettings priority; + + if (strmType == TMS_STREAM_UPLINK) + { + iDevSound->GetSupportedInputDataTypesL(*codecs, priority); + } + else if (strmType == TMS_STREAM_DOWNLINK) + { + iDevSound->GetSupportedOutputDataTypesL(*codecs, priority); + } + else + { + err = KErrNotSupported; + } + +#ifdef __WINSCW__ + // Support for adaptation stubs + codecs->Append(KMccFourCCIdG711); + codecs->Append(KMccFourCCIdG729); + codecs->Append(KMccFourCCIdILBC); + codecs->Append(KMccFourCCIdAMRNB); +#endif + codecsCount = codecs->Count(); + } + + delete iDevSound; + iDevSound = NULL; + } + + TmsMsgBufPckg p; + p().iInt = codecsCount; +#ifndef __WINSCW__ + p().iUint = 0; // G711 frame size undetermined + //TODO: query G.711 codec to find its correct frame size (10 or 20 ms) +#else + p().iUint = KTMSG711FrameLen20ms; +#endif //__WINSCW__ + p().iStatus = err; + aMessage.WriteL(0, p); + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::GetSupportedEncodersL +// +// ----------------------------------------------------------------------------- +// +void TMSServerSession::GetSupportedCodecsL(const RMessage2& aMessage, + TMSStreamType strmType) + { + TRACE_PRN_FN_ENT; + + CBufFlat* dataCopyBuffer = CBufFlat::NewL(KArrayExpandSize); + CleanupStack::PushL(dataCopyBuffer); + RBufWriteStream stream; + stream.Open(*dataCopyBuffer); + CleanupClosePushL(stream); + + RArray* codecs; + iServer.GetSupportedCodecs(strmType, codecs); + TInt codecsCount = 0; + codecsCount = codecs->Count(); + + for (TInt i = 0; i < codecsCount; i++) + { + TFourCC fcc = (codecs->Array())[i]; + stream.WriteUint32L(fcc.FourCC()); + TRACE_PRN_N2(_L("TMS->Codec[%d]==[0x%x]"), i+1, fcc.FourCC()); + } + + aMessage.WriteL(0, dataCopyBuffer->Ptr(0)); + CleanupStack::PopAndDestroy(&stream); + CleanupStack::PopAndDestroy(dataCopyBuffer); + aMessage.Complete(KErrNone); + + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::SetOutput +// ----------------------------------------------------------------------------- +// +void TMSServerSession::SetOutput(const RMessage2& aMessage) + { + TInt output = aMessage.Int0(); + iServer.SetOutput(this, output); + aMessage.Complete(KErrNone); + } + +// ----------------------------------------------------------------------------- +// TMSServerSession::NotifyClient +// ----------------------------------------------------------------------------- +// +void TMSServerSession::NotifyClient() + { + if (iMsgQueue.Handle() > 0) + { + iMsgQueue.Send(iMsgBuffer); + } + } + +// End of file