/// <summary> /// Handles RevisionResponse message. /// </summary> /// <param name="script">Script.</param> /// <param name="reader">Binary reader.</param> private void HandleRevisionResponse(ClientScript script, BinaryReader reader) { DebugEx.VerboseFormat("ClientScript.ConnectedState.HandleRevisionResponse(reader = {0})", reader); int remoteRevision = reader.ReadInt32(); int localRevision = 0; if (File.Exists(Application.persistentDataPath + "/Revision.txt")) { string text = File.ReadAllText(Application.persistentDataPath + "/Revision.txt", Encoding.UTF8); localRevision = int.Parse(text); } DebugEx.DebugFormat("Revision at the client: {0}", localRevision); DebugEx.DebugFormat("Revision at the server: {0}", remoteRevision); if (remoteRevision > localRevision) { script.state = ClientState.RequestingMD5Hashes; } else { script.state = ClientState.Disconnected; } }
/// <summary> /// Load settings. /// </summary> public static void Load() { DebugEx.Verbose("Settings.Load()"); sInternalMode = (PlayerPrefs.GetString(KEY_INTERNAL_MODE, "False").ToLower() == "true"); DebugEx.Debug("Settings loaded:"); DebugEx.DebugFormat(" * sInternalMode = {0}", sInternalMode); }
/// <summary> /// Checks for new revision. /// </summary> private static void CheckForNewRevision() { DebugEx.VeryVeryVerbose("RevisionChecker.CheckForNewRevision()"); if (!File.Exists(sAppDir + "/Revisions/NewRevision/Lock")) { CalculateMD5InFolder(sAppDir + "/Revisions/NewRevision"); ++sRevision; Directory.Move(sAppDir + "/Revisions/NewRevision", sAppDir + "/Revisions/" + sRevision.ToString()); CreateNewRevisionFolder(); RevisionsCache.OnNewRevision(); DebugEx.DebugFormat("New revision: {0}", sRevision); } }
/// <summary> /// Setups the canvas. /// </summary> private void SetupCanvas() { DebugEx.Verbose("MasterScript.SetupCanvas()"); float dpi = Screen.dpi; if (dpi != 0f) { CanvasScaler canvasScaler = GetComponent <CanvasScaler>(); canvasScaler.scaleFactor = dpi / 96f; DebugEx.DebugFormat("Canvas scale factor: {0}", canvasScaler.scaleFactor); } else { DebugEx.Warning("Failed to determine DPI"); } }
/// <summary> /// Handler for message received from the server. /// </summary> /// <param name="script">Script.</param> /// <param name="bytes">Byte array.</param> /// <param name="dataSize">Data size.</param> public override void OnMessageReceivedFromServer(ClientScript script, byte[] bytes, int dataSize) { DebugEx.VerboseFormat("ClientScript.RequestingMD5HashesState.OnMessageReceivedFromServer(script = {0}, bytes = {1}, dataSize = {2})", script, bytes, dataSize); DebugEx.VeryVerboseFormat("Message received from the server: {0}", Utils.BytesInHex(bytes, dataSize)); MemoryStream stream = new MemoryStream(bytes); BinaryReader reader = new BinaryReader(stream, Encoding.UTF8); MessageType messageType = NetUtils.ReadMessageHeader(reader); DebugEx.DebugFormat("Message type = {0}", messageType); switch (messageType) { case MessageType.MD5HashesResponse: { HandleMD5HashesResponse(script, reader, dataSize); } break; case MessageType.RevisionRequest: case MessageType.RevisionResponse: case MessageType.MD5HashesRequest: { DebugEx.ErrorFormat("Unexpected message type: {0}", messageType); script.mFiles.Clear(); script.state = ClientState.Disconnected; } break; default: { DebugEx.ErrorFormat("Unknown message type: {0}", messageType); script.mFiles.Clear(); script.state = ClientState.Disconnected; } break; } }
/// <summary> /// Handler for message received from the client. /// </summary> /// <param name="context">Context.</param> /// <param name="bytes">Byte array.</param> /// <param name="dataSize">Data size.</param> public override void OnMessageReceivedFromClient(ClientContext context, byte[] bytes, int dataSize) { DebugEx.VerboseFormat("ClientContext.ConnectedState.OnMessageReceivedFromClient(context = {0}, bytes = {1}, dataSize = {2})", context, bytes, dataSize); DebugEx.VeryVerboseFormat("Message received from client {0}: {1}", context.mConnectionId, Utils.BytesInHex(bytes, dataSize)); MemoryStream stream = new MemoryStream(bytes); BinaryReader reader = new BinaryReader(stream, Encoding.UTF8); MessageType messageType = NetUtils.ReadMessageHeader(reader); DebugEx.DebugFormat("Message type = {0}", messageType); switch (messageType) { case MessageType.RevisionRequest: { HandleRevisionRequest(context); } break; case MessageType.RevisionResponse: case MessageType.MD5HashesRequest: case MessageType.MD5HashesResponse: { DebugEx.ErrorFormat("Unexpected message type: {0}", messageType); context.state = ClientState.Disconnected; } break; default: { DebugEx.ErrorFormat("Unknown message type: {0}", messageType); context.state = ClientState.Disconnected; } break; } }
/// <summary> /// Sets to the latest revision. /// </summary> private static void SetToTheLatestRevision() { DebugEx.Verbose("RevisionChecker.SetToTheLatestRevision()"); sRevision = 0; char[] pathDelimeters = new char[2]; pathDelimeters[0] = '/'; pathDelimeters[1] = '\\'; string[] revisions = Directory.GetDirectories(sAppDir + "/Revisions"); for (int i = 0; i < revisions.Length; ++i) { string revision = revisions[i]; int index = revision.LastIndexOfAny(pathDelimeters); if (index >= 0) { revision = revision.Substring(index + 1); } int revisionNumber; if (int.TryParse(revision, out revisionNumber)) { if (revisionNumber > sRevision) { sRevision = revisionNumber; } } } DebugEx.DebugFormat("Latest revision: {0}", sRevision); }
/// <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; } }