📄 tag.cpp
字号:
return _impl->GetAppendedBytes();
}
size_t ID3_Tag::GetFileSize() const
{
return _impl->GetFileSize();
}
const char* ID3_Tag::GetFileName() const
{
return _impl->GetFileName().c_str();
}
/// Finds frame with given frame id
/** Returns a pointer to the next ID3_Frame with the given ID3_FrameID;
** returns NULL if no such frame found.
**
** If there are multiple frames in the tag with the same ID (which, for some
** frames, is allowed), then subsequent calls to Find() will return
** subsequent frame pointers, wrapping if necessary.
**
** \code
** ID3_Frame *myFrame;
** if (myFrame = myTag.Find(ID3FID_TITLE))
** {
** // do something with the frame, like copy
** // the contents into a buffer, display the
** // contents in a window, etc.
** // ...
** }
** \endcode
**
** You may optionally supply to more parameters ot this method, being an
** ID3_FieldID and a value of some sort. Depending on the field name/ID you
** supply, you may supply an integer, a char* or a unicode_t* as the third
** parameter. If you supply an ID3_FrameID, you must also supply a data
** value to compare against.
**
** This method will then return the first frame that has a matching frame
** ID, and which has a field with the same name as that which you supplied
** in the second parameter, whose calue matches that which you supplied as
** the third parameter. For example:
**
** \code
** ID3_Frame *myFrame;
** if (myFrame = myTag.Find(ID3FID_TITLE, ID3FN_TEXT, "Nirvana"))
** {
** // found it, do something with it.
** // ...
** }
** \endcode
**
** This example will return the first TITLE frame and whose TEXT field is
** 'Nirvana'. Currently there is no provision for things like 'contains',
** 'greater than', or 'less than'. If there happens to be more than one of
** these frames, subsequent calls to the Find() method will return
** subsequent frames and will wrap around to the beginning.
**
** Another example...
**
** \code
** ID3_Frame *myFrame;
** if (myFrame = myTag.Find(ID3FID_COMMENT, ID3FN_TEXTENC, ID3TE_UNICODE))
** {
** // found it, do something with it.
** // ...
** }
** \endcode
**
** This returns the first COMMENT frame that uses Unicode as its text
** encdoing.
**
** @name Find
** @param id The ID of the frame that is to be located
** @return A pointer to the first frame found that has the given frame id,
** or NULL if no such frame.
**/
ID3_Frame* ID3_Tag::Find(ID3_FrameID id) const
{
return _impl->Find(id);
}
/// Finds frame with given frame id, fld id, and integer data
ID3_Frame* ID3_Tag::Find(ID3_FrameID id, ID3_FieldID fld, uint32 data) const
{
return _impl->Find(id, fld, data);
}
/// Finds frame with given frame id, fld id, and ascii data
ID3_Frame* ID3_Tag::Find(ID3_FrameID id, ID3_FieldID fld, const char* data) const
{
String str(data);
return _impl->Find(id, fld, str);
}
/// Finds frame with given frame id, fld id, and unicode data
ID3_Frame* ID3_Tag::Find(ID3_FrameID id, ID3_FieldID fld, const unicode_t* data) const
{
WString str = toWString(data, ucslen(data));
return _impl->Find(id, fld, str);
}
/** Returns the number of frames present in the tag object.
**
** This includes only those frames that id3lib recognises. This is used as
** the upper bound on calls to the GetFrame() and operator[]() methods.
**
** \return The number of frames present in the tag object.
**/
size_t ID3_Tag::NumFrames() const
{
return _impl->NumFrames();
}
/** Returns a pointer to the frame with the given index; returns NULL if
** there is no such frame at that index.
**
** Optionally, operator[](index_t) can be used as an alternative to this
** method. Indexing is 0-based (that is, the first frame is number 0, and the
** last frame in a tag that holds n frames is n-1).
**
** If you wish to have a more comlex searching facility, then at least for
** now you will have to devise it yourself and implement it useing these
** methods.
**
** @param nIndex The index of the frame that is to be retrieved
** @return A pointer to the requested frame, or NULL if no such frame.
**/
/*
ID3_Frame* ID3_Tag::GetFrameNum(index_t num) const
{
const size_t numFrames = this->NumFrames();
if (num >= numFrames)
{
return NULL;
}
ID3_Frame* frame = NULL;
index_t curNum = 0;
// search from the cursor to the end
for (ID3_TagImpl::const_iterator cur = _impl->begin(); cur != _impl->end(); ++cur)
{
if (curNum++ == num)
{
frame = *cur;
break;
}
}
return frame;
}
*/
/** Returns a pointer to the frame with the given index; returns NULL if
** there is no such frame at that index.
**
** @name operator[]
** @param index The index of the frame that is to be retrieved
** @return A pointer to the requested frame, or NULL if no such frame.
** @see #GetFrameNum
**/
/*
ID3_Frame* ID3_Tag::operator[](index_t index) const
{
return this->GetFrameNum(index);
}
*/
ID3_Tag& ID3_Tag::operator=( const ID3_Tag &rTag )
{
if (this != &rTag)
{
*_impl = rTag;
}
return *this;
}
bool ID3_Tag::HasTagType(uint16 tt) const
{
return _impl->HasTagType(16);
}
ID3_V2Spec ID3_Tag::GetSpec() const
{
return _impl->GetSpec();
}
bool ID3_Tag::SetSpec(ID3_V2Spec spec)
{
return _impl->SetSpec(spec);
}
/** Analyses a buffer to determine if we have a valid ID3v2 tag header.
** If so, return the total number of bytes (including the header) to
** read so we get all of the tag
**/
size_t ID3_Tag::IsV2Tag(const uchar* const data)
{
ID3_MemoryReader mr(data, ID3_TagHeader::SIZE);
return ID3_TagImpl::IsV2Tag(mr);
}
size_t ID3_Tag::IsV2Tag(ID3_Reader& reader)
{
return ID3_TagImpl::IsV2Tag(reader);
}
/// Deprecated
void ID3_Tag::AddNewFrame(ID3_Frame* f)
{
_impl->AttachFrame(f);
}
/** Copies an array of frames to the tag.
**
** This method copies each frame in an array to the tag. As in
** AddFrame, the tag adds a copy of the frame, and it assumes responsiblity
** for freeing the frames' memory when the tag goes out of scope.
**
** \code
** ID3_Frame myFrames[10];
** myTag.AddFrames(myFrames, 10);
** \endcode
**
** \sa ID3_Frame
** \sa ID3_Frame#AddFrame
** \param pNewFrames A pointer to an array of frames to be added to the tag.
** \param nFrames The number of frames in the array pNewFrames.
**/
void ID3_Tag::AddFrames(const ID3_Frame *frames, size_t numFrames)
{
for (index_t i = numFrames - 1; i >= 0; i--)
{
this->AddFrame(frames[i]);
}
}
size_t ID3_Tag::Link(const char *fileInfo, bool parseID3v1, bool parseLyrics3)
{
return _impl->Link(fileInfo, parseID3v1, parseLyrics3);
}
void ID3_Tag::SetCompression(bool b)
{
;
}
bool ID3_Tag::HasLyrics() const
{
return this->HasTagType(ID3TT_LYRICS);
}
bool ID3_Tag::HasV2Tag() const
{
return this->HasTagType(ID3TT_ID3V2);
}
bool ID3_Tag::HasV1Tag() const
{
return this->HasTagType(ID3TT_ID3V1);
}
/** Copies a frame to the tag. The frame parameter can thus safely be deleted
** or allowed to go out of scope.
**
** Operator<< supports the addition of a pointer to a frame object, or
** the frame object itself.
**
** \code
** ID3_Frame *pFrame, frame;
** p_frame = &frame;
** myTag << pFrame;
** myTag << frame;
** \endcode
**
** Both these methods copy the given frame to the tag---the tag creates its
** own copy of the frame.
**
** \name operator<<
** \param frame The frame to be added to the tag.
**/
ID3_Tag& ID3_Tag::operator<<(const ID3_Frame& frame)
{
this->AddFrame(frame);
return *this;
}
ID3_Tag& ID3_Tag::operator<<(const ID3_Frame* frame)
{
if (frame)
{
this->AddFrame(frame);
}
return *this;
}
int32 ID3_IsTagHeader(const uchar data[ID3_TAGHEADERSIZE])
{
size_t size = ID3_Tag::IsV2Tag(data);
if (!size)
{
return -1;
}
return size - ID3_TagHeader::SIZE;
}
namespace
{
class IteratorImpl : public ID3_Tag::Iterator
{
ID3_TagImpl::iterator _cur;
ID3_TagImpl::iterator _end;
public:
IteratorImpl(ID3_TagImpl& tag)
: _cur(tag.begin()), _end(tag.end())
{
}
ID3_Frame* GetNext()
{
ID3_Frame* next = NULL;
while (next == NULL && _cur != _end)
{
next = *_cur;
++_cur;
}
return next;
}
};
class ConstIteratorImpl : public ID3_Tag::ConstIterator
{
ID3_TagImpl::const_iterator _cur;
ID3_TagImpl::const_iterator _end;
public:
ConstIteratorImpl(ID3_TagImpl& tag)
: _cur(tag.begin()), _end(tag.end())
{
}
const ID3_Frame* GetNext()
{
ID3_Frame* next = NULL;
while (next == NULL && _cur != _end)
{
next = *_cur;
++_cur;
}
return next;
}
};
}
ID3_Tag::Iterator*
ID3_Tag::CreateIterator()
{
return new IteratorImpl(*_impl);
}
ID3_Tag::ConstIterator*
ID3_Tag::CreateIterator() const
{
return new ConstIteratorImpl(*_impl);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -