add methods to SeekTable, Padding, and VorbisComment
diff --git a/include/FLAC++/metadata.h b/include/FLAC++/metadata.h
index 15d117e..32c6ebb 100644
--- a/include/FLAC++/metadata.h
+++ b/include/FLAC++/metadata.h
@@ -114,6 +114,8 @@
 			inline void operator=(const Padding &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
+
+			void set_length(unsigned length);
 		};
 
 		class Application : public Prototype {
@@ -142,10 +144,61 @@
 			inline void operator=(const SeekTable &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
+
+			unsigned get_num_points() const;
+			::FLAC__StreamMetaData_SeekPoint get_point(unsigned index) const;
+
+			void set_point(unsigned index, const ::FLAC__StreamMetaData_SeekPoint &point);
+			bool insert_point(unsigned index, const ::FLAC__StreamMetaData_SeekPoint &point);
+			bool delete_point(unsigned index);
 		};
 
 		class VorbisComment : public Prototype {
 		public:
+			class Entry {
+			public:
+				Entry();
+				Entry(const char *field, unsigned field_length);
+				Entry(const char *field_name, const char *field_value, unsigned field_value_length);
+				Entry(const Entry &entry);
+				void operator=(const Entry &entry);
+
+				virtual ~Entry();
+
+				virtual bool is_valid() const;
+				inline operator bool() const { return is_valid(); }
+
+				unsigned get_field_length() const;
+				unsigned get_field_name_length() const;
+				unsigned get_field_value_length() const;
+
+				::FLAC__StreamMetaData_VorbisComment_Entry get_entry() const;
+				const char *get_field() const;
+				const char *get_field_name() const;
+				const char *get_field_value() const;
+
+				bool set_field(const char *field, unsigned field_length);
+				bool set_field_name(const char *field_name);
+				bool set_field_value(const char *field_value, unsigned field_value_length);
+			protected:
+				bool is_valid_;
+				::FLAC__StreamMetaData_VorbisComment_Entry entry_;
+				char *field_name_;
+				unsigned field_name_length_;
+				char *field_value_;
+				unsigned field_value_length_;
+			private:
+				void zero();
+				void clear();
+				void clear_entry();
+				void clear_field_name();
+				void clear_field_value();
+				void construct(const char *field, unsigned field_length);
+				void construct(const char *field_name, const char *field_value, unsigned field_value_length);
+				void compose_field();
+				void parse_field();
+			};
+
 			VorbisComment();
 			VorbisComment(::FLAC__StreamMetaData *object, bool copy = false);
 			~VorbisComment();
@@ -153,8 +206,18 @@
 			inline void operator=(const VorbisComment &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData &object) { Prototype::operator=(object); }
 			inline void operator=(const ::FLAC__StreamMetaData *object) { Prototype::operator=(object); }
+
+			unsigned get_num_comments() const;
+			Entry get_vendor_string() const;
+			Entry get_comment(unsigned index) const;
+
+			bool set_vendor_string(const Entry &entry);
+			bool set_comment(unsigned index, const Entry &entry);
+			bool insert_comment(unsigned index, const Entry &entry);
+			bool delete_comment(unsigned index);
 		};
 
+
 		// ============================================================
 		//
 		//  Level 0
@@ -163,6 +226,7 @@
 
 		bool get_streaminfo(const char *filename, StreamInfo &streaminfo);
 
+
 		// ============================================================
 		//
 		//  Level 1
@@ -226,6 +290,7 @@
 			void clear();
 		};
 
+
 		// ============================================================
 		//
 		//  Level 2