/** Function oyConfigs_FromDomain * @memberof oyConfigs_s * @brief Send a request to a configuration module * * The convention an empty options argument should be send an Warning message * containing intructions on how to talk with the module as a fallback for * programmers. Otherwise the calls are pure convention and depend on the usage * and agreement of the partners. * * For the convention to call to colour devices * @see oyX1Configs_FromPatternUsage(). * * @param[in] registration_domain the module to call to * @param[in] options options to specify the calling into modules * messages are bound to this object * @param[out] configs the returned configurations * @param[in] object a optional user object * @return 0 - good, 1 <= error, -1 >= issues, * look for messages * * @version Oyranos: 0.1.10 * @since 2009/01/16 (Oyranos: 0.1.10) * @date 2009/01/19 */ OYAPI int OYEXPORT oyConfigs_FromDomain ( const char * registration_domain, oyOptions_s * options, oyConfigs_s ** configs, oyObject_s object ) { oyConfigs_s * s = 0; oyConfig_s * config = 0; int error = !registration_domain, l_error = 0; oyCMMapi8_s_ * cmm_api8 = 0; int i, n; oyExportStart_(EXPORT_CHECK_NO); /** * 1. first we search for oyCMMapi8_s complex config support matching to our * registration_domain * 2. if we find a module, we ask for the options * 3. add the options to the config (in the module) */ if(error <= 0) { cmm_api8 = (oyCMMapi8_s_*) oyCMMsGetFilterApi_( 0, registration_domain, oyOBJECT_CMM_API8_S ); error = !cmm_api8; } if(error <= 0) error = !cmm_api8->oyConfigs_FromPattern; if(error <= 0) error = cmm_api8->oyConfigs_FromPattern( registration_domain, options, &s ); if(error <= 0) { n = oyConfigs_Count( s ); for(i = 0; i < n && error <= 0; ++i) { config = oyConfigs_Get( s, i ); l_error = oyOptions_SetSource( oyConfigPriv_m(config)->backend_core, oyOPTIONSOURCE_FILTER); OY_ERR l_error = oyOptions_SetSource( oyConfigPriv_m(config)->data, oyOPTIONSOURCE_FILTER ); OY_ERR oyConfig_Release( &config ); } } if(error <= 0 && configs) { *configs = s; s = 0; } else oyConfigs_Release( &s ); oyExportEnd_(); return error; }
/** Function oyConfigs_Modify * @memberof oyConfigs_s * @brief Ask a module for device informations or other direct calls * * * @param[in,out] configs The passed configs first member is used * to obtain a registration string and * select a appropriate module. * Regarding the module the * configs need to be homogenous. * All configs are passed at once to the * module. Mixing configs from different * modules is not defined. * @param[in] options options to pass to the module; With zero * the usage instructions are requested. * @return 0 - good, >= 1 - error, issue <= -1 * * @version Oyranos: 0.1.10 * @since 2009/08/21 (Oyranos: 0.1.10) * @date 2009/08/25 */ OYAPI int OYEXPORT oyConfigs_Modify ( oyConfigs_s * configs, oyOptions_s * options ) { int error = !oyConfigs_Count( configs ); oyConfig_s_ * config = 0; oyConfigs_s * s = configs; int i; uint32_t count = 0, * rank_list = 0; char ** texts = 0, * registration_domain = 0; oyCMMapi8_s_ * cmm_api8 = 0; if(error > 0) { WARNc_S( "\n No devices provided. Give up" ); return 0; } oyCheckType__m( oyOBJECT_CONFIGS_S, return 1 ) oyExportStart_(EXPORT_CHECK_NO); if(error <= 0) { /** 1. pick the first device to select a registration */ config = (oyConfig_s_*)oyConfigs_Get( configs, 0 ); /** 1.2 get all device class module names from the firsts oyConfig_s * registration */ error = oyConfigDomainList ( config->registration, &texts, &count, &rank_list, 0 ); oyConfig_Release( (oyConfig_s**)&config ); } /** 2. call each modules oyCMMapi8_s::oyConfigs_Modify */ for( i = 0; i < count; ++i ) { registration_domain = texts[i]; if(error <= 0) { cmm_api8 = (oyCMMapi8_s_*) oyCMMsGetFilterApi_( 0, registration_domain, oyOBJECT_CMM_API8_S ); error = !cmm_api8; } if(error <= 0) error = !cmm_api8->oyConfigs_Modify; if(error <= 0) error = cmm_api8->oyConfigs_Modify( configs, options ); } oyStringListRelease_( &texts, count, oyDeAllocateFunc_ ); if(rank_list) oyDeAllocateFunc_( rank_list ); oyExportEnd_(); return error; }
/** Function oyConfigs_FromDB * @memberof oyConfigs_s * @brief Get all oyConfigs_s from DB * * @param[in] registration the filter * @param[out] configs the found configuration list * @param[in] object a optional user object * @return error * * @version Oyranos: 0.1.10 * @since 2009/01/23 (Oyranos: 0.1.10) * @date 2010/02/25 */ OYAPI int OYEXPORT oyConfigs_FromDB ( const char * registration, oyConfigs_s ** configs, oyObject_s object ) { oyConfigs_s * s = 0; oyConfig_s_ * config = 0; oyOption_s * o = 0; char ** texts = 0, ** key_set_names = 0, ** config_key_names = 0; uint32_t count = 0, * d_rank_list = 0; int error = !registration; int i, j, k, n = 0, k_n = 0; oyCMMapi8_s_ * cmm_api8 = 0; /** 0. setup Elektra */ oyExportStart_(EXPORT_PATH | EXPORT_SETTING); if(error <= 0) { /** 1. get all module names for the registration pattern */ error = oyConfigDomainList( registration, &texts, &count, &d_rank_list, 0 ); if(count) s = oyConfigs_New( 0 ); if(error <= 0 && count && texts) cmm_api8 = (oyCMMapi8_s_*) oyCMMsGetFilterApi_( 0, texts[0], oyOBJECT_CMM_API8_S ); for(i = 0; i < count; ++i) { /** 2. obtain the directory structure for configurations */ key_set_names = oyKeySetGetNames_( texts[i], &n ); if(error <= 0) for(j = 0; j < n; ++j) { /** 3. obtain all keys from one configuration directory */ config_key_names = oyKeySetGetNames_( key_set_names[j], &k_n ); config = (oyConfig_s_*)oyConfig_New( texts[i], object ); error = !config; for(k = 0; k < k_n; ++k) { /** 4. create a oyOption_s for each Elektra DB key/value pair */ if(error <= 0) o = oyOption_FromDB( config_key_names[k], object ); error = !o; if(error <= 0) error = oyOptions_Add( config->db, o, -1, 0 ); else { WARNcc1_S( (oyStruct_s*) object, "Could not generate key %s", config_key_names[k] ); break; } oyOption_Release( &o ); } /* add information about the data's origin */ oyConfig_AddDBData( (oyConfig_s*)config, "key_set_name", key_set_names[j], OY_CREATE_NEW ); /* add a rank map to allow for comparisions */ if(cmm_api8) config->rank_map = oyRankMapCopy( cmm_api8->rank_map, config->oy_->allocateFunc_ ); oyConfigs_MoveIn( s, (oyConfig_s**)&config, -1 ); } } oyStringListRelease_( &texts, count, oyDeAllocateFunc_ ); } if(configs) *configs = s; else oyConfigs_Release( &s ); oyExportEnd_(); return error; }
/** Function oyFilterNode_Create * @memberof oyFilterNode_s * @brief Initialise a new filter node object properly * * @param registration the processing filter @ref registration string * @param filter the context filter * @param object the optional object * * @version Oyranos: 0.9.6 * @date 2014/07/01 * @since 2008/07/30 (Oyranos: 0.1.8) */ oyFilterNode_s * oyFilterNode_Create(const char * registration, oyFilterCore_s * filter, oyObject_s object ) { oyFilterNode_s_ * s = 0; int error = 0; oyAlloc_f allocateFunc_ = 0; oyFilterCore_s_ * filter_ = (oyFilterCore_s_*)filter; if(!filter) return (oyFilterNode_s*) s; s = (oyFilterNode_s_*) oyFilterNode_New( object ); error = !s; if(error <= 0) { allocateFunc_ = s->oy_->allocateFunc_; s->core = (oyFilterCore_s_*)oyFilterCore_Copy( filter, object ); if(!s->core) { WARNc2_S("Could not copy filter: %s %s", filter_->registration_, filter_->category_) error = 1; } if(error <= 0) s->api7_ = (oyCMMapi7_s_*) oyCMMsGetFilterApi_( registration, oyOBJECT_CMM_API7_S ); if(error <= 0 && !s->api7_) { WARNc2_S("Could not obtain filter api7 for: %s %s", filter_->registration_, filter_->category_) error = 1; } if(s->api7_) { s->plugs_n_ = s->api7_->plugs_n + s->api7_->plugs_last_add; if(s->api7_->plugs_last_add) --s->plugs_n_; s->sockets_n_ = s->api7_->sockets_n + s->api7_->sockets_last_add; if(s->api7_->sockets_last_add) --s->sockets_n_; } if(s->core) { int count = oyFilterNode_EdgeCount( (oyFilterNode_s*) s, 0, 0 ); size_t len; if(count < 0) count = 0; len = sizeof(oyFilterSocket_s*) * (count + 1); s->sockets = allocateFunc_( len ); memset( s->sockets, 0, len ); len = sizeof(oyFilterSocket_s*) * (oyFilterNode_EdgeCount( (oyFilterNode_s*) s, 1, 0 ) + 1); len = len?len:sizeof(oyFilterSocket_s*); s->plugs = allocateFunc_( len ); memset( s->plugs, 0, len ); s->relatives_ = allocateFunc_( oyStrlen_(filter_->category_) + 24 ); oySprintf_( s->relatives_, "%d: %s", oyObject_GetId(s->oy_), s->core->category_); } } if(error) oyFilterNode_Release( (oyFilterNode_s**) &s ); return (oyFilterNode_s*) s; }