public Cdr(string pGuid, string pRawCdr, bool pDateLoggedFromCdr) { cdrRow = new CDRRow(); cdrRow.Id = pGuid; cdrRow.ANI = 0; cdrRow.DNIS = 0; cdrRow.Price = decimal.Zero; cdrRow.Cost = decimal.Zero; cdrRow.End_user_price = decimal.Zero; cdrRow.Used_bonus_minutes = 0; cdrRow.Prefix_in = string.Empty; cdrRow.Prefix_out = string.Empty; cdrRow.Local_number = string.Empty; cdrRow.Node_id = (new CurrentNode()).Id; sipUserId = string.Empty; alias = string.Empty; //--preset Cdr fields, in case route == null CountryCode = 0; LocalNumber = string.Empty; CarrierRouteName = "UNKNOWN"; CustomerRouteName = "UNKNOWN"; #region cdr format: // 0 2| //duration // 1 Wed. 09 Mar 2005 14:20:43 -0500| //startDateTime // 2 Wed. 09 Mar 2005 14:20:45 -0500| //StopDateTime // 3 192.168.1.4:1719| //OrigIp // 4 8113_endp| //callerID // 5 192.168.1.10:1720| //TermIp // 6 8473_endp| //calledID or S#:xxx // 7 01152222234567:dialedDigits| //DestNumber // 8 |1112222 //ANI(ANI), orig Alias? // 9 |Gk Alias //Gk Alias or DNIS:xxx;ANIxxx // 10 customer route id // 11 carrier route id // 12 customer route id // 13 carrier route id // 14 Release cause code // 15 Release source // 16 Rbr result // 17 Original Release cause code #endregion var _fields = pRawCdr.Split('|'); //-- fields[0]: Call Duration cdrRow.Duration = Convert.ToInt16(_fields[0]); //-- fields[1]: start date/time var _startDateTime = _fields[1]; //-- fields[2]: stop date/time var _endDateTime = _fields[2]; cdrRow.Start = getStandardDateTime(_startDateTime, _endDateTime); cdrRow.Timok_date = TimokDate.Parse(cdrRow.Start); //-- late logged if (pDateLoggedFromCdr) { cdrRow.Date_logged = cdrRow.Start.AddMinutes((cdrRow.Duration / 60) + (cdrRow.Duration % 60 > 0 ? 1 : 0)); } else { var _dtNow = DateTime.Now; cdrRow.Date_logged = new DateTime(_dtNow.Year, _dtNow.Month, _dtNow.Day, _dtNow.Hour, _dtNow.Minute, 0); } //-- fields[3]: Orig ip address var _origIP = _fields[3].Substring(0, _fields[3].IndexOf(':')); cdrRow.Orig_IP_address = IPUtil.ToInt32(_origIP); OrigIP = _origIP; //-- fields[4]: sipUserId ( m_callerId ) sipUserId = SIPHelper.GetUserId(_fields[4], TimokLogger.Instance.LogRbr); if (sipUserId.Length > 0) { alias = sipUserId; } //-- fields[5]: TermIP address //75|Wed, 07 Feb 2007 18:45:17 -0500|Wed, 07 Feb 2007 18:46:32 -0500|67.130.1.45:1276|8435225294:dialedDigits=8435225294 :h323_ID=id$8435225294:h323_ID=ip$67.130.1.40:h323_ID|67.130.1.31:1720|2486_endp|18128772101:dialedDigits|8435225294|MUNDETEL-SW1|0|10000|10000|1|10306|16|0|0|16;) var _indx = _fields[5].IndexOf(':'); if (_indx > -1) { TermIP = _fields[5].Substring(0, _indx); } else { TermIP = _fields[5]; } //-- This is because Gk sends HostIP address in the CalledIP field when Rbr did not find termination //-- we want to show 0.0.0.0 in cdr if (TermIP.CompareTo(Configuration.Instance.Main.HostIP) == 0) { TermIP = "0.0.0.0"; } //-- fields[6]: m_calledId - check if SerialNumber present //NOTE: some h323 endpoints send orig alias here //alias = tryAlias(_fields[6]); cdrRow.Serial_number = trySerialNumber(_fields[6]); TimokLogger.Instance.LogRbr(LogSeverity.Debug, "Cdr.Ctor", string.Format("Is Serial# ? field[6]: {0}", _fields[6])); //-- fields[7]: Dest number //TimokLogger.Instance.LogDebug(string.Format("Is Dest# ? field[7]: {0}", _fields[7])); _indx = _fields[7].IndexOf(':'); if (_indx > -1) { DestNumber = _fields[7].Substring(0, _indx); } else { DestNumber = _fields[7]; } if (DestNumber == null) { DestNumber = string.Empty; } //if (DestNumber.Length > 0) { // CountryCode = int.Parse(DestNumber.Substring(0,1)); // LocalNumber = DestNumber.Substring(1); //} //-- fields[8]: ANI, Orig Alias //TimokLogger.Instance.LogDebug(string.Format("Is ANI/Alias ? field[8]: {0}", _fields[8])); /* * sourceAddress = 4 entries { * [0]=dialedDigits "3605759548" * [1]=h323_ID 11 characters { * 0033 0036 0030 0035 0037 0035 0039 0035 36057595 * 0034 0038 0020 48 * } * [2]=h323_ID 13 characters { * 0069 0064 0024 0033 0036 0030 0035 0037 id$36057 * 0035 0039 0035 0034 0038 59548 * } * [3]=h323_ID 14 characters { * 0069 0070 0024 0036 0037 002e 0031 0033 ip$67.13 * 0030 002e 0031 002e 0034 0030 0.1.40 * } * } * 75|Wed, 07 Feb 2007 18:45:17 -0500|Wed, 07 Feb 2007 18:46:32 -0500|67.130.1.45:1276|8435225294:dialedDigits=8435225294 :h323_ID=id$8435225294:h323_ID=ip$67.130.1.40:h323_ID|67.130.1.31:1720|2486_endp|18128772101:dialedDigits|8435225294|MUNDETEL-SW1|0|10000|10000|1|10306|16|0|0|16;) */ var _subFields = _fields[8].Split('='); foreach (var _subfield in _subFields) { if (alias.Length == 0) { alias = tryAlias(_subfield); if (alias.Length > 0) { continue; } } if (cdrRow.ANI == 0) { cdrRow.ANI = tryANI(_subfield); if (cdrRow.ANI > 0) { continue; } } } //-- fields[9]: Gk Alias - check if DNIS is here cdrRow.DNIS = tryDNIS(_fields[9]); //TimokLogger.Instance.LogDebug(string.Format("Is DNIS ? field[9]: {0}", _fields[9])); //-- fields[10]: retail acct id try { cdrRow.Retail_acct_id = int.Parse(_fields[10]); } catch { cdrRow.Retail_acct_id = 0; } //TimokLogger.Instance.LogDebug(string.Format("Is RetailAcct ? field[10]: {0}", _fields[10])); //-- fields[11]: customer acct id try { cdrRow.Customer_acct_id = short.Parse(_fields[11]); } catch { cdrRow.Customer_acct_id = 0; } //TimokLogger.Instance.LogDebug(string.Format("Is CustomerAcct ? field[11]: {0}", _fields[11])); //-- fields[12]: carrier routaccte id try { cdrRow.Carrier_acct_id = short.Parse(_fields[12]); } catch { cdrRow.Carrier_acct_id = 0; } //TimokLogger.Instance.LogDebug(string.Format("Is CarrierAcct ? field[12]: {0}", _fields[12])); //-- fields[13]: customer route id try { cdrRow.Customer_route_id = int.Parse(_fields[13]); } catch { cdrRow.Customer_route_id = 0; } //TimokLogger.Instance.LogDebug(string.Format("Is CustomerRoute ? field[13]: {0}", _fields[13])); //-- fields[14]: carrier route id try { cdrRow.Carrier_route_id = int.Parse(_fields[14]); } catch { cdrRow.Carrier_route_id = 0; } //TimokLogger.Instance.LogDebug(string.Format("Is CarrierAcct ? field[14]: {0}", _fields[14])); //-- fields[15]: Release cause code var _causeStr = _fields[15]; //TimokLogger.Instance.LogDebug(string.Format("Is DisconnectCause ? field[15]: {0}", _fields[15])); try { cdrRow.Disconnect_cause = short.Parse(_causeStr); } catch { cdrRow.Disconnect_cause = (short)GkDisconnectCause.Unknown; } //-- fields[16]: Release source var _sourceStr = _fields[16]; //TimokLogger.Instance.LogDebug(string.Format("Is SourceStr ? field[16]: {0}", _fields[16])); try { cdrRow.Disconnect_source = byte.Parse(_sourceStr); } catch { cdrRow.Disconnect_source = (byte)GkDisconnectSource.Unknown; } //-- fields[17]: Rbr result var _rbrResultStr = _fields[17]; //TimokLogger.Instance.LogDebug(string.Format("Is RbrResult ? field[17]: {0}", _fields[17])); try { cdrRow.Rbr_result = short.Parse(_rbrResultStr); } catch { cdrRow.Rbr_result = (short)RbrResult.Unknown; } //-- fields[18]: Original Release cause code //TimokLogger.Instance.LogDebug(string.Format("Is MappedCauseStr ? field[18]: {0}", _fields[18])); try { cdrRow.Mapped_disconnect_cause = short.Parse(_fields[18]); } catch { cdrRow.Mapped_disconnect_cause = (short)GkDisconnectCause.Unknown; } //-- fields[19]: Original Release cause code //TimokLogger.Instance.LogDebug(string.Format("Is InfoDigits ? field[19]: {0}", _fields[19])); string _infoDigits = _fields[19].TrimEnd(';'); try { cdrRow.Info_digits = byte.Parse(_infoDigits); } catch { cdrRow.Info_digits = 0; } }
public void TestGetIPAddress() { string _ip = SIPHelper.GetIPAddress("ip$192.168.1.1"); Assert.IsTrue("192.168.1.1" == _ip); }