Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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();
            }
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
        /// <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;
            }
        }
Ejemplo n.º 5
0
        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();
                }
            }
        }
Ejemplo n.º 6
0
        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;
        }