mmserv/tms/tmsproxy/src/tmsproxy.cpp
branchRCL_3
changeset 45 095bea5f582e
parent 18 2eb3b066cc7d
child 46 0ac9a5310753
--- 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 <s32mem.h>
+#include <gstring.h>
 #include <AudioPreference.h>
 #include <tmseffectobsrvr.h>
 #include <tmsglobalroutingobsrvr.h>
+#include <tmsringtoneobsrvr.h>
+#include <tmsdtmfobsrvr.h>
+#include <tmsinbandtoneobsrvr.h>
 #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<TUint32>& 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<TMSGlobalRoutingObserver*>(obsrv)),
                     *(static_cast<TMSGlobalRouting*>(parent)), clientid);
             break;
+        case EMsgQueueRingtoneType:
+            status = AddRingToneObserver(
+                    *(static_cast<TMSRingToneObserver*>(obsrv)),
+                    *(static_cast<TMSRingTone*>(parent)), clientid);
+            break;
+        case EMsgQueueDTMFType:
+            status = AddDTMFObserver(*(static_cast<TMSDTMFObserver*>(obsrv)),
+                    *(static_cast<TMSDTMF*>(parent)), clientid);
+            break;
+        case EMsgQueueInbandToneType:
+            status = AddInbandToneObserver(
+                    *(static_cast<TMSInbandToneObserver*>(obsrv)),
+                    *(static_cast<TMSInbandTone*>(parent)), clientid);
+            break;
         default:
             status = TMS_RESULT_INVALID_ARGUMENT;
             break;
@@ -473,6 +699,18 @@
             status = RemoveRoutingObserver(
                     *(static_cast<TMSGlobalRoutingObserver*>(obsrv)));
             break;
+        case EMsgQueueRingtoneType:
+            status = RemoveRingToneObserver(
+                    *(static_cast<TMSRingToneObserver*>(obsrv)));
+            break;
+        case EMsgQueueDTMFType:
+            status = RemoveDTMFObserver(
+                    *(static_cast<TMSDTMFObserver*>(obsrv)));
+            break;
+        case EMsgQueueInbandToneType:
+            status = RemoveInbandToneObserver(
+                    *(static_cast<TMSInbandToneObserver*>(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