Example #1
0
        /// <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();
        }
Example #4
0
        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();
        }