~ubuntu-branches/ubuntu/utopic/unrar-nonfree/utopic-updates

« back to all changes in this revision

Viewing changes to timefn.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Chris Anderson
  • Date: 2004-07-02 01:53:47 UTC
  • Revision ID: james.westby@ubuntu.com-20040702015347-26ptn0errf3ew0u9
Tags: upstream-3.3.6
ImportĀ upstreamĀ versionĀ 3.3.6

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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];
 
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
  t=localtime(&ut);
 
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=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
      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
}