Changeset 490 for cpp/frams/util


Ignore:
Timestamp:
03/30/16 17:08:08 (8 years ago)
Author:
Maciej Komosinski
Message:

Introduced general-use ErrorObject?, fixed enumeration of mixed private/public property lists

Location:
cpp/frams/util
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/util/extvalue.cpp

    r478 r490  
    357357}
    358358
     359void ExtValue::setError(const SString& msg)
     360{
     361ErrorObject *err=new ErrorObject;
     362err->message=msg;
     363setObject(ErrorObject::makeDynamicObject(err));
     364}
     365
    359366static ExtValue::CompareResult longsign(paInt x)
    360367{
     
    369376        if ((v.getType() == TInt) && (v.getInt() == 0)) return ExtValue::ResultUnequal_RelaxedEqual;
    370377        return ExtValue::ResultUnequal_RelaxedUnequal; //comparing anything else with null is valid but null is neither higher nor lower than numbers or strings
     378}
     379
     380static ExtValue::CompareResult compareInvalid(const ExtValue& v)
     381{
     382        if (v.getType()==TInvalid) return ExtValue::ResultEqualUnordered;
     383        if ((v.getType() == TInt) && (v.getInt() == 0)) return ExtValue::ResultUnequal_RelaxedEqual;
     384        return ExtValue::ResultMismatch; //comparing anything else with invalid is invalid
    371385}
    372386
     
    392406        else if (src.isNull())
    393407                return compareNull(*this);
     408        if (getType()==TInvalid)
     409                return compareInvalid(src);
     410        else if (src.getType()==TInvalid)
     411                return compareInvalid(*this);
    394412        switch (type)
    395413        {
     
    11211139                return in + 5;
    11221140        }
    1123         else if (!strncmp(in, "invalid", 9))
     1141        else if (!strncmp(in, "invalid", 7))
    11241142        {
    11251143                setInvalid();
    1126                 return in + 9;
     1144                return in + 7;
    11271145        }
    11281146        else if (*in == '<')
    11291147        { //unserializable object
    1130                 setInvalid();
    1131                 while (*in)
    1132                         if (*in == '>')
    1133                                 return in + 1;
    1134                         else in++;
    1135                         return in;
     1148                const char* end=in+1;
     1149                while (*end)
     1150                        if (*end == '>')
     1151                                {
     1152                                setError(SString("Unserializable class: ")+SString(in+1,end-in-1));
     1153                                return end+1;
     1154                                }
     1155                        else
     1156                                end++;
     1157                logPrintf("ExtValue", "deserialize", LOG_ERROR, "Missing '>'");
     1158                return NULL;
    11361159        }
    11371160        else if (*in == '^')
     
    12361259        return v.toString();
    12371260}
     1261
     1262#define FIELDSTRUCT ErrorObject
     1263static ParamEntry errorobject_paramtab[]=
     1264{
     1265{"Error",1,3,"Error",},
     1266{"message",0,0,"Message","s",FIELD(message),},
     1267{"newFromString",0,0,"create new object","p oError(s message)",PROCEDURE(p_newfromstring),},
     1268{"toString",0,PARAM_READONLY | PARAM_NOSTATIC,"Textual form","s",GETONLY(toString),},
     1269{0,0,0,},
     1270};
     1271#undef FIELDSTRUCT
     1272
     1273Param& ErrorObject::getParam()
     1274{
     1275        static Param param(errorobject_paramtab);
     1276        return param;
     1277}
     1278
     1279ExtObject ErrorObject::makeDynamicObject(ErrorObject* e)
     1280{
     1281        return ExtObject(&getParam(), (DestrBase*)e);
     1282}
     1283
     1284const SString ErrorObject::TO_STRING_PREFIX="Error: ";
     1285
     1286void ErrorObject::get_toString(ExtValue* ret)
     1287{
     1288ret->setString(TO_STRING_PREFIX+message);
     1289}
     1290
     1291void ErrorObject::p_newfromstring(ExtValue *args, ExtValue *ret)
     1292{
     1293ErrorObject *err=new ErrorObject();
     1294err->message=args[0].getString();
     1295if (err->message.startsWith(TO_STRING_PREFIX.c_str()))
     1296        err->message=err->message.substr(TO_STRING_PREFIX.len());
     1297*ret = makeDynamicObject(err);
     1298}
     1299
     1300REGISTER_DESERIALIZABLE(ErrorObject)
  • cpp/frams/util/extvalue.h

    r482 r490  
    185185        void setEmpty();
    186186        void setInvalid() { setEmpty(); type = TInvalid; }
     187        void setError(const SString& msg);
    187188        bool makeUnique() { return (type == TObj) && odata().makeUnique(); } //< @return false if nothing has changed
    188189        ExtPType getType() const { return type; }
     
    243244#define REGISTER_DESERIALIZABLE(name) ExtValue::AddDeserializable<name> deserializable_autoinit_ ## name;
    244245
    245 #endif
     246class ErrorObject: public DestrBase
     247{
     248  public:
     249SString message;
     250static Param& getParam();
     251static Param& getStaticParam() {return getParam();}
     252static ExtObject makeDynamicObject(ErrorObject* e);
     253static const SString TO_STRING_PREFIX;
     254#define STATRICKCLASS ErrorObject
     255PARAMGETDEF(toString);
     256PARAMPROCDEF(p_newfromstring);
     257#undef STATRICKCLASS
     258};
     259
     260#endif
Note: See TracChangeset for help on using the changeset viewer.