/** Function oyStruct_ObserverCopyModel * @memberof oyObserver_s * @brief copy a models observers to a different model * * The observers are copied from pattern with object type to a model with the * same object type. * * @param[in,out] model the model * @param[in] pattern the pattern to copy from * @param[in] flags 0x01 omit observer idendity check * @return 0 - good; >= 1 - error; < 0 issue * * @version Oyranos: 0.1.10 * @since 2009/11/02 (Oyranos: 0.1.10) * @date 2009/11/02 */ OYAPI int OYEXPORT oyStruct_ObserverCopyModel( oyStruct_s * model, oyStruct_s * pattern, uint32_t flags ) { oyObserver_s * obs = 0; int error = !model; oyStructList_s * observers = 0; int n,i; if( !model || !pattern ) return 0; observers = oyStruct_ObserverListGet_( pattern, OY_SIGNAL_OBSERVERS ); if(!error) { n = oyStructList_Count( observers ); for(i = 0; i < n; ++i) { obs = (oyObserver_s*) oyStructList_GetType( observers, i, oyOBJECT_OBSERVER_S ); if(obs && (!(flags & 0x01) || obs->model == pattern)) { if(oy_debug_signals) { WARNc5_S( "\n\tCopy %s: %s[%d]->%s[%d]", _("Signal"), oyStruct_GetText( obs->model, oyNAME_NAME, 1), oyObject_GetId( obs->model->oy_), oyStruct_GetText( obs->observer, oyNAME_NAME, 1), oyObject_GetId( obs->observer->oy_) ); } error = oyStruct_ObserverAdd( (oyStruct_s*)model, obs->observer, obs->user_data, obs->signal ); } else { if(obs) { WARNc5_S( "\n\tCopy: %s: %s[%d]->%s[%d]", _("found observer of wrong type"), oyStruct_GetText( obs->model, oyNAME_NAME, 1), oyObject_GetId( obs->model->oy_), oyStruct_GetText( obs->observer, oyNAME_NAME, 1), oyObject_GetId( obs->observer->oy_) ); } else { WARNc2_S( "\n\toyObservers_s %s ",_("found no observer"), oyStruct_TypeToText((oyStruct_s*)observers) ); } } } } return error; }
/** Function oyStruct_EnableSignalSend * @memberof oyObserver_s * @brief reenable sending a signal to all ovservers of a model * * @param[in] model the model * @return 0 - no handler found; 1 - error * < 0 error or issue * * @version Oyranos: 0.1.10 * @since 2010/04/07 (Oyranos: 0.1.10) * @date 2010/04/07 */ OYAPI int OYEXPORT oyStruct_EnableSignalSend ( oyStruct_s * model ) { oyObserver_s * obs = 0; int error = !model; oyOption_s * o = 0; oyStructList_s * observers = 0; int n,i; if(!error) o = oyOptions_Find( model->oy_->handles_, OY_SIGNAL_OBSERVERS, oyNAME_REGISTRATION ); if(!o) return 0; if(!error) { observers = (oyStructList_s*)oyOption_GetStruct( o, oyOBJECT_STRUCT_LIST_S ); n = oyStructList_Count( observers ); for(i = 0; i < n; ++i) { obs = (oyObserver_s*) oyStructList_GetType( observers, i, oyOBJECT_OBSERVER_S ); if(obs) --obs->disable_ref; if(obs && obs->disable_ref < 0) { oyOption_s_ * o_ = (oyOption_s_*)o; obs->disable_ref = 0; WARNcc3_S( model, "%s: %s[%d]", _("Already enabled"), oyStruct_GetText( (oyStruct_s*)obs, oyNAME_NAME, 1), oyObject_GetId( o_->value->oy_struct->oy_ ) ); } } } return error; }
/** Function oyStruct_ObserverSignal * @memberof oyObserver_s * @brief send a signal to all ovservers of a model * * @param[in] model the model * @param[in] signal_type the basic signal type to emit * @param[in,out] signal_data the advanced signal information * @return 0 - no handler found; 1 - handler found; * < 0 error or issue * * @version Oyranos: 0.1.10 * @since 2009/10/27 (Oyranos: 0.1.10) * @date 2009/10/27 */ OYAPI int OYEXPORT oyStruct_ObserverSignal ( oyStruct_s * model, oySIGNAL_e signal_type, oyStruct_s * signal_data ) { oyObserver_s * obs = 0; int error = !model, t_err = 0; oyOption_s * o = 0; oyStructList_s * observers = 0; int n,i, result = 0; if(oyToSignalBlock_m( oyObserverGetFlags() )) return 0; if(!error) o = oyOptions_Find( model->oy_->handles_, OY_SIGNAL_OBSERVERS, oyNAME_REGISTRATION ); if(!o) return 0; if(!error) { observers = (oyStructList_s*)oyOption_GetStruct( o, oyOBJECT_STRUCT_LIST_S); n = oyStructList_Count( observers ); for(i = 0; i < n; ++i) { obs = (oyObserver_s*) oyStructList_GetType( observers, i, oyOBJECT_OBSERVER_S ); if(obs) { if(obs->model == model) { if(oy_debug_signals) { WARNc6_S( "\n\t%s %s: %s[%d]->%s[%d]", _("Signal"), oySignalToString(signal_type), oyStruct_GetText( obs->model, oyNAME_NAME, 1), oyObject_GetId( obs->model->oy_), oyStruct_GetText( obs->observer, oyNAME_NAME, 1), oyObject_GetId( obs->observer->oy_) ); } t_err = oyObserver_SignalSend( obs, signal_type, signal_data ); if(t_err) { DBG_NUM7_S( "oyObserver_SignalSend() returned %d\n\t%s %s: %s[%d]->%s[%d]", t_err, _("Signal"), oySignalToString(signal_type), oyStruct_GetText( obs->model, oyNAME_NAME, 1), oyObject_GetId( obs->model->oy_), oyStruct_GetText( obs->observer, oyNAME_NAME, 1), oyObject_GetId( obs->observer->oy_) ); } ++result; } else { WARNc6_S( "\n\t%s %s: %s[%d]->%s[%d]",_("found observer of wrong type"), oySignalToString(signal_type), oyStruct_GetText( obs->model, oyNAME_NAME, 1), oyObject_GetId( obs->model->oy_), oyStruct_GetText( obs->observer, oyNAME_NAME, 1), oyObject_GetId( obs->observer->oy_) ); } } else WARNc3_S( "\n\t%s: oyObservers_s[%s]",_("found no observer"), oySignalToString(signal_type), oyStruct_TypeToText((oyStruct_s*)observers) ); } } if(result) return result; return error; }
/** * @internal * Function oyOption_GetValueText_ * @memberof oyOption_s * @brief get value as a text dump * * @param obj the option * @param allocateFunc user allocator * @return the text * * @version Oyranos: 0.1.9 * @since 2008/12/05 (Oyranos: 0.1.9) * @date 2009/08/17 */ char * oyOption_GetValueText_( oyOption_s_ * obj, oyAlloc_f allocateFunc ) { int error = !obj; char * erg = 0; oyValue_u * v = 0; oyStructList_s * oy_struct_list = 0; char * text = 0; char * save_locale = 0; if(error <= 0) v = obj->value; if(!allocateFunc) allocateFunc = oyAllocateFunc_; error = !v; save_locale = oyStringCopy_( setlocale(LC_NUMERIC, 0 ), oyAllocateFunc_ ); setlocale(LC_NUMERIC, "C"); if(error <= 0) { int n = 1, i = 0; char * tmp = oyAllocateFunc_(1024); const char * ct = 0; switch(obj->value_type) { case oyVAL_INT_LIST: n = v->int32_list[0]; break; case oyVAL_DOUBLE_LIST: n = (int)v->dbl_list[0]; break; case oyVAL_STRING_LIST: n = 0; while( v->string_list[n] ) ++n; break; case oyVAL_INT: case oyVAL_DOUBLE: case oyVAL_STRING: case oyVAL_STRUCT: n = 1; break; case oyVAL_NONE: case oyVAL_MAX: n = 0; break; } if(obj->value_type == oyVAL_STRUCT) { oy_struct_list = (oyStructList_s*) v->oy_struct; if(oy_struct_list) { if(oy_struct_list->type_ == oyOBJECT_STRUCT_LIST_S) n = oyStructList_Count( oy_struct_list ); } else WARNc2_S( "missed \"oy_struct\" member of \"%s\" [%d]", obj->registration, oyObject_GetId(obj->oy_) ); } for(i = 0; i < n; ++i) { if(obj->value_type == oyVAL_INT) oySprintf_(tmp, "%d", v->int32); if(obj->value_type == oyVAL_DOUBLE) oySprintf_(tmp, "%g", v->dbl); if(obj->value_type == oyVAL_INT_LIST) oySprintf_(tmp, "%d", v->int32_list[i+1]); if(obj->value_type == oyVAL_DOUBLE_LIST) oySprintf_(tmp, "%g", v->dbl_list[i+1]); if((obj->value_type == oyVAL_INT_LIST || obj->value_type == oyVAL_DOUBLE_LIST) && i) STRING_ADD( text, "," ); switch(obj->value_type) { case oyVAL_INT: case oyVAL_DOUBLE: case oyVAL_INT_LIST: case oyVAL_DOUBLE_LIST: STRING_ADD( text, tmp ); break; case oyVAL_STRING: STRING_ADD( text, v->string ); break; case oyVAL_STRING_LIST: STRING_ADD( text, v->string_list[i] ); break; case oyVAL_STRUCT: case oyVAL_NONE: case oyVAL_MAX: break; } if(obj->value_type == oyVAL_STRUCT) { oyStruct_s * oy_struct = 0; if(oy_struct_list && oy_struct_list->type_ == oyOBJECT_STRUCT_LIST_S) oy_struct = oyStructList_Get_( ( oyStructList_s_*)oy_struct_list, i ); else if(v->oy_struct) oy_struct = v->oy_struct; if(oy_struct) { ct = 0; /* get explicite name */ if(oy_struct->oy_) ct = oyObject_GetName( oy_struct->oy_, oyNAME_NICK ); if(!ct) /* fall back to oyCMMapi9_s object type lookup */ ct = oyStruct_GetText( oy_struct, oyNAME_NICK, 0 ); if(ct) STRING_ADD( text, ct ); if(!ct) /* fall back to plain struct type name, if known */ STRING_ADD ( text, oyStructTypeToText(oy_struct->type_) ); } } } if(text) erg = oyStringCopy_( text, allocateFunc ); oyFree_m_( tmp ); if(!text) { DBG_NUM2_S( "missed value in \"%s\" [%d]", obj->registration, oyObject_GetId(obj->oy_) ); } else oyFree_m_( text ); } setlocale(LC_NUMERIC, save_locale); oyFree_m_( save_locale ); return erg; }