class UNDERBIT_ID3_FRAME

(source code)

Description

Tag frame

note
	description: "[
		Tag frame
	]"

	author: "Finnian Reilly"
	copyright: "Copyright (c) 2001-2022 Finnian Reilly"
	contact: "finnian at eiffel hyphen loop dot com"

	license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
	date: "2022-11-15 19:56:05 GMT (Tuesday 15th November 2022)"
	revision: "7"

class
	UNDERBIT_ID3_FRAME

inherit
	ID3_FRAME

	EL_C_OBJECT
		export
			{UNDERBIT_ID3_TAG_INFO} self_ptr
		undefine
			out
		end

	UNDERBIT_ID3_C_API
		undefine
			out
		end

	UNDERBIT_ID3_CONSTANTS

create
	make, make_new

feature {EL_FACTORY_CLIENT} -- Initialization

	make (obj_ptr: POINTER; a_code: STRING)
			--
		local
			i: INTEGER
		do
			make_from_pointer (obj_ptr); code := a_code
			make_default
			i := description_index
			if i > 0 and then attached {UNDERBIT_ID3_STRING_FIELD} field_list [i] as l_field then
				field_list [i] := l_field.as_description
			end
		end

	make_new (a_code: STRING)
			--
		do
			make_from_pointer (c_id3_frame_new (a_code.area.base_address))
		end

feature -- Access

	code: STRING

	field_count: INTEGER
			--
		do
			Result := c_id3_frame_nfields (self_ptr)
		end

feature -- Status query

	is_unique_file_id: BOOLEAN
			--
		do
			Result := code ~ "UFID"
		end

feature {UNDERBIT_ID3_TAG_INFO} -- Implementation

	description_index: INTEGER
		local
			list: like field_list
		do
			list := field_list
			from list.start until list.after or else Result > 0 loop
				if list.item.type = Field_type.string then
					Result := list.index
				end
				list.forth
			end
			if Result = field_count then
				Result := 0
			end
		end

	new_field_list: EL_ARRAYED_LIST [ID3_FRAME_FIELD]
		do
			Last_encoding.set_item (Encoding_enum.unknown)
			create Result.make_filled (field_count, agent new_frame_field)
		end

	new_frame_field (index: INTEGER): ID3_FRAME_FIELD
		-- From: id3tag.h

		--	enum id3_field_type {
		--	 0  ID3_FIELD_TYPE_TEXTENCODING,
		--	 1  ID3_FIELD_TYPE_LATIN1,
		--	 2  ID3_FIELD_TYPE_LATIN1FULL,
		--	 3  ID3_FIELD_TYPE_LATIN1LIST,
		--	 4  ID3_FIELD_TYPE_STRING,
		--	 5  ID3_FIELD_TYPE_STRINGFULL,
		--	 6  ID3_FIELD_TYPE_STRINGLIST,
		--	 7  ID3_FIELD_TYPE_LANGUAGE,
		--	 8  ID3_FIELD_TYPE_FRAMEID,
		--	 9  ID3_FIELD_TYPE_DATE,
		--	10  ID3_FIELD_TYPE_INT8,
		--	11  ID3_FIELD_TYPE_INT16,
		--	12  ID3_FIELD_TYPE_INT24,
		--	13  ID3_FIELD_TYPE_INT32,
		--	14  ID3_FIELD_TYPE_INT32PLUS, (counts as binary data too)
		--	15  ID3_FIELD_TYPE_BINARYDATA
		--	};
		local
			encoding_field: UNDERBIT_ID3_ENCODING_FIELD
			l_pointer: POINTER; type: INTEGER
		do
			l_pointer := c_id3_frame_field (self_ptr, index - 1)
			type := c_id3_field_type (l_pointer)
			inspect type -- enum id3_field_type {
				when 0 then -- ID3_FIELD_TYPE_TEXTENCODING
					create encoding_field.make (l_pointer)
					Last_encoding.set_item (encoding_field.encoding)
					Result := encoding_field
				when 1 then -- ID3_FIELD_TYPE_LATIN1
					create {UNDERBIT_ID3_LATIN_1_FIELD} Result.make (l_pointer)
				when 2 then -- ID3_FIELD_TYPE_LATIN1FULL,
					create {UNDERBIT_ID3_FULL_LATIN_1_FIELD} Result.make (l_pointer)

--				when 3 then ID3_FIELD_TYPE_LATIN1LIST Missing implemenation in Underbit API

				when 4 then -- ID3_FIELD_TYPE_STRING
					create {UNDERBIT_ID3_STRING_FIELD} Result.make (l_pointer, Last_encoding)

				when 5 then -- ID3_FIELD_TYPE_STRINGFULL
					create {UNDERBIT_ID3_FULL_STRING_FIELD} Result.make (l_pointer, Last_encoding)

				when 6 then -- ID3_FIELD_TYPE_STRINGLIST
					create {UNDERBIT_ID3_STRING_LIST_FIELD} Result.make (l_pointer, Last_encoding)

				when 7 then -- ID3_FIELD_TYPE_LANGUAGE
					create {UNDERBIT_ID3_LANGUAGE_FIELD} Result.make (l_pointer)

				when 8 then -- ID3_FIELD_TYPE_FRAMEID
					create {UNDERBIT_ID3_FRAME_ID_FIELD} Result.make (l_pointer)
				when 9 then -- ID3_FIELD_TYPE_DATE
					create {UNDERBIT_ID3_DATE_FIELD} Result.make (l_pointer)
				when 10 .. 13 then -- ID3_FIELD_TYPE_INT8 .. ID3_FIELD_TYPE_INT32
					create {UNDERBIT_ID3_INTEGER_FIELD} Result.make (l_pointer)

				when 14 .. 15 then -- ID3_FIELD_TYPE_BINARYDATA
					create {UNDERBIT_ID3_BINARY_DATA_FIELD} Result.make (l_pointer)

			else
				create {ID3_DEFAULT_FIELD} Result
			end
		end

feature {NONE} -- Constants

	Last_encoding: NATURAL_8_REF
		once
			create Result
		end

end