00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
#ifndef OFCOND_H
00035
#define OFCOND_H
00036
00037
#include "osconfig.h"
00038
#include "oftypes.h"
00039
#include "ofstring.h"
00040
#include "ofcast.h"
00041
00042
#define INCLUDE_CASSERT
00043
#include "ofstdinc.h"
00044
00047
enum OFStatus
00048 {
00050 OF_ok,
00051
00053 OF_error,
00054
00056 OF_failure
00057 };
00058
00059
00062 class OFConditionBase
00063 {
00064
public:
00065
00067 OFConditionBase()
00068 {
00069 }
00070
00072 OFConditionBase(
const OFConditionBase& )
00073 {
00074 }
00075
00077 virtual ~OFConditionBase()
00078 {
00079 }
00080
00086
virtual const OFConditionBase *
clone() const = 0;
00087
00091 virtual
unsigned long codeAndModule() const = 0;
00092
00094 virtual OFStatus status() const = 0;
00095
00097 virtual const
char *text() const = 0;
00098
00103 virtual OFBool deletable() const = 0;
00104
00106 unsigned short module()
const
00107
{
00108
return OFstatic_cast(
unsigned short,((
codeAndModule() >> 16) & 0xFFFF));
00109 }
00110
00112 unsigned short code()
const
00113
{
00114
return OFstatic_cast(
unsigned short,(
codeAndModule() & 0xFFFF));
00115 }
00116
00122 OFBool
operator==(
const OFConditionBase& arg)
const
00123
{
00124
return ((
status() == arg.
status()) && (
codeAndModule() == arg.
codeAndModule()));
00125 }
00126
00132 OFBool
operator!=(
const OFConditionBase& arg)
const
00133
{
00134
return ((
status() != arg.
status()) || (
code() != arg.
code()) || (
module() != arg.
module()));
00135 }
00136
00137
private:
00138
00140
OFConditionBase&
operator=(
const OFConditionBase& arg);
00141
00142 };
00143
00144
00145
00150 class OFConditionConst:
public OFConditionBase
00151 {
00152
public:
00153
00162 OFConditionConst(
unsigned short aModule,
unsigned short aCode, OFStatus aStatus,
const char *aText)
00163 :
OFConditionBase()
00164 ,
theCodeAndModule(OFstatic_cast(unsigned long, aCode) | OFstatic_cast(unsigned long, aModule << 16))
00165 ,
theStatus(aStatus)
00166 ,
theText(aText)
00167 {
00168 }
00169
00171 OFConditionConst(
const OFConditionConst& arg)
00172 :
OFConditionBase(arg)
00173 ,
theCodeAndModule(arg.
theCodeAndModule)
00174 ,
theStatus(arg.
theStatus)
00175 ,
theText(arg.
theText)
00176 {
00177 }
00178
00180 virtual ~OFConditionConst()
00181 {
00182 }
00183
00188
virtual const OFConditionBase *
clone() const;
00189
00193 virtual
unsigned long codeAndModule() const;
00194
00196 virtual OFStatus status() const;
00197
00199 virtual const
char *text() const;
00200
00205 virtual OFBool deletable() const;
00206
00207 private:
00208
00210
OFConditionConst& operator=(const
OFConditionConst& arg);
00211
00213 unsigned long theCodeAndModule;
00214
00216 OFStatus theStatus;
00217
00219 const
char *theText;
00220
00221 };
00222
00223
00224
00228 class
OFConditionString: public
OFConditionBase
00229 {
00230
public:
00231
00239 OFConditionString(
unsigned short aModule,
unsigned short aCode, OFStatus aStatus,
const char *aText)
00240 : OFConditionBase()
00241 , theCodeAndModule(OFstatic_cast(unsigned long, aCode) | OFstatic_cast(unsigned long, aModule << 16))
00242 , theStatus(aStatus)
00243 , theText()
00244 {
00245
if (aText) theText = aText;
00246 }
00247
00249 OFConditionString(
const OFConditionString& arg)
00250 : OFConditionBase(arg)
00251 , theCodeAndModule(arg.theCodeAndModule)
00252 , theStatus(arg.theStatus)
00253 , theText(arg.theText)
00254 {
00255 }
00256
00258 virtual ~
OFConditionString()
00259 {
00260 }
00261
00266
virtual const OFConditionBase *
clone() const;
00267
00271 virtual
unsigned long codeAndModule() const;
00272
00274 virtual OFStatus status() const;
00275
00277 virtual const
char *text() const;
00278
00283 virtual OFBool deletable() const;
00284
00285 private:
00287
OFConditionString& operator=(const
OFConditionString& arg);
00288
00290 unsigned long theCodeAndModule;
00291
00293 OFStatus theStatus;
00294
00296 OFString theText;
00297 };
00298
00299
00300
00301 extern const
OFConditionConst ECC_Normal;
00302
00303
00309 class
OFCondition
00310 {
00311
public:
00312
00318 OFCondition(
OFConditionString *base)
00319 : theCondition(base)
00320 {
00321 assert(theCondition);
00322 }
00323
00329
#ifdef OFCONDITION_STRICT_MODE
00330
00331 OFCondition(
const OFConditionConst& base)
00332 #
else
00333 OFCondition(
const OFConditionConst& base = ECC_Normal)
00334 #endif
00335 : theCondition(&base)
00336 {
00337 assert(theCondition);
00338 }
00339
00341 OFCondition(
const OFCondition& arg)
00342 : theCondition(arg.theCondition->clone())
00343 {
00344 assert(theCondition);
00345 }
00346
00348 ~OFCondition()
00349 {
00350
if (theCondition->deletable())
00351 {
00352
delete OFconst_cast(OFConditionBase *, theCondition);
00353 }
00354 }
00355
00357 OFCondition&
operator=(
const OFCondition& arg)
00358 {
00359
if (&arg !=
this)
00360 {
00361
if (theCondition->deletable())
00362 {
00363
delete OFconst_cast(OFConditionBase *, theCondition);
00364 }
00365 theCondition = arg.
theCondition->
clone();
00366 assert(theCondition);
00367 }
00368
return *
this;
00369 }
00370
00372 inline unsigned short module()
const
00373
{
00374
return theCondition->module();
00375 }
00376
00378 inline unsigned short code()
const
00379
{
00380
return theCondition->code();
00381 }
00382
00384 inline OFStatus
status()
const
00385
{
00386
return theCondition->status();
00387 }
00388
00390 inline const char *
text()
const
00391
{
00392
return theCondition->text();
00393 }
00394
00396 inline OFBool good()
const
00397
{
00398 OFStatus s = theCondition->status();
00399
return (s == OF_ok);
00400 }
00401
00403 inline OFBool bad()
const
00404
{
00405 OFStatus s = theCondition->status();
00406
return (s != OF_ok);
00407 }
00408
00409
#ifdef OFCONDITION_IMPLICIT_BOOL_CONVERSION
00410
00411
00412
00413
00414
00418
inline operator OFBool()
const
00419
{
00420
return good();
00421 }
00422
#endif
00423
00429 inline OFBool
operator==(
const OFCondition& arg)
const
00430
{
00431
return (*theCondition == *arg.
theCondition);
00432 }
00433
00439 inline OFBool
operator!=(
const OFCondition& arg)
const
00440
{
00441
return (*theCondition != *arg.
theCondition);
00442 }
00443
00444
private:
00445
00447 const OFConditionBase *theCondition;
00448
00449 };
00450
00451
00452
00453
00454
00455
00456
00458
extern const OFCondition EC_Normal;
00459
00461
extern const OFCondition EC_IllegalParameter;
00462
00464
extern const OFCondition EC_MemoryExhausted;
00465
00466
00469
#define makeOFCondition(A, B, C, D) OFCondition(new OFConditionString((A), (B), (C), (D)))
00470
00471
00472
#endif
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508