/// <summary> /// Initialize telephony and VoIP stack. On success register accounts. /// </summary> /// <returns>initialiation status</returns> public int Initialize(IVoipProxy proxy) { _stack = proxy; int status = 0; /// if (!IsInitialized) { //// register to signaling proxy interface ICallProxyInterface.CallStateChanged += OnCallStateChanged; ICallProxyInterface.CallIncoming += OnIncomingCall; ICallProxyInterface.CallNotification += OnCallNotification; // Initialize call table _calls = new Dictionary <int, IStateMachine>(); } // (re)initialize voip proxy status = StackProxy.initialize(); if (status != 0) { return(status); } // (re)register _initialized = true; return(status); }
public void Transfer(string number) { Action method = new Action(() => { string num = Globals.NormalizeTelNumber(number); if (number.Length >= 9 && Settings.Prefix0) { num = "0" + num; } IStateMachine call; if (CallManager.getNoCallsInState(EStateId.ACTIVE) > 0) { call = CallManager.getCallInState(EStateId.ACTIVE); } else { call = CallManager.getCallInState(EStateId.INCOMING); } ICallProxyInterface proxy = StackProxy.createCallProxy(); proxy.SessionId = call.Session; if (call.StateId == EStateId.ACTIVE) { proxy.holdCall(); proxy.xferCall(num); } else { CallManager.onUserTransfer(call.Session, num); } }); if (this.InvokeRequired) { this.Invoke((MethodInvoker) delegate { method(); }); } else { method(); } }
/// <summary> /// Shutdown telephony and VoIP stack /// </summary> public void Shutdown() { IStateMachine[] callarr = new IStateMachine[CallList.Count]; CallList.Values.CopyTo(callarr, 0); for (int i = 0; i < callarr.Length; i++) { callarr[i].Destroy(); } this.CallList.Clear(); StackProxy.shutdown(); _initialized = false; CallStateRefresh = null; IncomingCallNotification = null; ICallProxyInterface.CallStateChanged -= OnCallStateChanged; ICallProxyInterface.CallIncoming -= OnIncomingCall; ICallProxyInterface.CallNotification -= OnCallNotification; StackProxy.CallReplaced -= OnCallReplaced; }
/// <summary> /// /// </summary> /// <param name="callId"></param> /// <param name="callState"></param> private void OnCallStateChanged(int callId, ESessionState callState, string info) { if (callState == ESessionState.SESSION_STATE_INCOMING) { IStateMachine incall = Factory.createStateMachine(); // couldn't create new call instance (max calls?) if (incall.IsNull) { // check if CFB, activate redirection if (Config.CFBFlag == true) { // get stack proxy ICallProxyInterface proxy = StackProxy.createCallProxy(); // assign callid to the proxy... //proxy.SessionId = callId; proxy.serviceRequest((int)EServiceCodes.SC_CFB, Config.CFBNumber); return; } } // save session parameters incall.Session = callId; // check if callID already exists!!! if (CallList.ContainsKey(callId)) { // shouldn't be here // release the call CallList[callId].State.endCall(); return; } // add call to call table _calls.Add(callId, incall); return; } IStateMachine call = this[callId]; if (call.IsNull) { return; } switch (callState) { case ESessionState.SESSION_STATE_CALLING: //sm.getState().onCalling(); break; case ESessionState.SESSION_STATE_EARLY: call.State.onAlerting(); break; case ESessionState.SESSION_STATE_CONNECTING: call.State.onConnect(); break; case ESessionState.SESSION_STATE_DISCONNECTED: call.State.onReleased(); break; } }
private void OnCallStateChanged(int sessionId) { IStateMachine call = CallManager.getCall(sessionId); //MessageBox.Show(call.Session.ToString() + ": " + call.StateId.ToString()); if (call.StateId == EStateId.INCOMING) { try { if (Settings.PlaySound) { //SetVolume(10); ringtone.SoundLocation = Settings.Ringtone; ringtone.PlayLooping(); } else { //SetVolume(0); StackProxy.setSoundDevice("0", "0"); } } catch { } try { OnNewCall(sessionId); } catch { } } else if (call.StateId == EStateId.ALERTING) { OnNewCall(sessionId); } else if (call.StateId == EStateId.ACTIVE) { ringtone.Stop(); timerCallDuration.Start(); lTime.Visible = true; btnAnswerCall.Visible = false; lCallStatus.Text = "Rozmowa"; tlpACButtons.SetColumn(btnEndCall, 0); tlpACButtons.SetColumnSpan(btnEndCall, 4); sesje[sessionId].Begin(); Send("ACTIVECALL:" + sesje[sessionId].Number + ";" + sesje[sessionId].Incoming.ToString() + ";" + sesje[sessionId].Start.ToString() + ";" + sesje[sessionId].Duration.ToString()); } else if (call.StateId == EStateId.NULL) { if (sesje.ContainsKey(sessionId)) { ringtone.Stop(); tabControll.SelectedTabPage = tabActiveCall; sesje[sessionId].End(); timerCallDuration.Stop(); timerEndCall.Start(); lCallStatus.Text = "Rozmowa zakończona"; lCallStatus.BackColor = Color.Maroon; lTime.BackColor = Color.Maroon; btnAnswerCall.Visible = false; btnEndCall.Visible = false; btnTransferCall.Visible = false; teDialNumber.Text = ""; Send("ENDCALL:" + sesje[sessionId].Number + ";" + sesje[sessionId].Incoming.ToString() + ";" + sesje[sessionId].Start.ToString() + ";" + sesje[sessionId].Duration.ToString()); Histories.Add(new History(sesje[sessionId])); gvHistory.RefreshData(); sesje.Remove(sessionId); dtmf = ""; IsTransfer = false; //call.destroy(); } } }
private void bbtnRegister_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { StackProxy.initialize(); CallManager.StackProxy = StackProxy; Config.CFNRFlag = false; Config.CFUFlag = false; Config.DefaultAccountIndex = 0; Config.AAFlag = Settings.AutoAnswer; Config.DNDFlag = Settings.DoNotDisturb; if (Config.Accounts.Count > 0) { Registrar.unregisterAccounts(); } Config.Accounts.Clear(); AccountConfig acc = new AccountConfig(); acc.AccountName = Settings.UserName; acc.DisplayName = Settings.UserName; acc.DomainName = Settings.Domain; acc.HostName = Settings.Host; acc.Password = Settings.Password; acc.TransportMode = ETransportMode.TM_UDP; acc.UserName = Settings.UserName; acc.Id = Settings.UserName; acc.ProxyAddress = ""; Config.Accounts.Add(acc); //ConfigStruct.listenPort = Settings.Port; //ConfigStruct.noUDP = false; //ConfigStruct.noTCP = true; //ConfigStruct.stunServer = ""; //ConfigStruct.publishEnabled = false; //ConfigStruct.expires = 3600; //ConfigStruct.VADEnabled = true; //ConfigStruct.ECTail = 200; //ConfigStruct.nameServer = Settings.Host; //ConfigStruct.pollingEventsEnabled = false; CallManager.Config = Config; StackProxy.Config = Config; Registrar.Config = Config; pjsipPresenceAndMessaging.Instance.Config = Config; CallManager.CallStateRefresh -= CallManager_CallStateRefresh; CallManager.CallStateRefresh += CallManager_CallStateRefresh; //CallManager.IncomingCallNotification += CallManager_IncomingCallNotification; Registrar.AccountStateChanged -= Instance_AccountStateChanged; Registrar.AccountStateChanged += Instance_AccountStateChanged; if (CallManager.Initialize() == 0) { Registrar.registerAccounts(); } else { lMessages.Caption = "Popraw ustawienia."; lStatus.Caption = "Nie połączono"; timerMessages.Start(); } int noOfCodecs = StackProxy.getNoOfCodecs(); for (int i = 0; i < noOfCodecs; i++) { string codecname = StackProxy.getCodec(i); StackProxy.setCodecPriority(codecname, 128); } StackProxy.DtmfDigitReceived -= Instance_DtmfDigitReceived; StackProxy.DtmfDigitReceived += Instance_DtmfDigitReceived; }