private void buildFileDescriptor(FileDescriptorSet desc)
        {
            if (desc == null)
            {
                throw new ArgumentNullException("FileDescriptorSet can not be null");
            }

            foreach (var fd in desc.file)
            {
                if (descriptors.FileDescriptors.ContainsKey(fd.name))
                {
                    continue;
                }

                descriptors.FileDescriptors.Add(fd.name, fd);
                foreach (var enum_desc in fd.enum_type)
                {
                    string enum_key = fd.package.Length > 0? string.Format("{0}.{1}", fd.package, enum_desc.name): enum_desc.name;
                    if (descriptors.EnumDescriptors.ContainsKey(enum_key))
                    {
                        lastError.AddLast(string.Format("enum discriptor {0} already existed"));
                    }
                    else
                    {
                        descriptors.EnumDescriptors.Add(enum_key, enum_desc);

                        foreach (var enum_val in enum_desc.value)
                        {
                            string enum_val_key = string.Format("{0}.{1}", enum_key, enum_val.name);
                            descriptors.EnumValueDescriptors[enum_val_key] = enum_val;
                        }
                    }
                }

                foreach (var msg_desc in fd.message_type)
                {
                    string key = fd.package.Length > 0 ? string.Format("{0}.{1}", fd.package, msg_desc.name): msg_desc.name;
                    if (descriptors.MsgDescriptors.ContainsKey(key))
                    {
                        lastError.AddLast(string.Format("message discriptor {0} already existed"));
                    }
                    else
                    {
                        DynamicMessage.MsgDiscriptor res = new DynamicMessage.MsgDiscriptor();
                        res.Package        = fd.package;
                        res.Protocol       = msg_desc;
                        res.FieldIdIndex   = new Dictionary <int, FieldDescriptorProto>();
                        res.FieldNameIndex = new Dictionary <string, FieldDescriptorProto>();
                        descriptors.MsgDescriptors.Add(key, res);
                    }
                }
            }
        }
        public DynamicMessage Create(string path)
        {
            lastError.Clear();

            DynamicMessage.MsgDiscriptor out_desc = GetMsgDiscriptor(path);
            if (null != out_desc)
            {
                return(Create(out_desc));
            }

            lastError.AddLast(string.Format("invalid protocol path {0}", path));
            return(null);
        }
        public DynamicMessage Decode(DynamicMessage.MsgDiscriptor out_desc, Stream stream)
        {
            lastError.Clear();

            DynamicMessage ret = Create(out_desc);

            if (null == ret)
            {
                lastError.AddLast(string.Format("invalid protocol path {0}.{1}", out_desc.Package, out_desc.Protocol));
                return(null);
            }

            if (false == ret.Parse(stream))
            {
                lastError.AddLast(ret.LastError);
                return(null);
            }

            return(ret);
        }
 public DynamicMessage Create(DynamicMessage.MsgDiscriptor out_desc)
 {
     return(new DynamicMessage(out_desc, descriptors));
 }