Sayonara Player
ID3v2Frame.h
1 /* AbstractFrame.h */
2 
3 /* Copyright (C) 2011-2017 Lucio Carreras
4  *
5  * This file is part of sayonara player
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef ID3V2_FRAME_H_
22 #define ID3V2_FRAME_H_
23 
24 #include "Helper/Tagging/AbstractFrame.h"
25 
26 #include <taglib/fileref.h>
27 #include <taglib/mpegfile.h>
28 #include <taglib/id3v2tag.h>
29 #include <taglib/id3v2frame.h>
30 
31 #include <QString>
32 
37 namespace ID3v2
38 {
39  template<typename ModelType_t, typename FrameType_t>
46  class ID3v2Frame :
47  protected Tagging::AbstractFrame<TagLib::ID3v2::Tag>
48  {
49  protected:
50  FrameType_t* _frame=nullptr;
51 
52  protected:
53 
60  virtual TagLib::ID3v2::Frame* create_id3v2_frame()=0;
61 
67  virtual void map_model_to_frame(const ModelType_t& model, FrameType_t* frame)=0;
68  virtual void map_frame_to_model(const FrameType_t* frame, ModelType_t& model)=0;
69 
70 
71  public:
72  // constructor
73  ID3v2Frame(const TagLib::FileRef& f, const char* four) :
75  {
76  TagLib::MPEG::File* mpeg = dynamic_cast<TagLib::MPEG::File*>(f.file());
77  if(!mpeg){
78  return;
79  }
80 
81  TagLib::ID3v2::Tag* tag = mpeg->ID3v2Tag(true);
82  this->set_tag(tag);
83  if(!tag){
84  return;
85  }
86 
87  // map, containing [four][frame list]
88  TagLib::ByteVector vec(four, 4);
89  TagLib::ID3v2::FrameListMap map = tag->frameListMap();
90  TagLib::ID3v2::FrameList frame_list = map[vec];
91  if(!frame_list.isEmpty()) {
92  _frame = dynamic_cast<FrameType_t*> (frame_list.front());
93  }
94  }
95 
96  // destructor
97  virtual ~ID3v2Frame() {}
98 
99 
100  //
106  virtual bool read(ModelType_t& data)
107  {
108  if(!_frame){
109  return false;
110  }
111 
112  map_frame_to_model(_frame, data);
113 
114  return true;
115  }
116 
117 
118  //
124  virtual bool write(const ModelType_t& data_model)
125  {
126  bool created = false;
127 
128  TagLib::ID3v2::Tag* tag = this->tag();
129  if(!tag){
130  return false;
131  }
132 
133  if(!_frame){
134  _frame = dynamic_cast<FrameType_t*>(create_id3v2_frame());
135 
136  if(!_frame){
137  return false;
138  }
139  created = true;
140  }
141 
142  map_model_to_frame(data_model, _frame);
143 
144  if(created){
145  // after that, no need to delete _frame
146  tag->addFrame(_frame);
147  }
148 
149  return true;
150  }
151 
152 
157  bool is_frame_found() const
158  {
159  return (_frame != nullptr);
160  }
161  };
162 }
163 
164 #endif // ABSTRACTFRAME_H
virtual void map_model_to_frame(const ModelType_t &model, FrameType_t *frame)=0
map_model_to_frame maps the model to the frame and vice versa so the frame knows how to get/set data ...
virtual bool read(ModelType_t &data)
sets the _data_model by reading from the frame
Definition: ID3v2Frame.h:106
ID3v2Frame namespace.
Definition: AlbumArtist.h:26
virtual TagLib::ID3v2::Frame * create_id3v2_frame()=0
create_id3v2_frame creates new id3v2 frame if there&#39;s no frame we have to create it manually every su...
bool is_frame_found() const
if the frame was found when called read()
Definition: ID3v2Frame.h:157
The AbstractFrame class for example AbstractFrame<Discnumber, TagLib::ID3v2::TextIdentificationFrame>...
Definition: ID3v2Frame.h:46
virtual bool write(const ModelType_t &data_model)
insert the _data_model into the frame
Definition: ID3v2Frame.h:124
Definition: AbstractFrame.h:57