void tTJSBinarySerializer::InsertArray( tTJSArrayObject* array, tjs_uint index, tTJSVariant* value ) { if( value == NULL ) TJS_eTJSError( TJSReadError ); tTJSArrayNI* ni = NULL; tjs_error hr = array->NativeInstanceSupport(TJS_NIS_GETINSTANCE, TJSGetArrayClassID(), (iTJSNativeInstance**)&ni ); if( TJS_SUCCEEDED(hr) ) { // array->Insert( ni, *value, index ); array->Add( ni, *value ); } }
//--------------------------------------------------------------------------- void tTJSDictionaryNI::Assign(iTJSDispatch2 * dsp, bool clear) { // copy members from "dsp" to "Owner" // determin dsp's object type tTJSArrayNI *arrayni = NULL; if(dsp && TJS_SUCCEEDED(dsp->NativeInstanceSupport(TJS_NIS_GETINSTANCE, TJSGetArrayClassID(), (iTJSNativeInstance**)&arrayni)) ) { // convert from array if(clear) Owner->Clear(); // reserve area tjs_int reqcount = Owner->Count + arrayni->Items.size(); Owner->RebuildHash( reqcount ); tTJSArrayNI::tArrayItemIterator i; for(i = arrayni->Items.begin(); i != arrayni->Items.end(); i++) { tTJSVariantString *name = i->AsStringNoAddRef(); i++; if(arrayni->Items.end() == i) break; Owner->PropSetByVS(TJS_MEMBERENSURE|TJS_IGNOREPROP, name, &(*i), Owner); } } else { // otherwise if(clear) Owner->Clear(); tSaveMemberCountCallback countCallback; dsp->EnumMembers(TJS_IGNOREPROP, &tTJSVariantClosure(&countCallback, NULL), dsp); tjs_int reqcount = countCallback.Count + Owner->Count; Owner->RebuildHash( reqcount ); tAssignCallback callback; callback.Owner = Owner; dsp->EnumMembers(TJS_IGNOREPROP, &tTJSVariantClosure(&callback, NULL), dsp); } }
//--------------------------------------------------------------------------- tjs_error TJS_INTF_METHOD tTJSDictionaryNI::tAssignStructCallback::FuncCall( tjs_uint32 flag, const tjs_char * membername, tjs_uint32 *hint, tTJSVariant *result, tjs_int numparams, tTJSVariant **param, iTJSDispatch2 *objthis) { // called indirectly from tTJSDictionaryNI::AssignStructure or // tTJSArrayNI::AssignStructure if(numparams < 3) return TJS_E_BADPARAMCOUNT; // hidden members are not processed tjs_uint32 flags = (tjs_int)*param[1]; if(flags & TJS_HIDDENMEMBER) { if(result) *result = (tjs_int)1; return TJS_S_OK; } tTJSVariant &value = *param[2]; tTJSVariantType type = value.Type(); if(type == tvtObject) { // object iTJSDispatch2 *dsp = value.AsObjectNoAddRef(); // determin dsp's object type tTJSVariant val; tTJSDictionaryNI *dicni = NULL; tTJSArrayNI *arrayni = NULL; if(dsp && TJS_SUCCEEDED(dsp->NativeInstanceSupport(TJS_NIS_GETINSTANCE, TJSGetDictionaryClassID(), (iTJSNativeInstance**)&dicni)) ) { // dictionary bool objrec = false; std::vector<iTJSDispatch2 *>::iterator i; for(i = Stack->begin(); i != Stack->end(); i++) { if(*i == dsp) { // object recursion detected objrec = true; break; } } if(objrec) { val.SetObject(NULL); // becomes null } else { iTJSDispatch2 * newobj = TJSCreateDictionaryObject(); val.SetObject(newobj, newobj); newobj->Release(); tTJSDictionaryNI * newni = NULL; if(TJS_SUCCEEDED(newobj->NativeInstanceSupport(TJS_NIS_GETINSTANCE, TJSGetDictionaryClassID(), (iTJSNativeInstance**)&newni)) ) { newni->AssignStructure(dsp, *Stack); } } } else if(dsp && TJS_SUCCEEDED(dsp->NativeInstanceSupport(TJS_NIS_GETINSTANCE, TJSGetArrayClassID(), (iTJSNativeInstance**)&arrayni)) ) { // array bool objrec = false; std::vector<iTJSDispatch2 *>::iterator i; for(i = Stack->begin(); i != Stack->end(); i++) { if(*i == dsp) { // object recursion detected objrec = true; break; } } if(objrec) { val.SetObject(NULL); // becomes null } else { iTJSDispatch2 * newobj = TJSCreateArrayObject(); val.SetObject(newobj, newobj); newobj->Release(); tTJSArrayNI * newni = NULL; if(TJS_SUCCEEDED(newobj->NativeInstanceSupport(TJS_NIS_GETINSTANCE, TJSGetArrayClassID(), (iTJSNativeInstance**)&newni)) ) { newni->AssignStructure(dsp, *Stack); } } } else { // other object types val = value; } Dest->PropSetByVS(TJS_MEMBERENSURE|TJS_IGNOREPROP, param[0]->AsStringNoAddRef(), &val, Dest); } else { // other types Dest->PropSetByVS(TJS_MEMBERENSURE|TJS_IGNOREPROP, param[0]->AsStringNoAddRef(), &value, Dest); } if(result) *result = (tjs_int)1; return TJS_S_OK; }