0030091: Configuration - allow cross-compilation from Linux (case sensitive filesyste...
[occt.git] / src / OSD / OSD_Error.cxx
CommitLineData
b311480e 1// Copyright (c) 1998-1999 Matra Datavision
973c2be1 2// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
b311480e 5//
d5f74e42 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
973c2be1 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.
b311480e 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
7fd59977 14
57c28b61 15#ifndef _WIN32
7fd59977 16
42cf5bc1 17
18#include <OSD_Error.hxx>
7fd59977 19#include <OSD_ErrorList.hxx>
42cf5bc1 20#include <OSD_OSDError.hxx>
21#include <TCollection_AsciiString.hxx>
7fd59977 22
42cf5bc1 23#include <stdio.h>
7fd59977 24/* Created by Stephan GARNAUD (ARM) 1992 for Matra Datavision */
7fd59977 25OSD_Error::OSD_Error(){
26 myErrno = 0;
27}
28
29
30void OSD_Error::Reset(){
31 myErrno = 0;
32}
33
34Standard_Boolean OSD_Error::Failed()const{
35 if (myErrno == 0) return (Standard_False);
36 else return (Standard_True);
37}
38
39
40
41void OSD_Error::SetValue(const Standard_Integer errcode,
42 const Standard_Integer from,
43 const TCollection_AsciiString& message){
44 myErrno = errcode;
45 myCode = (OSD_WhoAmI)from;
46 myMessage = message;
47}
48
49
50
51Standard_Integer OSD_Error::Error()const{
52 return(extCode);
53}
54
55
56void OSD_Error::Perror() {
57 TCollection_AsciiString buffer;
58
59 if (myErrno == 0) return;
60
61 buffer += " :\n ";
62 extCode = ERR_SURPRISE;
63
64 switch (myErrno){
65 case EBADF :
66 switch (myCode){
67 case OSD_WFile:
68 buffer += "Invalid file descriptor or bad mode";
69 extCode = ERR_FBADF;
70 break;
7fd59977 71 default:
72 break;
73 }
74 break;
75
76
77#ifdef SUN
78 case EBADMSG:
79 switch (myCode){
80 case OSD_WFile:
81 buffer +=
82 "The message waiting to be read on stream is not a data message";
83 extCode = ERR_FBADMSG;
84 break;
85 default:
86 break;
87 }
88 break;
89#endif
90
91 case EINVAL:
92 switch (myCode){
93 case OSD_WFileNode:
94 buffer += "Can't unlink '.' or '..'";
95 extCode = ERR_FNINVAL;
96 break;
97 case OSD_WFile:
98 buffer += "Invalid file descriptor";
99 extCode = ERR_FINVAL;
100 break;
7fd59977 101 default :
102 buffer += "User error : Bad parameter";
103 extCode = ERR_INVAL;
104 break;
105 }
106 break;
107#if !defined(sun) && !defined(SOLARIS)
108 case EDQUOT :
109 switch (myCode){
110 case OSD_WDirectory:
111 case OSD_WFileNode:
112 case OSD_WFile :
113 buffer += "Exceed quota of disk blocks";
114 extCode = ERR_QUOT;
115 break;
116 default:
117 break;
118 }
119 break;
120#endif
121
122#ifdef SUN
123 case EDEADLK:
124 switch (myCode){
125 case OSD_WFile:
126 buffer += "Lock is already blocked by another process";
127 extCode = ERR_FDEADLK;
128 break;
7fd59977 129 default:
130 break;
7fd59977 131 }
132 break;
133#endif
134
135 case ENOLCK:
136 switch (myCode){
137 case OSD_WFile:
138 buffer += "No more file lock entries available";
139 extCode = ERR_FNOLCK;
140 break;
141 default:
142 break;
143 }
144 break;
145 case EOPNOTSUPP:
146 switch (myCode){
147 case OSD_WFile:
148 buffer += "File descriptor doesn't refer to a file";
149 extCode = ERR_FWFD;
150 break;
151 default:
152 break;
153 }
154 break;
155 case EACCES:
156 buffer += "Permission denied";
157 extCode = ERR_ACCESS;
158 break;
159 case EBUSY:
160 switch (myCode){
161 case OSD_WFileNode:
162 buffer += "Still used by system or a process";
163 extCode = ERR_FNBUSY;
164 break;
165 default:
166 break;
167 }
168 break;
169 case ERANGE:
170 switch (myCode){
171 case OSD_WFile:
172 buffer += "Not enough or too many bytes written";
173 extCode = ERR_FRANGE;
174 break;
7fd59977 175 default:
176 break;
177 }
178 break;
179 case EPERM:
180 switch (myCode){
181 case OSD_WPackage:
182 buffer += "Permission denied";
183 extCode = ERR_PPERM;
184 break;
185 case OSD_WFileNode:
186 buffer += "Permission denied or can't unlink directory";
187 extCode = ERR_FPERM;
188 break;
7fd59977 189 default :
190 buffer += "abnormal error : you modified OSD library";
191 extCode = ERR_PERM;
192 break;
193 }
194 break;
195 case EROFS:
196 switch (myCode){
197 case OSD_WFileNode:
198 case OSD_WFile:
199 buffer += "Read only file system";
200 extCode = ERR_ROFS;
201 break;
202 default:
203 break;
204 }
205 break;
206 case ENXIO:
207 case EIO :
208 switch (myCode){
209 case OSD_WDirectory:
210 case OSD_WFileNode:
211 buffer += "I/O error";
212 extCode = ERR_IO;
213 break;
214 case OSD_WFile :
215 buffer += "I/O error or Hang up from terminal";
216 extCode = ERR_FIO;
217 break;
218 default:
219 break;
220 }
221 break;
222 case EISDIR :
223 switch (myCode){
224 case OSD_WFileNode:
225 case OSD_WFile :
226 buffer += "The File is a Directory";
227 extCode = ERR_ISDIR;
228 break;
229 default:
230 break;
231 }
232 break;
233
234#ifdef SUN
235 case EWOULDBLOCK:
236 switch (myCode){
237 case OSD_WFile:
238 buffer += "File is locked";
239 extCode = ERR_FLOCKED;
240 break;
7fd59977 241 default:
242 break;
7fd59977 243 }
244 break;
245#endif
246
247#ifdef IRIX4
248 case EWOULDBLOCK:
249 switch (myCode){
250 case OSD_WFile:
251 buffer += "File is locked";
252 extCode = ERR_FLOCKED;
253 break;
7fd59977 254 default:
255 break;
7fd59977 256 }
257 break;
258#endif
259
260 case EAGAIN:
261 switch (myCode){
262 case OSD_WFile:
263 buffer += "No data ready to be read/written";
264 extCode = ERR_FAGAIN;
265 break;
266 default:
267 break;
268 }
269 break;
270 case ENOTDIR:
271 switch(myCode){
272 case OSD_WDirectory:
273 case OSD_WFileNode:
274 case OSD_WFile:
275 buffer += "A component of path is not a Directory";
276 extCode = ERR_NOTDIR;
277 break;
278 default:
279 break;
280 }
281 break;
282 case EMLINK:
283 switch (myCode){
284 case OSD_WDirectory:
285 buffer += "Too many links";
286 extCode = ERR_DMLINK;
287 break;
288 default:
289 break;
290 }
291 break;
292 case ELOOP :
293 switch (myCode){
294 case OSD_WDirectory:
295 case OSD_WFileNode:
296 case OSD_WFile :
297 buffer += "Too many symbolic links";
298 break;
299 default:
300 break;
301 }
302 break;
303 case EFAULT:
304 buffer += "User error : arguments point to an illegal address";
305 extCode = ERR_FAULT;
306 break;
307 case EFBIG:
308 switch (myCode){
309 case OSD_WFile:
310 buffer += "Exceed process's file size limit or the maximum file size";
311 extCode = ERR_FFBIG;
312 break;
7fd59977 313 default:
314 break;
315 }
316 break;
317 case EINTR:
318 buffer += "operation breaked by a signal";
319 extCode = ERR_INTR;
320 break;
7fd59977 321 case ENOMEM:
322 buffer += "Not enough memory";
323 extCode = ERR_NOMEM;
324 break;
325 case EMFILE :
326 switch(myCode){
327 case OSD_WFile :
328 buffer += "Too many file descriptors are currently in use by this process";
329 extCode = ERR_FMFILE;
330 break;
7fd59977 331 default:
332 break;
333 }
334 break;
335 case ENAMETOOLONG :
336 buffer += "File name too long";
337 extCode = ERR_NAMETOOLONG;
338 break;
339 case ENFILE :
340 switch (myCode){
341 case OSD_WFile:
342 buffer += "Too many files are currently open in the system";
343 extCode = ERR_FNFILE;
344 break;
345 default:
346 break;
347 }
348 break;
349 case EXDEV:
350 switch (myCode){
351 case OSD_WFileNode:
352 buffer += "The link named by path2 and the file named by path1 are\n";
353 buffer += "on different logical devices (file systems)";
354 extCode = ERR_FNXDEV;
355 break;
356 default:
357 break;
358 }
359 break;
360 case ENOENT:
361 switch (myCode){
362 case OSD_WFileNode:
363 case OSD_WFile:
364 if (myMessage != "Open") buffer += "File doesn't exist or";
365 buffer += "Invalid path (empty string)";
366 extCode = ERR_NOENT;
367 break;
368 case OSD_WDirectory:
369 buffer += "A component of the path prefix of path does not exist";
370 extCode = ERR_DNOENT;
371 break;
7fd59977 372 default:
373 break;
374 }
375 break;
376 case ENOSPC: {
377 switch (myCode){
378 case OSD_WDirectory:
379 case OSD_WFile:
380 buffer += "No more free space on file system";
381 extCode = ERR_FNOSPC;
382 break;
7fd59977 383 default:
384 break;
385 }
386 break;
387 }
388
389//
390// AIX maps ENOTEMPTY to EEXIST. Move this case block to
391// the EEXIST case block.
392//
393#if (!defined(_AIX)) && (!defined(AIX))
394 case ENOTEMPTY:
395 switch (myCode){
396 case OSD_WFileNode:
397 buffer += "Directory not empty";
398 extCode = ERR_FNNOTEMPTY;
399 break;
400 default:
401 break;
402 }
403 break;
404#endif
405
406 case EEXIST:
407 switch(myCode){
408 case OSD_WFileNode:
409 buffer += "Directory not empty";
410 extCode = ERR_FNNOTEMPTY;
411 break;
412 case OSD_WFile:
413 buffer += "OSD_Create and OSD_Exclude are set and the named file exists";
414 extCode = ERR_FEXIST;
415 break;
416 default:
417 buffer += "Identifier already exists for this key";
418 extCode = ERR_EXIST;
419 break;
420 }
421 break;
422 case E2BIG:
423 buffer += "Too many Semaphore/Shared memory for a process.";
424 buffer += "Reconfigure Kernel with greater values";
425 extCode = ERR_TOOBIG;
426 break;
7fd59977 427 default: {
428 Standard_Character buf[255];
429 //
430 sprintf(buf,"%sUnknowm error #%d",buffer.ToCString(),myErrno);
431 TCollection_AsciiString interm(buf);
432 buffer = interm;
433 extCode = ERR_UNKNOWN;
434 }
435 }
436 buffer += ".\n\n";
9775fa61 437 throw OSD_OSDError(buffer.ToCString());
7fd59977 438}
439
440#else
441
442//------------------------------------------------------------------------
443//------------------- Windows NT sources for OSD_Error ------------------
444//------------------------------------------------------------------------
445
7fd59977 446#include <OSD_Error.hxx>
447#include <OSD_ErrorList.hxx>
d9ff84e8 448#include <TCollection_ExtendedString.hxx>
7fd59977 449
450#include <windows.h>
5fecc495 451#include <strsafe.h>
7fd59977 452
453typedef struct _error_table {
454
455 DWORD wnt_error;
456 Standard_Integer csf_error;
457
458 } ERROR_TABLE;
459
7fd59977 460static ERROR_TABLE commErrorTable [] = {
461
462 { ERROR_INVALID_FUNCTION, ERR_INVAL },
463 { ERROR_FILE_NOT_FOUND, ERR_NOENT },
464 { ERROR_PATH_NOT_FOUND, ERR_NOENT },
465 { ERROR_ACCESS_DENIED, ERR_ACCESS },
466 { ERROR_ARENA_TRASHED, ERR_NOMEM },
467 { ERROR_NOT_ENOUGH_MEMORY, ERR_NOMEM },
468 { ERROR_INVALID_BLOCK, ERR_NOMEM },
469 { ERROR_BAD_ENVIRONMENT, ERR_TOOBIG },
470 { ERROR_INVALID_ACCESS, ERR_INVAL },
471 { ERROR_INVALID_DATA, ERR_INVAL },
472 { ERROR_INVALID_DRIVE, ERR_NOENT },
473 { ERROR_CURRENT_DIRECTORY, ERR_ACCESS },
474 { ERROR_NO_MORE_FILES, ERR_NOENT },
475 { ERROR_LOCK_VIOLATION, ERR_ACCESS },
476 { ERROR_SHARING_VIOLATION, ERR_ACCESS },
477 { ERROR_BAD_NETPATH, ERR_NOENT },
478 { ERROR_NETWORK_ACCESS_DENIED, ERR_ACCESS },
479 { ERROR_BAD_NET_NAME, ERR_NOENT },
480 { ERROR_FILE_EXISTS, ERR_EXIST },
481 { ERROR_CANNOT_MAKE, ERR_ACCESS },
482 { ERROR_FAIL_I24, ERR_ACCESS },
483 { ERROR_INVALID_PARAMETER, ERR_INVAL },
484 { ERROR_DRIVE_LOCKED, ERR_ACCESS },
485 { ERROR_INVALID_HANDLE, ERR_INVAL },
486 { ERROR_NEGATIVE_SEEK, ERR_INVAL },
487 { ERROR_SEEK_ON_DEVICE, ERR_ACCESS },
488 { ERROR_NOT_LOCKED, ERR_ACCESS },
489 { ERROR_BAD_PATHNAME, ERR_NOENT },
490 { ERROR_LOCK_FAILED, ERR_ACCESS },
491 { ERROR_ALREADY_EXISTS, ERR_EXIST },
492 { ERROR_FILENAME_EXCED_RANGE, ERR_NOENT },
493 { ERROR_NOT_ENOUGH_QUOTA, ERR_QUOT },
494 { ERROR_IO_DEVICE, ERR_IO },
495 { ERROR_INVALID_BLOCK, ERR_FAULT },
496 { ERROR_BAD_THREADID_ADDR, ERR_FAULT },
497 { ERROR_INVALID_ADDRESS, ERR_FAULT },
498 { ERROR_MAPPED_ALIGNMENT, ERR_FAULT },
499 { ERROR_BUFFER_OVERFLOW, ERR_NAMETOOLONG }
500
501};
502
f24125b9 503#define COMM_ERR_TABLE_SIZE (int)(sizeof(commErrorTable) / sizeof(commErrorTable[0]))
7fd59977 504
505static ERROR_TABLE dirErrorTable[] = {
506
507 { ERROR_FILE_NOT_FOUND, ERR_NOENT },
508 { ERROR_PATH_NOT_FOUND, ERR_NOENT },
509 { ERROR_INVALID_DRIVE, ERR_NOENT },
510 { ERROR_NO_MORE_FILES, ERR_NOENT },
511 { ERROR_BAD_NETPATH, ERR_NOENT },
512 { ERROR_BAD_NET_NAME, ERR_NOENT },
513 { ERROR_BAD_PATHNAME, ERR_NOENT },
514 { ERROR_FILENAME_EXCED_RANGE, ERR_NOENT }
515
516};
517
f24125b9 518#define DIR_ERR_TABLE_SIZE (int)(sizeof(dirErrorTable) / sizeof(dirErrorTable[0]))
7fd59977 519
520static ERROR_TABLE fileErrorTable[] = {
521
522 { ERROR_INVALID_HANDLE, ERR_FBADF },
523 { ERROR_INVALID_TARGET_HANDLE, ERR_FBADF },
524 { ERROR_DIRECT_ACCESS_HANDLE, ERR_FBADF },
525 { ERROR_FILE_EXISTS, ERR_EXIST },
526 { ERROR_ALREADY_EXISTS, ERR_EXIST },
527 { ERROR_TOO_MANY_OPEN_FILES, ERR_FMFILE },
528 { ERROR_INVALID_FUNCTION, ERR_FINVAL },
529 { ERROR_INVALID_ACCESS, ERR_FINVAL },
530 { ERROR_INVALID_DATA, ERR_FINVAL },
531 { ERROR_INVALID_PARAMETER, ERR_FINVAL },
532 { ERROR_INVALID_HANDLE, ERR_FINVAL },
533 { ERROR_NEGATIVE_SEEK, ERR_FINVAL },
534 { ERROR_IO_PENDING, ERR_FAGAIN },
535 { ERROR_WRITE_FAULT, ERR_FIO },
536 { ERROR_READ_FAULT, ERR_FIO },
537 { ERROR_NET_WRITE_FAULT, ERR_FIO },
538 { ERROR_IO_DEVICE, ERR_FIO },
539 { ERROR_LOCK_VIOLATION, ERR_FLOCKED },
540 { ERROR_LOCK_FAILED, ERR_FLOCKED }
541
542};
543
566f8441 544#define FILE_ERR_TABLE_SIZE (int)(sizeof(fileErrorTable) / sizeof(fileErrorTable[0]))
7fd59977 545
546static ERROR_TABLE fileNodeErrorTable[] = {
547
548 { ERROR_INVALID_FUNCTION, ERR_FNINVAL },
549 { ERROR_INVALID_ACCESS, ERR_FNINVAL },
550 { ERROR_INVALID_DATA, ERR_FNINVAL },
551 { ERROR_INVALID_PARAMETER, ERR_FNINVAL },
552 { ERROR_INVALID_HANDLE, ERR_FNINVAL },
553 { ERROR_NEGATIVE_SEEK, ERR_FNINVAL },
554 { ERROR_DISK_FULL, ERR_FNOSPC },
555 { ERROR_DIR_NOT_EMPTY, ERR_FNNOTEMPTY },
556 { ERROR_NOT_SAME_DEVICE, ERR_FNXDEV }
557
558};
559
f24125b9 560#define FILE_NODE_ERR_TABLE_SIZE (int)(sizeof(fileNodeErrorTable) / sizeof(fileNodeErrorTable[0]))
7fd59977 561
562static Standard_Integer _get_comm_error ( DWORD );
563
c24d4017 564OSD_Error :: OSD_Error () :
565 myCode((OSD_WhoAmI)0),
566 extCode(0)
567{
7fd59977 568 Reset ();
7fd59977 569} // end constructor ( 1 )
570
571void OSD_Error :: Perror () {
572
742cc8b0 573 wchar_t buff[32];
7fd59977 574
742cc8b0 575 StringCchCopyW(buff, _countof(buff), L"Error ( ");
7fd59977 576
577 switch ( myCode ) {
578
579 case OSD_WDirectoryIterator:
742cc8b0 580 StringCchCatW(buff, _countof(buff), L"OSD_DirectoryIterator");
7fd59977 581 break;
582
583 case OSD_WDirectory:
742cc8b0 584 StringCchCatW(buff, _countof(buff), L"OSD_Directory");
7fd59977 585 break;
586
587 case OSD_WFileIterator:
742cc8b0 588 StringCchCatW(buff, _countof(buff), L"OSD_FileIterator");
7fd59977 589 break;
590
591 case OSD_WFile:
742cc8b0 592 StringCchCatW(buff, _countof(buff), L"OSD_File");
7fd59977 593 break;
594
595 case OSD_WFileNode:
742cc8b0 596 StringCchCatW(buff, _countof(buff), L"OSD_FileNode");
7fd59977 597 break;
598
599 case OSD_WHost:
742cc8b0 600 StringCchCatW(buff, _countof(buff), L"OSD_Host");
7fd59977 601 break;
602
603 case OSD_WProcess:
742cc8b0 604 StringCchCatW(buff, _countof(buff), L"OSD_Environment");
7fd59977 605 break;
606
607 case OSD_WEnvironmentIterator:
742cc8b0 608 StringCchCatW(buff, _countof(buff), L"OSD_EnvironmentIterator");
7fd59977 609 break;
610
611 case OSD_WEnvironment:
742cc8b0 612 StringCchCatW(buff, _countof(buff), L"OSD_Environment");
7fd59977 613 break;
614
7fd59977 615 case OSD_WDisk:
742cc8b0 616 StringCchCatW(buff, _countof(buff), L"OSD_Disk");
7fd59977 617 break;
618
619 default:
742cc8b0 620 StringCchCatW(buff, _countof(buff), L"Unknown");
7fd59977 621
622 } // end switch
623
742cc8b0 624 StringCchCatW(buff, _countof(buff), L" )");
625
626 std::wcerr << buff;
7fd59977 627
46802936 628 std::cerr << myMessage.ToCString() << std::endl << std::flush;
7fd59977 629
630} // end OSD_Error :: Perror
631
632void OSD_Error :: SetValue (
633 const Standard_Integer Errcode,
634 const Standard_Integer From,
635 const TCollection_AsciiString& Message
636 ) {
637
638 int i;
639
640 myErrno = Errcode;
641 myCode = ( OSD_WhoAmI )From;
642 myMessage = Message;
643
644 switch ( From ) {
645
646 case OSD_WDirectory:
647
648 for ( i = 0; i < DIR_ERR_TABLE_SIZE; ++i )
649
650 if ( dirErrorTable[ i ].wnt_error == ( DWORD )Errcode ) {
651
652 extCode = dirErrorTable[ i ].csf_error;
653 break;
654
655 } // end if
656
657 if ( i == DIR_ERR_TABLE_SIZE ) extCode = _get_comm_error ( Errcode );
658
659 break;
660
661 case OSD_WFile:
662
663 for ( i = 0; i < FILE_ERR_TABLE_SIZE; ++i )
664
665 if ( fileErrorTable[ i ].wnt_error == ( DWORD )Errcode ) {
666
667 extCode = fileErrorTable[ i ].csf_error;
668 break;
669
670 } // end if
671
672 if ( i == FILE_ERR_TABLE_SIZE ) extCode = _get_comm_error ( Errcode );
673
674 break;
675
676 case OSD_WFileNode:
677
678 for ( i = 0; i < FILE_NODE_ERR_TABLE_SIZE; ++i )
679
680 if ( fileNodeErrorTable[ i ].wnt_error == ( DWORD )Errcode ) {
681
682 extCode = fileNodeErrorTable[ i ].csf_error;
683 break;
684
685 } // end if
686
687 if ( i == FILE_NODE_ERR_TABLE_SIZE ) extCode = _get_comm_error ( Errcode );
688
689 break;
690
691 default:
692
693 extCode = _get_comm_error ( Errcode );
694
695 } // end switch
696
697} // end OSD_Error :: SetValue
698
699Standard_Integer OSD_Error :: Error () const {
700
701 return extCode;
702
703} // end OSD_Error :: Error
704
705Standard_Boolean OSD_Error :: Failed () const {
706
707 return myErrno == ERROR_SUCCESS ? Standard_False : Standard_True;
708
709} // end OSD_Error :: Failed
710
46802936 711void OSD_Error :: Reset ()
712{
713 myErrno = ERROR_SUCCESS;
7fd59977 714} // end OSD_Error :: Reset
715
7fd59977 716static Standard_Integer _get_comm_error ( DWORD dwCode ) {
717
718 int i;
719 Standard_Integer retVal = ERR_SURPRISE;
720
721 for ( i = 0; i < COMM_ERR_TABLE_SIZE; ++i )
722
723 if ( commErrorTable[ i ].wnt_error == ( DWORD )dwCode ) {
724
725 retVal = commErrorTable[ i ].csf_error;
726 break;
727
728 } // end if
729
730 return retVal;
731
732} // end _get_comm_error
733
734#endif