0027105: Make code ISO-compliant [-Wpedantic fixes]
[occt.git] / src / OSD / OSD_Disk.cxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _WIN32
16
17
18 #include <OSD_Disk.hxx>
19 #include <OSD_OSDError.hxx>
20 #include <OSD_Path.hxx>
21 #include <OSD_WhoAmI.hxx>
22
23 const OSD_WhoAmI Iam = OSD_WDisk;
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 #if defined(__ANDROID__)
30   #include <sys/vfs.h>
31   #define statvfs  statfs
32   #define fstatvfs fstatfs
33 #else
34   #include <sys/statvfs.h>
35   #ifdef __GNU_LIBRARY__
36     int statvfs(const char *, struct statvfs *) __THROW;
37   #else
38     int statvfs(const char *, struct statvfs *);
39   #endif
40 #endif
41
42 #ifdef __cplusplus
43 }
44 #endif
45
46 #include <errno.h>
47
48 OSD_Disk::OSD_Disk() : myQuotaSize(0) {}
49
50
51 OSD_Disk::OSD_Disk(const OSD_Path& name){
52  DiskName = name.Disk();
53  myQuotaSize = 0;
54 }
55
56 OSD_Disk::OSD_Disk(const Standard_CString name)
57 {
58  DiskName = name;
59  myQuotaSize = 0;
60 }
61
62 void OSD_Disk::SetName(const OSD_Path& name){
63  DiskName = name.Disk();
64 }
65
66
67 OSD_Path OSD_Disk::Name()const{
68  OSD_Path result;
69  result.SetDisk(DiskName);
70  return(result);
71 }
72
73 Standard_Integer OSD_Disk::DiskSize(){
74
75 struct statvfs buffer;
76
77   if ( statvfs(DiskName.ToCString(),&buffer) == 0 ){
78     int BSize512 = buffer.f_frsize / 512 ;
79     return buffer.f_blocks * BSize512 ;
80   }
81   else {
82     myError.SetValue(errno, Iam, "OSD_Disk: statvfs failed.");
83     return 0;
84   }
85 }
86
87 Standard_Integer OSD_Disk::DiskFree(){
88
89 struct statvfs buffer;
90   if ( statvfs (DiskName.ToCString(),&buffer) == 0 ){
91     int BSize512 = buffer.f_frsize / 512 ;
92     return buffer.f_bavail * BSize512 ;
93   }
94   else {
95     myError.SetValue(errno, Iam, "OSD_Disk: statvfs failed.");
96     return 0;
97   }
98 }
99
100 Standard_Integer OSD_Disk::DiskQuota(){
101 //@@@ A faire
102 return 0;
103 }
104
105
106 void OSD_Disk::SetDiskQuota(const Standard_Integer ){
107 // int status;
108 // struct dqblk quota_info;
109 #ifdef ULTRIX
110 // status = quota(Q_SETDLIM,<< User Id>>,&quota_info);
111 #else
112 // status = quotactl(Q_SETQLIM,"",<< User Id >>,&quota_info);
113 #endif
114 //@@@ A terminer
115 }
116
117
118 void OSD_Disk::SetQuotaOff(){
119 //int status;
120 #ifdef ULTRIX
121 // status = setquota("","");
122 #else
123 // status = quotactl(Q_QUOTAOFF,"",0,NULL);
124 #endif
125 //@@@ A faire
126 }
127
128 void OSD_Disk::SetQuotaOn(){
129 //TCollection_AsciiString quota_file="????";
130 //int status;
131 #ifdef ULTRIX
132 // status = setquota("",quota_file);
133 #else
134 // status = quotactl(Q_QUOTAON,"",0,quota_file);
135 #endif
136 //@@@ A faire
137 }
138
139
140 void OSD_Disk::Reset(){
141  myError.Reset();
142 }
143
144 Standard_Boolean OSD_Disk::Failed()const{
145  return( myError.Failed());
146 }
147
148 void OSD_Disk::Perror() {
149  myError.Perror();
150 }
151
152
153 Standard_Integer OSD_Disk::Error()const{
154  return( myError.Error());
155 }
156
157 #else
158
159 //-------------------------------------------------------------------------------
160 //---------------------------- Windows NT System --------------------------------
161 //-------------------------------------------------------------------------------
162
163 #define STRICT
164
165
166 #include <OSD_Disk.hxx>
167 #include <OSD_OSDError.hxx>
168 #include <OSD_Path.hxx>
169 #include <Standard_ProgramError.hxx>
170
171 #include <windows.h>
172
173 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
174
175 static void __fastcall _osd_wnt_set_disk_name ( TCollection_AsciiString&, const OSD_Path& );
176
177 OSD_Disk :: OSD_Disk () {
178
179  TCHAR cwd[ MAX_PATH ];
180
181  GetCurrentDirectory ( MAX_PATH, cwd );
182
183  cwd[ 3 ] = TEXT( '\x00' );
184  DiskName = cwd;
185
186 }  // end constructor ( 1 )
187
188 OSD_Disk :: OSD_Disk ( const OSD_Path& Name ) {
189
190  _osd_wnt_set_disk_name ( DiskName, Name );
191
192 }  // end constructor ( 2 )
193
194 OSD_Disk :: OSD_Disk ( const Standard_CString PathName ) {
195
196  OSD_Path path ( PathName );
197
198  _osd_wnt_set_disk_name ( DiskName, path );
199
200 }  // end constructor ( 3 )
201
202 OSD_Path OSD_Disk :: Name () const {
203
204  return DiskName;
205
206 }  // end OSD_Disk :: Name
207
208 void OSD_Disk :: SetName ( const OSD_Path& Name ) {
209
210  DiskName = Name.Disk ();
211
212 }  // end OSD_Disk :: SetName
213
214 Standard_Integer OSD_Disk :: DiskSize () {
215
216  Standard_Integer retVal = 0;
217
218
219 //  DWORD            dwSpC;
220 //  DWORD            dwBpS;
221 //  DWORD            dwFC;
222 //  DWORD            dwC;
223
224 //  if (   !GetDiskFreeSpace (  DiskName.ToCString (), &dwSpC, &dwBpS, &dwFC, &dwC  )   )
225
226   ULARGE_INTEGER lpFreeBytesAvailableToCaller; // receives the number of bytes on
227                                                 // disk available to the caller
228   ULARGE_INTEGER lpTotalNumberOfBytes;    // receives the number of bytes on disk
229   ULARGE_INTEGER lpTotalNumberOfFreeBytes;// receives the free bytes on disk
230
231
232   if (!GetDiskFreeSpaceEx (DiskName.ToCString (),
233                            &lpFreeBytesAvailableToCaller,
234                            &lpTotalNumberOfBytes,
235                            &lpTotalNumberOfFreeBytes))
236     
237     _osd_wnt_set_error ( myError, OSD_WDisk );
238   
239   else {
240     
241     ULONGLONG  aSize = lpTotalNumberOfBytes.QuadPart /512;
242    
243     retVal = ( Standard_Integer ) aSize; // may be an overflow
244     
245     // retVal = ( Standard_Integer )( dwSpC * dwBpS * dwFC );
246   }
247
248
249  return retVal;
250
251 }  // end OSD_Disk :: DiskSize
252
253 Standard_Integer OSD_Disk :: DiskFree () {
254
255  Standard_Integer retVal = -1;
256
257
258 //  DWORD            dwSpC;
259 //  DWORD            dwBpS;
260 //  DWORD            dwFC;
261 //  DWORD            dwC;
262
263   ULARGE_INTEGER lpFreeBytesAvailableToCaller; // receives the number of bytes on
264                                                 // disk available to the caller
265   ULARGE_INTEGER lpTotalNumberOfBytes;    // receives the number of bytes on disk
266   ULARGE_INTEGER lpTotalNumberOfFreeBytes;// receives the free bytes on disk
267
268   // if (   !GetDiskFreeSpace (  DiskName.ToCString (), &dwSpC, &dwBpS, &dwFC, &dwC  )   )
269
270   if (!GetDiskFreeSpaceEx (DiskName.ToCString (),
271                            &lpFreeBytesAvailableToCaller,
272                            &lpTotalNumberOfBytes,
273                            &lpTotalNumberOfFreeBytes))
274     
275     _osd_wnt_set_error ( myError, OSD_WDisk );
276   
277   else {
278     
279     ULONGLONG  aSize = lpFreeBytesAvailableToCaller.QuadPart /512;
280     
281     retVal = ( Standard_Integer ) aSize; // may be an overflow
282
283     //  retVal = ( Standard_Integer )( dwSpC * dwBpS * dwFC );
284   }
285
286  return retVal;
287
288 }  // end OSD_Disk :: DiskFree
289
290 Standard_Integer OSD_Disk :: DiskQuota () {
291
292  return DiskSize ();
293
294 }  // end OSD_Disk :: DiskQuota
295
296 void OSD_Disk :: SetDiskQuota ( const Standard_Integer /*QuotaSize*/ ) {
297
298  SetLastError (  ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION  );
299
300  _osd_wnt_set_error ( myError, OSD_WDisk );
301
302 }  // end OSD_Disk :: SetDiskQuota
303
304 void OSD_Disk :: SetQuotaOn () {
305
306  SetLastError (  ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION  );
307
308  _osd_wnt_set_error ( myError, OSD_WDisk );
309
310 }  // end OSD_Disk :: SetQuotaOn
311
312 void OSD_Disk :: SetQuotaOff () {
313
314  SetLastError (  ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION  );
315
316  _osd_wnt_set_error ( myError, OSD_WDisk );
317
318 }  // end OSD_Disk :: SetQuotaOff
319
320 Standard_Boolean OSD_Disk :: Failed () const {
321
322  return myError.Failed ();
323
324 }  // end OSD_Disk :: Failed
325
326 void OSD_Disk :: Reset () {
327
328  myError.Reset ();
329
330 }  // end OSD_Disk :: Reset
331
332 void OSD_Disk :: Perror () {
333
334  myError.Perror ();
335
336 }  // end OSD_Disk :: Perror
337
338 Standard_Integer OSD_Disk :: Error () const {
339
340  return myError.Error ();
341
342 }  // end OSD_Disk :: Error
343
344 static void __fastcall _osd_wnt_set_disk_name ( TCollection_AsciiString& result, const OSD_Path& path ) {
345
346  TCollection_AsciiString dir;
347
348  result = path.Disk ();
349
350  if (  result.UsefullLength () == 0  ) {
351  
352   int i, j, k;
353
354   dir = path.Trek ();
355   
356   if (   (  j = dir.UsefullLength ()  ) > 2 &&
357          dir.Value ( 1 ) == TEXT( '|' )     &&
358          dir.Value ( 2 ) == TEXT( '|' )
359   ) {
360   
361    dir.SetValue (  1, TEXT( '\\' )  );
362    dir.SetValue (  2, TEXT( '\\' )  );
363    
364    for ( i = 3, k = 0; i <= j; ++i )
365
366     if (  dir.Value ( i ) == TEXT( '|' )  ) {
367     
368      if ( k == 0 ) {
369
370       dir.SetValue (  i, TEXT( "\\" )  );     
371       ++k;
372       continue; 
373      
374      }  // end if
375
376      dir.SetValue (  i, TEXT( "\\" )  );
377      break;
378      
379     }  /* end if */
380
381     if ( k == 0 )
382     {
383      if (  path.Name ().UsefullLength () == 0 && path.Extension ().UsefullLength () == 0  )
384      
385       goto badPath;
386
387      else {
388
389       dir += TEXT( "\\" );
390       dir += path.Name ();
391       dir += path.Extension ();
392       
393      }  // end else    
394     }
395
396     if (   dir.Value (  dir.UsefullLength ()  ) != TEXT( '\\' )   ) dir += TEXT( "\\" );
397
398     result = dir;
399   
400   } else {
401 badPath:  
402    Standard_ProgramError :: Raise ( "OSD_Disk: bad disk name" );
403
404   }  // end else
405  
406  } else result += TEXT( "/" );
407
408 }  // end _osd_set_disk_name
409
410 #endif