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
00035
00036
00037
00038
00039 #include "debug/DebugUtils.h"
00040 #include "TclListSerialize.h"
00041
00042 namespace oasys {
00043
00044 TclListSerialize::TclListSerialize(Tcl_Interp* interp,
00045 Tcl_Obj* list_obj,
00046 context_t context,
00047 int options)
00048 : SerializeAction(Serialize::MARSHAL, context, options),
00049 interp_(interp), list_obj_(list_obj)
00050 {
00051 }
00052
00053 TclListSerialize::~TclListSerialize()
00054 {
00055 }
00056
00057 void
00058 TclListSerialize::process(const char* name, u_int32_t* i)
00059 {
00060 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00061 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewIntObj(*i));
00062 }
00063
00064 void
00065 TclListSerialize::process(const char* name, u_int16_t* i)
00066 {
00067 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00068 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewIntObj(*i));
00069 }
00070
00071 void
00072 TclListSerialize::process(const char* name, u_int8_t* i)
00073 {
00074 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00075 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewIntObj(*i));
00076 }
00077
00078 void
00079 TclListSerialize::process(const char* name, bool* b)
00080 {
00081 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00082 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewBooleanObj(*b));
00083 }
00084
00085 void
00086 TclListSerialize::process(const char* name, u_char* bp, size_t len)
00087 {
00088 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00089 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewByteArrayObj(bp, len));
00090 }
00091
00092 void
00093 TclListSerialize::process(const char* name, std::string* s)
00094 {
00095 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00096 Tcl_ListObjAppendElement(interp_, list_obj_,
00097 Tcl_NewStringObj(s->data(), s->length()));
00098 }
00099
00100 void
00101 TclListSerialize::process(const char* name, u_char** bp,
00102 size_t* lenp, int flags)
00103 {
00104 if (flags & Serialize::NULL_TERMINATED) {
00105 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00106 Tcl_ListObjAppendElement(interp_, list_obj_,
00107 Tcl_NewStringObj((char*)*bp, -1));
00108 } else {
00109 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00110 Tcl_ListObjAppendElement(interp_, list_obj_,
00111 Tcl_NewStringObj((char*)*bp, *lenp));
00112 }
00113 }
00114
00115 void
00116 TclListSerialize::process(const char* name, SerializableObject* object)
00117 {
00118 Tcl_Obj* old_list_obj = list_obj_;
00119 Tcl_Obj* new_list_obj = Tcl_NewListObj(0, NULL);
00120
00121 list_obj_ = new_list_obj;
00122 object->serialize(this);
00123 list_obj_ = old_list_obj;
00124
00125 Tcl_ListObjAppendElement(interp_, list_obj_, Tcl_NewStringObj(name, -1));
00126
00127 int length = 0;
00128 int ok = Tcl_ListObjLength(interp_, new_list_obj, &length);
00129 ASSERT(ok == TCL_OK);
00130
00131 if ((length != 2) || (options_ & KEEP_SINGLETON_SUBLISTS)) {
00132 Tcl_ListObjAppendElement(interp_, list_obj_, new_list_obj);
00133 } else {
00134 Tcl_Obj* obj;
00135 int ok = Tcl_ListObjIndex(interp_, new_list_obj, 1, &obj);
00136 ASSERT(ok == TCL_OK);
00137
00138 Tcl_ListObjAppendElement(interp_, list_obj_, obj);
00139 Tcl_IncrRefCount(new_list_obj);
00140 Tcl_DecrRefCount(new_list_obj);
00141 }
00142 }
00143
00144
00145 }