diff -r a36789189b53 -r 095bea5f582e mmserv/tms/tmsserver/src/tmsdtmfprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/tms/tmsserver/src/tmsdtmfprovider.cpp Tue Aug 31 15:43:02 2010 +0300 @@ -0,0 +1,307 @@ +/* + * 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 +#include "tmsdtmfprovider.h" +#include "tmsdtmfobserver.h" +#include "tmsutility.h" +#include "tmseteldtmfmonitor.h" +#include "tmseteldtmfstopmonitor.h" + +using namespace TMS; + +TMSDTMFProvider* TMSDTMFProvider::NewL() + { + TRACE_PRN_FN_ENT; + TMSDTMFProvider* self = new (ELeave) TMSDTMFProvider(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + TRACE_PRN_FN_EXT; + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor of the object. +// ----------------------------------------------------------------------------- +// +TMSDTMFProvider::~TMSDTMFProvider() + { + TRACE_PRN_FN_ENT; + Cancel(); + iObservers.Close(); + delete iMonitor; + delete iStopMonitor; + + iMmCustom.Close(); + iPhone.Close(); + iServer.UnloadPhoneModule(iTsyname); + iServer.Close(); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// Constructs the requester. +// ----------------------------------------------------------------------------- +// +TMSDTMFProvider::TMSDTMFProvider() : + CActive(EPriorityStandard) + { + TRACE_PRN_FN_ENT; + CActiveScheduler::Add(this); + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// Constructs the requester in the second phase. +// ----------------------------------------------------------------------------- +// +void TMSDTMFProvider::ConstructL() + { + TRACE_PRN_FN_ENT; + + User::LeaveIfError(iServer.Connect()); + + TRACE_PRN_N(_L("**TMS ETel iServer.Connect")); + + User::LeaveIfError(iServer.GetTsyName(0, iTsyname)); + + //Load in the phone device driver + User::LeaveIfError(iServer.LoadPhoneModule(iTsyname)); + + TRACE_PRN_N(_L("**TMS ETel iServer.LoadPhoneModule")); + + //Find the number of phones available from the tel server + gint numberPhones; + User::LeaveIfError(iServer.EnumeratePhones(numberPhones)); + + TRACE_PRN_N(_L("**TMS ETel iServer.EnumeratePhones")); + + //Check there are available phones + if (numberPhones < 1) + { + User::Leave(KErrNotFound); + } + + //Get info about the first available phone + RTelServer::TPhoneInfo info; + User::LeaveIfError(iServer.GetPhoneInfo(0, info)); + + TRACE_PRN_N(_L("**TMS ETel iServer.GetPhoneInfo")); + + CleanupClosePushL(iPhone); + User::LeaveIfError(iPhone.Open(iServer, info.iName)); + + TRACE_PRN_N(_L("**TMS ETel iPhone.Open")); + + RMobilePhone::TLineInfo lineInfo; + User::LeaveIfError(iPhone.GetLineInfo(0, lineInfo)); + + TRACE_PRN_N(_L("**TMS ETel iPhone.GetLineInfo")); + + gint errorCode = iMmCustom.Open(iPhone); + + if (!iPhone.SubSessionHandle() || !iMmCustom.SubSessionHandle()) + { + User::Leave(KErrArgument); + } + iMonitor = TMSEtelDtmfMonitor::NewL(*this, iMmCustom); + iMonitor->StartMonitoring(); + iStopMonitor = TMSEtelDtmfStopMonitor::NewL(*this, iPhone); + // iStopMonitor->StartMonitoring(); + + CleanupStack::Pop(1);//phone + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// Notifies observers about a DTMF event +// ----------------------------------------------------------------------------- +// +void TMSDTMFProvider::NotifyDTMFEvent( + const TMSDTMFObserver::TCCPDtmfEvent aEvent, const gint aError, + const TChar aTone) + { + TRACE_PRN_FN_ENT; + for (gint i = 0; i < iObservers.Count(); i++) + { + TMSDTMFObserver* obs = iObservers[i]; + if (obs) + { + iObservers[i]->HandleDTMFEvent(aEvent, aError, aTone); + } + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// Cancel DTMF string sending +// ----------------------------------------------------------------------------- +// +gint TMSDTMFProvider::CancelDtmfStringSending() + { + TRACE_PRN_FN_ENT; + gint ret(KErrAlreadyExists); + if (IsActive()) + { + Cancel(); + ret = KErrNone; + } + TRACE_PRN_FN_EXT; + return ret; + } + +// ----------------------------------------------------------------------------- +// Starts DTMF string sending +// ----------------------------------------------------------------------------- +// +gint TMSDTMFProvider::StartDtmfTone(const TChar aTone) + { + TRACE_PRN_FN_ENT; + gint ret(KErrAlreadyExists); + if (!IsActive()) + { + ret = iPhone.StartDTMFTone(aTone); + } + TRACE_PRN_IF_ERR(ret); + TRACE_PRN_FN_EXT; + return ret; + } + +// ----------------------------------------------------------------------------- +// Stop DTMF tone +// ----------------------------------------------------------------------------- +// +gint TMSDTMFProvider::StopDtmfTone() + { + TRACE_PRN_FN_ENT; + gint ret(KErrAlreadyExists); + if (!IsActive()) + { + ret = iPhone.StopDTMFTone(); + } + TRACE_PRN_IF_ERR(ret); + TRACE_PRN_FN_EXT; + return ret; + } + +// ----------------------------------------------------------------------------- +// Send DTMF string +// ----------------------------------------------------------------------------- +// +gint TMSDTMFProvider::SendDtmfToneString(const TDesC& aString) + { + TRACE_PRN_FN_ENT; + gint ret = KErrInUse; + if (!IsActive()) + { + iStatus = KRequestPending; + iPhone.SendDTMFTones(iStatus, aString); + SetActive(); + ret = KErrNone; + } + TRACE_PRN_IF_ERR(ret); + TRACE_PRN_FN_EXT; + return ret; + } + +// ----------------------------------------------------------------------------- +// Continue DTMF string sending +// ----------------------------------------------------------------------------- +// +gint TMSDTMFProvider::ContinueDtmfStringSending(const gboolean aContinue) + { + TRACE_PRN_FN_ENT; + gint status = iPhone.ContinueDTMFStringSending(aContinue); + TRACE_PRN_FN_EXT; + return status; + } + +// ----------------------------------------------------------------------------- +// Adds observer. +// ----------------------------------------------------------------------------- +// +void TMSDTMFProvider::AddObserver(const TMSDTMFObserver& aObserver) + { + TRACE_PRN_FN_ENT; + if (iObservers.Find(&aObserver) == KErrNotFound) + { + iObservers.Append(&aObserver); + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// Removes given observer. +// ----------------------------------------------------------------------------- +// +gint TMSDTMFProvider::RemoveObserver(const TMSDTMFObserver& aObserver) + { + TRACE_PRN_FN_ENT; + gint ret = KErrNotFound; + gint found = iObservers.Find(&aObserver); + if (found != KErrNotFound) + { + iObservers.Remove(found); + ret = KErrNone; + } + TRACE_PRN_FN_EXT; + return ret; + } + +// ----------------------------------------------------------------------------- +// From CActive. +// Handles request completion. +// ----------------------------------------------------------------------------- +// +void TMSDTMFProvider::RunL() + { + TRACE_PRN_FN_ENT; + if (iStatus == KErrNone) + { + TMSDTMFObserver::TCCPDtmfEvent event = + TMSDTMFObserver::ECCPDtmfStringSendingCompleted; + NotifyDTMFEvent(event, KErrNone, NULL); + } + else + { + gint error = iStatus.Int(); + if (error != KErrCancel) + { + TMSDTMFObserver::TCCPDtmfEvent event = + TMSDTMFObserver::ECCPDtmfStringSendingCompleted; + NotifyDTMFEvent(event, error, NULL); + TRACE_PRN_IF_ERR(error); + } + // Cancel is not notified + } + TRACE_PRN_FN_EXT; + } + +// ----------------------------------------------------------------------------- +// From CActive +// Canceling functionality. +// ----------------------------------------------------------------------------- +// +void TMSDTMFProvider::DoCancel() + { + TRACE_PRN_FN_ENT; + iPhone.CancelAsyncRequest(EMobilePhoneSendDTMFTones); + TRACE_PRN_FN_EXT; + } +