Esempio n. 1
0
        /// <summary>
        /// Multiple threads are required in order to send and receive streamed data if the user interface is going to be responsive.
        /// The best way I could seperate the visual content from the multiple threads required to send and receive streamed data was via the use
        /// of delegates. I could have passed the classes in such as MainWindow or mP2P, however this would have greatly increased the dependencies.
        /// By using delegates this class can stand on it's own without using MainWindow or mP2P.
        /// </summary>
        /// <param name="nodeName">This Node's name</param>
        /// <param name="threadFinishedDelegate">The delegate to respond when the Thread has finished (this will only happen when it is canceled via </param>
        public StreamingHttpListener(String uniqueStreamName, WorkerThreadFinished threadFinishedDelegate,
                                     LogMessage msg, StartStream startStream, SendStream sendStream)
        {
            mLogMessage       = msg;
            mUniqueStreamName = uniqueStreamName;
            mStartStream      = startStream;
            mSendStream       = sendStream;

            //start the audioHttpListenerThread. This thread contains the AudioHttpServer and responds to requests from
            //the mAudioPlayer
            mHttpListenerThread                            = new System.ComponentModel.BackgroundWorker();
            mHttpListenerThread.DoWork                    += new System.ComponentModel.DoWorkEventHandler(PseudoHttpServer);
            mHttpListenerThread.RunWorkerCompleted        += new System.ComponentModel.RunWorkerCompletedEventHandler(threadFinishedDelegate);
            mHttpListenerThread.WorkerSupportsCancellation = true;
            mHttpListenerThread.RunWorkerAsync(null);

            //initialize the audio parameters.
            mIncommingStream          = false;
            mSyncStreamLastWrittenPos = 0;
            mPseudoStream             = new MemoryStream();
            mSyncStream = Stream.Synchronized(mPseudoStream);
            mHashTable  = new System.Collections.Hashtable();

            mTimer = new Timer(new TimerCallback(TimerCallback));
            mTimer.Change(0, 3500);//every 3500ms get a callback
        }
Esempio n. 2
0
            public void Dispose()
            {
                RawReceiveStream?.Dispose();
                SendStream?.Dispose();
                ReceiveStream?.Dispose();

                _webSocket?.Dispose();
            }
        HttpWebRequest buildRequest(string method, string name, CookieContainer cookies)
        {
            GXLogging.Debug(log, String.Format("Start HTTPClient buildRequest: requestUrl:{0} method:{1} name:{2}", _url, method, name));
            int BytesRead;

            Byte[] Buffer = new Byte[1024];

            string         requestUrl = GetRequestURL(name);
            HttpWebRequest req        = (HttpWebRequest)WebRequest.Create(requestUrl);

            if (GXUtil.CompressResponse())
            {
                req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
            }

            req.Credentials     = getCredentialCache(req.RequestUri, _authCollection);
            req.CookieContainer = cookies;
            foreach (X509Certificate2 cert in _certificateCollection)
            {
                req.ClientCertificates.Add(cert);
            }
            req.Method  = method.Trim();
            req.Timeout = _timeout;
            setHttpVersion(req);
            WebProxy proxy = getProxy(_proxyHost, _proxyPort, _authProxyCollection);

            if (proxy != null)
            {
                req.Proxy = proxy;
            }

            setHeaders(req);

            if (method.ToUpper() != "GET")
            {
#if !NETCORE
                using (Stream reqStream = req.GetRequestStream())
#else
                using (Stream reqStream = req.GetRequestStreamAsync().GetAwaiter().GetResult())
#endif
                {
                    sendVariables(reqStream);
                    SendStream.Seek(0, SeekOrigin.Begin);
                    BytesRead = SendStream.Read(Buffer, 0, 1024);
                    GXLogging.Debug(log, "Start SendStream.Read: BytesRead " + BytesRead);
                    while (BytesRead > 0)
                    {
                        GXLogging.Debug(log, "reqStream.Write: Buffer.length " + Buffer.Length + ",'" + Encoding.UTF8.GetString(Buffer, 0, Buffer.Length) + "'");
                        reqStream.Write(Buffer, 0, BytesRead);
                        BytesRead = SendStream.Read(Buffer, 0, 1024);
                    }
                    EndMultipartBoundary(reqStream);
                }
            }
            return(req);
        }
Esempio n. 4
0
        public void Dispose()
        {
            SendStream?.Dispose();
            SendStream = null;

            ReceiveStream?.Dispose();
            ReceiveStream = null;

            _socket?.Dispose();
            _socket = null;
        }
Esempio n. 5
0
        /// <summary>
        /// Send an entire stream
        /// </summary>
        /// <param name="msg">Message</param>
        public void SendStream(SendStream msg)
        {
            if (_stream.CanRead)
            {
#if NET_3_5
                CopyTo(msg.Stream, _stream);
#else
                msg.Stream.CopyTo(_stream);
#endif
            }
            msg.Stream.Dispose();
        }
Esempio n. 6
0
 private void StartMultipartFile(string name, string s)
 {
     if (IsMultipart && File.Exists(s))
     {
         s = Path.GetFileName(s);
         if (string.IsNullOrEmpty(name))
         {
             name = Path.GetFileNameWithoutExtension(s);
         }
         SendStream.Write(MultiPart.Boundarybytes, 0, MultiPart.Boundarybytes.Length);
         var header      = string.Format(MultiPart.HeaderTemplate, name, s, MimeMapping.GetMimeMapping(s));
         var headerbytes = Encoding.UTF8.GetBytes(header);
         SendStream.Write(headerbytes, 0, headerbytes.Length);
     }
 }
Esempio n. 7
0
        public void AddFile(string s, string name)
        {
            StartMultipartFile(name, s);
#pragma warning disable SCS0018 // Path traversal: injection possible in {1} argument passed to '{0}'
            using (FileStream fs = new FileStream(s, FileMode.Open, FileAccess.Read))
#pragma warning restore SCS0018 // Path traversal: injection possible in {1} argument passed to '{0}'
            {
                byte[] buffer    = new Byte[1024];
                int    bytesRead = fs.Read(buffer, 0, 1024);
                while (bytesRead > 0)
                {
                    SendStream.Write(buffer, 0, bytesRead);
                    bytesRead = fs.Read(buffer, 0, 1024);
                }
            }
        }
Esempio n. 8
0
        public void Dispose()
        {
            try
            {
                SendStream?.Dispose();
            }
            catch (ObjectDisposedException)
            {
            }
            catch (NullReferenceException)
            {
            }
            finally
            {
                SendStream = null;
            }

            try
            {
                ReceiveStream?.Dispose();
            }
            catch (ObjectDisposedException)
            {
            }
            catch (NullReferenceException)
            {
            }
            finally
            {
                ReceiveStream = null;
            }

            try
            {
                _socket?.Dispose();
            }
            catch (ObjectDisposedException)
            {
            }
            catch (NullReferenceException)
            {
            }
            finally
            {
                _socket = null;
            }
        }
Esempio n. 9
0
        public override void SendUpdate()
        {
            ProfilerShort.Begin("ClientState.WriteAcks");

            // Client ACK Packet - reliable
            SendStream.ResetWrite();

            // ACK Header
            // Write last state sync packet id
            SendStream.WriteByte(m_lastStateSyncPacketId);

            // Write ACKs
            byte num = (byte)m_acks.Count;

            SendStream.WriteByte(num);
            for (int i = 0; i < num; i++)
            {
                SendStream.WriteByte(m_acks[i]);
            }
            SendStream.Terminate();
            m_acks.Clear();
            ProfilerShort.End();
            m_callback.SendClientAcks(SendStream);

            // Client Update Packet
            SendStream.ResetWrite();

            m_clientPacketId++;
            SendStream.WriteByte(m_clientPacketId);
            SendStream.WriteDouble(MyTimeSpan.FromTicks(Stopwatch.GetTimestamp()).Milliseconds);
            ProfilerShort.Begin("ClientState.Serialize");
            if (VRage.MyCompilationSymbols.EnableNetworkPacketTracking)
            {
                Trace.MyTrace.Send(Trace.TraceWindow.MPackets, "Send client update: ");
            }
            // Write Client state
            ClientState.Serialize(SendStream, false);
            ProfilerShort.End();
            SendStream.Terminate();

            ProfilerShort.Begin("SendClientUpdate");
            m_callback.SendClientUpdate(SendStream);
            ProfilerShort.End();

            //Client.SendMessageToServer(m_sendStream, PacketReliabilityEnum.UNRELIABLE, PacketPriorityEnum.IMMEDIATE_PRIORITY, MyChannelEnum.StateDataSync);
        }
Esempio n. 10
0
 /// <summary>
 /// Send an entire stream
 /// </summary>
 /// <param name="msg">Message</param>
 public void SendStream(SendStream msg)
 {
     msg.Stream.CopyTo(_stream);
     msg.Stream.Dispose();
 }
Esempio n. 11
0
 public void SendClientConnected(ref ConnectedClientDataMsg msg)
 {
     SendStream.ResetWrite();
     VRage.Serialization.MySerializer.Write <ConnectedClientDataMsg>(SendStream, ref msg);
     m_callback.SendConnectRequest(SendStream);
 }
Esempio n. 12
0
        void SetReplicableReady(NetworkId networkId, IMyReplicable replicable, bool loaded)
        {
            try
            {
                MyPendingReplicable pendingReplicable;
                if (m_pendingReplicables.TryGetValue(networkId, out pendingReplicable))
                {
                    m_pendingReplicables.Remove(networkId);

                    if (loaded)
                    {
                        var ids = pendingReplicable.StateGroupIds;

                        AddNetworkObjectClient(networkId, replicable);

                        using (m_tmpGroups)
                        {
                            IMyStreamableReplicable streamable = replicable as IMyStreamableReplicable;
                            if (streamable != null && pendingReplicable.IsStreaming)
                            {
                                var group = streamable.GetStreamingStateGroup();
                                m_tmpGroups.Add(group);
                            }

                            replicable.GetStateGroups(m_tmpGroups);
                            Debug.Assert(ids.Count == m_tmpGroups.Count,
                                         "Number of state groups on client and server for replicable does not match");
                            for (int i = 0; i < m_tmpGroups.Count; i++)
                            {
                                if (m_tmpGroups[i] != replicable && m_tmpGroups[i].GroupType != StateGroupEnum.Streaming)
                                {
                                    AddNetworkObjectClient(ids[i], m_tmpGroups[i]);
                                }
                            }
                        }
                        m_eventBuffer.ProcessEvents(networkId, m_eventHandler, m_isBlockedHandler, NetworkId.Invalid);
                    }
                    else
                    {
                        MyLog.Default.WriteLine("Failed to create replicable ! Type : " + replicable.ToString());
                        m_eventBuffer.RemoveEvents(networkId);

                        IMyStreamableReplicable streamable = replicable as IMyStreamableReplicable;
                        if (streamable != null && pendingReplicable.IsStreaming)
                        {
                            var group = streamable.GetStreamingStateGroup();
                            group.Destroy();
                            NetworkId streaingGroupId;
                            if (TryGetNetworkIdByObject(group, out streaingGroupId))
                            {
                                RemoveNetworkedObject(group);
                            }
                            MyLog.Default.WriteLine("removing streaming group for not loaded replicable !");
                        }
                    }

                    SendStream.ResetWrite();
                    SendStream.WriteNetworkId(networkId);
                    SendStream.WriteBool(loaded);
                    SendStream.Terminate();
                    m_callback.SendReplicableReady(SendStream);
                }
                else
                {
                    m_pendingReplicables.Remove(networkId);
                    using (m_tmpGroups)
                    {
                        IMyStreamableReplicable streamable = replicable as IMyStreamableReplicable;
                        if (streamable != null && streamable.NeedsToBeStreamed)
                        {
                            var group = streamable.GetStreamingStateGroup();
                            m_tmpGroups.Add(group);
                            MyLog.Default.WriteLine("removing streaming group for not loaded replicable !");
                        }

                        replicable.GetStateGroups(m_tmpGroups);
                        foreach (var g in m_tmpGroups)
                        {
                            if (g != null)
                            // when terminal repblicable fails to attach to block its state group is null becouase its created inside hook method.
                            {
                                g.Destroy();
                            }
                        }
                    }
                    replicable.OnDestroy();
                }
            }
            catch (Exception ex)
            {
                MyLog.Default.WriteLine(ex);
                throw;
                //m_callback.DisconnectFromHost();
            }
        }
Esempio n. 13
0
        public void Dispose()
        {
            var oneStreamIsUsed = SendStream != null && ReceiveStream != null && ReferenceEquals(SendStream, ReceiveStream);

            try
            {
                SendStream?.Dispose();
            }
            catch (ObjectDisposedException)
            {
            }
            catch (NullReferenceException)
            {
            }
            finally
            {
                SendStream = null;
            }

            try
            {
                if (!oneStreamIsUsed)
                {
                    ReceiveStream?.Dispose();
                }
            }
            catch (ObjectDisposedException)
            {
            }
            catch (NullReferenceException)
            {
            }
            finally
            {
                ReceiveStream = null;
            }

            try
            {
                _sslStream?.Dispose();
            }
            catch (ObjectDisposedException)
            {
            }
            catch (NullReferenceException)
            {
            }
            finally
            {
                _sslStream = null;
            }

            try
            {
                _socket?.Dispose();
            }
            catch (ObjectDisposedException)
            {
            }
            catch (NullReferenceException)
            {
            }
            finally
            {
                _socket = null;
            }
        }