1 /* Copyright (c) MediaArea.net SARL. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license that can
4 * be found in the License.html file in the root of the source tree.
5 */
6
7 //---------------------------------------------------------------------------
8 // Pre-compilation
9 #include "MediaInfo/PreComp.h"
10 #ifdef __BORLANDC__
11 #pragma hdrstop
12 #endif
13 //---------------------------------------------------------------------------
14
15 //---------------------------------------------------------------------------
16 #include "MediaInfo/Setup.h"
17 //---------------------------------------------------------------------------
18
19 //---------------------------------------------------------------------------
20 #include "MediaInfo/File__Base.h"
21 #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
22 #if defined(MEDIAINFO_REFERENCES_YES)
23 #include "ZenLib/File.h"
24 #endif //defined(MEDIAINFO_REFERENCES_YES)
25 #include <cstring>
26 //---------------------------------------------------------------------------
27
28 namespace MediaInfoLib
29 {
30
31 //---------------------------------------------------------------------------
32 extern MediaInfo_Config Config;
33 //---------------------------------------------------------------------------
34
35 //***************************************************************************
36 // Gestion de la classe
37 //***************************************************************************
38
39 //---------------------------------------------------------------------------
40 //Constructeurs
File__Base()41 File__Base::File__Base ()
42 {
43 //Init pointers
44 #if MEDIAINFO_TRACE
45 Details=NULL;
46 #endif //MEDIAINFO_TRACE
47 Stream=NULL;
48 Stream_More=NULL;
49 Stream_MustBeDeleted=false;
50
51 //File
52 File_Size=(int64u)-1;
53 File_Offset=0;
54 File_Offset_FirstSynched=(int64u)-1;
55 File_GoTo=(int64u)-1;
56
57 //Optimization init
58 StreamKind_Last=Stream_Max;
59 StreamPos_Last=Error;
60
61 //Config
62 Config=NULL;
63 }
64
65 //---------------------------------------------------------------------------
66 //Constructeurs
~File__Base()67 File__Base::~File__Base ()
68 {
69 if (Stream_MustBeDeleted)
70 {
71 delete Stream; //Stream=NULL;
72 delete Stream_More; //Stream_More=NULL;
73 }
74 }
75
76 //---------------------------------------------------------------------------
77 //Base
78 #if MEDIAINFO_TRACE
Init(MediaInfo_Config_MediaInfo * Config_,string * Details_,std::vector<std::vector<ZtringList>> * Stream_,std::vector<std::vector<ZtringListList>> * Stream_More_)79 void File__Base::Init (MediaInfo_Config_MediaInfo * Config_, string* Details_, std::vector<std::vector<ZtringList> > * Stream_, std::vector<std::vector<ZtringListList> > * Stream_More_)
80 #else //MEDIAINFO_TRACE
81 void File__Base::Init (MediaInfo_Config_MediaInfo * Config_, std::vector<std::vector<ZtringList> > * Stream_, std::vector<std::vector<ZtringListList> > * Stream_More_)
82 #endif //MEDIAINFO_TRACE
83 {
84 if (Config)
85 return; //Already done
86
87 if (Stream_)
88 {
89 Stream=Stream_;
90 Stream_More=Stream_More_;
91 Stream_MustBeDeleted=false;
92 }
93 else
94 {
95 Stream=new std::vector<std::vector<ZtringList> >;
96 Stream->resize(Stream_Max);
97 Stream_More=new std::vector<std::vector<ZtringListList> >;
98 Stream_More->resize(Stream_Max);
99 Stream_MustBeDeleted=true;
100 }
101
102 Config=Config_;
103 #if MEDIAINFO_TRACE
104 Details=Details_;
105 #endif //MEDIAINFO_TRACE
106 }
107
108 //***************************************************************************
109 // Fonctions
110 //***************************************************************************
111
112 //---------------------------------------------------------------------------
Count_Get(stream_t StreamKind,size_t Pos) const113 size_t File__Base::Count_Get (stream_t StreamKind, size_t Pos) const
114 {
115 //Integrity
116 if (StreamKind>=Stream_Max)
117 return 0;
118
119 //Count of streams
120 if (!Stream)
121 return 0;
122 if (Pos==Error)
123 return (*Stream)[StreamKind].size();
124
125 //Integrity
126 if (Pos>=(*Stream)[StreamKind].size())
127 return 0;
128
129 //Count of piece of information in a stream
130 return MediaInfoLib::Config.Info_Get(StreamKind).size()+(*Stream_More)[StreamKind][Pos].size();
131 }
132
133 //---------------------------------------------------------------------------
Get(stream_t StreamKind,size_t StreamNumber,size_t Parameter,info_t KindOfInfo)134 const Ztring &File__Base::Get (stream_t StreamKind, size_t StreamNumber, size_t Parameter, info_t KindOfInfo)
135 {
136 //Check integrity
137 if (StreamKind>=Stream_Max || StreamNumber>=(*Stream)[StreamKind].size() || Parameter>=MediaInfoLib::Config.Info_Get(StreamKind).size()+(StreamNumber>=(*Stream_More)[StreamKind].size()?0:(*Stream_More)[StreamKind][StreamNumber].size()) || KindOfInfo>=Info_Max)
138 return MediaInfoLib::Config.EmptyString_Get(); //Parameter is unknown
139
140 else if (Parameter<MediaInfoLib::Config.Info_Get(StreamKind).size())
141 {
142 //Optimization : KindOfInfo>Info_Text is in static lists
143 if (KindOfInfo!=Info_Text)
144 return MediaInfoLib::Config.Info_Get(StreamKind)[Parameter][KindOfInfo]; //look for static information only
145 else if (Parameter<(*Stream)[StreamKind][StreamNumber].size())
146 return (*Stream)[StreamKind][StreamNumber][Parameter];
147 else
148 return MediaInfoLib::Config.EmptyString_Get(); //This parameter is known, but not filled
149 }
150 else
151 {
152 if (((size_t)(Parameter-MediaInfoLib::Config.Info_Get(StreamKind).size()))<(*Stream_More)[StreamKind][StreamNumber].size() && ((size_t)KindOfInfo)<(*Stream_More)[StreamKind][StreamNumber][Parameter-MediaInfoLib::Config.Info_Get(StreamKind).size()].size())
153 return (*Stream_More)[StreamKind][StreamNumber][Parameter-MediaInfoLib::Config.Info_Get(StreamKind).size()][KindOfInfo];
154 else
155 return MediaInfoLib::Config.EmptyString_Get(); //Not filled
156 }
157 }
158
159 //---------------------------------------------------------------------------
Get(stream_t StreamKind,size_t StreamPos,const Ztring & Parameter,info_t KindOfInfo,info_t KindOfSearch)160 const Ztring &File__Base::Get (stream_t StreamKind, size_t StreamPos, const Ztring &Parameter, info_t KindOfInfo, info_t KindOfSearch)
161 {
162 size_t ParameterI=0;
163
164 //Check integrity
165 if (StreamKind>=Stream_Max || StreamPos>=(*Stream)[StreamKind].size() || KindOfInfo>=Info_Max)
166 return MediaInfoLib::Config.EmptyString_Get();
167 if ((ParameterI=MediaInfoLib::Config.Info_Get(StreamKind).Find(Parameter, KindOfSearch))==Error)
168 {
169 ParameterI=(*Stream_More)[StreamKind][StreamPos].Find(Parameter, KindOfSearch);
170 if (ParameterI==Error)
171 return MediaInfoLib::Config.EmptyString_Get(); //Parameter is unknown
172 return (*Stream_More)[StreamKind][StreamPos][ParameterI](KindOfInfo);
173 }
174
175 return Get(StreamKind, StreamPos, ParameterI, KindOfInfo);
176 }
177
178 //---------------------------------------------------------------------------
Set(stream_t StreamKind,size_t StreamNumber,size_t Parameter,const Ztring & ToSet,const Ztring & OldValue)179 int File__Base::Set (stream_t StreamKind, size_t StreamNumber, size_t Parameter, const Ztring &ToSet, const Ztring &OldValue)
180 {
181 //Integrity
182 if (Count_Get(StreamKind)<=StreamNumber)
183 return 0;
184
185 return Set(StreamKind, StreamNumber, Get(StreamKind, StreamNumber, Parameter, Info_Name), ToSet, OldValue);
186 }
187
188 //---------------------------------------------------------------------------
Set(stream_t StreamKind,size_t StreamNumber,const Ztring & Parameter,const Ztring & ToSet,const Ztring & OldValue)189 int File__Base::Set (stream_t StreamKind, size_t StreamNumber, const Ztring &Parameter, const Ztring &ToSet, const Ztring &OldValue)
190 {
191 //Integrity
192 if (Count_Get(StreamKind)<=StreamNumber)
193 return 0;
194
195 return Write(StreamKind, StreamNumber, Parameter, ToSet, OldValue);
196 }
197
198 //---------------------------------------------------------------------------
Language_Set()199 void File__Base::Language_Set()
200 {
201 }
202
203 //***************************************************************************
204 // Divers
205 //***************************************************************************
206
Clear()207 void File__Base::Clear()
208 {
209 for (size_t StreamKind=0; StreamKind<Stream_Max; StreamKind++)
210 {
211 (*Stream)[StreamKind].clear();
212 (*Stream_More)[StreamKind].clear();
213 }
214 }
215
216 } //NameSpace
217