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