Merge pull request #4324 from FernetMenta/wasapi
[vuplus_xbmc] / lib / UnrarXLib / timefn.cpp
1 #include "rar.hpp"
2
3 RarTime::RarTime()
4 {
5   Reset();
6 }
7
8 #ifdef _WIN_32
9 RarTime& RarTime::operator =(FILETIME &ft)
10 {
11   FILETIME lft,zft;
12   FileTimeToLocalFileTime(&ft,&lft);
13   SYSTEMTIME st;
14   FileTimeToSystemTime(&lft,&st);
15   rlt.Year=st.wYear;
16   rlt.Month=st.wMonth;
17   rlt.Day=st.wDay;
18   rlt.Hour=st.wHour;
19   rlt.Minute=st.wMinute;
20   rlt.Second=st.wSecond;
21   rlt.wDay=st.wDayOfWeek;
22   rlt.yDay=rlt.Day-1;
23   for (int I=1;I<rlt.Month;I++)
24   {
25     static int mdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
26     rlt.yDay+=mdays[I-1];
27   }
28   if (rlt.Month>2 && IsLeapYear(rlt.Year))
29     rlt.yDay++;
30
31   st.wMilliseconds=0;
32   SystemTimeToFileTime(&st,&zft);
33   rlt.Reminder=lft.dwLowDateTime-zft.dwLowDateTime;
34   return(*this);
35 }
36
37
38 void RarTime::GetWin32(FILETIME *ft)
39 {
40   SYSTEMTIME st;
41   st.wYear=rlt.Year;
42   st.wMonth=rlt.Month;
43   st.wDay=rlt.Day;
44   st.wHour=rlt.Hour;
45   st.wMinute=rlt.Minute;
46   st.wSecond=rlt.Second;
47   st.wMilliseconds=0;
48   FILETIME lft;
49   SystemTimeToFileTime(&st,&lft);
50   lft.dwLowDateTime+=rlt.Reminder;
51   if (lft.dwLowDateTime<rlt.Reminder)
52     lft.dwHighDateTime++;
53   LocalFileTimeToFileTime(&lft,ft);
54 }
55 #endif
56
57
58 #if defined(_UNIX) || defined(_EMX)
59 RarTime& RarTime::operator =(time_t ut)
60 {
61   struct tm t;
62   localtime_r(&ut, &t);
63
64   rlt.Year=t.tm_year+1900;
65   rlt.Month=t.tm_mon+1;
66   rlt.Day=t.tm_mday;
67   rlt.Hour=t.tm_hour;
68   rlt.Minute=t.tm_min;
69   rlt.Second=t.tm_sec;
70   rlt.Reminder=0;
71   rlt.wDay=t.tm_wday;
72   rlt.yDay=t.tm_yday;
73   return(*this);
74 }
75
76
77 time_t RarTime::GetUnix()
78 {
79   struct tm t;
80
81   t.tm_sec=rlt.Second;
82   t.tm_min=rlt.Minute;
83   t.tm_hour=rlt.Hour;
84   t.tm_mday=rlt.Day;
85   t.tm_mon=rlt.Month-1;
86   t.tm_year=rlt.Year-1900;
87   t.tm_isdst=-1;
88   return(mktime(&t));
89 }
90 #endif
91
92
93 Int64 RarTime::GetRaw()
94 {
95   if (!IsSet())
96     return(0);
97 #ifdef _WIN_32
98   FILETIME ft;
99   GetWin32(&ft);
100   return(int32to64(ft.dwHighDateTime,ft.dwLowDateTime));
101 #elif defined(_UNIX) || defined(_EMX)
102   time_t ut=GetUnix();
103   return(int32to64(0,ut)*10000000+rlt.Reminder);
104 #else
105   return(0);
106 #endif
107 }
108
109
110 #ifndef SFX_MODULE
111 void RarTime::SetRaw(Int64 RawTime)
112 {
113 #ifdef _WIN_32
114   FILETIME ft;
115   ft.dwHighDateTime=int64to32(RawTime>>32);
116   ft.dwLowDateTime=int64to32(RawTime);
117   *this=ft;
118 #elif defined(_UNIX) || defined(_EMX)
119   time_t ut=int64to32(RawTime/10000000);
120   *this=ut;
121   rlt.Reminder=int64to32(RawTime%10000000);
122 #endif
123 }
124 #endif
125
126
127 bool RarTime::operator == (RarTime &rt)
128 {
129   return(rlt.Year==rt.rlt.Year && rlt.Month==rt.rlt.Month &&
130          rlt.Day==rt.rlt.Day && rlt.Hour==rt.rlt.Hour &&
131          rlt.Minute==rt.rlt.Minute && rlt.Second==rt.rlt.Second &&
132          rlt.Reminder==rt.rlt.Reminder);
133 }
134
135
136 bool RarTime::operator < (RarTime &rt)
137 {
138   return(GetRaw()<rt.GetRaw());
139 }
140
141
142 bool RarTime::operator <= (RarTime &rt)
143 {
144   return(*this<rt || *this==rt);
145 }
146
147
148 bool RarTime::operator > (RarTime &rt)
149 {
150   return(GetRaw()>rt.GetRaw());
151 }
152
153
154 bool RarTime::operator >= (RarTime &rt)
155 {
156   return(*this>rt || *this==rt);
157 }
158
159
160 uint RarTime::GetDos()
161 {
162   uint DosTime=(rlt.Second/2)|(rlt.Minute<<5)|(rlt.Hour<<11)|
163                (rlt.Day<<16)|(rlt.Month<<21)|((rlt.Year-1980)<<25);
164   return(DosTime);
165 }
166
167
168 void RarTime::SetDos(uint DosTime)
169 {
170   rlt.Second=(DosTime & 0x1f)*2;
171   rlt.Minute=(DosTime>>5) & 0x3f;
172   rlt.Hour=(DosTime>>11) & 0x1f;
173   rlt.Day=(DosTime>>16) & 0x1f;
174   rlt.Month=(DosTime>>21) & 0x0f;
175   rlt.Year=(DosTime>>25)+1980;
176   rlt.Reminder=0;
177 }
178
179
180 #if !defined(GUI) || !defined(SFX_MODULE)
181 void RarTime::GetText(char *DateStr,bool FullYear)
182 {
183   if (FullYear)
184     sprintf(DateStr,"%02u-%02u-%u %02u:%02u",rlt.Day,rlt.Month,rlt.Year,rlt.Hour,rlt.Minute);
185   else
186     sprintf(DateStr,"%02u-%02u-%02u %02u:%02u",rlt.Day,rlt.Month,rlt.Year%100,rlt.Hour,rlt.Minute);
187 }
188 #endif
189
190
191 #ifndef SFX_MODULE
192 void RarTime::SetIsoText(char *TimeText)
193 {
194   int Field[6];
195   memset(Field,0,sizeof(Field));
196   for (int DigitCount=0;*TimeText!=0;TimeText++)
197     if (isdigit(*TimeText))
198     {
199       unsigned int FieldPos=DigitCount<4 ? 0:(DigitCount-4)/2+1;
200       if (FieldPos<sizeof(Field)/sizeof(Field[0]))
201         Field[FieldPos]=Field[FieldPos]*10+*TimeText-'0';
202       DigitCount++;
203     }
204   rlt.Second=Field[5];
205   rlt.Minute=Field[4];
206   rlt.Hour=Field[3];
207   rlt.Day=Field[2]==0 ? 1:Field[2];
208   rlt.Month=Field[1]==0 ? 1:Field[1];
209   rlt.Year=Field[0];
210   rlt.Reminder=0;
211 }
212 #endif
213
214
215 #ifndef SFX_MODULE
216 void RarTime::SetAgeText(char *TimeText)
217 {
218   uint Seconds=0,Value=0;
219   for (int I=0;TimeText[I]!=0;I++)
220   {
221     int Ch=TimeText[I];
222     if (isdigit(Ch))
223       Value=Value*10+Ch-'0';
224     else
225     {
226       switch(toupper(Ch))
227       {
228         case 'D':
229           Seconds+=Value*24*3600;
230           break;
231         case 'H':
232           Seconds+=Value*3600;
233           break;
234         case 'M':
235           Seconds+=Value*60;
236           break;
237         case 'S':
238           Seconds+=Value;
239           break;
240       }
241       Value=0;
242     }
243   }
244   SetCurrentTime();
245   Int64 RawTime=GetRaw();
246   SetRaw(RawTime-int32to64(0,Seconds)*10000000);
247 }
248 #endif
249
250
251 #ifndef SFX_MODULE
252 void RarTime::SetCurrentTime()
253 {
254 #ifdef _WIN_32
255   FILETIME ft;
256   SYSTEMTIME st;
257   GetSystemTime(&st);
258   SystemTimeToFileTime(&st,&ft);
259   *this=ft;
260 #else
261   time_t st;
262   time(&st);
263   *this=st;
264 #endif
265 }
266 #endif
267
268
269 #if !defined(SFX_MODULE) && !defined(_WIN_CE)
270 const char *GetMonthName(int Month)
271 {
272 #ifdef SILENT
273   return("");
274 #else
275   static MSGID MonthID[]={
276          MMonthJan,MMonthFeb,MMonthMar,MMonthApr,MMonthMay,MMonthJun,
277          MMonthJul,MMonthAug,MMonthSep,MMonthOct,MMonthNov,MMonthDec
278   };
279   return(St(MonthID[Month]));
280 #endif
281 }
282 #endif
283
284
285 bool IsLeapYear(int Year)
286 {
287   return((Year&3)==0 && (Year%100!=0 || Year%400==0));
288 }