1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
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.
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.
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.
25 #include <OSD_Disk.ixx>
26 #include <OSD_WhoAmI.hxx>
28 const OSD_WhoAmI Iam = OSD_WDisk;
34 //#include <sys/types.h>
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
41 #elif defined(HAVE_STATFS)
42 # include <sys/param.h>
43 # include <sys/mount.h>
52 #if defined(HAVE_STATVFS)
53 extern "C" {int statvfs(const char *, struct statvfs *); }
56 OSD_Disk::OSD_Disk() : myQuotaSize(0) {}
59 OSD_Disk::OSD_Disk(const OSD_Path& name){
60 DiskName = name.Disk();
64 OSD_Disk::OSD_Disk(const Standard_CString name)
70 void OSD_Disk::SetName(const OSD_Path& name){
71 DiskName = name.Disk();
75 OSD_Path OSD_Disk::Name()const{
77 result.SetDisk(DiskName);
81 Standard_Integer OSD_Disk::DiskSize(){
83 #if !defined(HAVE_STATVFS)
86 if ( statfs (DiskName.ToCString(),&buffer) == 0 ){
87 long BSize512 = buffer.f_bsize / 512 ;
88 return buffer.f_blocks * BSize512 ;
91 myError.SetValue(errno, Iam, "OSD_Disk: statfs failed.");
95 struct statvfs buffer;
97 if ( statvfs(DiskName.ToCString(),&buffer) == 0 ){
98 int BSize512 = buffer.f_frsize / 512 ;
99 return buffer.f_blocks * BSize512 ;
102 myError.SetValue(errno, Iam, "OSD_Disk: statvfs failed.");
109 #if !defined(HAVE_STATVFS)
110 Standard_Integer OSD_Disk::DiskFree(){
112 struct statfs buffer;
113 if ( statfs (DiskName.ToCString(),&buffer) == 0 ){
114 long BSize512 = buffer.f_bsize / 512 ;
115 return buffer.f_bavail * BSize512 ;
118 myError.SetValue(errno, Iam, "OSD_Disk: statfs failed.");
125 Standard_Integer OSD_Disk::DiskFree(){
127 struct statvfs buffer;
128 if ( statvfs (DiskName.ToCString(),&buffer) == 0 ){
129 int BSize512 = buffer.f_frsize / 512 ;
130 return buffer.f_bavail * BSize512 ;
133 myError.SetValue(errno, Iam, "OSD_Disk: statvfs failed.");
140 Standard_Integer OSD_Disk::DiskQuota(){
146 void OSD_Disk::SetDiskQuota(const Standard_Integer ){
148 // struct dqblk quota_info;
150 // status = quota(Q_SETDLIM,<< User Id>>,"a_info);
152 // status = quotactl(Q_SETQLIM,"",<< User Id >>,"a_info);
158 void OSD_Disk::SetQuotaOff(){
161 // status = setquota("","");
163 // status = quotactl(Q_QUOTAOFF,"",0,NULL);
168 void OSD_Disk::SetQuotaOn(){
169 //TCollection_AsciiString quota_file="????";
172 // status = setquota("",quota_file);
174 // status = quotactl(Q_QUOTAON,"",0,quota_file);
180 void OSD_Disk::Reset(){
184 Standard_Boolean OSD_Disk::Failed()const{
185 return( myError.Failed());
188 void OSD_Disk::Perror() {
193 Standard_Integer OSD_Disk::Error()const{
194 return( myError.Error());
199 //-------------------------------------------------------------------------------
200 //---------------------------- Windows NT System --------------------------------
201 //-------------------------------------------------------------------------------
204 #include <OSD_Disk.ixx>
205 #include <Standard_ProgramError.hxx>
209 void _osd_wnt_set_error ( OSD_Error&, OSD_WhoAmI, ... );
211 static void __fastcall _osd_wnt_set_disk_name ( TCollection_AsciiString&, const OSD_Path& );
213 OSD_Disk :: OSD_Disk () {
215 TCHAR cwd[ MAX_PATH ];
217 GetCurrentDirectory ( MAX_PATH, cwd );
219 cwd[ 3 ] = TEXT( '\x00' );
222 } // end constructor ( 1 )
224 OSD_Disk :: OSD_Disk ( const OSD_Path& Name ) {
226 _osd_wnt_set_disk_name ( DiskName, Name );
228 } // end constructor ( 2 )
230 OSD_Disk :: OSD_Disk ( const Standard_CString PathName ) {
232 OSD_Path path ( PathName );
234 _osd_wnt_set_disk_name ( DiskName, path );
236 } // end constructor ( 3 )
238 OSD_Path OSD_Disk :: Name () const {
242 } // end OSD_Disk :: Name
244 void OSD_Disk :: SetName ( const OSD_Path& Name ) {
246 DiskName = Name.Disk ();
248 } // end OSD_Disk :: SetName
250 Standard_Integer OSD_Disk :: DiskSize () {
252 Standard_Integer retVal = 0;
260 // if ( !GetDiskFreeSpace ( DiskName.ToCString (), &dwSpC, &dwBpS, &dwFC, &dwC ) )
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
268 if (!GetDiskFreeSpaceEx (DiskName.ToCString (),
269 &lpFreeBytesAvailableToCaller,
270 &lpTotalNumberOfBytes,
271 &lpTotalNumberOfFreeBytes))
273 _osd_wnt_set_error ( myError, OSD_WDisk );
277 ULONGLONG aSize = lpTotalNumberOfBytes.QuadPart /512;
279 retVal = ( Standard_Integer ) aSize; // may be an overflow
281 // retVal = ( Standard_Integer )( dwSpC * dwBpS * dwFC );
287 } // end OSD_Disk :: DiskSize
289 Standard_Integer OSD_Disk :: DiskFree () {
291 Standard_Integer retVal = -1;
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
304 // if ( !GetDiskFreeSpace ( DiskName.ToCString (), &dwSpC, &dwBpS, &dwFC, &dwC ) )
306 if (!GetDiskFreeSpaceEx (DiskName.ToCString (),
307 &lpFreeBytesAvailableToCaller,
308 &lpTotalNumberOfBytes,
309 &lpTotalNumberOfFreeBytes))
311 _osd_wnt_set_error ( myError, OSD_WDisk );
315 ULONGLONG aSize = lpFreeBytesAvailableToCaller.QuadPart /512;
317 retVal = ( Standard_Integer ) aSize; // may be an overflow
319 // retVal = ( Standard_Integer )( dwSpC * dwBpS * dwFC );
324 } // end OSD_Disk :: DiskFree
326 Standard_Integer OSD_Disk :: DiskQuota () {
330 } // end OSD_Disk :: DiskQuota
332 void OSD_Disk :: SetDiskQuota ( const Standard_Integer QuotaSize ) {
334 SetLastError ( ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION );
336 _osd_wnt_set_error ( myError, OSD_WDisk );
338 } // end OSD_Disk :: SetDiskQuota
340 void OSD_Disk :: SetQuotaOn () {
342 SetLastError ( ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION );
344 _osd_wnt_set_error ( myError, OSD_WDisk );
346 } // end OSD_Disk :: SetQuotaOn
348 void OSD_Disk :: SetQuotaOff () {
350 SetLastError ( ( DWORD )STG_E_UNIMPLEMENTEDFUNCTION );
352 _osd_wnt_set_error ( myError, OSD_WDisk );
354 } // end OSD_Disk :: SetQuotaOff
356 Standard_Boolean OSD_Disk :: Failed () const {
358 return myError.Failed ();
360 } // end OSD_Disk :: Failed
362 void OSD_Disk :: Reset () {
366 } // end OSD_Disk :: Reset
368 void OSD_Disk :: Perror () {
372 } // end OSD_Disk :: Perror
374 Standard_Integer OSD_Disk :: Error () const {
376 return myError.Error ();
378 } // end OSD_Disk :: Error
380 static void __fastcall _osd_wnt_set_disk_name ( TCollection_AsciiString& result, const OSD_Path& path ) {
382 TCollection_AsciiString dir;
384 result = path.Disk ();
386 if ( result.UsefullLength () == 0 ) {
392 if ( ( j = dir.UsefullLength () ) > 2 &&
393 dir.Value ( 1 ) == TEXT( '|' ) &&
394 dir.Value ( 2 ) == TEXT( '|' )
397 dir.SetValue ( 1, TEXT( '\\' ) );
398 dir.SetValue ( 2, TEXT( '\\' ) );
400 for ( i = 3, k = 0; i <= j; ++i )
402 if ( dir.Value ( i ) == TEXT( '|' ) ) {
406 dir.SetValue ( i, TEXT( "\\" ) );
412 dir.SetValue ( i, TEXT( "\\" ) );
419 if ( path.Name ().UsefullLength () == 0 && path.Extension ().UsefullLength () == 0 )
427 dir += path.Extension ();
431 if ( dir.Value ( dir.UsefullLength () ) != TEXT( '\\' ) ) dir += TEXT( "\\" );
437 Standard_ProgramError :: Raise ( "OSD_Disk: bad disk name" );
441 } else result += TEXT( "/" );
443 } // end _osd_set_disk_name