private IEnumerator CreateRoom(string roomName, UInt16 maxPlayer, RoomOptions presetRoomOptions, bool ignoreExist) { createAndJoinRoomAbort = false; OrLog(LogLevel.Verbose, "room name: " + roomName); OrLog(LogLevel.Verbose, "room max player: " + maxPlayer); var messageBytes = new byte[sizeof(UInt16)]; var stream = new MemoryStream(messageBytes); var message = new EndiannessBinaryWriter(stream); try { message.Write(maxPlayer); } catch (Exception e) { OrLogError(LogLevel.Info, "error: " + e.Message); OrLogError(LogLevel.Verbose, "stacktrace: " + e.StackTrace); } message.Close(); UnityWebRequest webRequest = UnityWebRequest.Put(BASE_URL + _settings.ServerAddress + ":" + _settings.EntryPort + "/room/create/" + roomName, messageBytes); webRequest.method = "POST"; webRequest.SetRequestHeader("User-Agent", UA_UNITY_CDK); webRequest.SetRequestHeader("Content-Type", "application/octet-stream"); //webRequest.SetRequestHeader("Content-Length", messageBytes.Length.ToString()); // auto setting. yield return(webRequest.SendWebRequest()); if (webRequest.isNetworkError) { OrLogError(LogLevel.Info, webRequest.error); OnOpenRelayCreateRoomFailedCall((short)webRequest.responseCode, "failed polling");//TODO error handle case; yield break; } var streamReader = new MemoryStream(webRequest.downloadHandler.data); var messageReader = new EndiannessBinaryReader(streamReader); if (webRequest.responseCode != 200) { OrLog(LogLevel.Verbose, "post create room failed. http status code:" + webRequest.responseCode); OnOpenRelayCreateRoomFailedCall((short)webRequest.responseCode, " failed polling"); yield break; } var responseCode = (ResponseCode)messageReader.ReadUInt16(); OrLog(LogLevel.Verbose, "read bytes responseCode:" + responseCode.ToString()); messageReader.ReadUInt16();// read alignment if (ignoreExist && responseCode == ResponseCode.OPENRELAY_RESPONSE_CODE_NG_CREATE_ROOM_ALREADY_EXISTS) { OrLog(LogLevel.Verbose, "ResponseCode.OPENRELAY_RESPONSE_CODE_NG_CREATE_ROOM_ALREADY_EXISTS, but ignore "); } else if (!ignoreExist && responseCode == ResponseCode.OPENRELAY_RESPONSE_CODE_NG_CREATE_ROOM_ALREADY_EXISTS) { createAndJoinRoomAbort = true; OrLogError(LogLevel.Info, "post create room failed. http status code:" + webRequest.responseCode); OrLogError(LogLevel.Info, "post create room failed. response code:" + responseCode); OnOpenRelayCreateRoomFailedCall((short)webRequest.responseCode, " failed polling"); yield break; } else if (responseCode != ResponseCode.OPENRELAY_RESPONSE_CODE_OK_ROOM_ASSGIN_AND_CREATED) { OrLogError(LogLevel.Info, "post create room failed. http status code:" + webRequest.responseCode); OrLogError(LogLevel.Info, "post create room failed. response code:" + responseCode); OnOpenRelayCreateRoomFailedCall((short)webRequest.responseCode, " failed polling"); yield break; } var responseSize = Marshal.SizeOf(typeof(RoomResponse)); var responseBytes = messageReader.ReadBytes(responseSize); OrLog(LogLevel.VeryVerbose, "raw response:" + BitConverter.ToString(responseBytes)); var ptr = Marshal.AllocCoTaskMem(responseSize); var gch = GCHandle.Alloc(responseBytes, GCHandleType.Pinned); RoomResponse response; try { response = Marshal.PtrToStructure <RoomResponse>(gch.AddrOfPinnedObject()); OrLog(LogLevel.Verbose, "read bytes created room Id:" + BitConverter.ToString(response.Id)); OrLog(LogLevel.Verbose, "read bytes created room Capacity:" + response.Capacity.ToString()); OrLog(LogLevel.Verbose, "read bytes created room StfDealPort:" + response.StfDealPort.ToString()); OrLog(LogLevel.Verbose, "read bytes created room StfSubPort:" + response.StfSubPort.ToString()); OrLog(LogLevel.Verbose, "read bytes created room StlDealPort:" + response.StlDealPort.ToString()); OrLog(LogLevel.Verbose, "read bytes created room StlSubPort:" + response.StlSubPort.ToString()); OrLog(LogLevel.Verbose, "read bytes created room QueuingPolicy:" + response.QueuingPolicy.ToString()); OrLog(LogLevel.Verbose, "read bytes created room Flags:" + response.Flags.ToString()); OrLog(LogLevel.Verbose, "read bytes created room NameLen:" + response.NameLen.ToString()); OrLog(LogLevel.Verbose, "read bytes created room FilterLen:" + response.FilterLen.ToString()); } catch (Exception e) { OrLogError(LogLevel.Info, "handle error: " + e.Message); OrLogError(LogLevel.Verbose, "stacktrace: " + e.StackTrace); OrLogError(LogLevel.Verbose, "post create room failed "); gch.Free(); yield break; } gch.Free(); //if (0 < response.NameLen) //{ var name = messageReader.ReadBytes(256); OrLog(LogLevel.Verbose, "read bytes created room Name:" + Encoding.UTF8.GetString(name)); //} //if (0 < response.FilterLen) //{ var filter = messageReader.ReadBytes(256); OrLog(LogLevel.Verbose, "read bytes created room Filter:" + BitConverter.ToString(filter)); //} var listenMode = messageReader.ReadByte(); OrLog(LogLevel.Verbose, "read bytes get room listen mode:" + listenMode); messageReader.ReadBytes(3); // alignment 3bytes for 4byte alignment. var ipv4Bytes = messageReader.ReadBytes(4); //var ipv4Addr = new IPAddress(ipv4Bytes).ToString(); var ipv4Addr = _settings.ServerAddress; // TODO ISSUE 24 provisional fix OrLog(LogLevel.Verbose, "read bytes get room listen ipv4 addr:" + ipv4Addr); var ipv6Bytes = messageReader.ReadBytes(16); var ipv6Addr = new IPAddress(ipv6Bytes).ToString(); OrLog(LogLevel.Verbose, "read bytes get room listen ipv6 addr:" + ipv6Addr); _room = new RoomInfo(roomName, response.Id, listenMode, ipv4Addr, ipv6Addr, response.StfDealPort.ToString(), response.StfSubPort.ToString(), response.StlDealPort.ToString(), response.StlSubPort.ToString(), response.Capacity, presetRoomOptions ); subscriberListener.Start(); dealerListener.Start(); _room = new RoomInfo( dealerListener.SetProperties, dealerListener.SetPropertiesListedInLobby, _room); OnCreatedRoomCall(); OrLog(LogLevel.Verbose, "OnCreatedRoomCall"); OrLog(LogLevel.Verbose, "post create room end"); }
public static void CreateOrJoinRoom(string presetRoomName, RoomOptions presetRoomOptions, UInt16 maxPlayers) { stateHandler.StartCoroutine(stateHandler.CreateOrJoinRoom(presetRoomName, maxPlayers, presetRoomOptions)); }