I write an IVR program with tapiex activex v3.6 and i want to get multi-calls per line but in my program when the program is in call and i want to call it at the same time, it is busy! what should i do? should i put the connected call in on hold? if yes when i have to do this? when the program is in call and someone try to call it at the same time, will an event fired up? if yes which event? should my program be multi-thread? i tried to make it multi-thread but this error happened!
'COM object that has been separated from its underlying RCW cannot be used.'
StartIvr();
//UiGlobal.ThreadManager.StartThread(o => StartIvr());
this is my startIvr method
private void StartIvr()
{
UI.Class.IVR.EventHandler eventHandler = new Class.IVR.EventHandler();
eventHandler.InitPhone();
eventHandler.OpenLine(null);
UiGlobal.eventHandler = eventHandler;
}
and this is my event handler class
class EventHandler
{
public List<string> linesName { get; set; }
public AxTAPIEXLib.AxTAPIExCtl Tapiex_com { get; set; }
public bool IsOutputCall = false;
CallHandler callHandler;
public EventHandler()
{
linesName = new List<string>();
Tapiex_com = new AxTAPIEXLib.AxTAPIExCtl();
}
public EventHandler(AxTAPIEXLib.AxTAPIExCtl Tapiex_com)
{
linesName = new List<string>();
this.Tapiex_com = Tapiex_com;
}
public ITAPILine Find_line(string LineName)
{
ITAPILine line = null;
for (int i = 0; i < Tapiex_com.Lines.Count; i++)
if (Tapiex_com.Lines.Item(i).Name == LineName)
{
line = Tapiex_com.Lines.Item(i);
break;
}
return line;
}
protected void Dispose(bool disposing)
{
if (disposing && (Tapiex_com != null))
{
Tapiex_com.Dispose();
}
}
public bool InitPhone()
{
Tapiex_com.CreateControl();
Tapiex_com.OnRing += new AxTAPIEXLib._ITAPIExEvents_OnRingEventHandler(this.Tapiex_com_OnRing);
Tapiex_com.OnDTMF += new AxTAPIEXLib._ITAPIExEvents_OnDTMFEventHandler(this.Tapiex_com_OnDTMF);
Tapiex_com.OnConnected += new AxTAPIEXLib._ITAPIExEvents_OnConnectedEventHandler(this.Tapiex_com_OnConnected);
Tapiex_com.OnDisConnected += new AxTAPIEXLib._ITAPIExEvents_OnDisConnectedEventHandler(this.Tapiex_com_OnDisConnected);
Tapiex_com.OnCallerID += new AxTAPIEXLib._ITAPIExEvents_OnCallerIDEventHandler(this.Tapiex_com_OnCallerID);
Tapiex_com.OnNewCall += new AxTAPIEXLib._ITAPIExEvents_OnNewCallEventHandler(this.Tapiex_com_OnNewCall);
bool init = Tapiex_com.initialize();
foreach (ITAPILine tmpline in Tapiex_com.Lines)
if ((tmpline.Caps.Media_Modes & LINEMEDIAMODE.MEDIAMODE_INTERACTIVEVOICE) > 0 ||
(tmpline.Caps.Media_Modes & LINEMEDIAMODE.MEDIAMODE_AUTOMATEDVOICE) > 0)
linesName.Add(tmpline.Name);
return init;
}
public bool OpenLine(string lineName)
{
if (lineName == null)
{
foreach (string item in linesName)
{
var line = Find_line(item);
if (!line.Opened)
line.Open();
}
return true;
}
else
{
var line = Find_line(lineName);
if (line != null)
{
if (!line.Opened)
line.Open();
return true;
}
else return false;
}
}
private void Tapiex_com_OnDTMF(object sender, _ITAPIExEvents_OnDTMFEvent e)
{
if (!IsOutputCall)
{
isInDTMFMethod = true;
callHandler.DTMF(e);
isInDTMFMethod = false;
}
}
private void Tapiex_com_OnNewCall(object sender, _ITAPIExEvents_OnNewCallEvent e)
{
callHandler = new CallHandler();
}
private void Tapiex_com_OnRing(object sender, AxTAPIEXLib._ITAPIExEvents_OnRingEvent e)
{
if (e.ringCount > 1) e.m_Call.Answer();
}
private void Tapiex_com_OnConnected(object sender, AxTAPIEXLib._ITAPIExEvents_OnConnectedEvent e)
{
callHandler.Connected(e, IsOutputCall);
}
private void Tapiex_com_OnDisConnected(object sender, AxTAPIEXLib._ITAPIExEvents_OnDisConnectedEvent e)
{
callHandler.HangUp(e.m_Call);
IsOutputCall = false;
}
private void Tapiex_com_OnCallerID(object sender, AxTAPIEXLib._ITAPIExEvents_OnCallerIDEvent e)
{
callHandler.GetCallerID(e);
}