mmserv/tms/tmsproxy/src/tmsproxy.cpp
changeset 12 5a06f39ad45b
parent 0 71ca22bcf22a
child 14 80975da52420
--- a/mmserv/tms/tmsproxy/src/tmsproxy.cpp	Tue Feb 02 01:08:46 2010 +0200
+++ b/mmserv/tms/tmsproxy/src/tmsproxy.cpp	Fri Apr 16 15:29:42 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,8 +30,9 @@
 using namespace TMS;
 
 // CONSTANTS
-const TUint KServerConnectRetries = 2;
+const TUint KTMSServerConnectRetries = 2;
 const TUint KSessionMessageSlots = 10;
+const TUint KUTF8Multiply = 2;
 
 // -----------------------------------------------------------------------------
 // StartServer
@@ -76,10 +81,7 @@
 //
 EXPORT_C TMSProxy::TMSProxy()
     {
-    iEffectsObsrvrList.Reset();
-    iEffectsParentList.Reset();
-    iRoutingObsrvrList.Reset();
-    iRoutingParentList.Reset();
+    ResetObjectLists();
     iMsgQHandler = NULL;
     }
 
@@ -89,10 +91,7 @@
 //
 EXPORT_C TMSProxy::~TMSProxy()
     {
-    iEffectsObsrvrList.Reset();
-    iEffectsParentList.Reset();
-    iRoutingObsrvrList.Reset();
-    iRoutingParentList.Reset();
+    ResetObjectLists();
 
     if (iMsgQHandler)
         {
@@ -118,7 +117,7 @@
     {
     TRACE_PRN_FN_ENT;
 
-    gint retry = KServerConnectRetries;
+    gint retry = KTMSServerConnectRetries;
     gint err(TMS_RESULT_GENERAL_ERROR);
     gint numMessageSlots = KSessionMessageSlots;
 
@@ -165,8 +164,8 @@
 //
 EXPORT_C TVersion TMSProxy::Version() const
     {
-    return (TVersion(KTMSServMajorVersionNumber,
-            KTMSServMinorVersionNumber, KTMSServBuildVersionNumber));
+    return (TVersion(KTMSServMajorVersionNumber, KTMSServMinorVersionNumber,
+            KTMSServBuildVersionNumber));
     }
 
 // -----------------------------------------------------------------------------
@@ -401,6 +400,221 @@
     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
+        gint 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
+                gint unilen = str->len / KUTF8Multiply;
+
+                TRAP(status, buf = HBufC::NewL(unilen));
+                if (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 (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::StartDTMF(TMSStreamType streamtype, GString* tone)
+    {
+    TRACE_PRN_FN_ENT;
+    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::StartDTMFNotifier()
+    {
+    gint status(TMS_RESULT_SUCCESS);
+    status = RSessionBase::SendReceive(ETMSStartDTMFNotifier); //DTMFHandler
+    return TMSRESULT(status);
+    }
+
+EXPORT_C gint TMSProxy::CancelDTMFNotifier()
+    {
+    gint status(TMS_RESULT_SUCCESS);
+    status = RSessionBase::SendReceive(ETMSCancelDTMFNotifier); //DTMFHandler
+    return TMSRESULT(status);
+    }
+
 EXPORT_C gint TMSProxy::StartGlobalEffectNotifier()
     {
     gint status(TMS_RESULT_SUCCESS);
@@ -442,11 +656,23 @@
         case EMsgQueueGlobalVolumeType:
         case EMsgQueueGlobalGainType:
             status = AddGlobalEffectObserver((*(TMSEffectObserver*) obsrv),
-                    (*(TMSEffect*)parent), clientid);
+                    (*(TMSEffect*) parent), clientid);
             break;
         case EMsgQueueGlobalRoutingType:
             status = AddRoutingObserver((*(TMSGlobalRoutingObserver*) obsrv),
-                    (*(TMSGlobalRouting*)parent), clientid);
+                    (*(TMSGlobalRouting*) parent), clientid);
+            break;
+        case EMsgQueueRingtoneType:
+            status = AddRingToneObserver((*(TMSRingToneObserver*) obsrv),
+                    (*(TMSRingTone*) parent), clientid);
+            break;
+        case EMsgQueueDTMFType:
+            status = AddDTMFObserver((*(TMSDTMFObserver*) obsrv),
+                    (*(TMSDTMF*) parent), clientid);
+            break;
+        case EMsgQueueInbandToneType:
+            status = AddInbandToneObserver((*(TMSInbandToneObserver*) obsrv),
+                    (*(TMSInbandTone*) parent), clientid);
             break;
         default:
             status = TMS_RESULT_INVALID_ARGUMENT;
@@ -471,7 +697,18 @@
             status = RemoveGlobalEffectObserver((*(TMSEffectObserver*) obsrv));
             break;
         case EMsgQueueGlobalRoutingType:
-            status = RemoveRoutingObserver((*(TMSGlobalRoutingObserver*) obsrv));
+            status = RemoveRoutingObserver((*(TMSGlobalRoutingObserver*)
+                    obsrv));
+            break;
+        case EMsgQueueRingtoneType:
+            status = RemoveRingToneObserver((*(TMSRingToneObserver*) obsrv));
+            break;
+        case EMsgQueueDTMFType:
+            status = RemoveDTMFObserver((*(TMSDTMFObserver*) obsrv));
+            break;
+        case EMsgQueueInbandToneType:
+            status = RemoveInbandToneObserver((*(TMSInbandToneObserver*)
+                    obsrv));
             break;
         default:
             status = TMS_RESULT_INVALID_ARGUMENT;
@@ -512,7 +749,6 @@
         {
         status = iEffectsObsrvrList.Append(&obsrv);
         status = iEffectsParentList.Append(&parent);
-        //status = iClientList.Append(clientid);
         }
     else
         {
@@ -529,7 +765,6 @@
         {
         iEffectsObsrvrList.Remove(index);
         iEffectsParentList.Remove(index);
-        //iClientList.Remove(index);
         }
     else
         {
@@ -546,7 +781,6 @@
         {
         status = iRoutingObsrvrList.Append(&obsrv);
         status = iRoutingParentList.Append(&parent);
-        //status = iClientList.Append(clientid);
         }
     else
         {
@@ -563,7 +797,104 @@
         {
         iRoutingObsrvrList.Remove(index);
         iRoutingParentList.Remove(index);
-        //iClientList.Remove(index);
+        }
+    else
+        {
+        status = TMS_RESULT_DOES_NOT_EXIST;
+        }
+    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
         {
@@ -612,7 +943,7 @@
         }
     else
         {
-        iMsgQHandler = CQueueHandler::NewL(&iMsgQueue, NULL);
+        iMsgQHandler = TMSQueueHandler::NewL(&iMsgQueue, NULL);
         iMsgQHandler->AddObserver(*this, -1);
         }
     iMsgQHandler->Start();
@@ -653,8 +984,38 @@
                 }
             for (gint i = 0; i < iRoutingObsrvrList.Count(); i++)
                 {
-                iRoutingObsrvrList[i]->GlobalRoutingEvent(iRoutingParentList[i],
-                        event, output);
+                iRoutingObsrvrList[i]->GlobalRoutingEvent(
+                        iRoutingParentList[i], event, output);
+                }
+            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;
             }
@@ -663,4 +1024,23 @@
         }
     }
 
+// ---------------------------------------------------------------------------
+// TMSProxy::ResetObjectLists
+// ---------------------------------------------------------------------------
+//
+void TMSProxy::ResetObjectLists()
+    {
+    iEffectsObsrvrList.Reset();
+    iRoutingObsrvrList.Reset();
+    iRingToneObsrvrList.Reset();
+    iDTMFObsrvrList.Reset();
+    iInbandToneObsrvrList.Reset();
+
+    iEffectsParentList.Reset();
+    iRoutingParentList.Reset();
+    iRingToneParentList.Reset();
+    iDTMFParentList.Reset();
+    iInbandToneParentList.Reset();
+    }
+
 // End of file