Example #1
0
        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));
        }
Example #2
0
        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);
                }
            });
        }
Example #3
0
 internal PackageContainer(Func <Type, string> idRetriever, ConcurrentRepository <string, byte> idMatcher, ConcurrentRepository <byte, PackageInfo> packages)
 {
     IdRetriever    = idRetriever;
     this.packages  = packages;
     this.idMatcher = idMatcher;
 }