private RegRtElem17 ParseRtStream(Stream rtxStream,
                                          RegMemElem17 mem)
        {
            if (mem.rtxOffset == 0)
            {
                return new RegRtElem17
                       {
                           value   = null,
                           no      = 0,
                           unknown = 2,
                       }
            }
            ;

            using (BinaryReader binStream = new BinaryReader(rtxStream,
                                                             Encoding.Default,
                                                             true))
            {
                rtxStream.Seek(mem.rtxOffset - 1,
                               SeekOrigin.Begin);

                return(new RegRtElem17
                {
                    value = binStream.ReadBytes(mem.rtxLength - sizeof(int) - sizeof(byte)),
                    no = binStream.ReadInt32(),
                    unknown = binStream.ReadByte()
                });
            }
        }

        #endregion
    }
        public virtual void UpdateMember(RegistryMemberBase member, RegMemElem17 mem, RegRtElem17 rt)
        {
#if DEBUG && !DEBUG_IN_PROD
            LogTo.Debug("[{0} {1}] Updating \"{member.Name}\"",
                        member.GetType().Name,
                        member.Id);
#endif

            if (mem.rtxOffset == 0)
            {
                member.Empty = true;

                return;
            }

            member.UseCount = mem.useCount;

            member.LinkType = (RegistryLinkType)mem.linkType;

            member.RtxOffset = mem.rtxOffset;
            member.RtxLength = mem.rtxLength;

            if (rt != null)
            {
                member.RtxId    = rt.no;
                member.RtxValue = Encoding.UTF8.GetString(rt.value);
            }

            member.SlotIdOrOffset             = mem.slotIdOrOffset;
            member.SlotLengthOrConceptGroupId = mem.slotLengthOrConceptGroup;
        }
        protected void Commit(int id,
                              RegMemElem17 mem,
                              RegRtElem17 rtxOrRtf)
        {
            var member = _registry.Get(id);

            try
            {
                if (member == null)
                {
                    member = _registry.CreateInternal(id);

                    SetupMember(member, mem, rtxOrRtf);
                }

                else
                {
                    UpdateMember(member, mem, rtxOrRtf);
                }
            }
            finally
            {
                _onMemberCreatedOrUpdated(member);
            }
        }
        public virtual void SetupMember(RegistryMemberBase member, RegMemElem17 mem, RegRtElem17 rt)
        {
            member.UseCount = mem.useCount;

            member.LinkType = (RegistryLinkType)mem.linkType;

            member.RtxId     = rt.no;
            member.RtxOffset = mem.rtxOffset;
            member.RtxLength = mem.rtxLength;

            if (rt.value != null)
            {
                member.RtxValue = Encoding.UTF8.GetString(rt.value);
            }

            member.SlotIdOrOffset             = mem.slotIdOrOffset;
            member.SlotLengthOrConceptGroupId = mem.slotLengthOrConceptGroup;

            member.Empty = member.RtxValue == null;
        }