/** * @internal * Function oyOption_Match_ * @memberof oyOption_s * @brief two option key name matches * * A registration name match is not required. * * @version Oyranos: 0.1.8 * @since 2008/06/28 (Oyranos: 0.1.8) * @date 2008/06/28 */ int oyOption_Match_ ( oyOption_s_ * option_a, oyOption_s_ * option_b ) { int erg = 0; if( option_a && option_b ) { char * a = oyFilterRegistrationToText( option_a->registration, oyFILTER_REG_TYPE, 0 ); char * b = oyFilterRegistrationToText( option_b->registration, oyFILTER_REG_TYPE, 0 ); if( oyStrcmp_( a, b ) == 0 ) erg = 1; oyDeAllocateFunc_(a); oyDeAllocateFunc_(b); } return erg; }
/** Function oyFilterNode_ConnectorMatch * @memberof oyFilterNode_s * @brief Check if a connector match to a FilterNode * * @param node_first first node * @param pos_first position of connector from first node * @param plug second connector * * @version Oyranos: 0.1.8 * @since 2008/07/29 (Oyranos: 0.1.8) * @date 2008/07/29 */ OYAPI int OYEXPORT oyFilterNode_ConnectorMatch ( oyFilterNode_s * node_first, int pos_first, oyFilterPlug_s * plug ) { int match = 0; oyConnector_s * a = 0, * b = oyFilterPlugPriv_m(plug)->pattern; char * reg = 0, * tmp = 0; if(node_first && node_first->type_ == oyOBJECT_FILTER_NODE_S && oyFilterNodePriv_m(node_first)->core) a = oyFilterNode_ShowConnector( node_first, pos_first, 0 ); if(a && b) { oyFilterSocket_s * sock_first = oyFilterNode_GetSocket( node_first, pos_first ); oyConnector_s * sock_first_pattern = oyFilterSocketPriv_m(sock_first)->pattern; match = 1; if(!oyConnectorPriv_m(b)->is_plug) match = 0; if(match) { /** Check if basic types match. */ reg = oyStringCopy_( "//", oyAllocateFunc_ ); tmp = oyFilterRegistrationToText( oyConnector_GetReg(a), oyFILTER_REG_TYPE, 0 ); STRING_ADD( reg, tmp ); if(tmp) oyFree_m_( tmp ); match = oyFilterRegistrationMatch( reg, oyConnector_GetReg(b), 0 ); if(reg) oyFree_m_(reg); } /** More detailed checking is done in oyCMMapi5_s. */ if(match && oyConnector_GetMatch(sock_first_pattern)) oyConnector_GetMatch(sock_first_pattern)( sock_first, plug ); oyFilterSocket_Release( &sock_first ); } oyConnector_Release( &a ); return match; }
char * oyFilterNode_GetFallback_( oyFilterNode_s_ * node, int select_core ) { char * fallback = NULL; oyCMMapiFilters_s * apis; int apis_n = 0, i; oyCMMapi9_s_ * cmm_api9_ = 0; char * class_name, * api_reg; oyFilterCore_s_ * core_ = node->core; const char * pattern = core_->registration_; class_name = oyFilterRegistrationToText( pattern, oyFILTER_REG_APPLICATION,0); api_reg = oyStringCopy_("///", oyAllocateFunc_ ); STRING_ADD( api_reg, class_name ); oyFree_m_( class_name ); apis = oyCMMsGetFilterApis_( api_reg, oyOBJECT_CMM_API9_S, oyFILTER_REG_MODE_STRIP_IMPLEMENTATION_ATTR, 0,0 ); oyFree_m_( api_reg ); apis_n = oyCMMapiFilters_Count( apis ); for(i = 0; i < apis_n; ++i) { cmm_api9_ = (oyCMMapi9_s_*) oyCMMapiFilters_Get( apis, i ); if(oyFilterRegistrationMatch( cmm_api9_->pattern, pattern, 0 )) { if(cmm_api9_->oyCMMGetFallback) fallback = cmm_api9_->oyCMMGetFallback( (oyFilterNode_s*)node, 0, select_core, oyAllocateFunc_ ); if(!fallback) WARNc2_S( "%s %s",_("error in module:"), cmm_api9_->registration ); } if(cmm_api9_->release) cmm_api9_->release( (oyStruct_s**)&cmm_api9_ ); } oyCMMapiFilters_Release( &apis ); return fallback; }