📄 id3tag.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2000 John Adcock. All rights reserved.
/////////////////////////////////////////////////////////////////////////////
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Library General Public License as published by
// the Free Software Foundation; either version 2 of the License, or (at your
// option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
// License for more details.
//
// You should have received a copy of the GNU Library General Public License
// along with this library; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// The id3lib authors encourage improvements and optimisations to be sent to
// the id3lib coordinator. Please see the README file for details on where to
// send such submissions. See the AUTHORS file for a list of people who have
// contributed to id3lib. See the ChangeLog file for a list of changes to
// id3lib. These files are distributed with id3lib at
// http://download.sourceforge.net/id3lib/
//
/////////////////////////////////////////////////////////////////////////////
// ID3Tag.cpp : Implementation of CID3Tag
/////////////////////////////////////////////////////////////////////////////
// Change Log
//
// Date Developer Changes
//
// 05 Jan 2000 John Adcock Original Release
// 26 Apr 2000 John Adcock Got working with id3lib 3.7.3
// 18 Aug 2000 Philip Oldaker Added Picture Functionality
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ID3COM.h"
#include "ID3Tag.h"
#include "config.h"
#include "ID3Frame.h"
#include "ID3Field.h"
#include "EnumFields.h"
#include "id3/misc_support.h"
#include "math.h"
/////////////////////////////////////////////////////////////////////////////
// CID3Tag
CID3Tag::CID3Tag()
{
m_ID3Tag = new ID3_Tag();
}
CID3Tag::~CID3Tag()
{
if(m_ID3Tag != NULL)
{
delete m_ID3Tag;
}
}
STDMETHODIMP CID3Tag::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IID3ComTag
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CID3Tag::Link(BSTR *FileName)
{
USES_CONVERSION;
if(FileName == NULL)
{
return E_INVALIDARG;
}
try
{
m_ID3Tag->Link(OLE2A(*FileName));
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
return S_OK;
}
STDMETHODIMP CID3Tag::Clear()
{
try
{
m_ID3Tag->Clear();
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
return S_OK;
}
STDMETHODIMP CID3Tag::get_HasChanged(VARIANT_BOOL *pVal)
{
try
{
*pVal = VARIANT_FALSE;
if(m_ID3Tag->HasChanged())
{
*pVal = VARIANT_TRUE;
}
else
{
*pVal = VARIANT_FALSE;
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::FindFrame(eID3FrameTypes FrameID, VARIANT_BOOL CreateNewIfNotFound, IID3ComFrame** pVal)
{
try
{
*pVal = NULL;
ID3_Frame* pFrame = m_ID3Tag->Find((enum ID3_FrameID)FrameID);
if(CreateNewIfNotFound == VARIANT_TRUE && pFrame == NULL)
{
pFrame = new ID3_Frame((enum ID3_FrameID)FrameID);
m_ID3Tag->AttachFrame(pFrame);
}
if(pFrame != NULL)
{
*pVal = CID3Frame::CreateObject(this, pFrame);
(*pVal)->AddRef();
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get__NewEnum(IUnknown** pRetVal)
{
*pRetVal = CEnumFields::CreateObject(this);
(*pRetVal)->AddRef();
return S_OK;
}
STDMETHODIMP CID3Tag::get_Count(long *pVal)
{
try
{
*pVal = 0;
*pVal = m_ID3Tag->NumFrames();
return S_OK;
}
catch (...)
{
*pVal = 0;
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get_Item(long FrameNum, IID3ComFrame** pVal)
{
try
{
*pVal = NULL;
ID3_Frame* pFrame = NULL;
ID3_Tag::Iterator* it = m_ID3Tag->CreateIterator();
pFrame = it->GetNext();
while(FrameNum)
{
pFrame = it->GetNext();
--FrameNum;
}
delete it;
if(pFrame != NULL)
{
*pVal = CID3Frame::CreateObject(this, pFrame);
(*pVal)->AddRef();
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::SaveV1Tag()
{
try
{
m_ID3Tag->Update(ID3TT_ID3V1);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::StripV1Tag()
{
try
{
m_ID3Tag->Strip(ID3TT_ID3V1);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::SaveV2Tag()
{
try
{
m_ID3Tag->Update(ID3TT_ID3V2);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::StripV2Tag()
{
try
{
m_ID3Tag->Strip(ID3TT_ID3V2);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get_Artist(BSTR *pVal)
{
USES_CONVERSION;
try
{
*pVal = NULL;
char* RetStr = NULL;
RetStr = ID3_GetArtist(m_ID3Tag);
*pVal = SysAllocString(A2W(RetStr));
if(RetStr != NULL)
{
delete [] RetStr;
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::put_Artist(BSTR newVal)
{
USES_CONVERSION;
try
{
ID3_Frame *pFrame;
if((pFrame = m_ID3Tag->Find(ID3FID_LEADARTIST)) == NULL &&
(pFrame = m_ID3Tag->Find(ID3FID_BAND)) == NULL &&
(pFrame = m_ID3Tag->Find(ID3FID_CONDUCTOR)) == NULL &&
(pFrame = m_ID3Tag->Find(ID3FID_COMPOSER)) == NULL)
{
pFrame = new ID3_Frame(ID3FID_LEADARTIST);
m_ID3Tag->AttachFrame(pFrame);
}
pFrame->Field(ID3FN_TEXT) = OLE2A(newVal);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get_Album(BSTR *pVal)
{
USES_CONVERSION;
char* RetStr = NULL;
try
{
*pVal = NULL;
RetStr = ID3_GetAlbum(m_ID3Tag);
*pVal = SysAllocString(A2W(RetStr));
if(RetStr != NULL)
{
delete [] RetStr;
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::put_Album(BSTR newVal)
{
USES_CONVERSION;
try
{
ID3_AddAlbum(m_ID3Tag, OLE2A(newVal), true);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get_Title(BSTR *pVal)
{
USES_CONVERSION;
char* RetStr = NULL;
try
{
*pVal = NULL;
RetStr = ID3_GetTitle(m_ID3Tag);
*pVal = SysAllocString(A2W(RetStr));
if(RetStr != NULL)
{
delete [] RetStr;
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::put_Title(BSTR newVal)
{
USES_CONVERSION;
try
{
ID3_AddTitle(m_ID3Tag, OLE2A(newVal), true);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get_Comment(BSTR *pVal)
{
USES_CONVERSION;
try
{
*pVal = NULL;
char* RetStr = NULL;
RetStr = ID3_GetComment(m_ID3Tag);
*pVal = SysAllocString(A2W(RetStr));
if(RetStr != NULL)
{
delete [] RetStr;
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::put_Comment(BSTR newVal)
{
USES_CONVERSION;
try
{
ID3_AddComment(m_ID3Tag, OLE2A(newVal), STR_V1_COMMENT_DESC, true);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get_Genre(long *pVal)
{
try
{
*pVal = 255;
*pVal = ID3_GetGenreNum(m_ID3Tag);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::put_Genre(long newVal)
{
try
{
ID3_AddGenre(m_ID3Tag, newVal, true);
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
}
STDMETHODIMP CID3Tag::get_Year(BSTR *pVal)
{
USES_CONVERSION;
try
{
*pVal = 0;
char* RetStr = NULL;
RetStr = ID3_GetYear(m_ID3Tag);
*pVal = SysAllocString(A2W(RetStr));
if(RetStr != NULL)
{
delete [] RetStr;
}
return S_OK;
}
catch (...)
{
return AtlReportError(CLSID_ID3ComTag, "An unexpected error has occurred", IID_IID3ComTag, E_UNEXPECTED);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -