/// <summary> /// Refreshes specified registration info. /// </summary> public void Refresh() { /* GetSipRegistration "<virtualServerID>" "<addressOfRecord>" Responses: +OK <sizeOfData> <data> -ERR <errorText> */ lock(m_pOwner.VirtualServer.Server.LockSynchronizer){ m_pOwner.VirtualServer.Server.TcpClient.TcpStream.WriteLine("GetSipRegistration " + TextUtils.QuoteString(m_pOwner.VirtualServer.VirtualServerID) + " " + TextUtils.QuoteString(m_AddressOfRecord) ); string response = m_pOwner.VirtualServer.Server.ReadLine(); if(!response.ToUpper().StartsWith("+OK")){ throw new Exception(response); } int sizeOfData = Convert.ToInt32(response.Split(new char[]{' '},2)[1]); MemoryStream ms = new MemoryStream(); m_pOwner.VirtualServer.Server.TcpClient.TcpStream.ReadFixedCount(ms,sizeOfData); // Decompress dataset DataSet ds = Utils.DecompressDataSet(ms); if(ds.Tables.Contains("Contacts")){ List<SipRegistrationContact> contacts = new List<SipRegistrationContact>(); foreach(DataRow dr in ds.Tables["Contacts"].Rows){ SIP_t_ContactParam c = new SIP_t_ContactParam(); c.Parse(new LumiSoft.Net.StringReader(dr["Value"].ToString())); contacts.Add(new SipRegistrationContact(c.Address.Uri.Value,c.Expires,c.QValue)); } m_pContacts = contacts.ToArray(); } else{ m_pContacts = new SipRegistrationContact[0]; } } }
/// <summary> /// Gets server events and binds them to this. /// </summary> private void Bind() { /* GetSipRegistrations "<virtualServerID>" Responses: +OK <sizeOfData> <data> -ERR <errorText> */ lock(m_pOwner.Server.LockSynchronizer){ m_pOwner.Server.Socket.WriteLine("GetSipRegistrations " + TextUtils.QuoteString(m_pOwner.VirtualServerID) ); string response = m_pOwner.Server.Socket.ReadLine(); if(!response.ToUpper().StartsWith("+OK")){ throw new Exception(response); } int sizeOfData = Convert.ToInt32(response.Split(new char[]{' '},2)[1]); MemoryStream ms = new MemoryStream(); m_pOwner.Server.Socket.ReadSpecifiedLength(sizeOfData,ms); // Decompress dataset DataSet ds = Utils.DecompressDataSet(ms); if(ds.Tables.Contains("SipRegistrations")){ foreach(DataRow dr in ds.Tables["SipRegistrations"].Rows){ //--- Parse contact -------------------------------------------------------------// List<SipRegistrationContact> contacts = new List<SipRegistrationContact>(); foreach(string contact in dr["Contacts"].ToString().Split('\t')){ if(!string.IsNullOrEmpty(contact)){ SIP_t_ContactParam c = new SIP_t_ContactParam(); c.Parse(new LumiSoft.Net.StringReader(contact)); contacts.Add(new SipRegistrationContact(c.Address.Uri,c.Expires,c.QValue)); } } //--------------------------------------------------------------------------------// m_pRegistrations.Add(new SipRegistration( this, dr["UserName"].ToString(), dr["AddressOfRecord"].ToString(), contacts.ToArray() )); } } } }
/// <summary> /// Converts <b>ContactUri</b> to valid Contact header value. /// </summary> /// <returns>Returns contact header value.</returns> public string ToContactValue() { SIP_t_ContactParam retVal = new SIP_t_ContactParam(); retVal.Parse(new StringReader(m_ContactURI.ToString())); retVal.Expires = m_Expires; return retVal.ToStringValue(); }
private void SetSipRegistration(string argsText) { /* SetSipRegistration "<virtualServerID>" "<addressOfRecord>" "<contacts>" Responses: +OK -ERR <errorText> */ try{ string[] args = TextUtils.SplitQuotedString(argsText,' ',true); if(args.Length != 3){ WriteLine("-ERR Invalid arguments. Syntax: SetSipRegistration \"<virtualServerID>\" \"<addressOfRecord>\" \"<contacts>\""); return; } foreach(VirtualServer virtualServer in this.Server.MailServer.VirtualServers){ if(virtualServer.ID.ToLower() == args[0].ToLower()){ List<SIP_t_ContactParam> contacts = new List<SIP_t_ContactParam>(); foreach(string contact in args[2].Split('\t')){ if(contact.Length > 0){ SIP_t_ContactParam c = new SIP_t_ContactParam(); c.Parse(new LumiSoft.Net.StringReader(contact)); contacts.Add(c); } } virtualServer.SipServer.Registrar.SetRegistration(args[1],contacts.ToArray()); WriteLine("+OK"); return; } } WriteLine("-ERR Specified virtual server with ID '" + argsText + "' doesn't exist !"); } catch(Exception x){ WriteLine("-ERR " + x.Message); } }
/// <summary> /// Returns this.Contact as string value, but expires parameter is replaced with remaining time value. /// </summary> /// <returns></returns> public string ToStringValue() { SIP_t_ContactParam retVal = new SIP_t_ContactParam(); retVal.Parse(new StringReader(m_pContact.ToStringValue())); retVal.Expires = this.Expires; return retVal.ToStringValue(); }