📄 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"/////////////////////////////////////////////////////////////////////////////// CID3TagCID3Tag::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 + -