diff --git a/src/system/obj/Msg.cpp b/src/system/obj/Msg.cpp index ae2185cb..2cbc7f82 100644 --- a/src/system/obj/Msg.cpp +++ b/src/system/obj/Msg.cpp @@ -129,22 +129,21 @@ DataNode MsgSource::OnRemoveSink(DataArray* da){ return DataNode(0); } -bool PropSync(MsgSource::Sink& sink, DataNode& node, DataArray* prop, int i, PropOp op){ - if(i == prop->Size()) return true; - else { - Symbol sym = prop->Sym(i); - if(sym == obj){ - return PropSync(sink.obj, node, prop, i + 1, op); - } - if(sym == mode){ - int x = sink.mode; - bool ret = PropSync(x, node, prop, i + 1, op); - sink.mode = (MsgSource::SinkMode)x; - return ret; - } - } - return true; -} +BEGIN_CUSTOM_PROPSYNC(MsgSource::Sink) + SYNC_PROP(obj, (Hmx::Object*&)o.obj) + SYNC_PROP(mode, (int&)o.mode) +END_CUSTOM_PROPSYNC + +BEGIN_CUSTOM_PROPSYNC(MsgSource::EventSinkElem) + SYNC_PROP(handler, o.handler) + SYNC_PROP(obj, (Hmx::Object*&)o.obj) + SYNC_PROP(mode, (int&)o.mode) +END_CUSTOM_PROPSYNC + +BEGIN_CUSTOM_PROPSYNC(MsgSource::EventSink) + SYNC_PROP(event, o.ev) + SYNC_PROP(sinks, o.sinks) +END_CUSTOM_PROPSYNC BEGIN_PROPSYNCS(MsgSource) SYNC_PROP(sinks, mSinks) diff --git a/src/system/obj/PropSync_p.h b/src/system/obj/PropSync_p.h index b0153406..cbbde421 100644 --- a/src/system/obj/PropSync_p.h +++ b/src/system/obj/PropSync_p.h @@ -123,14 +123,34 @@ template bool PropSync(ObjPtrList& ptr, DataNode& } } -template bool PropSync(std::list& list, DataNode& node, DataArray* prop, int i, PropOp op) { +template bool PropSync(std::list& pList, DataNode& node, DataArray* prop, int i, PropOp op) { if((int)op == 0x40) return false; - else { + else if(i == prop->Size()){ MILO_ASSERT(op == kPropSize, 146); - //if(op == kPropGet) node = DataNode(ptr.Ptr()); - //else ptr = node.Obj(0); + node = DataNode((int)pList.size()); return true; } + else { + std::list::iterator it = pList.begin(); + for(int count = prop->Int(i++); count > 0; count--){ + it++; + } + if(i < prop->Size() || op & 0x13){ + return PropSync(*it, node, prop, i, op); + } + else if(op == kPropRemove){ + pList.erase(it); + return true; + } + else if(op == kPropInsert){ + T item; + if(PropSync(item, node, prop, i, op)){ + pList.insert(it, item); + return true; + } + } + return false; + } } template bool PropSync(std::vector& vec, DataNode& node, DataArray* prop, int i, PropOp op) {