internal PackageContainer Build() { packages.OrderBy(p => p.Key); var packageRepo = new ConcurrentRepository <byte, PackageInfo>(); var idMatcher = new ConcurrentRepository <string, byte>(); byte packageId = 0; foreach (var package in packages) { var entry = new PackageInfo { Type = package.Value, Serializer = DefaultSerializer }; ConfigureCustomAttribute <PackageSerializerAttribute>(package.Value, attr => { Contract.Requires(attr.SerializerType.IsAssignableFrom(typeof(IPackageSerializer))); entry.Serializer = (IPackageSerializer)Activator.CreateInstance(attr.SerializerType); }); packageRepo.Add(packageId, entry); idMatcher.Add(package.Key, packageId); packageId++; } return(new PackageContainer(GetIdFromType, idMatcher, packageRepo)); }
internal IncomingMessageHandler(PackageContainer packageContainer) { appender = GinetOut.Appender[GetType().FullName]; this.packageContainer = packageContainer; messageHandlers.Add(NetIncomingMessageType.StatusChanged, async msg => { var key = (NetConnectionStatus)msg.ReadByte(); if (connectionChange.HasKey(key)) { await connectionChange[key](msg); } }); messageHandlers.Add(NetIncomingMessageType.Data, async im => { var package = packageContainer.GetPackageInfoFromByte(im.ReadByte()); if (package != null) { var message = package.Serializer.Decode(im, package.Type); if (package.Handler == null) { return; } await package.Handler.Invoke(message, im); } }); }
internal PackageContainer(Func <Type, string> idRetriever, ConcurrentRepository <string, byte> idMatcher, ConcurrentRepository <byte, PackageInfo> packages) { IdRetriever = idRetriever; this.packages = packages; this.idMatcher = idMatcher; }