asfattribute.cpp

来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 305 行

CPP
305
字号
/**************************************************************************    copyright            : (C) 2005-2007 by Lukáš Lalinský    email                : lalinsky@gmail.com **************************************************************************//*************************************************************************** *   This library is free software; you can redistribute it and/or modify  * *   it  under the terms of the GNU Lesser General Public License version  * *   2.1 as published by the Free Software Foundation.                     * *                                                                         * *   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     * *   Lesser General Public License for more details.                       * *                                                                         * *   You should have received a copy of the GNU Lesser 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                                                                   * ***************************************************************************/#include <taglib.h>#include "asfattribute.h"#include "asffile.h"using namespace TagLib;class ASF::Attribute::AttributePrivate : public RefCounter{public:  AttributePrivate()    : stream(0),      language(0) {}  AttributeTypes type;  String stringValue;  ByteVector byteVectorValue;  union {    unsigned int intValue;    unsigned short shortValue;    unsigned long long longLongValue;    bool boolValue;  };  int stream;  int language;};////////////////////////////////////////////////////////////////////////////////// public members////////////////////////////////////////////////////////////////////////////////ASF::Attribute::Attribute(){  d = new AttributePrivate;  d->type = UnicodeType;}ASF::Attribute::Attribute(const ASF::Attribute &other)  : d(other.d){  d->ref();}ASF::Attribute &ASF::Attribute::operator=(const ASF::Attribute &other){  if(d->deref())    delete d;  d = other.d;  d->ref();  return *this;}ASF::Attribute::~Attribute(){  if(d->deref())    delete d;}ASF::Attribute::Attribute(const String &value){  d = new AttributePrivate;  d->type = UnicodeType;  d->stringValue = value;}ASF::Attribute::Attribute(const ByteVector &value){  d = new AttributePrivate;  d->type = BytesType;  d->byteVectorValue = value;}ASF::Attribute::Attribute(unsigned int value){  d = new AttributePrivate;  d->type = DWordType;  d->intValue = value;}ASF::Attribute::Attribute(unsigned long long value){  d = new AttributePrivate;  d->type = QWordType;  d->longLongValue = value;}ASF::Attribute::Attribute(unsigned short value){  d = new AttributePrivate;  d->type = WordType;  d->shortValue = value;}ASF::Attribute::Attribute(bool value){  d = new AttributePrivate;  d->type = BoolType;  d->boolValue = value;}ASF::Attribute::AttributeTypesASF::Attribute::type() const{  return d->type;}StringASF::Attribute::toString() const{  return d->stringValue;}ByteVectorASF::Attribute::toByteVector() const{  return d->byteVectorValue;}unsigned shortASF::Attribute::toBool() const{  return d->shortValue;}unsigned shortASF::Attribute::toUShort() const{  return d->shortValue;}unsigned intASF::Attribute::toUInt() const{  return d->intValue;}unsigned long longASF::Attribute::toULongLong() const{  return d->longLongValue;}StringASF::Attribute::parse(ASF::File &f, int kind){  int size, nameLength;  String name;  // extended content descriptor  if(kind == 0) {    nameLength = f.readWORD();    name = f.readString(nameLength);    d->type = ASF::Attribute::AttributeTypes(f.readWORD());    size = f.readWORD();  }  // metadata & metadata library  else {    int temp = f.readWORD();    // metadata library    if(kind == 2) {      d->language = temp;    }    d->stream = f.readWORD();    nameLength = f.readWORD();    d->type = ASF::Attribute::AttributeTypes(f.readWORD());    size = f.readDWORD();    name = f.readString(nameLength);  }  switch(d->type) {  case WordType:    d->shortValue = f.readWORD();    break;  case BoolType:    if(kind == 0) {      d->boolValue = f.readDWORD() == 1;    }    else {      d->boolValue = f.readWORD() == 1;    }    break;  case DWordType:    d->intValue = f.readDWORD();    break;  case QWordType:    d->longLongValue = f.readQWORD();    break;  case UnicodeType:    d->stringValue = f.readString(size);    break;  case BytesType:  case GuidType:    d->byteVectorValue = f.readBlock(size);    break;  }  return name;}ByteVectorASF::Attribute::render(const String &name, int kind) const{  ByteVector data;  switch (d->type) {  case WordType:    data.append(ByteVector::fromShort(d->shortValue, false));    break;  case BoolType:    if(kind == 0) {      data.append(ByteVector::fromUInt(d->boolValue ? 1 : 0, false));    }    else {      data.append(ByteVector::fromShort(d->boolValue ? 1 : 0, false));    }    break;  case DWordType:    data.append(ByteVector::fromUInt(d->intValue, false));    break;  case QWordType:    data.append(ByteVector::fromLongLong(d->longLongValue, false));    break;  case UnicodeType:    data.append(File::renderString(d->stringValue));    break;  case BytesType:  case GuidType:    data.append(d->byteVectorValue);    break;  }  if(kind == 0) {    data = File::renderString(name, true) +           ByteVector::fromShort((int)d->type, false) +           ByteVector::fromShort(data.size(), false) +           data;  }  else {    ByteVector nameData = File::renderString(name);    data = ByteVector::fromShort(kind == 2 ? d->language : 0, false) +           ByteVector::fromShort(d->stream, false) +           ByteVector::fromShort(nameData.size(), false) +           ByteVector::fromShort((int)d->type, false) +           ByteVector::fromUInt(data.size(), false) +           nameData +           data;  }  return data;}intASF::Attribute::language() const{  return d->language;}voidASF::Attribute::setLanguage(int value){  d->language = value;}intASF::Attribute::stream() const{  return d->stream;}voidASF::Attribute::setStream(int value){  d->stream = value;}

⌨️ 快捷键说明

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