diff -r a36789189b53 -r 095bea5f582e mmserv/tms/tmsproxy/src/tmsproxy.cpp --- a/mmserv/tms/tmsproxy/src/tmsproxy.cpp Thu Aug 19 10:26:11 2010 +0300 +++ b/mmserv/tms/tmsproxy/src/tmsproxy.cpp Tue Aug 31 15:43:02 2010 +0300 @@ -16,9 +16,13 @@ */ #include +#include #include #include #include +#include +#include +#include #include "tmsutility.h" #include "tmsclientserver.h" #include "tmsproxy.h" @@ -26,11 +30,12 @@ using namespace TMS; // CONSTANTS -const TUint KTMSServerConnectRetries = 2; -const TUint KSessionMessageSlots = 10; +const guint KTMSServerConnectRetries = 2; +const guint KSessionMessageSlots = 10; +const guint KUTF8Multiply = 2; // ----------------------------------------------------------------------------- -// StartServer +// TMSProxy::StartServer // // Function that will launch TMS server executable in it its own process. // Start the server process/thread, which lives in an EPOCEXE object. @@ -114,14 +119,13 @@ { TRACE_PRN_FN_ENT; - gint retry = KTMSServerConnectRetries; + guint retry = KTMSServerConnectRetries; gint err(TMS_RESULT_GENERAL_ERROR); - gint numMessageSlots = KSessionMessageSlots; for (;;) { // Try to create a new session with the server - err = CreateSession(KTMSServerName, Version(), numMessageSlots); + err = CreateSession(KTMSServerName, Version(), KSessionMessageSlots); if ((err != KErrNotFound) && (err != KErrServerTerminated)) { @@ -178,9 +182,8 @@ EXPORT_C gint TMSProxy::GetTMSCallSessionHandle() { - gint err(TMS_RESULT_SUCCESS); - err = SendReceive(ETMSCallSessionHandle); - return TMSRESULT(err); + gint handle = SendReceive(ETMSCallSessionHandle); + return handle; } EXPORT_C gint TMSProxy::GetSupportedDecoders(RArray& aDecoders, @@ -397,6 +400,215 @@ return TMSRESULT(status); } +EXPORT_C gint TMSProxy::InitRT(const TMSRingToneType type, GString* str, + GString* tts) + { + TRACE_PRN_FN_ENT; + gint status(TMS_RESULT_INVALID_ARGUMENT); + TIpcArgs args; + HBufC* ttsBuf(NULL); + + if (tts) + { + // Convert buffer from UTF-8 to unicode (16-bit) + // Note: UTF-8 strings can take up to 4 bytes per character + guint unilen = tts->len / KUTF8Multiply; + TRAP(status, ttsBuf = HBufC::NewL(unilen)); + if (status == KErrNone) + { + TPtr p = ttsBuf->Des(); + p.Copy((TUint16*) tts->str, unilen); + args.Set(1, &p); + } + } + + switch (type) + { + case TMS_RINGTONE_DEFAULT: + { + status = RSessionBase::SendReceive(ETMSRingToneInitDefault, args); + break; + } + case TMS_RINGTONE_FILE: + { + if (str) + { + HBufC* buf(NULL); + // Convert buffer from UTF-8 to unicode (16-bit) + // Note: UTF-8 strings can take up to 4 bytes per character + guint unilen = str->len / KUTF8Multiply; + + TRAP(status, buf = HBufC::NewL(unilen)); + if (buf && status == KErrNone) + { + TPtr p = buf->Des(); + p.Copy((TUint16*) str->str, unilen); + TIpcArgs args; + args.Set(0, &p); + status = RSessionBase::SendReceive(ETMSRingToneInitFile, + args); + } + delete buf; + buf = NULL; + } + break; + } + case TMS_RINGTONE_BEEP_ONCE: + { + status = RSessionBase::SendReceive(ETMSRingToneInitBeepOnce); + break; + } + case TMS_RINGTONE_SILENT: + { + status = RSessionBase::SendReceive(ETMSRingToneInitSilent); + break; + } + case TMS_RINGTONE_UNSECURE_VOIP: + { + status = RSessionBase::SendReceive(ETMSRingToneInitUnsecureVoIP); + break; + } + case TMS_RINGTONE_SEQUENCE: + { + if (str) + { + HBufC8* buf(NULL); + gint len = str->len; + TRAP(status, buf = HBufC8::NewL(len)); + if (buf && status == KErrNone) + { + TPtr8 p = buf->Des(); + p.Copy((TUint8*) str->str, len); + TIpcArgs args; + args.Set(0, &p); + status = RSessionBase::SendReceive( + ETMSRingToneInitSequence, args); + } + delete buf; + buf = NULL; + } + break; + } + default: + break; + } + + delete ttsBuf; + ttsBuf = NULL; + + TRACE_PRN_FN_EXT; + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::DeinitRT() + { + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSRingToneDeinit); + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::PlayRT() + { + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSRingTonePlay); + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::StopRT() + { + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSRingToneStop); + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::PauseRT() + { + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSRingTonePause); + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::MuteRT() + { + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSRingToneMute); + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::InitDTMFPlayer(TMSStreamType streamtype) + { + gint status(TMS_RESULT_SUCCESS); + TIpcArgs args; + args.Set(0, streamtype); + status = RSessionBase::SendReceive(ETMSInitDTMF, args); + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::StartDTMF(TMSStreamType streamtype, GString* tone) + { + TRACE_PRN_FN_ENT; + __ASSERT_ALWAYS(tone, PANIC(TMS_RESULT_NULL_ARGUMENT)); + + gint status(TMS_RESULT_SUCCESS); + HBufC* buf(NULL); + TRAP(status, buf = HBufC::NewL(tone->len)); + if (status == KErrNone) + { + TPtr p1 = buf->Des(); + TPtr8 p2((TUint8*) tone->str, tone->len, tone->len); + p1.Copy(p2); + + TRACE_PRN_N(p1); + + TIpcArgs args; + args.Set(0, streamtype); + args.Set(1, &p1); + status = RSessionBase::SendReceive(ETMSStartDTMF, args); + } + delete buf; + buf = NULL; + TRACE_PRN_FN_EXT; + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::StopDTMF(TMSStreamType streamtype) + { + TRACE_PRN_FN_ENT; + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSStopDTMF, TIpcArgs(streamtype)); + TRACE_PRN_FN_EXT; + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::ContinueDTMFStringSending(gboolean continuesending) + { + TRACE_PRN_FN_ENT; + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSContinueDTMF, + TIpcArgs(continuesending)); + TRACE_PRN_FN_EXT; + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::StartInbandTone(TMSInbandToneType inbandtonetype) + { + TRACE_PRN_FN_ENT; + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSStartInbandTone, + TIpcArgs(inbandtonetype)); + TRACE_PRN_FN_EXT; + return TMSRESULT(status); + } + +EXPORT_C gint TMSProxy::StopInbandTone() + { + TRACE_PRN_FN_ENT; + gint status(TMS_RESULT_SUCCESS); + status = RSessionBase::SendReceive(ETMSStopInbandTone); + TRACE_PRN_FN_EXT; + return TMSRESULT(status); + } + EXPORT_C gint TMSProxy::StartGlobalEffectNotifier() { gint status(TMS_RESULT_SUCCESS); @@ -446,6 +658,20 @@ *(static_cast(obsrv)), *(static_cast(parent)), clientid); break; + case EMsgQueueRingtoneType: + status = AddRingToneObserver( + *(static_cast(obsrv)), + *(static_cast(parent)), clientid); + break; + case EMsgQueueDTMFType: + status = AddDTMFObserver(*(static_cast(obsrv)), + *(static_cast(parent)), clientid); + break; + case EMsgQueueInbandToneType: + status = AddInbandToneObserver( + *(static_cast(obsrv)), + *(static_cast(parent)), clientid); + break; default: status = TMS_RESULT_INVALID_ARGUMENT; break; @@ -473,6 +699,18 @@ status = RemoveRoutingObserver( *(static_cast(obsrv))); break; + case EMsgQueueRingtoneType: + status = RemoveRingToneObserver( + *(static_cast(obsrv))); + break; + case EMsgQueueDTMFType: + status = RemoveDTMFObserver( + *(static_cast(obsrv))); + break; + case EMsgQueueInbandToneType: + status = RemoveInbandToneObserver( + *(static_cast(obsrv))); + break; default: status = TMS_RESULT_INVALID_ARGUMENT; break; @@ -568,6 +806,104 @@ return TMSRESULT(status); } +gint TMSProxy::AddRingToneObserver(TMSRingToneObserver& obsrv, + TMSRingTone& parent, gint /*clientid*/) + { + gint status = iRingToneObsrvrList.Find(&obsrv); + if (status == KErrNotFound) + { + status = iRingToneObsrvrList.Append(&obsrv); + status = iRingToneParentList.Append(&parent); + } + else + { + status = TMS_RESULT_ALREADY_EXIST; + } + return TMSRESULT(status); + } + +gint TMSProxy::RemoveRingToneObserver(TMSRingToneObserver& obsrv) + { + gint status(TMS_RESULT_SUCCESS); + gint index = iRingToneObsrvrList.Find(&obsrv); + if (index >= 0) + { + iRingToneObsrvrList.Remove(index); + iRingToneParentList.Remove(index); + } + else + { + status = TMS_RESULT_DOES_NOT_EXIST; + } + return TMSRESULT(status); + } + +gint TMSProxy::AddDTMFObserver(TMSDTMFObserver& obsrv, TMSDTMF& parent, + gint /*clientid*/) + { + // Add to list if observer is not already added + gint status = iDTMFObsrvrList.Find(&obsrv); + if (status == KErrNotFound) + { + status = iDTMFObsrvrList.Append(&obsrv); + status = iDTMFParentList.Append(&parent); + } + else + { + status = TMS_RESULT_ALREADY_EXIST; + } + return TMSRESULT(status); + } + +gint TMSProxy::RemoveDTMFObserver(TMSDTMFObserver& obsrv) + { + gint status(TMS_RESULT_SUCCESS); + gint index = iDTMFObsrvrList.Find(&obsrv); + if (index >= 0) + { + iDTMFObsrvrList.Remove(index); + iDTMFParentList.Remove(index); + } + else + { + status = TMS_RESULT_DOES_NOT_EXIST; + } + return TMSRESULT(status); + } + +gint TMSProxy::AddInbandToneObserver(TMSInbandToneObserver& obsrv, + TMSInbandTone& parent, gint /*clientid*/) + { + // Add to list if observer is not already added + gint status = iInbandToneObsrvrList.Find(&obsrv); + if (status == KErrNotFound) + { + status = iInbandToneObsrvrList.Append(&obsrv); + status = iInbandToneParentList.Append(&parent); + } + else + { + status = TMS_RESULT_ALREADY_EXIST; + } + return TMSRESULT(status); + } + +gint TMSProxy::RemoveInbandToneObserver(TMSInbandToneObserver& obsrv) + { + gint status(TMS_RESULT_SUCCESS); + gint index = iInbandToneObsrvrList.Find(&obsrv); + if (index >= 0) + { + iInbandToneObsrvrList.Remove(index); + iInbandToneParentList.Remove(index); + } + else + { + status = TMS_RESULT_DOES_NOT_EXIST; + } + return TMSRESULT(status); + } + // --------------------------------------------------------------------------- // TMSProxy::CreateQueue // --------------------------------------------------------------------------- @@ -666,6 +1002,36 @@ } break; } + case TMS_EVENT_RINGTONE_OPEN_COMPLETE: + case TMS_EVENT_RINGTONE_PLAY_COMPLETE: + case TMS_EVENT_RINGTONE_DEINIT_COMPLETE: + { + for (gint i = 0; i < iRingToneObsrvrList.Count(); i++) + { + iRingToneObsrvrList[i]->RingtoneEvent(*iRingToneParentList[i], + event); + } + break; + } + case TMS_EVENT_DTMF_TONE_STARTED: + case TMS_EVENT_DTMF_TONE_STOPPED: + { + for (gint i = 0; i < iDTMFObsrvrList.Count(); i++) + { + iDTMFObsrvrList[i]->DTMFEvent(*iDTMFParentList[i], event); + } + break; + } + case TMS_EVENT_INBAND_TONE_STARTED: + case TMS_EVENT_INBAND_TONE_STOPPED: + { + for (gint i = 0; i < iInbandToneObsrvrList.Count(); i++) + { + iInbandToneObsrvrList[i]->InbandToneEvent( + *iInbandToneParentList[i], event); + } + break; + } default: break; } @@ -679,9 +1045,15 @@ { iEffectsObsrvrList.Reset(); iRoutingObsrvrList.Reset(); + iRingToneObsrvrList.Reset(); + iDTMFObsrvrList.Reset(); + iInbandToneObsrvrList.Reset(); iEffectsParentList.Reset(); iRoutingParentList.Reset(); + iRingToneParentList.Reset(); + iDTMFParentList.Reset(); + iInbandToneParentList.Reset(); } // End of file