/// <summary>
        /// The primary message handling function.
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="reader"></param>
        /// <returns></returns>
        public override Error ReadMessage(PacketBuffer packet, BinaryReader reader)
        {
            switch (packet.Header.MessageID)
            {
            case (ushort)CategoryMessageID.Name:
                CategoryNameMessage msg = new CategoryNameMessage();
                if (!msg.Read(reader))
                {
                    return(new Error(ErrorCode.MalformedMessage));
                }

                AddCategory(msg.CategoryID, msg.ParentID, msg.Name, msg.DefaultActive);
                break;

            default:
                return(new Error(ErrorCode.InvalidMessageID, packet.Header.MessageID));
            }

            return(new Error());
        }
        /// <summary>
        /// Serialises the currently active objects in for playback from file.
        /// </summary>
        /// <param name="writer">The write to serialise to.</param>
        /// <param name="info">Statistics</param>
        /// <returns>An error code on failure.</returns>
        public override Error Serialise(BinaryWriter writer, ref SerialiseInfo info)
        {
            Error err = new Error();

            info.TransientCount = info.PersistentCount = 0u;

            PacketBuffer        packet = new PacketBuffer(1024);
            CategoryNameMessage msg    = new CategoryNameMessage();

            foreach (Category cat in _categories.Values)
            {
                ++info.PersistentCount;
                msg.CategoryID    = cat.ID;
                msg.ParentID      = cat.ParentID;
                msg.DefaultActive = cat.Active;
                msg.Name          = cat.Name;
                packet.Reset(RoutingID, CategoryNameMessage.MessageID);
                msg.Write(packet);
                packet.FinalisePacket();
                packet.ExportTo(writer);
            }

            return(err);
        }