예제 #1
0
 private void AddActiveCall(string uniqueid, AsteriskCall dest)
 {
     if (!this.activeCalls.ContainsKey(uniqueid))
     {
         this.activeCalls.Add(uniqueid, dest);
     }
     else
     {
         this.activeCalls[uniqueid] = dest;
     }
     if (Server.debug) Console.WriteLine("Active channels: " + activeCalls.Count.ToString());
 }
예제 #2
-1
        private void EvaluateEvent(Hashtable evt)
        {
            string szEvent = (string)evt["Event"];
            string Uniqueid = null;
            string Uniqueid2 = null;
            string Context = null;
            string Destination = null;
            AsteriskCall call = null;
            AsteriskCall call1 = null;
            AsteriskEvent astevt = null;
            switch (szEvent)
            {
                /*
                 * This event always happens when a new channel is created
                 * So is generated everytime a call bengins
                 */
                case "Newchannel":
                    Uniqueid = (string)evt["Uniqueid"];
                    Context = (string)evt["Context"];
                    call = new AsteriskCall();
                    call.Channel = (string)evt["Channel"];
                    call.ParseDestination();
                    call.Uniqueid = Uniqueid;
                    if (Context != null) call.Context = Context;

                    if (Server.debug) Console.WriteLine("Newchannel - " + call.ToString());
                    Server.logger.WriteLine(LogType.Debug, "Newchannel - " + call.ToString());
                    AddActiveCall(Uniqueid, call);
                    break;

                /*
                 * Ringing: some phone is ringing? This should be trigger callerid
                 */
                case "Dial":
                    Uniqueid = (string)evt["SrcUniqueID"]; // Caller
                    Uniqueid2 = (string)evt["DestUniqueID"]; // Called

                    call = GetActiveCall(Uniqueid); // caller extension..
                    call1 = GetActiveCall(Uniqueid2); // called extension..

                    if ( (call != null) && (call1 != null) )
                    {

                        string callerid = (string)evt["CallerID"];
                        string calleridname = (string)evt["CallerIDName"];

                        // Here we set called call as dialed ;)
                        call1.isDialed = true;
                        call1.CallerIDNum = callerid;
                        call1.CallerIDName = calleridname;
                        astevt = new AsteriskEvent();
                        astevt.Call = call1;
                        astevt.Event = "Newcallerid";
                        if (call1.ParsedChannel != null) //BI (Beppe Innamorato) 16/10/08 inserted if
                        {
                            SendMessage(call1.ParsedChannel, astevt.ToXML());
                        }
                    }
                    break;
                /*
                 * Example
                 * Event: Newstate
                 * Privilege: call,all
                 * Channel: SIP/201-0080e6e0
                 * State: Ringing
                 * CallerID: 202
                 * CallerIDName: Test 202
                 * Uniqueid: asterisk-5559-1224799548.57

                 */
                case "Newstate":
                    Destination = AsteriskCall.ParseChannel((string)evt["Channel"]);
                    if (Destination != null)
                    {
                        string state = (string)evt["State"];
                        if ((state != null) & (state.Equals("Ringing")))
                        {

                            Uniqueid = (string)evt["Uniqueid"]; // Caller
                            call = GetActiveCall(Uniqueid);

                            // If the call is dialed then we can't
                            // send callerid event on Newstate..
                            if (!call.isDialed)
                            {

                                string callerid = (string)evt["CallerID"];
                                string calleridname = (string)evt["CallerIDName"];

                                call.CallerIDNum = callerid;
                                call.CallerIDName = calleridname;
                                astevt = new AsteriskEvent();
                                astevt.Call = call;
                                astevt.Event = "Newcallerid";

                                SendMessage(Destination, astevt.ToXML());
                            }

                        }
                        else
                        {
                            AsteriskEvent tmpEvt = new AsteriskEvent();
                            tmpEvt.Event = "Newstate";

                            AsteriskCall tmpCall = new AsteriskCall();
                            tmpCall.Uniqueid = (string)evt["Uniqueid"];
                            tmpCall.CallerIDNum = (string)evt["CallerID"];
                            tmpCall.CallerIDName = (string)evt["CallerIDName"];
                            tmpCall.Channel = (string)evt["Channel"];
                            tmpCall.State = (string)evt["State"];

                            tmpEvt.Call = tmpCall;
                            SendMessage(Destination, tmpEvt.ToXML());

                            tmpCall = null;
                            tmpEvt = null;
                        }

                    }
                    break;
                /*
                 * Event: OriginateResponse
                 * Privilege: call,all
                 * Response: Success
                 * Channel: SIP/201-082141f8
                 * Context: astctidemo
                 * Exten: 200
                 * Reason: 4
                 * Uniqueid: 1193986538.26
                 * CallerID: <unknown>
                 * CallerIDNum: <unknown>
                 * CallerIDName: SIP/201
                 */
                case "OriginateResponse":
                    string originateResponse = (string)evt["Response"];
                    if (originateResponse == null) return;
                    if (originateResponse.Equals("Success"))
                    {
                        Uniqueid = (string)evt["Uniqueid"];
                        Context = (string)evt["Context"];

                        call = GetActiveCall(Uniqueid);
                        if (call == null)
                        {
                            call = new AsteriskCall();
                        }
                        call.Context = Context;
                        call.Uniqueid = Uniqueid;
                    }
                    break;

                /*
                 * This event is generated everytime a new step in the dialplan
                 * is done: a new extension of type set may contains calldata
                 */
                case "Newexten":
                    Uniqueid = (string)evt["Uniqueid"];
                    Context = (string)evt["Context"];

                    call = GetActiveCall(Uniqueid);
                    if (call == null)
                    {
                        call = new AsteriskCall();
                    }
                    if (Context != null) call.Context = Context;
                    if (Uniqueid != null) call.Uniqueid = Uniqueid;
                    AddActiveCall(Uniqueid, call);

                    string Application = (string)evt["Application"];
                    if (Application == null) break;
                    switch (Application)
                    {
                        case "Set":
                            string AppData = ParseCallData((string)evt["AppData"]);
                            if (AppData != null)
                            {
                                call = GetActiveCall(Uniqueid);
                                if (call != null)
                                {
                                    if (Context != null) call.Context = Context;
                                    call.AppData = AppData;
                                    if (Server.debug) Console.WriteLine("AppData - " + call.ToString());
                                    Server.logger.WriteLine(LogType.Debug, "AppData - " + call.ToString());
                                }
                            }
                            break;

                    }
                    break;
                /*
                 * Here we should notify the client..
                 *
                 * >> Example -> SIP/202 calls SIP/201
                 * Event: Link
                 * Privilege: call,all
                 * Channel1: SIP/202-082173d0
                 * Channel2: SIP/201-0821bb20
                 * Uniqueid1: 1194000842.70
                 * Uniqueid2: 1194000842.71
                 * CallerID1: 202
                 * CallerID2: 201
                 *
                 * >> Example -> SIP/202 calls Extension 100
                 * Event: Link
                 * Privilege: call,all
                 * Channel1: SIP/202-082173d0
                 * Channel2: SIP/201-0821bb20
                 * Uniqueid1: 1194001092.74
                 * Uniqueid2: 1194001092.75
                 * CallerID1: 202
                 * CallerID2: 100
                 */
                case "Link":
                    Uniqueid = (string)evt["Uniqueid1"];
                    Uniqueid2 = (string)evt["Uniqueid2"];
                    string callerid1 = (string)evt["CallerID1"];
                    string callerid2 = (string)evt["CallerID2"];
                    call = GetActiveCall(Uniqueid); // caller
                    call1 = GetActiveCall(Uniqueid2); // called

                    if (call1 != null)
                    {
                        if (Server.debug) Console.WriteLine("Link - " + call1.ToString());
                        Server.logger.WriteLine(LogType.Debug, "Link - " + call1.ToString());

                        if (call1.AppData == null)
                        {
                            if (call.AppData != null) call1.AppData = call.AppData;
                        }
                        if (call1.Context == null)
                        {
                            if (call.Context != null) call1.Context = call.Context;
                        }
                        // call1.CallerIDNum = callerid2;
                    }
                    if ((call != null) & (call1 != null))
                    {
                        if (Server.debug) Console.WriteLine("Link");
                        astevt = new AsteriskEvent();
                        astevt.Call = call1;
                        astevt.Event = "Link";

                        Destination = AsteriskCall.ParseChannel((string)evt["Channel2"]);
                        if (Destination != null)
                        {
                            Server.logger.WriteLine(LogType.Debug, string.Format("Sending Link notification to {0}", Destination));
                            SendMessage(Destination, astevt.ToXML());
                        }
                    }
                    break;

                /*
                 * This event happens after a Dial command and usually before a Ringing event
                 * and it's unique id is of the dialed extension. So we can notify when this happens
                 */
                case "Newcallerid":
                    //Uniqueid = (string)evt["Uniqueid"];
                    //call = GetActiveCall(Uniqueid); // called extension..

                    //if (call != null)
                    //{
                    //    string callerid = (string)evt["CallerID"];
                    //    string calleridname = (string)evt["CallerIDName"];
                    //    call.CallerIDNum = callerid;
                    //    call.CallerIDName = calleridname;
                    //    AddActiveCall(Uniqueid, call);   // Update the call info..
                    //    if (Server.debug) Console.WriteLine("Newcallerid - " + call.ToString());

                    //    astevt = new AsteriskEvent();
                    //    astevt.Call = call;
                    //    astevt.Event = "Newcallerid";
                    //    if (call.ParsedChannel != null) //BI (Beppe Innamorato) 16/10/08 inserted if
                    //    {
                    //        SendMessage(call.ParsedChannel, astevt.ToXML());
                    //    }
                    //}

                    break;
                /*
                 * When an hangup event is fired, we've to remove
                 * the call with the uniqueid matched
                 */
                case "Hangup":
                    Uniqueid = (string)evt["Uniqueid"];
                    call = GetActiveCall(Uniqueid);
                    if (call != null)
                    {
                        astevt = new AsteriskEvent();
                        astevt.Call = call;
                        astevt.Event = "Hangup";
                        if (call.ParsedChannel != null) //BI (Beppe Innamorato) 16/10/08 inserted if
                        {
                            SendMessage(call.ParsedChannel, astevt.ToXML());
                        }
                        if (Server.debug) Console.WriteLine("Hangup - " + call.ToString());
                        Server.logger.WriteLine(LogType.Debug, "Hangup - " + call.ToString());
                        RemoveActiveCall(Uniqueid);
                    }

                    break;
                default:

                    break;
            }
        }