public CheckVersion3InMessage(object sender, ServiceDesc msg, object data) : base((ServerClient)sender, msg, data) { Request = data as __RPC_Directory_CheckVersion3_ARG_string_lang_string_platform_string_channel_string_version__; mResponse = new __RPC_Directory_CheckVersion3_RET_VersionInfo__(); mResponse.ReturnValue = new VersionInfo(); }
public override void SetResponse(uint error, byte[] data) { if (data != null) { var ms = new MemoryStream(data, false); mResponse = Serializer.Deserialize <__RPC_Directory_CheckVersion3_RET_VersionInfo__>(ms); } State = MessageState.Reply; ErrorCode = (int)error; }
/// <summary> /// This function will be called in multithread, so THREAD SAFE is very important. /// </summary> /// <param name="client"></param> /// <param name="desc"></param> private void ClientMessageReceived(ServerClient client, ServiceDesc desc) { try { Logger.Debug("Received a message from Client {0}, {1}.", client.ClientId, ((IPEndPoint)client.RemoteEndPoint).Address.MapToIPv4()); if (desc.ServiceType == (int)ServiceType.Directory) { switch (desc.FuncId) { case 8000: { var info = ProtocolExtension .Deserialize < __RPC_Directory_CheckVersion_ARG_string_lang_string_platform_string_channel_string_version__ >(desc.Data); var lang = info.Lang.ToLowerInvariant(); var platform = info.Platform.ToLowerInvariant(); var channel = info.Channel.ToLowerInvariant(); var big = info.Version; var sb = new StringBuilder(); sb.Append(lang); sb.Append("."); sb.Append(platform); sb.Append("."); sb.Append(channel); sb.Append("."); sb.Append(big); try { mLock.EnterReadLock(); Content c; if (mContents.TryGetValue(sb.ToString(), out c)) { var ret = new __RPC_Directory_CheckVersion_RET_VersionInfo__(); ret.ReturnValue = new VersionInfo(); ret.ReturnValue.SmallVersion = c.SmallVersion; ret.ReturnValue.AnnoucementURL = c.AnnoucementURL; ret.ReturnValue.ResourceURL = c.ResourceURL; ret.ReturnValue.HasNewVersion = c.HasNewVersion ? 1 : 0; ret.ReturnValue.NewVersionURL = c.NewVersionURL; ret.ReturnValue.ReviewState = c.ReviewState; var length = c.GateAddress.Length; if (length > 0) { if (length == 1) { ret.ReturnValue.GateAddress = c.GateAddress[0]; } else { ret.ReturnValue.GateAddress = c.GateAddress[random.Next(length)]; } } desc.Data = ProtocolExtension.Serialize(ret); client.SendMessage(desc); } else { desc.Data = null; desc.Error = 1; client.SendMessage(desc); } } catch (Exception ex) { Logger.Error(ex, "8000 error."); } finally { mLock.ExitReadLock(); } } break; case 8001: { var info = ProtocolExtension .Deserialize < __RPC_Directory_CheckVersion_ARG_string_lang_string_platform_string_channel_string_version__ >(desc.Data); var lang = info.Lang.ToLowerInvariant(); var platform = info.Platform.ToLowerInvariant(); var channel = info.Channel.ToLowerInvariant(); var big = info.Version; var sb = new StringBuilder(); sb.Append(lang); sb.Append("."); sb.Append(platform); sb.Append("."); sb.Append(channel); sb.Append("."); sb.Append(big); try { mLock.EnterReadLock(); Content c; if (mContents.TryGetValue(sb.ToString(), out c)) { var ret = new __RPC_Directory_CheckVersion_RET_VersionInfo__(); ret.ReturnValue = new VersionInfo(); ret.ReturnValue.SmallVersion = c.SmallVersion; ret.ReturnValue.AnnoucementURL = c.AnnoucementURL; ret.ReturnValue.ResourceURL = c.ResourceURL; ret.ReturnValue.HasNewVersion = c.HasNewVersion ? 1 : 0; ret.ReturnValue.NewVersionURL = c.NewVersionURL; ret.ReturnValue.ReviewState = c.ReviewState; ret.ReturnValue.GateAddress = c.GateAddressString; desc.Data = ProtocolExtension.Serialize(ret); client.SendMessage(desc); } else { desc.Data = null; desc.Error = 1; client.SendMessage(desc); } } catch (Exception ex) { Logger.Error(ex, "8001 error."); } finally { mLock.ExitReadLock(); } } break; case 8002: { var info = ProtocolExtension .Deserialize < __RPC_Directory_CheckVersion3_ARG_string_lang_string_platform_string_channel_string_version__ >(desc.Data); var lang = info.Lang.ToLowerInvariant(); var platform = info.Platform.ToLowerInvariant(); var channel = info.Channel.ToLowerInvariant(); var big = info.Version; var sb = new StringBuilder(); sb.Append(lang); sb.Append("."); sb.Append(platform); sb.Append("."); sb.Append(channel); sb.Append("."); sb.Append(big); try { mLock.EnterReadLock(); Content c; if (mContents.TryGetValue(sb.ToString(), out c)) { var ret = new __RPC_Directory_CheckVersion3_RET_VersionInfo__(); ret.ReturnValue = new VersionInfo(); ret.ReturnValue.SmallVersion = c.SmallVersion; ret.ReturnValue.AnnoucementURL = c.AnnoucementURL; ret.ReturnValue.ResourceURL = c.ResourceURL; ret.ReturnValue.HasNewVersion = c.HasNewVersion ? 1 : 0; ret.ReturnValue.NewVersionURL = c.NewVersionURL; ret.ReturnValue.ReviewState = c.ReviewState; if (c.IpWhiteList.Contains(((IPEndPoint)client.RemoteEndPoint).Address.MapToIPv4().ToString())) { ret.ReturnValue.GateAddress = c.RetargetGateAddress; } else { ret.ReturnValue.GateAddress = c.GateAddressString; } ret.ReturnValue.ForceShowAnn = c.ForceShowAnn; ret.ReturnValue.Isbn = c.Isbn; desc.Data = ProtocolExtension.Serialize(ret); client.SendMessage(desc); } else { desc.Data = null; desc.Error = 1; client.SendMessage(desc); } } catch (Exception ex) { Logger.Error(ex, "8001 error."); } finally { mLock.ExitReadLock(); } } break; default: Logger.Error("Unknown funcion id:{0}", desc.FuncId); break; } } } catch (Exception e) { Logger.Error(e, "ClientMessageReceived"); } }