PageRenderTime 84ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/sipsorcery-core/SIPSorcery.SIP.App/SIPAssets/SIPDialogueAsset.cs

https://github.com/thecc4re/sipsorcery-mono
C# | 397 lines | 347 code | 45 blank | 5 comment | 34 complexity | 33051674a6b6d2184865bdec604715b1 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.Serialization;
  5. using System.Text;
  6. using System.Xml;
  7. using System.Xml.Linq;
  8. using SIPSorcery.Sys;
  9. using SIPSorcery.Persistence;
  10. #if !SILVERLIGHT
  11. using System.Data;
  12. using System.Data.Linq;
  13. using System.Data.Linq.Mapping;
  14. #endif
  15. namespace SIPSorcery.SIP.App
  16. {
  17. [Table(Name = "sipdialogues")]
  18. public class SIPDialogueAsset : ISIPAsset
  19. {
  20. public const string XML_DOCUMENT_ELEMENT_NAME = "sipdialogues";
  21. public const string XML_ELEMENT_NAME = "sipdialogue";
  22. private static string m_newLine = AppState.NewLine;
  23. [IgnoreDataMember]
  24. public SIPDialogue SIPDialogue;
  25. [Column(Name = "id", DbType = "varchar(36)", IsPrimaryKey = true, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  26. public Guid Id
  27. {
  28. get { return SIPDialogue.Id; }
  29. set { SIPDialogue.Id = value; }
  30. }
  31. [Column(Name = "owner", DbType = "varchar(32)", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  32. public string Owner
  33. {
  34. get { return SIPDialogue.Owner; }
  35. set { SIPDialogue.Owner = value; }
  36. }
  37. [Column(Name = "adminmemberid", DbType = "varchar(32)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  38. public string AdminMemberId
  39. {
  40. get { return SIPDialogue.AdminMemberId; }
  41. set { SIPDialogue.AdminMemberId = value; }
  42. }
  43. //[Column(Name = "dialogueid", DbType = "varchar(256)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  44. //public string DialogueId {
  45. // get { return SIPDialogue.DialogueId; }
  46. // set { SIPDialogue.DialogueId = value; }
  47. //}
  48. [Column(Name = "localtag", DbType = "varchar(64)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  49. public string LocalTag
  50. {
  51. get { return SIPDialogue.LocalTag; }
  52. set { SIPDialogue.LocalTag = value; }
  53. }
  54. [Column(Name = "remotetag", DbType = "varchar(64)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  55. public string RemoteTag
  56. {
  57. get { return SIPDialogue.RemoteTag; }
  58. set { SIPDialogue.RemoteTag = value; }
  59. }
  60. [Column(Name = "callid", DbType = "varchar(128)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  61. public string CallId
  62. {
  63. get { return SIPDialogue.CallId; }
  64. set { SIPDialogue.CallId = value; }
  65. }
  66. [Column(Name = "cseq", DbType = "int", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  67. public int CSeq
  68. {
  69. get { return SIPDialogue.CSeq; }
  70. set { SIPDialogue.CSeq = value; }
  71. }
  72. [Column(Name = "bridgeid", DbType = "varchar(36)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  73. public string BridgeId
  74. {
  75. get { return SIPDialogue.BridgeId.ToString(); }
  76. set { SIPDialogue.BridgeId = (!value.IsNullOrBlank()) ? new Guid(value) : Guid.Empty; }
  77. }
  78. [Column(Name = "remotetarget", DbType = "varchar(256)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  79. public string RemoteTarget
  80. {
  81. get { return SIPDialogue.RemoteTarget.ToString(); }
  82. set { SIPDialogue.RemoteTarget = (!value.IsNullOrBlank()) ? SIPURI.ParseSIPURI(value) : null; }
  83. }
  84. [IgnoreDataMember]
  85. [Column(Name = "localuserfield", DbType = "varchar(512)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  86. public string LocalUserField
  87. {
  88. get { return SIPDialogue.LocalUserField.ToString(); }
  89. set { SIPDialogue.LocalUserField = (!value.IsNullOrBlank()) ? SIPUserField.ParseSIPUserField(value) : null; }
  90. }
  91. [DataMember]
  92. [Column(Name = "remoteuserfield", DbType = "varchar(512)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  93. public string RemoteUserField
  94. {
  95. get { return SIPDialogue.RemoteUserField.ToString(); }
  96. set { SIPDialogue.RemoteUserField = (!value.IsNullOrBlank()) ? SIPUserField.ParseSIPUserField(value) : null; }
  97. }
  98. [Column(Name = "proxysipsocket", DbType = "varchar(64)", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  99. [DataMember]
  100. public string ProxySIPSocket
  101. {
  102. get { return SIPDialogue.ProxySendFrom; }
  103. set { SIPDialogue.ProxySendFrom = value; }
  104. }
  105. [IgnoreDataMember]
  106. [Column(Name = "routeset", DbType = "varchar(512)", IsPrimaryKey = false, CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  107. public string RouteSet
  108. {
  109. get { return (SIPDialogue.RouteSet != null) ? SIPDialogue.RouteSet.ToString() : null; }
  110. set { SIPDialogue.RouteSet = (!value.IsNullOrBlank()) ? SIPRouteSet.ParseSIPRouteSet(value) : null; }
  111. }
  112. [Column(Name = "cdrid", DbType = "varchar(36)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  113. public string CDRId
  114. {
  115. get { return SIPDialogue.CDRId.ToString(); }
  116. set { SIPDialogue.CDRId = (!value.IsNullOrBlank()) ? new Guid(value) : Guid.Empty; }
  117. }
  118. [DataMember]
  119. [Column(Name = "calldurationlimit", DbType = "int", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  120. public int CallDurationLimit
  121. {
  122. get { return SIPDialogue.CallDurationLimit; }
  123. set { SIPDialogue.CallDurationLimit = value; }
  124. }
  125. [DataMember]
  126. [Column(Name = "inserted", DbType = "datetimeoffset", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  127. public DateTimeOffset Inserted
  128. {
  129. get { return SIPDialogue.Inserted; }
  130. set { SIPDialogue.Inserted = value.DateTime; }
  131. }
  132. [DataMember]
  133. [Column(Name = "hangupat", DbType = "datetimeoffset", CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  134. public DateTimeOffset? HangupAt
  135. {
  136. get
  137. {
  138. if (CallDurationLimit != 0)
  139. {
  140. return Inserted.AddSeconds(CallDurationLimit);
  141. }
  142. else
  143. {
  144. return null;
  145. }
  146. }
  147. set { } // The hangup time is stored in the database for info. It is calculated from inserted and calldurationlimit and does not need a setter.
  148. }
  149. [DataMember]
  150. [Column(Name = "transfermode", DbType = "varchar(16)", IsPrimaryKey = false, CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  151. public string TransferMode
  152. {
  153. get { return SIPDialogue.TransferMode.ToString(); }
  154. set
  155. {
  156. if (!value.IsNullOrBlank())
  157. {
  158. SIPDialogue.TransferMode = (SIPDialogueTransferModesEnum)Enum.Parse(typeof(SIPDialogueTransferModesEnum), value, true);
  159. }
  160. }
  161. }
  162. [Column(Name = "direction", DbType = "varchar(3)", IsPrimaryKey = false, CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
  163. public string Direction
  164. {
  165. get { return SIPDialogue.Direction.ToString(); }
  166. set
  167. {
  168. if (!value.IsNullOrBlank())
  169. {
  170. SIPDialogue.Direction = (SIPCallDirection)Enum.Parse(typeof(SIPCallDirection), value, true);
  171. }
  172. }
  173. }
  174. [Column(Name = "sdp", DbType = "varchar(2048)", IsPrimaryKey = false, CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  175. public string SDP
  176. {
  177. get { return SIPDialogue.SDP; }
  178. set { SIPDialogue.SDP = value; }
  179. }
  180. [Column(Name = "remotesdp", DbType = "varchar(2048)", IsPrimaryKey = false, CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  181. public string RemoteSDP
  182. {
  183. get { return SIPDialogue.RemoteSDP; }
  184. set { SIPDialogue.RemoteSDP = value; }
  185. }
  186. [Column(Name = "switchboarddescription", DbType = "varchar(1024)", IsPrimaryKey = false, CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  187. public string SwitchboardDescription
  188. {
  189. get { return SIPDialogue.SwitchboardDescription; }
  190. set { SIPDialogue.SwitchboardDescription = value; }
  191. }
  192. [Column(Name = "switchboardcallerdescription", DbType = "varchar(1024)", IsPrimaryKey = false, CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  193. public string SwitchboardCallerDescription
  194. {
  195. get { return SIPDialogue.SwitchboardCallerDescription; }
  196. set { SIPDialogue.SwitchboardCallerDescription = value; }
  197. }
  198. [Column(Name = "switchboardowner", DbType = "varchar(32)", IsPrimaryKey = false, CanBeNull = true, UpdateCheck = UpdateCheck.Never)]
  199. public string SwitchboardOwner
  200. {
  201. get { return SIPDialogue.SwitchboardOwner; }
  202. set { SIPDialogue.SwitchboardOwner = value; }
  203. }
  204. public SIPDialogueAsset()
  205. {
  206. SIPDialogue = new SIPDialogue();
  207. }
  208. public SIPDialogueAsset(SIPDialogue sipDialogue)
  209. {
  210. SIPDialogue = sipDialogue;
  211. }
  212. #if !SILVERLIGHT
  213. public SIPDialogueAsset(DataRow row)
  214. {
  215. Load(row);
  216. }
  217. public DataTable GetTable()
  218. {
  219. DataTable table = new DataTable();
  220. table.Columns.Add(new DataColumn("id", typeof(String)));
  221. table.Columns.Add(new DataColumn("owner", typeof(String)));
  222. table.Columns.Add(new DataColumn("adminmemberid", typeof(String)));
  223. table.Columns.Add(new DataColumn("localtag", typeof(String)));
  224. table.Columns.Add(new DataColumn("remotetag", typeof(String)));
  225. table.Columns.Add(new DataColumn("localuserfield", typeof(String)));
  226. table.Columns.Add(new DataColumn("remoteuserfield", typeof(String)));
  227. table.Columns.Add(new DataColumn("callid", typeof(String)));
  228. table.Columns.Add(new DataColumn("cseq", typeof(Int32)));
  229. table.Columns.Add(new DataColumn("bridgeid", typeof(String)));
  230. table.Columns.Add(new DataColumn("proxysipsocket", typeof(String)));
  231. table.Columns.Add(new DataColumn("remotetarget", typeof(String)));
  232. table.Columns.Add(new DataColumn("routeset", typeof(String)));
  233. table.Columns.Add(new DataColumn("cdrid", typeof(String)));
  234. table.Columns.Add(new DataColumn("calldurationlimit", typeof(Int32)));
  235. table.Columns.Add(new DataColumn("hangupat", typeof(DateTimeOffset)));
  236. table.Columns.Add(new DataColumn("inserted", typeof(DateTimeOffset)));
  237. table.Columns.Add(new DataColumn("direction", typeof(DateTimeOffset)));
  238. table.Columns.Add(new DataColumn("sdp", typeof(String)));
  239. table.Columns.Add(new DataColumn("remotesdp", typeof(String)));
  240. table.Columns.Add(new DataColumn("transfermode", typeof(String)));
  241. table.Columns.Add(new DataColumn("switchboarddescription", typeof(String)));
  242. table.Columns.Add(new DataColumn("switchboardcallerdescription", typeof(String)));
  243. table.Columns.Add(new DataColumn("switchboardowner", typeof(String)));
  244. return table;
  245. }
  246. public void Load(DataRow row)
  247. {
  248. SIPDialogue = new SIPDialogue();
  249. SIPDialogue.Id = new Guid(row["id"] as string);
  250. SIPDialogue.Owner = row["owner"] as string;
  251. SIPDialogue.AdminMemberId = row["adminmemberid"] as string;
  252. SIPDialogue.LocalTag = row["localtag"] as string;
  253. SIPDialogue.RemoteTag = row["remotetag"] as string;
  254. SIPDialogue.LocalUserField = SIPUserField.ParseSIPUserField(row["localuserfield"] as string);
  255. SIPDialogue.RemoteUserField = SIPUserField.ParseSIPUserField(row["remoteuserfield"] as string);
  256. SIPDialogue.CallId = row["callid"] as string;
  257. SIPDialogue.CSeq = Convert.ToInt32(row["cseq"]);
  258. SIPDialogue.BridgeId = new Guid(row["bridgeid"] as string);
  259. SIPDialogue.RemoteTarget = SIPURI.ParseSIPURI(row["remotetarget"] as string);
  260. SIPDialogue.RouteSet = (row["routeset"] != null && row["routeset"] != DBNull.Value && !(row["routeset"] as string).IsNullOrBlank()) ? SIPRouteSet.ParseSIPRouteSet(row["routeset"] as string) : null;
  261. SIPDialogue.ProxySendFrom = (row["proxysipsocket"] != null && row["proxysipsocket"] != DBNull.Value) ? row["proxysipsocket"] as string : null;
  262. SIPDialogue.CDRId = new Guid(row["cdrid"] as string);
  263. SIPDialogue.CallDurationLimit = (row["calldurationlimit"] != null && row["calldurationlimit"] != DBNull.Value) ? Convert.ToInt32(row["calldurationlimit"]) : 0;
  264. SIPDialogue.Direction = (row["direction"] != null) ? (SIPCallDirection)Enum.Parse(typeof(SIPCallDirection), row["direction"] as string, true) : SIPCallDirection.None;
  265. Inserted = DateTimeOffset.Parse(row["inserted"] as string);
  266. TransferMode = row["transfermode"] as string;
  267. SDP = row["sdp"] as string;
  268. RemoteSDP = row["remotesdp"] as string;
  269. SIPDialogue.SwitchboardCallerDescription = (row["switchboardcallerdescription"] != null && row["switchboardcallerdescription"] != DBNull.Value) ? row["switchboardcallerdescription"] as string : null;
  270. SIPDialogue.SwitchboardDescription = (row["switchboarddescription"] != null && row["switchboarddescription"] != DBNull.Value) ? row["switchboarddescription"] as string : null;
  271. SIPDialogue.SwitchboardOwner = (row["switchboardowner"] != null && row["switchboardowner"] != DBNull.Value) ? row["switchboardowner"] as string : null;
  272. }
  273. public Dictionary<Guid, object> Load(XmlDocument dom)
  274. {
  275. return SIPAssetXMLPersistor<SIPDialogueAsset>.LoadAssetsFromXMLRecordSet(dom);
  276. }
  277. #endif
  278. public void Load(XElement dialogueElement)
  279. {
  280. SIPDialogue = new SIPDialogue();
  281. SIPDialogue.Id = new Guid(dialogueElement.Element("id").Value);
  282. SIPDialogue.Owner = dialogueElement.Element("owner").Value;
  283. SIPDialogue.AdminMemberId = dialogueElement.Element("adminmemberid").Value;
  284. SIPDialogue.LocalTag = dialogueElement.Element("localtag").Value;
  285. SIPDialogue.RemoteTag = dialogueElement.Element("remotetag").Value;
  286. SIPDialogue.LocalUserField = SIPUserField.ParseSIPUserField(dialogueElement.Element("localuserfield").Value);
  287. SIPDialogue.RemoteUserField = SIPUserField.ParseSIPUserField(dialogueElement.Element("remoteuserfield").Value);
  288. SIPDialogue.CallId = dialogueElement.Element("callid").Value;
  289. SIPDialogue.CSeq = Convert.ToInt32(dialogueElement.Element("cseq").Value);
  290. SIPDialogue.BridgeId = new Guid(dialogueElement.Element("bridgeid").Value);
  291. SIPDialogue.RemoteTarget = SIPURI.ParseSIPURI(dialogueElement.Element("remotetarget").Value);
  292. SIPDialogue.RouteSet = (dialogueElement.Element("routeset") != null && !dialogueElement.Element("routeset").Value.IsNullOrBlank()) ? SIPRouteSet.ParseSIPRouteSet(dialogueElement.Element("routeset").Value) : null;
  293. SIPDialogue.ProxySendFrom = (dialogueElement.Element("proxysipsocket") != null) ? dialogueElement.Element("proxysipsocket").Value : null;
  294. SIPDialogue.CDRId = new Guid(dialogueElement.Element("cdrid").Value);
  295. SIPDialogue.CallDurationLimit = (dialogueElement.Element("calldurationlimit") != null) ? Convert.ToInt32(dialogueElement.Element("calldurationlimit").Value) : 0;
  296. SIPDialogue.Direction = (dialogueElement.Element("direction") != null) ? (SIPCallDirection)Enum.Parse(typeof(SIPCallDirection), dialogueElement.Element("direction").Value, true) : SIPCallDirection.None;
  297. Inserted = DateTimeOffset.Parse(dialogueElement.Element("inserted").Value);
  298. TransferMode = dialogueElement.Element("transfermode").Value;
  299. SDP = dialogueElement.Element("sdp").Value;
  300. RemoteSDP = dialogueElement.Element("remotesdp").Value;
  301. SIPDialogue.SwitchboardCallerDescription = (dialogueElement.Element("switchboardcallerdescription") != null) ? dialogueElement.Element("switchboardcallerdescription").Value : null;
  302. SIPDialogue.SwitchboardDescription = (dialogueElement.Element("switchboarddescription") != null) ? dialogueElement.Element("switchboarddescription").Value : null;
  303. SIPDialogue.SwitchboardOwner = (dialogueElement.Element("switchboardowner") != null) ? dialogueElement.Element("switchboardowner").Value : null;
  304. }
  305. public string ToXML()
  306. {
  307. string dialogueXML =
  308. " <" + XML_ELEMENT_NAME + ">" + m_newLine +
  309. ToXMLNoParent() +
  310. " </" + XML_ELEMENT_NAME + ">" + m_newLine;
  311. return dialogueXML;
  312. }
  313. public string ToXMLNoParent()
  314. {
  315. string hanupAtStr = (HangupAt != null) ? HangupAt.Value.ToString("o") : null;
  316. string dialogueXML =
  317. " <id>" + SIPDialogue.Id + "</id>" + m_newLine +
  318. " <owner>" + SIPDialogue.Owner + "</owner>" + m_newLine +
  319. " <adminmemberid>" + SIPDialogue.AdminMemberId + "</adminmemberid>" + m_newLine +
  320. " <localtag>" + SIPDialogue.LocalTag + "</localtag>" + m_newLine +
  321. " <remotetag>" + SIPDialogue.RemoteTag + "</remotetag>" + m_newLine +
  322. " <callid>" + SIPDialogue.CallId + "</callid>" + m_newLine +
  323. " <cseq>" + SIPDialogue.CSeq + "</cseq>" + m_newLine +
  324. " <bridgeid>" + SIPDialogue.BridgeId + "</bridgeid>" + m_newLine +
  325. " <remotetarget>" + SafeXML.MakeSafeXML(SIPDialogue.RemoteTarget.ToString()) + "</remotetarget>" + m_newLine +
  326. " <localuserfield>" + SafeXML.MakeSafeXML(SIPDialogue.LocalUserField.ToString()) + "</localuserfield>" + m_newLine +
  327. " <remoteuserfield>" + SafeXML.MakeSafeXML(SIPDialogue.RemoteUserField.ToString()) + "</remoteuserfield>" + m_newLine +
  328. " <routeset>" + SafeXML.MakeSafeXML(RouteSet) + "</routeset>" + m_newLine +
  329. " <proxysipsocket>" + SafeXML.MakeSafeXML(ProxySIPSocket) + "</proxysipsocket>" + m_newLine +
  330. " <cdrid>" + SIPDialogue.CDRId + "</cdrid>" + m_newLine +
  331. " <calldurationlimit>" + SIPDialogue.CallDurationLimit + "</calldurationlimit>" + m_newLine +
  332. " <inserted>" + Inserted.ToString("dd MMM yyyy HH:mm:ss zz") + "</inserted>" + m_newLine +
  333. " <hangupat>" + hanupAtStr + "</hangupat>" + m_newLine +
  334. " <transfermode>" + TransferMode + "</transfermode>" + m_newLine +
  335. " <direction>" + Direction + "</direction>" + m_newLine +
  336. " <sdp>" + SafeXML.MakeSafeXML(SDP) + "</sdp>" + m_newLine +
  337. " <remotesdp>" + SafeXML.MakeSafeXML(RemoteSDP) + "</remotesdp>" + m_newLine +
  338. " <switchboardcallerdescription>" + SafeXML.MakeSafeXML(SIPDialogue.SwitchboardCallerDescription) + "</switchboardcallerdescription>" + m_newLine +
  339. " <switchboarddescription>" + SafeXML.MakeSafeXML(SIPDialogue.SwitchboardDescription) + "</switchboarddescription>" + m_newLine +
  340. " <switchboardowner>" + SafeXML.MakeSafeXML(SIPDialogue.SwitchboardOwner) + "</switchboardowner>" + m_newLine;
  341. return dialogueXML;
  342. }
  343. public string GetXMLElementName()
  344. {
  345. return XML_ELEMENT_NAME;
  346. }
  347. public string GetXMLDocumentElementName()
  348. {
  349. return XML_DOCUMENT_ELEMENT_NAME;
  350. }
  351. }
  352. }