public HoxisConnection() { _extractor = new HoxisBytesExtractor(readBufferSize); user = new HoxisUser(); user.onNetworkAnomaly += ProcessNetworkAnomaly; _extractor.onBytesExtracted += user.ProtocolEntry; user.onPost += Send; }
/// <summary> /// Get the connection state if this user has already signed in /// </summary> /// <param name="handle"></param> /// <param name="args"></param> /// <returns></returns> private bool QueryConnectionState(string handle, HoxisProtocolArgs args) { long uid = FF.StringToLong(args["uid"]); if (uid <= 0) { return(ResponseError(handle, C.RESP_ILLEGAL_ARGUMENT, FF.StringFormat("illegal argument: {0}", args["uid"]))); } HoxisUser user = HoxisServer.Ins.GetUser(uid); if (user == null) { return(Response(handle, "QueryConnectionStateCb", new KVString("code", C.RESP_NO_USER_INFO))); } if (user == this) { return(Response(handle, "QueryConnectionStateCb", new KVString("code", C.RESP_NO_USER_INFO))); } return(ResponseSuccess(handle, "QueryConnectionStateCb", new KVString("state", user.connectionState.ToString()))); }
//public void UserJoin(HoxisUser user, out Ret ret) //{ // if (_users.Count >= maxUser) { ret = new Ret(LogLevel.Info, RET_ENOUGH_USERS, "Users are enough"); return; } // if (_users.Contains(user)) { ret = new Ret(LogLevel.Warning, RET_USER_EXISTS, FF.StringFormat("User:{0} already exists", user.userID)); return; } // _users.Add(user); // user.realtimeData.parentCluster = this; // ret = Ret.ok; //} //public void UserLeave(HoxisUser user, out Ret ret) //{ // if (!_users.Contains(user)) { ret = new Ret(LogLevel.Warning, RET_NO_USER, FF.StringFormat("User:{0} doesn't exist", user.userID)); return; } // ManageTeam(ManageOperation.Leave, user); // user.realtimeData.parentTeam = null; // _users.Remove(user); // if (_users.Count == 0) { ret = new Ret(LogLevel.Info, RET_ALL_USERS_LEAVE, "All users have left"); return; } // ret = Ret.ok; //} public bool ManageTeam(ManageOperation op, HoxisUser sponsor) { switch (op) { case ManageOperation.Create: break; case ManageOperation.Join: break; case ManageOperation.Leave: break; case ManageOperation.Destroy: break; } return(true); }
/// <summary> /// **WITHIN THREAD** /// The entrance of protocol bytes /// </summary> /// <param name="data"></param> public void ProtocolEntry(byte[] data) { string json = FF.BytesToString(data); HoxisProtocol proto = FF.JsonToObject <HoxisProtocol>(json); switch (proto.type) { case ProtocolType.Synchronization: switch (proto.receiver.type) { case ReceiverType.Cluster: if (realtimeData.parentCluster == null) { return; } realtimeData.parentCluster.ProtocolBroadcast(proto); break; case ReceiverType.Team: if (realtimeData.parentTeam == null) { return; } realtimeData.parentTeam.ProtocolBroadcast(proto); break; case ReceiverType.User: HoxisUser user = HoxisServer.Ins.GetUser(proto.receiver.uid); // todo send break; } break; case ProtocolType.Request: // Request check Ret ret; CheckRequest(proto, out ret); if (ret.code != 0) { ResponseError(proto.handle, C.RESP_CHECK_FAILED, ret.desc); return; } // Check ok if (!respTable.ContainsKey(proto.action.method)) { if (DebugRecorder.LogEnable(_logger)) { _logger.LogError(FF.StringFormat("invalid request: {0}", proto.action.method), "", true); } ResponseError(proto.handle, C.RESP_CHECK_FAILED, FF.StringFormat("invalid request: {0}", proto.action.method)); return; } respTable[proto.action.method](proto.handle, proto.action.args); break; default: if (DebugRecorder.LogEnable(_logger)) { _logger.LogError(FF.StringFormat("invalid protocol type: {0}", proto.type), ""); } break; } }