Eliminate newly appeared warnings
[occt.git] / src / OSD / OSD_Disk.cxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
3 //
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
8 //
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
11 //
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
18
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22
23 #ifndef WNT
24
25 #include <OSD_Disk.ixx>
26 #include <OSD_WhoAmI.hxx>
27
28 const OSD_WhoAmI Iam = OSD_WDisk;
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34   //#include <sys/types.h>
35
36 #if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
37 # include <sys/statvfs.h>
38 #elif defined(HAVE_STATFS) && defined(HAVE_SYS_VFS_H)
39   // Note: we want to use the "vfs" method on HP, not elsewhere
40 # include <sys/vfs.h>
41 #elif defined(HAVE_STATFS)
42 # include <sys/param.h>
43 # include <sys/mount.h>
44 #endif
45
46 #ifdef __cplusplus
47 }
48 #endif                                                       
49
50 #include <errno.h>
51
52 #if defined(HAVE_STATVFS)
53 extern "C" {int statvfs(const char *, struct statvfs *); }
54 #endif
55
56 OSD_Disk::OSD_Disk() : myQuotaSize(0) {}
57
58
59 OSD_Disk::OSD_Disk(const OSD_Path& name){
60  DiskName = name.Disk();
61  myQuotaSize = 0;
62 }
63
64 OSD_Disk::OSD_Disk(const Standard_CString name)
65 {
66  DiskName = name;
67  myQuotaSize = 0;
68 }
69
70 void OSD_Disk::SetName(const OSD_Path& name){
71  DiskName = name.Disk();
72 }
73
74
75 OSD_Path OSD_Disk::Name()const{
76  OSD_Path result;
77  result.SetDisk(DiskName);
78  return(result);
79 }
80
81 Standard_Integer OSD_Disk::DiskSize(){
82
83 #if !defined(HAVE_STATVFS)
84
85 struct statfs buffer;
86   if ( statfs (DiskName.ToCString(),&buffer) == 0 ){
87     long BSize512 = buffer.f_bsize / 512 ;
88     return buffer.f_blocks * BSize512 ;
89   }
90   else {
91     myError.SetValue(errno, Iam, "OSD_Disk: statfs failed.");
92
93 #else
94
95 struct statvfs buffer;
96
97   if ( statvfs(DiskName.ToCString(),&buffer) == 0 ){
98     int BSize512 = buffer.f_frsize / 512 ;
99     return buffer.f_blocks * BSize512 ;
100   }
101   else {
102     myError.SetValue(errno, Iam, "OSD_Disk: statvfs failed.");
103
104 #endif
105     return 0;
106   }
107 }
108
109 #if !defined(HAVE_STATVFS)
110 Standard_Integer OSD_Disk::DiskFree(){
111
112 struct statfs buffer;
113   if ( statfs (DiskName.ToCString(),&buffer) == 0 ){
114     long BSize512 = buffer.f_bsize / 512 ;
115     return buffer.f_bavail * BSize512 ;
116   }
117   else {
118     myError.SetValue(errno, Iam, "OSD_Disk: statfs failed.");
119     return 0;
120   }
121 }
122
123 #else
124
125 Standard_Integer OSD_Disk::DiskFree(){
126
127 struct statvfs buffer;
128   if ( statvfs (DiskName.ToCString(),&buffer) == 0 ){
129     int BSize512 = buffer.f_frsize / 512 ;
130     return buffer.f_bavail * BSize512 ;
131   }
132   else {
133     myError.SetValue(errno, Iam, "OSD_Disk: statvfs failed.");
134     return 0;
135   }
136 }
137
138 #endif
139
140 Standard_Integer OSD_Disk::DiskQuota(){
141 //@@@ A faire
142 return 0;
143 }
144
145
146 void OSD_Disk::SetDiskQuota(const Standard_Integer ){
147 // int status;
148 // struct dqblk quota_info;
149 #ifdef ULTRIX
150 // status = quota(Q_SETDLIM,<< User Id>>,&quota_info);
151 #else
152 // status = quotactl(Q_SETQLIM,"",<< User Id >>,&quota_info);
153 #endif
154 //@@@ A terminer
155 }
156
157
158 void OSD_Disk::SetQuotaOff(){
159 //int status;
160 #ifdef ULTRIX
161 // status = setquota("","");
162 #else
163 // status = quotactl(Q_QUOTAOFF,"",0,NULL);
164 #endif
165 //@@@ A faire
166 }
167
168 void OSD_Disk::SetQuotaOn(){
169 //TCollection_AsciiString quota_file="????";
170 //int status;
171 #ifdef ULTRIX
172 // status = setquota("",quota_file);
173 #else
174 // status = quotactl(Q_QUOTAON,"",0,quota_file);
175 #endif
176 //@@@ A faire
177 }
178
179
180 void OSD_Disk::Reset(){
181  myError.Reset();
182 }
183
184 Standard_Boolean OSD_Disk::Failed()const{
185  return( myError.Failed());
186 }
187
188 void OSD_Disk::Perror() {
189  myError.Perror();
190 }
191
192
193 Standard_Integer OSD_Disk::Error()const{
194  return( myError.Error());
195 }
196
197 #else
198
199 //-------------------------------------------------------------------------------
200 //---------------------------- Windows NT System --------------------------------
201 //-------------------------------------------------------------------------------
202
203 #define STRICT
204 #include <OSD_Disk.ixx>
205 #include <Standard_ProgramError.hxx>
206
207 #include <windows.h>
208
209 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
210
211 static void __fastcall _osd_wnt_set_disk_name ( TCollection_AsciiString&, const OSD_Path& );
212
213 OSD_Disk :: OSD_Disk () {
214
215  TCHAR cwd[ MAX_PATH ];
216
217  GetCurrentDirectory ( MAX_PATH, cwd );
218
219  cwd[ 3 ] = TEXT( '\x00' );
220  DiskName = cwd;
221
222 }  // end constructor ( 1 )
223
224 OSD_Disk :: OSD_Disk ( const OSD_Path& Name ) {
225
226  _osd_wnt_set_disk_name ( DiskName, Name );
227
228 }  // end constructor ( 2 )
229
230 OSD_Disk :: OSD_Disk ( const Standard_CString PathName ) {
231
232  OSD_Path path ( PathName );
233
234  _osd_wnt_set_disk_name ( DiskName, path );
235
236 }  // end constructor ( 3 )
237
238 OSD_Path OSD_Disk :: Name () const {
239
240  return DiskName;
241
242 }  // end OSD_Disk :: Name
243
244 void OSD_Disk :: SetName ( const OSD_Path& Name ) {
245
246  DiskName = Name.Disk ();
247
248 }  // end OSD_Disk :: SetName
249
250 Standard_Integer OSD_Disk :: DiskSize () {
251
252  Standard_Integer retVal = 0;
253
254
255 //  DWORD            dwSpC;
256 //  DWORD            dwBpS;
257 //  DWORD            dwFC;
258 //  DWORD            dwC;
259
260 //  if (   !GetDiskFreeSpace (  DiskName.ToCString (), &dwSpC, &dwBpS, &dwFC, &dwC  )   )
261
262   ULARGE_INTEGER lpFreeBytesAvailableToCaller; // receives the number of bytes on
263                                                 // disk available to the caller
264   ULARGE_INTEGER lpTotalNumberOfBytes;    // receives the number of bytes on disk
265   ULARGE_INTEGER lpTotalNumberOfFreeBytes;// receives the free bytes on disk
266
267
268   if (!GetDiskFreeSpaceEx (DiskName.ToCString (),
269                            &lpFreeBytesAvailableToCaller,
270                            &lpTotalNumberOfBytes,
271                            &lpTotalNumberOfFreeBytes))
272     
273     _osd_wnt_set_error ( myError, OSD_WDisk );
274   
275   else {
276     
277     ULONGLONG  aSize = lpTotalNumberOfBytes.QuadPart /512;
278    
279     retVal = ( Standard_Integer ) aSize; // may be an overflow
280     
281     // retVal = ( Standard_Integer )( dwSpC * dwBpS * dwFC );
282   }
283
284
285  return retVal;
286
287 }  // end OSD_Disk :: DiskSize
288
289 Standard_Integer OSD_Disk :: DiskFree () {
290
291  Standard_Integer retVal = -1;
292
293
294 //  DWORD            dwSpC;
295 //  DWORD            dwBpS;
296 //  DWORD            dwFC;
297 //  DWORD            dwC;
298
299   ULARGE_INTEGER lpFreeBytesAvailableToCaller; // receives the number of bytes on
300                                                 // disk available to the caller
301   ULARGE_INTEGER lpTotalNumberOfBytes;    // receives the number of bytes on disk
302   ULARGE_INTEGER lpTotalNumberOfFreeBytes;// receives the free bytes on disk
303
304   // if (   !GetDiskFreeSpace (  DiskName.ToCString (), &dwSpC, &dwBpS, &dwFC, &dwC  )   )
305
306   if (!GetDiskFreeSpaceEx (DiskName.ToCString (),
307                            &lpFreeBytesAvailableToCaller,
308                            &lpTotalNumberOfBytes,
309                            &lpTotalNumberOfFreeBytes))
310     
311     _osd_wnt_set_error ( myError, OSD_WDisk );
312   
313   else {
314     
315     ULONGLONG  aSize = lpFreeBytesAvailableToCaller.QuadPart /512;
316     
317     retVal = ( Standard_Integer ) aSize; // may be an overflow
318
319     //  retVal = ( Standard_Integer )( dwSpC * dwBpS * dwFC );
320   }
321
322  return retVal;
323
324 }  // end OSD_Disk :: DiskFree
325
326 Standard_Integer OSD_Disk :: DiskQuota () {
327
328  return DiskSize ();
329
330 }  // end OSD_Disk :: DiskQuota
331
332 void OSD_Disk :: SetDiskQuota ( const Standard_Integer /*QuotaSize*/ ) {
333
334  SetLastError (  ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION  );
335
336  _osd_wnt_set_error ( myError, OSD_WDisk );
337
338 }  // end OSD_Disk :: SetDiskQuota
339
340 void OSD_Disk :: SetQuotaOn () {
341
342  SetLastError (  ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION  );
343
344  _osd_wnt_set_error ( myError, OSD_WDisk );
345
346 }  // end OSD_Disk :: SetQuotaOn
347
348 void OSD_Disk :: SetQuotaOff () {
349
350  SetLastError (  ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION  );
351
352  _osd_wnt_set_error ( myError, OSD_WDisk );
353
354 }  // end OSD_Disk :: SetQuotaOff
355
356 Standard_Boolean OSD_Disk :: Failed () const {
357
358  return myError.Failed ();
359
360 }  // end OSD_Disk :: Failed
361
362 void OSD_Disk :: Reset () {
363
364  myError.Reset ();
365
366 }  // end OSD_Disk :: Reset
367
368 void OSD_Disk :: Perror () {
369
370  myError.Perror ();
371
372 }  // end OSD_Disk :: Perror
373
374 Standard_Integer OSD_Disk :: Error () const {
375
376  return myError.Error ();
377
378 }  // end OSD_Disk :: Error
379
380 static void __fastcall _osd_wnt_set_disk_name ( TCollection_AsciiString& result, const OSD_Path& path ) {
381
382  TCollection_AsciiString dir;
383
384  result = path.Disk ();
385
386  if (  result.UsefullLength () == 0  ) {
387  
388   int i, j, k;
389
390   dir = path.Trek ();
391   
392   if (   (  j = dir.UsefullLength ()  ) > 2 &&
393          dir.Value ( 1 ) == TEXT( '|' )     &&
394          dir.Value ( 2 ) == TEXT( '|' )
395   ) {
396   
397    dir.SetValue (  1, TEXT( '\\' )  );
398    dir.SetValue (  2, TEXT( '\\' )  );
399    
400    for ( i = 3, k = 0; i <= j; ++i )
401
402     if (  dir.Value ( i ) == TEXT( '|' )  ) {
403     
404      if ( k == 0 ) {
405
406       dir.SetValue (  i, TEXT( "\\" )  );     
407       ++k;
408       continue; 
409      
410      }  // end if
411
412      dir.SetValue (  i, TEXT( "\\" )  );
413      break;
414      
415     }  /* end if */
416
417     if ( k == 0 )
418     {
419      if (  path.Name ().UsefullLength () == 0 && path.Extension ().UsefullLength () == 0  )
420      
421       goto badPath;
422
423      else {
424
425       dir += TEXT( "\\" );
426       dir += path.Name ();
427       dir += path.Extension ();
428       
429      }  // end else    
430     }
431
432     if (   dir.Value (  dir.UsefullLength ()  ) != TEXT( '\\' )   ) dir += TEXT( "\\" );
433
434     result = dir;
435   
436   } else {
437 badPath:  
438    Standard_ProgramError :: Raise ( "OSD_Disk: bad disk name" );
439
440   }  // end else
441  
442  } else result += TEXT( "/" );
443
444 }  // end _osd_set_disk_name
445
446 #endif