⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frame_parse.cpp

📁 更新mp3
💻 CPP
字号:
// $Id: frame_parse.cpp,v 1.34 2002/07/06 13:53:18 t1mpy Exp $// id3lib: a C++ library for creating and manipulating id3v1/v2 tags// Copyright 1999, 2000  Scott Thomas Haug// 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/#if defined HAVE_CONFIG_H#include <config.h>#endif#include "frame_impl.h"#include "id3/io_decorators.h" //has "readers.h" "io_helpers.h" "utils.h"using namespace dami;namespace{  bool parseFields(ID3_Reader& rdr, ID3_FrameImpl& frame)  {    int iLoop;    int iFields;    io::ExitTrigger et(rdr);    ID3_TextEnc enc = ID3TE_ASCII;  // set the default encoding     ID3_V2Spec spec = frame.GetSpec();     // parse the frame's fields      iFields = frame.NumFields();    ID3D_NOTICE( "ID3_FrameImpl::Parse(): num_fields = " << iFields );    iLoop = 0;    for (ID3_FrameImpl::iterator fi = frame.begin(); fi != frame.end(); ++fi)    {      ID3_Field* fp = *fi;      ++iLoop;      if (rdr.atEnd())      {         // there's no remaining data to parse!         ID3D_WARNING( "ID3_FrameImpl::Parse(): out of data at postion " <<                      rdr.getCur() );        if (iLoop == iFields)        {          //if we are at the last field, (the 'data' field) it's apparently          //an empty tag used for filling up padding, it's no problem          //break will set the current 'cursor' to the right spot outside the for loop          break;        }        return false;      }             if (NULL == fp)      {        // Ack!  Why is the field NULL?  Log this...        ID3D_WARNING( "ID3_FrameImpl::Parse(): field is null" );        continue;      }            if (!fp->InScope(spec))       {        ID3D_NOTICE( "ID3_FrameImpl::Parse(): field is not in scope" );        // continue with the rest of the fields        continue;       }            ID3D_NOTICE( "ID3_FrameImpl::Parse(): setting enc to " << enc );      fp->SetEncoding(enc);      ID3_Reader::pos_type beg = rdr.getCur();      et.setExitPos(beg);      ID3D_NOTICE( "ID3_FrameImpl::Parse(): parsing field, cur = " << beg );      ID3D_NOTICE( "ID3_FrameImpl::Parse(): parsing field, end = " <<                    rdr.getEnd() );      if (!fp->Parse(rdr) || rdr.getCur() == beg)       {         // nothing to parse!  ack!  parse error...         ID3D_WARNING( "ID3_FrameImpl::Parse(): no data parsed, bad parse" );        return false;      }            if (fp->GetID() == ID3FN_TEXTENC)        {        enc = static_cast<ID3_TextEnc>(fp->Get());          ID3D_NOTICE( "ID3_FrameImpl::Parse(): found encoding = " << enc );      }    }    et.setExitPos(rdr.getCur());        return true;  }};bool ID3_FrameImpl::Parse(ID3_Reader& reader) {   io::ExitTrigger et(reader);  ID3D_NOTICE( "ID3_FrameImpl::Parse(): reader.getBeg() = " << reader.getBeg() );  ID3D_NOTICE( "ID3_FrameImpl::Parse(): reader.getCur() = " << reader.getCur() );  ID3D_NOTICE( "ID3_FrameImpl::Parse(): reader.getEnd() = " << reader.getEnd() );  ID3_Reader::pos_type beg = reader.getCur();  if (!_hdr.Parse(reader) || reader.getCur() == beg)    {     ID3D_WARNING( "ID3_FrameImpl::Parse(): no header to parse" );    return false;   }  ID3D_NOTICE( "ID3_FrameImpl::Parse(): after hdr, getCur() = " << reader.getCur() );  ID3D_NOTICE( "ID3_FrameImpl::Parse(): found frame! id = " << _hdr.GetTextID() );  // data is the part of the frame buffer that appears after the header    const size_t dataSize = _hdr.GetDataSize();  ID3D_NOTICE( "ID3_FrameImpl::Parse(): dataSize = " << dataSize );  if (reader.getEnd() < beg + dataSize)  {    ID3D_WARNING( "ID3_FrameImpl::Parse(): not enough data to parse frame" );    return false;  }  io::WindowedReader wr(reader, dataSize);  ID3D_NOTICE( "ID3_FrameImpl::Parse(): window getBeg() = " << wr.getBeg() );  ID3D_NOTICE( "ID3_FrameImpl::Parse(): window getCur() = " << wr.getCur() );  ID3D_NOTICE( "ID3_FrameImpl::Parse(): window getEnd() = " << wr.getEnd() );    unsigned long origSize = 0;  if (_hdr.GetCompression())  {    origSize = io::readBENumber(reader, sizeof(uint32));    ID3D_NOTICE( "ID3_FrameImpl::Parse(): frame is compressed, origSize = " << origSize );  }  if (_hdr.GetEncryption())  {    char ch = wr.readChar();    this->SetEncryptionID(ch);    ID3D_NOTICE( "ID3_FrameImpl::Parse(): frame is encrypted, encryption_id = " << (int) ch );  }  if (_hdr.GetGrouping())  {    char ch = wr.readChar();    this->SetGroupingID(ch);    ID3D_NOTICE( "ID3_FrameImpl::Parse(): frame is encrypted, grouping_id = " << (int) ch );  }  // set the type of frame based on the parsed header    this->_ClearFields();   this->_InitFields();   bool success = false;  // expand out the data if it's compressed   if (!_hdr.GetCompression())  {    success = parseFields(wr, *this);  }  else  {    io::CompressedReader csr(wr, origSize);    success = parseFields(csr, *this);  }  et.setExitPos(wr.getCur());  _changed = false;  return true;} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -