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