Click here to Skip to main content
12,696,493 members (30,384 online)
Click here to Skip to main content
Articles » Languages » C# » General » Downloads

Stats

789.7K views
23.7K downloads
159 bookmarked
Posted

SIP Stack with SIP Proxy - (VOIP)

, 11 Jun 2007 CPOL
C# implementation of SIP
SIP_Proxy_demo
SIP_Proxy_demo.suo
SIP_Proxy_demo
bin
Debug
LumiSoft.Net.dll
SIP_Proxy_demo.exe
SIP_Proxy_demo.vshost.exe
dep
LumiSoft.Net.dll
LumiSoft.Net.pdb
Properties
Resources
add.ico
app.ico
delete.ico
edit.ico
error.ico
info.ico
refresh.ico
rule.ico
server_running.ico
server_stopped.ico
viewmessages.ico
Net
docs
dns
dns_records.jpg
dns_records.vsd
Net
_junk
_Obsolete
AUTH
bin
Release
LumiSoft.Net.dll
Data
Dns
Client
FTP
Client
Server
HTTP
Server
ICMP
IMAP
Client
Server
IO
Log
LumiSoft.Net
Mime
vCard
Net.csproj.user
Net.suo
NNTP
Client
POP3
Client
Server
RTP
SDP
ServersCore
SIP
Client
Message
Proxy
Stack
SMTP
Client
Server
STUN
Client
Message
URI
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

using SIP_Proxy_demo.Resources;
using LumiSoft.Net;
using LumiSoft.Net.SIP;
using LumiSoft.Net.SIP.Message;
using LumiSoft.Net.SIP.Proxy;

namespace SIP_Proxy_demo
{
    /// <summary>
    /// Add/edit SIP registration info.
    /// </summary>
    public class wfrm_SipRegistration : Form
    {
        private PictureBox    m_pIcon          = null;
        private Label         mt_Info          = null;
        private GroupBox      m_pSeparator1    = null;
        private Label         mt_AOR           = null;
        private TextBox       m_pAOR           = null;
        private Button        m_pGetAOR        = null;
        private Label         mt_Contact       = null;
        private TextBox       m_pContact       = null;
        private NumericUpDown m_pExpires       = null;
        private NumericUpDown m_pPriority      = null;
        private ToolStrip     m_pToolbar       = null;
        private ListView      m_pContacts      = null;
        private GroupBox      m_pSeparator2    = null;
        private Button        m_pCancel        = null;
        private Button        m_pOk            = null;

        private SIP_ProxyCore    m_pSipProxy         = null;
        private SIP_Registration m_pRegistration     = null;
        private List<string>     m_pContactsToRemove = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        /// <param name="sipProxy">Reference to SIP proxy server.</param>
        public wfrm_SipRegistration(SIP_ProxyCore sipProxy)
        {
            m_pSipProxy = sipProxy;
            m_pContactsToRemove = new List<string>();

            InitUI();

            m_pToolbar.Items[3].Enabled = false;
        }
        
        /// <summary>
        /// Edit constructor.
        /// </summary>
        /// <param name="sipProxy">Reference to SIP proxy server.</param>
        /// <param name="registration">Registration what contacts to show.</param>
        public wfrm_SipRegistration(SIP_ProxyCore sipProxy,SIP_Registration registration)
        {
            m_pSipProxy = sipProxy;
            m_pRegistration = registration;
            m_pContactsToRemove = new List<string>();

            InitUI();

            m_pAOR.Enabled = false;
            m_pAOR.Text = registration.Address;

            LoadContacts();
        }

        #region method InitUI

        /// <summary>
        /// Creates and initializes window UI.
        /// </summary>
        private void InitUI()
        {
            this.StartPosition = FormStartPosition.CenterScreen;
            this.ClientSize = new Size(500,320);
            this.Text = "Add/Update SIP registration.";
            this.Icon = ResManager.GetIcon("rule.ico");

            m_pIcon = new PictureBox();
            m_pIcon.Size = new Size(32,32);
            m_pIcon.Location = new Point(10,10);
            m_pIcon.Image = ResManager.GetIcon("rule.ico").ToBitmap();

            mt_Info = new Label();
            mt_Info.Size = new Size(450,32);
            mt_Info.Location = new Point(50,10);
            mt_Info.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
            mt_Info.TextAlign = ContentAlignment.MiddleLeft;
            mt_Info.Text = "SIP registration info.";

            m_pSeparator1 = new GroupBox();
            m_pSeparator1.Size = new Size(485,3);
            m_pSeparator1.Location = new Point(7,50);
            m_pSeparator1.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
            
            mt_AOR = new Label();
            mt_AOR.Size = new Size(140,20);
            mt_AOR.Location = new Point(0,65);
            mt_AOR.TextAlign = ContentAlignment.MiddleRight;
            mt_AOR.Text = "Address of Record:";

            m_pAOR = new TextBox();
            m_pAOR.Size = new Size(315,20);
            m_pAOR.Location = new Point(145,65);

            m_pGetAOR = new Button();
            m_pGetAOR.Size = new Size(25,20);
            m_pGetAOR.Location = new Point(465,65);
            m_pGetAOR.Text = "...";
            m_pGetAOR.Click += new EventHandler(m_pGetAOR_Click);
            m_pGetAOR.Enabled = false;

            mt_Contact = new Label();
            mt_Contact.Size = new Size(140,20);
            mt_Contact.Location = new Point(0,90);
            mt_Contact.TextAlign = ContentAlignment.MiddleRight;
            mt_Contact.Text = "Contact URI:";

            m_pContact = new TextBox();
            m_pContact.Size = new Size(160,20);
            m_pContact.Location = new Point(145,90);

            m_pExpires = new NumericUpDown();
            m_pExpires.Size = new Size(50,20);
            m_pExpires.Location = new Point(310,90);
            m_pExpires.Minimum = 60;
            m_pExpires.Maximum = 9999;

            m_pPriority = new NumericUpDown();
            m_pPriority.Size = new Size(45,20);
            m_pPriority.Location = new Point(365,90);
            m_pPriority.DecimalPlaces = 2;
            m_pPriority.Minimum = (decimal)0.1;
            m_pPriority.Maximum = (decimal)1.0;
            m_pPriority.Value = (decimal)1.0;
           
            m_pToolbar = new ToolStrip();
            m_pToolbar.Location = new Point(430,88);
            m_pToolbar.Size = new Size(60,25);
            m_pToolbar.Dock = DockStyle.None;
            m_pToolbar.Anchor = AnchorStyles.Right | AnchorStyles.Top;
            m_pToolbar.GripStyle = ToolStripGripStyle.Hidden;
            m_pToolbar.BackColor = this.BackColor;
            m_pToolbar.Renderer = new ToolBarRendererEx();
            m_pToolbar.ItemClicked += new ToolStripItemClickedEventHandler(m_pToolbar_ItemClicked);
            // Add button
            ToolStripButton button_Add = new ToolStripButton();
            button_Add.Image = ResManager.GetIcon("add.ico").ToBitmap();
            button_Add.Tag = "add";
            button_Add.ToolTipText = "Add";
            m_pToolbar.Items.Add(button_Add);
            // Delete button
            ToolStripButton button_Delete = new ToolStripButton();
            button_Delete.Enabled = false;
            button_Delete.Image = ResManager.GetIcon("delete.ico").ToBitmap();
            button_Delete.Tag = "delete";
            button_Delete.ToolTipText = "Delete";
            m_pToolbar.Items.Add(button_Delete);
            // Separator
            m_pToolbar.Items.Add(new ToolStripSeparator());
            // Refresh button
            ToolStripButton button_Refresh = new ToolStripButton();
            button_Refresh.Image = ResManager.GetIcon("refresh.ico").ToBitmap();
            button_Refresh.Tag = "refresh";
            button_Refresh.ToolTipText  = "Refresh";
            m_pToolbar.Items.Add(button_Refresh);

            m_pContacts = new ListView();
            m_pContacts.Size = new Size(480,155);
            m_pContacts.Location = new Point(10,120);
            m_pContacts.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
            m_pContacts.View = View.Details;
            m_pContacts.FullRowSelect = true;
            m_pContacts.HideSelection = false;
            m_pContacts.Columns.Add("Contact URI",340);
            m_pContacts.Columns.Add("Expires",60);
            m_pContacts.Columns.Add("Priority",50);
            m_pContacts.SelectedIndexChanged += new EventHandler(m_pContacts_SelectedIndexChanged);

            m_pSeparator2 = new GroupBox();
            m_pSeparator2.Size = new Size(485,4);
            m_pSeparator2.Location = new Point(7,285);
            m_pSeparator2.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;

            m_pCancel = new Button();
            m_pCancel.Size = new Size(70,20);
            m_pCancel.Location = new Point(340,295);
            m_pCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            m_pCancel.Text = "Cancel";
            m_pCancel.Click += new EventHandler(m_pCancel_Click);

            m_pOk = new Button();
            m_pOk.Size = new Size(70,20);
            m_pOk.Location = new Point(415,295);
            m_pOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            m_pOk.Text = "Ok";
            m_pOk.Click += new EventHandler(m_pOk_Click);

            this.Controls.Add(m_pIcon);
            this.Controls.Add(mt_Info);
            this.Controls.Add(m_pSeparator1);
            this.Controls.Add(mt_AOR);
            this.Controls.Add(m_pAOR);
            this.Controls.Add(m_pGetAOR);
            this.Controls.Add(mt_Contact);
            this.Controls.Add(m_pContact);
            this.Controls.Add(m_pExpires);
            this.Controls.Add(m_pPriority);
            this.Controls.Add(m_pToolbar);
            this.Controls.Add(m_pContacts);
            this.Controls.Add(m_pSeparator2);
            this.Controls.Add(m_pCancel);
            this.Controls.Add(m_pOk);
        }
                                                                                
        #endregion


        #region Events Handling

        #region method m_pGetAOR_Click

        private void m_pGetAOR_Click(object sender,EventArgs e)
        {
            //wfrm_se
        }

        #endregion

        #region method m_pToolbar_ItemClicked

        private void m_pToolbar_ItemClicked(object sender,ToolStripItemClickedEventArgs e)
        {
            if(e.ClickedItem.Tag == null){
                return;
            }
            else if(e.ClickedItem.Tag.ToString() == "add"){
                if(m_pContact.Text.Length < 3){
                    MessageBox.Show(this,"Please specify Contact URI !","Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    return;
                }

                ListViewItem it = new ListViewItem(m_pContact.Text);
                it.SubItems.Add(m_pExpires.Value.ToString());
                it.SubItems.Add(m_pPriority.Value.ToString("f2"));
                it.Tag = true;
                m_pContacts.Items.Add(it);

                m_pContact.Text = "";
            }
            else if(e.ClickedItem.Tag.ToString() == "delete"){
                ListViewItem selectedItem = m_pContacts.SelectedItems[0];
                // Add only existing contacts to remove list, don't add uncommited contacts.
                if(!((bool)selectedItem.Tag)){
                    m_pContactsToRemove.Add(selectedItem.Text);                    
                }
                selectedItem.Remove();
            }
            else if(e.ClickedItem.Tag.ToString() == "refresh"){
                LoadContacts();
            }
        }

        #endregion

        #region method m_pContacts_SelectedIndexChanged

        private void m_pContacts_SelectedIndexChanged(object sender,EventArgs e)
        {
            if(m_pContacts.SelectedItems.Count > 0){
                m_pToolbar.Items[1].Enabled = true;
            }
            else{
                m_pToolbar.Items[1].Enabled = false;
            }
        }

        #endregion


        #region method m_pCancel_Click

        private void m_pCancel_Click(object sender,EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }

        #endregion

        #region method m_pOk_Click

        private void m_pOk_Click(object sender,EventArgs e)
        {
            if(m_pAOR.Text.Length < 3){
                MessageBox.Show(this,"Please specify Address of Record !","Error:",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return;
            }

            List<SIP_t_ContactParam> contacts = new List<SIP_t_ContactParam>();
            // Add remove items
            foreach(string contact in m_pContactsToRemove){
                SIP_t_ContactParam c = new SIP_t_ContactParam();
                c.Parse(new StringReader("<" + contact + ">;expires=0"));
                contacts.Add(c);
            }
            // Add new items
            foreach(ListViewItem item in m_pContacts.Items){
                // We need new items only, others we don't touch.
                if(((bool)item.Tag)){
                    SIP_t_ContactParam c = new SIP_t_ContactParam();
                    c.Parse(new StringReader("<" + item.Text + ">;expires=" + item.SubItems[1].Text + ";qvalue=" + item.SubItems[2].Text.Replace(',','.')));
                    contacts.Add(c);
                }
            }
            
            if(contacts.Count > 0){
                // Add or update registration info.
                m_pSipProxy.Registrar.SetRegistration(m_pAOR.Text,contacts.ToArray());
            }

            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        #endregion

        #endregion


        #region method LoadContacts

        /// <summary>
        /// Loads contacts to UI.
        /// </summary>
        private void LoadContacts()
        {
            m_pContacts.Items.Clear();
            
            foreach(SIP_RegistrationContact contact in m_pRegistration.Contacts){
                ListViewItem it = new ListViewItem(contact.Contact.Address.Uri);
                it.SubItems.Add(contact.Expires.ToString());
                it.SubItems.Add(contact.QValue.ToString("f2"));
                it.Tag = false;
                m_pContacts.Items.Add(it);
            }
        }

        #endregion


        #region Properties Implementation
                
        /// <summary>
        /// Gets current SIP registration address of record.
        /// </summary>
        public string AddressOfRecord
        {
            get{ return m_pAOR.Text; }
        }

        #endregion

    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Ivar Lumi
Estonia Estonia
No Biography provided

You may also be interested in...

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170118.1 | Last Updated 11 Jun 2007
Article Copyright 2007 by Ivar Lumi
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid