Example #1
0
		/// <summary>
		/// Builds MD5HashesResponse messages.
		/// </summary>
		/// <returns>Byte arrays that represents MD5HashesResponse messages.</returns>
        public static List<byte[]> BuildMD5HashesResponseMessages()
        {
			ReadOnlyCollection<string> files       = RevisionsCache.files;
			string                     revisionDir = Application.persistentDataPath + "/Revisions/" + RevisionChecker.revision.ToString();

			List<byte[]> res = new List<byte[]>();

			MemoryStream stream = new MemoryStream();
			BinaryWriter writer = new BinaryWriter(stream, Encoding.UTF8);

			NetUtils.WriteMessageHeader(writer, MessageType.MD5HashesResponse);
			writer.Write(false); // To be continued?

			for (int i = 0; i < files.Count; ++i)
			{
				string file = files[i];

				if (stream.Length > CommonConstants.PACKET_SIZE - CommonConstants.PACKET_SAFE_LIMIT)
				{
					res.Add(stream.ToArray());

					stream = new MemoryStream();
					writer = new BinaryWriter(stream, Encoding.UTF8);
					
					NetUtils.WriteMessageHeader(writer, MessageType.MD5HashesResponse);
					writer.Write(false); // To be continued?
				}

				writer.Write(file); // Name of file

				if (Directory.Exists(revisionDir + "/" + file))
				{
					writer.Write(true); // Is it a folder
				}
				else
				{
					writer.Write(false); // Is it a folder

					if (!File.Exists(revisionDir + "/" + file))
					{
						DebugEx.FatalFormat("File {0} not found", revisionDir + "/" + file);

						return null;
					}

					if (!File.Exists(revisionDir + "/" + file + ".md5"))
					{
						RevisionChecker.CalculateMD5ForFile(revisionDir + "/" + file);
					}

					writer.Write(File.ReadAllText(revisionDir + "/" + file + ".md5", Encoding.UTF8)); // MD5 Hash of file
				}
			}

			res.Add(stream.ToArray());

			for (int i = 0; i < res.Count - 1; ++i)
			{
				stream = new MemoryStream(res[i]);
				writer = new BinaryWriter(stream, Encoding.UTF8);
								
				NetUtils.WriteMessageHeader(writer, MessageType.MD5HashesResponse);
				writer.Write(true); // To be continued?
			}

			return res;
		}
Example #2
0
        /// <summary>
        /// Update is called once per frame.
        /// </summary>
        void Update()
        {
            DebugEx.VeryVeryVerbose("ServerScript.Update()");

            RevisionChecker.Update();

            int  hostId;
            int  connectionId;
            int  channelId;
            int  dataSize;
            byte error;

            NetworkEventType eventType = NetworkTransport.Receive(out hostId, out connectionId, out channelId, mBuffer, CommonConstants.PACKET_SIZE, out dataSize, out error);

            switch (eventType)
            {
            case NetworkEventType.Nothing:
            {
                // Nothing
            }
            break;

            case NetworkEventType.ConnectEvent:
            {
                DebugEx.DebugFormat("Client {0} connected", connectionId);

                if (connectionId == mClients.Count + 1)
                {
                    mClients.Add(new ClientContext(connectionId));
                }
                else
                {
                    if (connectionId > 0 && connectionId <= mClients.Count && mClients[connectionId - 1] == null)
                    {
                        mClients[connectionId - 1] = new ClientContext(connectionId);
                    }
                    else
                    {
                        DebugEx.FatalFormat("Incorrect behaviour on handling connected client. connectionId = {0} mClients.Count = {1}", connectionId, mClients.Count);

                        Server.DisconnectClient(connectionId);
                    }
                }
            }
            break;

            case NetworkEventType.DataEvent:
            {
                if (connectionId > 0 && connectionId <= mClients.Count && mClients[connectionId - 1] != null)
                {
                    mClients[connectionId - 1].OnMessageReceivedFromClient(mBuffer, dataSize);
                }
                else
                {
                    DebugEx.FatalFormat("Incorrect behaviour on handling data from client. connectionId = {0} mClients.Count = {1}", connectionId, mClients.Count);

                    Server.DisconnectClient(connectionId);
                }
            }
            break;

            case NetworkEventType.DisconnectEvent:
            {
                DebugEx.DebugFormat("Client {0} disconnected, error: {1}({2})", connectionId, (NetworkError)error, error);

                if (connectionId > 0 && connectionId <= mClients.Count && mClients[connectionId - 1] != null)
                {
                    mClients[connectionId - 1] = null;
                }
                else
                {
                    DebugEx.FatalFormat("Incorrect behaviour on handling disconnected client. connectionId = {0} mClients.Count = {1}", connectionId, mClients.Count);
                }
            }
            break;

            case NetworkEventType.BroadcastEvent:
            {
                DebugEx.ErrorFormat("Unexpected event type: {0}", eventType);
            }
            break;

            default:
            {
                DebugEx.ErrorFormat("Unknown event type: {0}", eventType);
            }
            break;
            }
        }