/// <summary>
        /// Process all responses.
        /// </summary>
        /// <param name="altiResponse">Block of data to process.</param>
        /// <returns>An object with the response.</returns>
        protected virtual void ProcessResponse(AltiLinkPlus.ALPResponse altiResponse)
        {
            TraceOut.Put("AltiGenSPCore::ProcessResponse SeqId=" + altiResponse.SequenceId + " LocId=" + altiResponse.LocationId + " CmdId=" + ((ALPCmdID)altiResponse.CommandId).ToString() + " code=" + ((ALPRespID)altiResponse.ResponseCode).ToString());
            WaitingCommandInfo wci;

            lock (this.waitingCommands)
            {
                wci = this.waitingCommands[altiResponse.SequenceId];
            }
            switch ((ALPCmdID)(altiResponse.CommandId))
            {
            case ALPCmdID.REGISTER_APPID:
                if (wci != null)
                {
                    wci.respCode     = altiResponse.ResponseCode;
                    wci.errorOccured = (altiResponse.ResponseCode == 0) ? false : true;
                    wci.cmdReady.Set();
                }
                break;

            // Logon.
            case ALPCmdID.LOGON:
            {
                if (altiResponse.ResponseCode == 0)
                {
                    TraceOut.Put("Logon saccessfull...");
                    // Getting our control line PAD.
                    if (this.logonType == SPLogonType.ADMINISTRATOR)
                    {
                        this.ControlLocationID = altiResponse.LocationId;
                    }
                }
                if (wci != null)
                {
                    wci.respCode     = altiResponse.ResponseCode;
                    wci.errorOccured = (altiResponse.ResponseCode == 0) ? false : true;
                    wci.cmdReady.Set();
                }
                break;
            }

            case ALPCmdID.GET_VERSION:
                if (altiResponse.ResponseCode == 0)
                {
                    this.VersionID = altiResponse[0].ReadInt32();
                    TraceOut.Put("GetVersion successful. Version = " + VersionID.ToString("X"));
                    bool enableOptionPack = Convert.ToBoolean(altiResponse[1].ReadByte());
                }
                if (wci != null)
                {
                    wci.errorOccured = (altiResponse.ResponseCode == 0) ? false : true;
                    wci.respCode     = altiResponse.ResponseCode;
                    wci.cmdReady.Set();
                }
                break;

            // Get lines info.
            case ALPCmdID.GET_LINEINFO:
                if (altiResponse.ResponseCode == 0)
                {
                    // First parameter in response is number of entries.
                    int linesCount = altiResponse[0].ReadInt32();
                    // Second parameter holds lines information.
                    AltiLinkPlus.ALPParameter param = altiResponse[1];
                    // Filling lines hashtable.
                    for (int i = 0; i < linesCount; i++)
                    {
                        LineInfo _li = new LineInfo(param, this.VersionID);
                        this[_li.lineHandle] = new ALPLine(_li);
                        // If there is no command waiting - send the event that new line was added
                        if (wci == null)
                        {
                            this.SendSpEvent(new Ev.LineStateChanged(_li.lineHandle, SPLineState.LINE_ADD));
                        }
                    }
                    TraceOut.Put(linesCount.ToString() + " lines added...");
                }
                else if (altiResponse.ResponseCode == (int)Diacom.AltiGen.ALPRespID.LIST_END)
                {                               // We received "No more Data" response
                    TraceOut.Put("All lines received.");
                    if (wci != null)
                    {
                        wci.errorOccured = false;
                        wci.cmdReady.Set();
                    }
                }
                else
                {
                    TraceOut.Put("Failed to get lines info : " + ((ALPRespID)(altiResponse.ResponseCode)).ToString());
                    if (wci != null)
                    {
                        wci.errorOccured = true;
                        wci.respCode     = altiResponse.ResponseCode;
                        wci.cmdReady.Set();
                    }
                }
                break;

            case ALPCmdID.PING:
                TraceOut.Put("PING response received.");
                this.ConnectionIsAlive = true;
                break;
            }
        }
Beispiel #2
0
        /// <summary>
        /// Process all responses.
        /// </summary>
        /// <param name="altiResponse">Block of data to process.</param>
        /// <returns>An object with the response.</returns>
        protected override void ProcessResponse(AltiLinkPlus.ALPResponse altiResponse)
        {
            TraceOut.Put("AltiGenSP::ProcessResponse SeqId=" + altiResponse.SequenceId + " LocId=" + altiResponse.LocationId + " CmdId=" + ((ALPCmdID)altiResponse.CommandId).ToString() + " code=" + ((ALPRespID)altiResponse.ResponseCode).ToString());
            ALPLine _line = GetLineBySequenceId(altiResponse.SequenceId);

            switch ((ALPCmdID)(altiResponse.CommandId))
            {
            // Answer call.
            case ALPCmdID.APC_ANSWER_CALL:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.ANSWER_CALL, Ev.CmdStatus.ERROR));
                }
                else
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.ANSWER_CALL, Ev.CmdStatus.OK));
                }
                break;

            // Reject.
            case ALPCmdID.APC_REJECT_CALL:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.REJECT_CALL, Ev.CmdStatus.ERROR));
                }
                else
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.REJECT_CALL, Ev.CmdStatus.OK));
                }
                break;

            // Pass.
            case ALPCmdID.APC_PASS_CALL:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.PASS_CALL, Ev.CmdStatus.ERROR));
                }
                else
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.PASS_CALL, Ev.CmdStatus.OK));
                }
                break;

            // Connect.
            case ALPCmdID.APC_CONNECT_CALL:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.CONNECT_LINES, Ev.CmdStatus.ERROR));
                }
                break;

            // Disconnect.
            case ALPCmdID.APC_DROP_CALL:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.DROP_CALL, Ev.CmdStatus.ERROR));
                }
                break;

            // Dial.
            case ALPCmdID.APC_MAKE_CALL:
            {
                // Searching for a line command to dial was sent on.
                OutcallCommandStruct odc = ((OutcallCommandStruct)(outcallNumbersDialingCommands[altiResponse.SequenceId]));
                if (odc != null)
                {
                    outcallNumbersDialingCommands.Remove(altiResponse.SequenceId);
                    // Have appropriate line.
                    if (altiResponse.ResponseCode != 0)
                    {
                        this.SendSpEvent(new Ev.CommandStatus(odc.Line, Cmd.CommandID.DIAL, Ev.CmdStatus.ERROR));
                    }
                    else
                    {
                        this.SendSpEvent(new Ev.CommandStatus(odc.Line, Cmd.CommandID.DIAL, Ev.CmdStatus.OK));
                    }
                    break;
                }
                break;
            }

            // Play DTMF.
            case ALPCmdID.APC_PLAY_DTMF:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.PLAY_DTMF, Ev.CmdStatus.ERROR));
                }
                break;

            // Play file.
            case ALPCmdID.APC_PLAY_VOICE:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.PLAY_FILE, Ev.CmdStatus.ERROR));
                }
                break;

            // Record file.
            case ALPCmdID.APC_RECORD_VOICE:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.RECORD_FILE, Ev.CmdStatus.ERROR));
                }
                break;

            // Stop playing and recording.
            case ALPCmdID.APC_STOP_PLAY_VOICE:
            case ALPCmdID.APC_STOP_RECORD_VOICE:
                break;

            // Ring extension.
            case ALPCmdID.APC_RING_EXT:
            {
                // Find the line command to dial was sent on.
                OutcallCommandStruct odc = ((OutcallCommandStruct)(outcallNumbersDialingCommands[altiResponse.SequenceId]));
                if (odc != null)
                {
                    outcallNumbersDialingCommands.Remove(altiResponse.SequenceId);
                    // Have appropriate line.
                    if (altiResponse.ResponseCode != 0)
                    {
                        this.SendSpEvent(new Ev.CommandStatus(odc.Line, Cmd.CommandID.RING_EXTENSION, Ev.CmdStatus.ERROR));
                    }
                    else
                    {
                        this.SendSpEvent(new Ev.CommandStatus(odc.Line, Cmd.CommandID.RING_EXTENSION, Ev.CmdStatus.OK));
                    }
                }
                break;
            }

            // Snatch line.
            case ALPCmdID.APC_SNATCH_LINE:
                if (_line == null)
                {
                    return;
                }
                int lineConnectedToThisID = altiResponse[0].ReadInt32();

                TraceOut.Put("AltiGenSP::SnatchLine. Line1=" + _line.SPLineInfo.ID + " and Line2=" + lineConnectedToThisID);

                ALPLine _connectedLine = this[lineConnectedToThisID];

                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.DISCONNECT_LINE, Ev.CmdStatus.ERROR));
                }
                else
                {
                    if (_connectedLine == null)
                    {
                        this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.DISCONNECT_LINE, Ev.CmdStatus.OK));
                    }
                    else
                    {
                        _connectedLine.InfoState         = ALPLine.CallInfoState.SNATCHED_SLAVE_LINE;
                        _connectedLine.ConnectedLine     = _line;
                        _connectedLine.IsUnderAPCControl = true;
                        this.SendSpEvent(new Ev.LineLinked(_line.SPLineInfo.ID, _connectedLine.SPLineInfo.ID));
                    }
                }
                break;

            // Switch music.
            case ALPCmdID.APC_SWITCH_MUSIC:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode == 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.SWITCH_MUSIC, Ev.CmdStatus.OK));
                }
                else
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.SWITCH_MUSIC, Ev.CmdStatus.ERROR));
                }
                break;

            // Transfer call.
            case ALPCmdID.APC_TRANSFER_CALL:
                if (_line == null)
                {
                    return;
                }
                if (altiResponse.ResponseCode != 0)
                {
                    this.SendSpEvent(new Ev.CommandStatus(_line.SPLineInfo.ID, Cmd.CommandID.TRANSFER, Ev.CmdStatus.ERROR));
                }
                break;

            case ALPCmdID.APC_GET_DATA:
                CallInfo rInfo = (CallInfo)this.StoredRingInfo[altiResponse.SequenceId];
                if (rInfo != null)
                {
                    this.StoredRingInfo.Remove(rInfo);
                    _line = this[rInfo.lineID];
                    if (_line != null && !_line.IsUnderAPCControl)
                    {
                        // Updating line information.
                        _line.SPLineInfo.CalledNumber = rInfo.callerID;
                        _line.SPLineInfo.CalledName   = rInfo.callerName;
                        _line.SPLineInfo.DNISNumber   = rInfo.DNISID;
                        _line.SPLineInfo.DNISName     = rInfo.DNISName;
                        _line.SPLineInfo.CIDNumber    = rInfo.callerID;
                        _line.SPLineInfo.CIDName      = rInfo.callerName;
                        _line.SPLineInfo.DIDNumber    = rInfo.calleeID;
                        _line.SPLineInfo.DIDName      = rInfo.calleeName;
                        _line.SPLineInfo.UserName     = rInfo.ANIName;
                        _line.SPLineInfo.UserNumber   = rInfo.ANIID;
                        if (altiResponse.ResponseCode == 0)
                        {
                            int _lineID  = altiResponse[0].ReadInt32();
                            int DataType = altiResponse[1].ReadInt32();
                            switch ((ALPInfoType)DataType)
                            {
                            case ALPInfoType.APC_DATATYPE_USER:
                                _line[USER_DATA] = altiResponse.ReadString();
                                break;
                            }
                        }
                        this.SendSpEvent(new Ev.Ring(rInfo.lineID, (SPLine)_line.SPLineInfo.Clone()));
                        if (_line.InfoState == ALPLine.CallInfoState.CONNECT_DELAYED)
                        {
                            // Have new connected line. Creating and sending event.
                            TraceOut.Put("AltiGenSP:: Line is APC controlled");
                            _line.IsUnderAPCControl = true;
                            this.SendSpEvent(new Ev.Connect(rInfo.lineID));
                            foreach (string _digit in _line.Digits)
                            {
                                this.SendSpEvent(new Ev.Digit(rInfo.lineID, _digit[0]));
                            }
                        }
                        else
                        {
                            _line.InfoState = ALPLine.CallInfoState.CALL_INFO_RECEIVED;
                        }
                    }
                }
                break;

            case ALPCmdID.APC_SET_DATA:
                break;

            default:
                base.ProcessResponse(altiResponse);
                break;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Prints <see cref="AltiLinkPlus.ALPDataBlock"/> to standard error stream of application.
        /// </summary>
        /// <param name="time">Current time the data is putting into stream.</param>
        /// <param name="aData">Data block to print.</param>
        public static void Put(DateTime time, AltiLinkPlus.ALPDataBlock aData)
        {
            if (aData == null)
            {
                return;
            }
            string str     = String.Empty;
            string HTMLStr = time.ToString("[HH:mm:ss:fff]") + " ";

            // The command.
            if (aData is AltiLinkPlus.ALPCommand)
            {
                AltiLinkPlus.ALPCommand cmd = ((AltiLinkPlus.ALPCommand)(aData));
                str      = "Command:" + Environment.NewLine;
                HTMLStr += HTML.GHF("Command:") + Environment.NewLine;
                str     += String.Format("ID: {0} [{1}], location ID: {2}, sequence ID: {3}, number of parameters: {4}{5}", ((ALPCmdID)(cmd.CommandId)), cmd.CommandId, cmd.LocationId, cmd.SequenceId, cmd.Count, Environment.NewLine);
                HTMLStr += HTML.GPF("ID: ") + HTML.GCF(((ALPCmdID)(cmd.CommandId)).ToString()) + HTML.GPF(" [") + cmd.CommandId.ToString() + HTML.GPF("], location ID: ") + cmd.LocationId.ToString() + HTML.GPF(", sequence ID: ") + cmd.SequenceId.ToString() + HTML.GPF(", number of parameters: ") + cmd.Count.ToString() + Environment.NewLine;
                for (int i = 0; i < cmd.Count; i++)
                {
                    str += String.Format("param#{0}: {1}{2}", i, BitConverter.ToString(cmd[i].GetBytes()), Environment.NewLine);
                }
                for (int i = 0; i < cmd.Count; i++)
                {
                    HTMLStr += String.Format("{0}{1}{2} {3}{4}", HTML.GPF("param#"), i, HTML.GPF(":"), BitConverter.ToString(cmd[i].GetBytes()), Environment.NewLine);
                }
            }
            else if (aData is AltiLinkPlus.ALPEvent)
            {
                AltiLinkPlus.ALPEvent ev = ((AltiLinkPlus.ALPEvent)(aData));
                str      = "Event:" + Environment.NewLine;
                HTMLStr += HTML.GHF("Event:") + Environment.NewLine;
                str     += String.Format("ID: {0} [{1}], location ID: {2}, sequence ID: {3}, number of parameters: {4}{5}", ((ALPEvID)(ev.CommandId)), ev.CommandId, ev.LocationId, ev.SequenceId, ev.Count, Environment.NewLine);
                HTMLStr += HTML.GPF("ID: ") + HTML.GCF(((ALPEvID)(ev.CommandId)).ToString()) + HTML.GPF(" [") + ev.CommandId.ToString() + HTML.GPF("], location ID: ") + ev.LocationId.ToString() + HTML.GPF(", sequence ID: ") + ev.SequenceId.ToString() + HTML.GPF(", number of parameters: ") + ev.Count.ToString() + Environment.NewLine;
                for (int i = 0; i < ev.Count; i++)
                {
                    str += String.Format("param#{0}: {1}{2}", i, BitConverter.ToString(ev[i].GetBytes()), Environment.NewLine);
                }
                for (int i = 0; i < ev.Count; i++)
                {
                    HTMLStr += String.Format("{0}{1}{2} {3}{4}", HTML.GPF("param#"), i, HTML.GPF(":"), BitConverter.ToString(ev[i].GetBytes()), Environment.NewLine);
                }
            }
            else if (aData is AltiLinkPlus.ALPResponse)
            {
                AltiLinkPlus.ALPResponse rsp = ((AltiLinkPlus.ALPResponse)(aData));
                str      = "Responce:" + Environment.NewLine;
                HTMLStr += HTML.GHF("Responce:") + Environment.NewLine;
                str     += String.Format("ID: {0} [{1}], location ID: {2}, sequence ID: {3}, responce code: {4} [{5}], number of parameters: {6}{7}", ((ALPCmdID)(rsp.CommandId)), rsp.CommandId, rsp.LocationId, rsp.SequenceId, ((ALPRespID)(rsp.ResponseCode)), rsp.ResponseCode, rsp.Count, Environment.NewLine);
                HTMLStr += HTML.GPF("ID: ") + HTML.GCF(((ALPCmdID)(rsp.CommandId)).ToString()) + HTML.GPF(" [") + rsp.CommandId.ToString() + HTML.GPF("], location ID: ") + rsp.LocationId.ToString() + HTML.GPF(", sequence ID: ") + rsp.SequenceId.ToString() + HTML.GPF(", responce code: ") + HTML.GCF(((ALPRespID)(rsp.ResponseCode)).ToString()) + HTML.GPF(" [") + rsp.ResponseCode.ToString() + HTML.GPF("], number of parameters: ") + rsp.Count.ToString() + Environment.NewLine;
                for (int i = 0; i < rsp.Count; i++)
                {
                    str += String.Format("param#{0}: {1}{2}", i, BitConverter.ToString(rsp[i].GetBytes()), Environment.NewLine);
                }
                for (int i = 0; i < rsp.Count; i++)
                {
                    HTMLStr += String.Format("{0}{1}{2} {3}{4}", HTML.GPF("param#"), i, HTML.GPF(":"), BitConverter.ToString(rsp[i].GetBytes()), Environment.NewLine);
                }

                if (rsp.CommandId.Equals(1021))
                {
                    // GET_LINE_INFO responce.

/*					StreamWriter sw = new StreamWriter(DateTime.Now.ToFileTime().ToString()+".html", false, Encoding.Unicode);
 *                                      sw.WriteLine("");
 *                                      sw.WriteLine("<html>{0}<head>{0}<meta http-equiv=\"Content-Type\" content=\"text/html; charset=unicode\">{0}</head>{0}<body>{0}<pre>{0}", Environment.NewLine);
 *                                      sw.WriteLine(DateTime.Now.ToString("yyyy.MM.dd, HH:mm:ss:fff"));
 *                                      for(int i = 0; i < 80; i++) sw.Write("*");
 *                                      sw.WriteLine("");
 *                                      for(int i = 0; i < rsp.Count; i++)
 *                                      {
 *                                              sw.WriteLine("param #{0}", i);
 *                                              Diacom.AltiGen.AltiLinkPlus.ALPParameter par = ((Diacom.AltiGen.AltiLinkPlus.ALPParameter)(rsp[i]));
 *                                              sw.WriteLine("ID: {0}, length: {1}, size: {2}, type: {3}", par.ParameterID, par.Length, par.ParameterSize, par.ParameterType);
 *                                              int l = par.Length;
 *                                              char [] c = new char[l];
 *                                              byte [] b = par.GetBytes();
 *                                              for(int j = 0; j < l; j++)
 *                                              {
 *                                                      if(j%10 == 0) sw.Write("|");
 *                                                      else sw.Write(" ");
 *                                                      c[j] = Convert.ToChar(b[j]);
 *                                              }
 *                                              sw.WriteLine("");
 *                                              sw.WriteLine(c);
 *                                              sw.WriteLine("");
 *                                      }
 *                                      sw.WriteLine("</pre>{0}</body>{0}</html>{0}", Environment.NewLine);
 *                                      sw.Close();
 */             }
            }
            else
            {
                str      = "Unrecognized:" + Environment.NewLine;
                HTMLStr += HTML.GHF("Unrecognized:") + Environment.NewLine;
                str     += String.Format("ID: ... [{0}], location ID: {1}, sequence ID: {2}, number of parameters: {3}{4}", aData.CommandId, aData.LocationId, aData.SequenceId, aData.Count, Environment.NewLine);
                HTMLStr += HTML.GPF("ID: ... [") + aData.CommandId.ToString() + HTML.GPF("], location ID: ") + aData.LocationId.ToString() + HTML.GPF(", sequence ID: ") + aData.SequenceId.ToString() + HTML.GPF(", number of parameters: ") + aData.Count.ToString() + Environment.NewLine;
                for (int i = 0; i < aData.Count; i++)
                {
                    str += String.Format("param#{0}: {1}{2}", i, BitConverter.ToString(aData[i].GetBytes()), Environment.NewLine);
                }
                for (int i = 0; i < aData.Count; i++)
                {
                    HTMLStr += String.Format("{0}{1}{2} {3}{4}", HTML.GPF("param#"), i, HTML.GPF(":"), BitConverter.ToString(aData[i].GetBytes()), Environment.NewLine);
                }
            }
            // Saving string to a storage and putting it to trace output.
            TraceOut.Put(str);
            Storage.Append(HTMLStr + Environment.NewLine + "<hr>" + Environment.NewLine);
        }