//============================================================== // Copyright (C) 2020 Inc. All rights reserved. // //============================================================== // Create by 种道洋 at 2020/5/14 11:00:38. // Version 1.0 // 种道洋 //============================================================== using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using Cdy.Tag; using DotNetty.Buffers; namespace SpiderDriver { public class TagInfoServerProcess : ServerProcessBase { #region ... Variables ... public const byte GetTagIdByNameFun = 0; public const byte QueryAllTagNameAndIds = 2; public const byte Login = 1; #endregion ...Variables... #region ... Events ... #endregion ...Events... #region ... Constructor... #endregion ...Constructor... #region ... Properties ... public override byte FunId => APIConst.TagInfoRequestFun; #endregion ...Properties... #region ... Methods ... /// /// /// /// /// protected unsafe override void ProcessSingleData(string client, IByteBuffer data) { var mm = Cdy.Tag.ServiceLocator.Locator.Resolve(); byte sfun = data.ReadByte(); switch (sfun) { case GetTagIdByNameFun: long loginId = data.ReadLong(); if (Cdy.Tag.ServiceLocator.Locator.Resolve().CheckLogin(loginId)) { int count = data.ReadInt(); if (count > 0) { var re = BufferManager.Manager.Allocate(APIConst.TagInfoRequestFun, (count+1) * 4); re.WriteInt(count); for (int i = 0; i < count; i++) { string stag = data.ReadString(); var ival = mm.GetTagIdByName(stag); if (ival.HasValue) { re.WriteInt(ival.Value); } else { re.WriteInt((int)-1); } } Parent.AsyncCallback(client, re); } } break; case QueryAllTagNameAndIds: loginId = data.ReadLong(); if (Cdy.Tag.ServiceLocator.Locator.Resolve().CheckLogin(loginId)) { int psize = 100000; var vtags = mm.ListAllTags(); int tcount = vtags.Count() / psize; tcount += (vtags.Count() % psize > 0 ? 1 : 0); for(int i=0;ivtags.Count()) { var vv = vtags.Skip(i * psize).Take(psize); Parent.AsyncCallback(client, GetTagBuffer(vv, (short)i, (short)tcount)); } else { var vv = vtags.Skip(i * psize).Take(vtags.Count() % psize); Parent.AsyncCallback(client, GetTagBuffer(vv, (short)i, (short)tcount)); } } } break; case Login: string user = data.ReadString(); string pass = data.ReadString(); long result = Cdy.Tag.ServiceLocator.Locator.Resolve().Login(user, pass, client); Parent.AsyncCallback(client, ToByteBuffer(APIConst.TagInfoRequestFun, result)); break; } } /// /// /// /// /// /// /// private IByteBuffer GetTagBuffer(IEnumerable tags,short bcount,short totalcount) { IByteBuffer re = BufferManager.Manager.Allocate(APIConst.TagInfoRequestFun, tags.Count() * 64+5); re.WriteByte(QueryAllTagNameAndIds); re.WriteShort(totalcount); re.WriteShort(bcount); re.WriteInt(tags.Count()); foreach(var vv in tags) { re.WriteInt(vv.Id); re.WriteString(vv.FullName); re.WriteByte((byte)vv.Type); } return re; } #endregion ...Methods... #region ... Interfaces ... #endregion ...Interfaces... } }