/// <summary>
            /// Creates new flow from TCP server session.
            /// </summary>
            /// <param name="session">TCP server session.</param>
            /// <returns>Returns created flow.</returns>
            /// <exception cref="ArgumentNullException">Is raised when <b>session</b> is null reference.</exception>
            internal SIP_Flow CreateFromSession(TCP_ServerSession session)
            {
                if (session == null)
                {
                    throw new ArgumentNullException("session");
                }

                string flowID = session.LocalEndPoint + "-" + session.RemoteEndPoint + "-" +
                                (session.IsSecureConnection ? SIP_Transport.TLS : SIP_Transport.TCP);

                lock (m_pLock)
                {
                    SIP_Flow flow = new SIP_Flow(m_pOwner.Stack, session);
                    m_pFlows.Add(flowID, flow);
                    flow.IsDisposing += delegate
                                            {
                                                lock (m_pLock)
                                                {
                                                    m_pFlows.Remove(flowID);
                                                }
                                            };
                    flow.Start();

                    return flow;
                }
            }
            /// <summary>
            /// Returns existing flow if exists, otherwise new created flow.
            /// </summary>
            /// <param name="isServer">Specifies if created flow is server or client flow. This has effect only if flow is created.</param>
            /// <param name="localEP">Local end point.</param>
            /// <param name="remoteEP">Remote end point.</param>
            /// <param name="transport">SIP transport.</param>
            /// <returns>Returns existing flow if exists, otherwise new created flow.</returns>
            /// <exception cref="ArgumentNullException">Is raised when <b>localEP</b>,<b>remoteEP</b> or <b>transport</b> is null reference.</exception>
            /// <exception cref="ArgumentException">Is raised when any of the arguments has invalid value.</exception>
            internal SIP_Flow GetOrCreateFlow(bool isServer,
                                              IPEndPoint localEP,
                                              IPEndPoint remoteEP,
                                              string transport)
            {
                if (localEP == null)
                {
                    throw new ArgumentNullException("localEP");
                }
                if (remoteEP == null)
                {
                    throw new ArgumentNullException("remoteEP");
                }
                if (transport == null)
                {
                    throw new ArgumentNullException("transport");
                }

                string flowID = localEP + "-" + remoteEP + "-" + transport;

                lock (m_pLock)
                {
                    SIP_Flow flow = null;
                    if (m_pFlows.TryGetValue(flowID, out flow))
                    {
                        return flow;
                    }
                    else
                    {
                        flow = new SIP_Flow(m_pOwner.Stack, isServer, localEP, remoteEP, transport);
                        m_pFlows.Add(flow.ID, flow);
                        flow.IsDisposing += delegate
                                                {
                                                    lock (m_pLock)
                                                    {
                                                        m_pFlows.Remove(flowID);
                                                    }
                                                };
                        flow.Start();

                        return flow;
                    }
                }
            }