/** Function Configs_Modify * @brief oyCMMapi8_s SANE scanner manipulation * * @version Oyranos: 0.1.10 * @since 2009/01/19 (Oyranos: 0.1.10) * @date 2009/08/21 * * \todo { Test } */ int Configs_Modify(oyConfigs_s * devices, oyOptions_s * options) { oyOption_s *version_opt = NULL; oyOption_s *version_opt_dev = NULL; oyConfig_s *device = NULL; int num_devices, g_error = 0; int call_sane_exit = 0; const char *command_list = NULL, *command_properties = NULL; oyAlloc_f allocateFunc = malloc; printf(PRFX "Entering %s(). Options:\n%s", __func__, oyOptions_GetText(options, oyNAME_NICK)); /* "error handling" section */ if (!devices || !oyConfigs_Count(devices)) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ "\n " "No devices given! Options:\n%s", _DBG_ARGS_, oyOptions_GetText(options, oyNAME_NICK) ); return 1; } /* "help" call section */ if (oyOptions_FindString(options, "command", "help") || !options || !oyOptions_Count(options)) { /** oyMSG_WARN should make shure our message is visible. */ ConfigsFromPatternUsage((oyStruct_s *) options); return 0; } num_devices = oyConfigs_Count(devices); command_list = oyOptions_FindString(options, "command", "list"); command_properties = oyOptions_FindString(options, "command", "properties"); /* Now we get some options [IN], and we already have some devices with * possibly already assigned options. Those provided through the input * oyOptions_s should take presedence over ::data & ::backend_core ones. * OTOH, all device_* options have a 1-1 relationship meaning if * one changes, probably all other should. So the simplest [naive] approach * would be to ignore all device_* options [IN] that are already in device. * Except from driver_version which has a special meaning. */ /* Handle "driver_version" option [IN] */ /* Check the first device to see if a positive driver_version is provided. */ /* If not, consult the input options */ device = oyConfigs_Get(devices, 0); version_opt_dev = oyConfig_Find(device, "driver_version"); if (version_opt_dev && oyOption_GetValueInt(version_opt_dev, 0) > 0) call_sane_exit = 0; else check_driver_version(options, &version_opt, &call_sane_exit); oyConfig_Release(&device); oyOption_Release(&version_opt_dev); if (command_list) { /* "list" call section */ int i; for (i = 0; i < num_devices; ++i) { const SANE_Device *device_context = NULL; SANE_Status status = SANE_STATUS_INVAL; oyOption_s *name_opt_dev = NULL, *handle_opt_dev = NULL, *context_opt_dev = NULL; const char *sane_name = NULL, *sane_model = NULL; int error = 0; device = oyConfigs_Get(devices, i); if(oyOptions_Count(*oyConfig_GetOptions(device,"backend_core"))) printf(PRFX "Backend core:\n%s", oyOptions_GetText(*oyConfig_GetOptions(device,"backend_core"), oyNAME_NICK)); if(oyOptions_Count(*oyConfig_GetOptions(device,"data"))) printf(PRFX "Data:\n%s", oyOptions_GetText(*oyConfig_GetOptions(device,"data"), oyNAME_NICK)); /*Ignore device without a device_name*/ if (!oyOptions_FindString(*oyConfig_GetOptions(device,"backend_core"), "device_name", NULL)) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ ": %s\n", _DBG_ARGS_, "The \"device_name\" is missing from config object!"); oyConfig_Release(&device); g_error++; continue; } /*Handle "driver_version" option [OUT] */ version_opt_dev = oyConfig_Find(device, "driver_version"); if (!version_opt_dev && version_opt) oyOptions_MoveIn(*oyConfig_GetOptions(device,"backend_core"), &version_opt, -1); oyOption_Release(&version_opt_dev); /*Handle "device_context" option */ /*This is always provided by Configs_FromPattern() * [or should be alternatively by the user]. * Configs_Modify() will not scan for SANE devices * because it takes too long*/ context_opt_dev = oyConfig_Find(device, "device_context"); if (!context_opt_dev) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ ": %s\n", _DBG_ARGS_, "The \"device_context\" option is missing!"); error = g_error = 1; } if (!error) { device_context = (SANE_Device*)oyOption_GetData(context_opt_dev, NULL, allocateFunc); sane_name = device_context->name; sane_model = device_context->model; } /*Handle "oyNAME_NAME" option */ name_opt_dev = oyConfig_Find(device, "oyNAME_NAME"); if (!error && !name_opt_dev && oyOptions_Find(options, "oyNAME_NAME", oyNAME_PATTERN)) oyOptions_SetFromString(oyConfig_GetOptions(device,"backend_core"), CMM_BASE_REG OY_SLASH "oyNAME_NAME", sane_model, OY_CREATE_NEW); /*Handle "device_handle" option */ handle_opt_dev = oyConfig_Find(device, "device_handle"); if (!error && !handle_opt_dev) { oyPointer_s *handle_ptr = NULL; SANE_Handle h; status = sane_open(sane_name, &h); if (status == SANE_STATUS_GOOD) { handle_ptr = oyPointer_New(0); oyPointer_Set(handle_ptr, "SANE", "handle", (oyPointer)h, "sane_release_handle", sane_release_handle); oyOptions_MoveInStruct(oyConfig_GetOptions(device,"data"), CMM_BASE_REG OY_SLASH "device_handle", (oyStruct_s **) &handle_ptr, OY_CREATE_NEW); } else printf(PRFX "Unable to open sane device \"%s\": %s\n", sane_name, sane_strstatus(status)); } /*Create static rank_map, if not already there*/ if (!oyConfig_GetRankMap( device)) oyConfig_SetRankMap( device, _api8.rank_map ); /*Cleanup*/ oyConfig_Release(&device); oyOption_Release(&context_opt_dev); oyOption_Release(&name_opt_dev); oyOption_Release(&handle_opt_dev); } } else if (command_properties) { /* "properties" call section */ int i; /*Return a full list of scanner H/W & * SANE driver S/W color options * with the according rank map */ for (i = 0; i < num_devices; ++i) { SANE_Device *device_context = NULL; SANE_Status status = SANE_STATUS_INVAL; SANE_Handle device_handle; oyOption_s *name_opt_dev = NULL, *handle_opt_dev = NULL, *context_opt_dev = NULL; oyConfig_s *device_new = NULL; char *device_name = NULL; /* All previous device properties are considered obsolete * and a new device is created. Basic options are moved from * the old to new device */ device = oyConfigs_Get(devices, i); device_new = oyConfig_FromRegistration(CMM_BASE_REG, 0); printf(PRFX "Backend core:\n%s", oyOptions_GetText(*oyConfig_GetOptions(device,"backend_core"), oyNAME_NICK)); printf(PRFX "Data:\n%s", oyOptions_GetText(*oyConfig_GetOptions(device,"data"), oyNAME_NICK)); /*Ignore device without a device_name*/ if (!oyOptions_FindString(*oyConfig_GetOptions(device,"backend_core"), "device_name", NULL)) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ ": %s\n", _DBG_ARGS_, "The \"device_name\" is NULL, or missing from config object!"); oyConfig_Release(&device); oyConfig_Release(&device_new); g_error++; continue; } /*Handle "driver_version" option [OUT] */ if (version_opt) { oyOption_s *tmp = oyOption_Copy(version_opt, 0); oyOptions_MoveIn(*oyConfig_GetOptions(device_new,"backend_core"), &tmp, -1); } /* 1. Get the "device_name" from old device */ name_opt_dev = oyConfig_Find(device, "device_name"); device_name = oyOption_GetValueText(name_opt_dev, allocateFunc); oyOptions_MoveIn(*oyConfig_GetOptions(device_new,"backend_core"), &name_opt_dev, -1); /* 2. Get the "device_context" from old device */ /* It should be there, see "list" call above */ context_opt_dev = oyConfig_Find(device, "device_context"); if (context_opt_dev) { device_context = (SANE_Device*)oyOption_GetData(context_opt_dev, NULL, allocateFunc); if (device_context) { oyOptions_MoveIn(*oyConfig_GetOptions(device_new,"data"), &context_opt_dev, -1); } else { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ ": %s\n", _DBG_ARGS_, "The \"device_context\" is NULL!"); oyOption_Release(&context_opt_dev); g_error++; } } else { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ ": %s\n", _DBG_ARGS_, "The \"device_context\" option is missing!"); g_error++; } /* 3. Get the scanner H/W properties from old device */ /* FIXME: we only recompute them, just in case they are not in old device */ if (device_context) { DeviceInfoFromContext_(device_context, oyConfig_GetOptions(device_new,"backend_core")); } /* 4. Get the "device_handle" from old device */ /* If not there, get one from SANE */ handle_opt_dev = oyConfig_Find(device, "device_handle"); if (handle_opt_dev) { oyPointer_s * oy_struct = (oyPointer_s*)oyOption_GetStruct( handle_opt_dev, oyOBJECT_POINTER_S ); device_handle = (SANE_Handle)oyPointer_GetPointer(oy_struct); oyPointer_Release( &oy_struct ); oyOptions_MoveIn(*oyConfig_GetOptions(device_new,"data"), &handle_opt_dev, -1); } else { printf(PRFX "Opening sane device \"%s\"..", device_name); fflush(NULL); status = sane_open( device_name, &device_handle ); if (status != SANE_STATUS_GOOD) printf("[FAIL: %s]\n", sane_strstatus(status)); else printf("[OK]\n"); } if (handle_opt_dev || status == SANE_STATUS_GOOD) { /* Use the device_handle to get the device color options */ ColorInfoFromHandle(device_handle, oyConfig_GetOptions(device_new,"backend_core")); /*5. Set the rank map*/ oyConfig_SetRankMap( device_new, _api8.rank_map ); } /*Cleanup*/ /* Remove old, add new device */ oyConfig_Release(&device); oyConfigs_ReleaseAt(devices, i); oyConfigs_MoveIn(devices, &device_new, -1); /*If we had to open a SANE device, we'll have to close it*/ if (status == SANE_STATUS_GOOD) { printf(PRFX "sane_close(%s)\n", device_name); sane_close(device_handle); } free(device_context); free(device_name); } } else { /*unsupported, wrong or no command */ SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ "\n " "No supported commands in options:\n%s", _DBG_ARGS_, oyOptions_GetText(options, oyNAME_NICK) ); ConfigsFromPatternUsage((oyStruct_s *) options); g_error = 1; } /*Cleanup*/ if (call_sane_exit) { printf(PRFX "sane_exit()\n"); sane_exit(); } oyOption_Release(&version_opt); printf(PRFX "Leaving %s\n", __func__); return g_error; }
/** Function Configs_FromPattern * @brief CMM_NICK oyCMMapi8_s scanner devices * * @param[in] registration a string to compare ?????? * @param[in] options read what to do from the options object * @param[out] s Return a configuration for each device found * * @version Oyranos: 0.1.10 * @since 2009/01/19 (Oyranos: 0.1.10) * @date 2009/02/09 */ int Configs_FromPattern(const char *registration, oyOptions_s * options, oyConfigs_s ** s) { oyConfig_s *device = NULL; oyConfigs_s *devices = NULL; oyOption_s *context_opt = NULL, *handle_opt = NULL, *version_opt = NULL, *name_opt = NULL; int i, num_devices, g_error = 0, status, call_sane_exit = 0; const char *device_name = 0, *command_list = 0, *command_properties = 0; const SANE_Device **device_list = NULL; int rank; oyAlloc_f allocateFunc = malloc; printf(PRFX "Entering %s(). Options:\n%s", __func__, oyOptions_GetText(options, oyNAME_NICK)); rank = oyFilterRegistrationMatch(_api8.registration, registration, oyOBJECT_CMM_API8_S); command_list = oyOptions_FindString(options, "command", "list"); command_properties = oyOptions_FindString(options, "command", "properties"); device_name = oyOptions_FindString(options, "device_name", 0); /* "error handling" section */ if (rank == 0) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ "\n " "Registration match Failed. Options:\n%s", _DBG_ARGS_, oyOptions_GetText(options, oyNAME_NICK)); return 1; } if (s == NULL) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ "\n " "oyConfigs_s is NULL! Options:\n%s", _DBG_ARGS_, oyOptions_GetText(options, oyNAME_NICK)); return 1; } if (*s != NULL) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ "\n " "Devices struct already present! Options:\n%s", _DBG_ARGS_, oyOptions_GetText(options, oyNAME_NICK)); return 1; } if (!device_name && command_properties) { SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ "\n " "Device_name is mandatory for properties command:\n%s", _DBG_ARGS_, oyOptions_GetText(options, oyNAME_NICK)); return 1; } /* "help" call section */ if (oyOptions_FindString(options, "command", "help") || !options || !oyOptions_Count(options)) { /** oyMSG_WARN should make shure our message is visible. */ ConfigsFromPatternUsage((oyStruct_s *) options); return 0; } context_opt = oyOptions_Find(options, "device_context", oyNAME_PATTERN); handle_opt = oyOptions_Find(options, "device_handle", oyNAME_PATTERN); name_opt = oyOptions_Find(options, "oyNAME_NAME", oyNAME_PATTERN); /*Handle "driver_version" option [IN] */ check_driver_version(options, &version_opt, &call_sane_exit); devices = oyConfigs_New(0); if (command_list) { /* "list" call section */ if (device_name && /*If a user provides a device_name option,*/ !context_opt && /*and does not need the device_context data,*/ !name_opt /*or the oyNAME_NAME description*/ ) num_devices = 1; /*then we can get away without calling GetDevices()*/ else if (GetDevices(&device_list, &num_devices) != 0) { num_devices = 0; /*So that for loop will not run*/ ++g_error; } for (i = 0; i < num_devices; ++i) { int error = 0; const char *sane_name = NULL, *sane_model = NULL; if (device_list) { sane_name = device_list[i]->name; sane_model = device_list[i]->model; } else { sane_name = device_name; } /*Handle "device_name" option [IN] */ if (device_name && /*device_name is provided*/ sane_name && /*and sane_name has been retrieved*/ strcmp(device_name, sane_name) != 0) /*and they don't match,*/ continue; /*then try the next*/ device = oyConfig_FromRegistration(CMM_BASE_REG, 0); /*Handle "driver_version" option [OUT] */ if (version_opt) { oyOption_s * tmp = oyOption_Copy(version_opt, 0); oyOptions_MoveIn(*oyConfig_GetOptions(device,"backend_core"), &tmp, -1); } /*Handle "device_name" option [OUT] */ oyOptions_SetFromString(oyConfig_GetOptions(device,"backend_core"), CMM_BASE_REG OY_SLASH "device_name", sane_name, OY_CREATE_NEW); /*Handle "oyNAME_NAME" option */ if (name_opt) oyOptions_SetFromString(oyConfig_GetOptions(device,"backend_core"), CMM_BASE_REG OY_SLASH "oyNAME_NAME", sane_model, OY_CREATE_NEW); /*Handle "device_context" option */ /* SANE Backend protocol states that device_context is *always* returned * This is a slight variation: Only when GetDevices() is called will it be returned, * unless we call sane_exit*/ if (device_list && !call_sane_exit) { oyBlob_s *context_blob = oyBlob_New(NULL); oyOption_s *context_opt = oyOption_FromRegistration( CMM_BASE_REG OY_SLASH "device_context", 0); oyBlob_SetFromData(context_blob, (oyPointer) device_list[i], sizeof(SANE_Device), "sane"); oyOption_MoveInStruct(context_opt, (oyStruct_s **) & context_blob); oyOptions_MoveIn(*oyConfig_GetOptions(device,"data"), &context_opt, -1); } /*Handle "device_handle" option */ if (handle_opt && !call_sane_exit) { oyPointer_s *handle_ptr = NULL; SANE_Handle h; status = sane_open(sane_name, &h); if (status == SANE_STATUS_GOOD) { handle_ptr = oyPointer_New(0); oyPointer_Set(handle_ptr, "SANE", "handle", (oyPointer)h, "sane_release_handle", sane_release_handle); oyOptions_MoveInStruct(oyConfig_GetOptions(device,"data"), CMM_BASE_REG OY_SLASH "device_handle", (oyStruct_s **) &handle_ptr, OY_CREATE_NEW); } else printf(PRFX "Unable to open sane device \"%s\": %s\n", sane_name, sane_strstatus(status)); } oyConfig_SetRankMap( device, _api8.rank_map ); error = oyConfigs_MoveIn(devices, &device, -1); /*Cleanup*/ if (error) { oyConfig_Release(&device); ++g_error; } } *s = devices; } else if (command_properties) { /* "properties" call section */ const SANE_Device *device_context = NULL; SANE_Device *aux_context = NULL; SANE_Handle device_handle = NULL; /*Return a full list of scanner H/W & * SANE driver S/W color options * with the according rank map */ device = oyConfig_FromRegistration(CMM_BASE_REG, 0); /*Handle "driver_version" option [OUT] */ if (version_opt) { oyOption_s *tmp = oyOption_Copy(version_opt, 0); oyOptions_MoveIn(*oyConfig_GetOptions(device,"backend_core"), &tmp, -1); } /*1a. Get the "device_context"*/ if (!context_opt) { /*we'll have to get it ourselves*/ if (GetDevices(&device_list, &num_devices) == 0) { device_context = *device_list; while (device_context) { if(device_name && device_context->name && strcmp(device_name,device_context->name) == 0) break; device_context++; } if (!device_context) { printf(PRFX "device_name does not match any installed device.\n"); g_error++; } } else { g_error++; } } else { aux_context = (SANE_Device*)oyOption_GetData(context_opt, NULL, allocateFunc); device_context = aux_context; } /*1b. Use the "device_context"*/ if (device_context) DeviceInfoFromContext_(device_context, oyConfig_GetOptions(device,"backend_core")); /*2a. Get the "device_handle"*/ if (!handle_opt) { status = sane_open( device_name, &device_handle ); if (status != SANE_STATUS_GOOD) { printf(PRFX "Unable to open sane device \"%s\": %s\n", device_name, sane_strstatus(status)); g_error++; } } else { oyPointer_s * oy_struct = (oyPointer_s*) oyOption_GetStruct( handle_opt, oyOBJECT_POINTER_S ); device_handle = (SANE_Handle)oyPointer_GetPointer(oy_struct); oyPointer_Release( &oy_struct ); } if (device_handle) { /*2b. Use the "device_handle"*/ ColorInfoFromHandle(device_handle, oyConfig_GetOptions(device,"backend_core")); /*3. Set the rank map*/ oyConfig_SetRankMap( device, _api8.rank_map ); } oyConfigs_MoveIn(devices, &device, -1); /*Cleanup*/ free(aux_context); *s = devices; } else { /*unsupported, wrong or no command */ SANE_msg(oyMSG_WARN, (oyStruct_s *) options, _DBG_FORMAT_ "\n " "No supported commands in options:\n%s", _DBG_ARGS_, oyOptions_GetText(options, oyNAME_NICK) ); ConfigsFromPatternUsage((oyStruct_s *) options); g_error = 1; } /*Global Cleanup*/ if (call_sane_exit) { printf(PRFX "sane_exit()\n"); sane_exit(); } oyOption_Release(&context_opt); oyOption_Release(&handle_opt); oyOption_Release(&version_opt); oyOption_Release(&name_opt ); printf(PRFX "Leaving %s\n", __func__); return g_error; }
int main( int argc , char** argv ) { char *display_name = 0; char *monitor_profile = 0; int error = 0; /* the functional switches */ int erase = 0; int unset = 0; int list = 0; int setup = 0; int daemon = 0; char * format = 0; char * output = 0; int server = 0; int x_color_region_target = 0; int device_meta_tag = 0; char * add_meta = 0, * prof_name = 0, * module_name = 0, * new_profile_name = 0; char * device_class = 0; int list_modules = 0; int list_taxi = 0; int verbose = 0; int simple = 0; char *ptr = NULL; int x = 0, y = 0; int device_pos = -1; char *oy_display_name = NULL; oyProfile_s * prof = 0; oyConfig_s * device = 0; oyConfigs_s * devices = 0; oyOptions_s * options = 0; oyConfig_s * c = 0; oyOption_s * o = 0; size_t size = 0; const char * filename = 0; char * data = 0; uint32_t n = 0; int i; uint32_t icc_profile_flags = 0; oySCOPE_e scope = oySCOPE_USER; if(getenv(OY_DEBUG)) { int value = atoi(getenv(OY_DEBUG)); if(value > 0) oy_debug += value; } #ifdef USE_GETTEXT setlocale(LC_ALL,""); #endif oyI18NInit_(); STRING_ADD( device_class, "monitor._native" ); if(getenv("DISPLAY")) display_name = strdup(getenv("DISPLAY")); if(argc != 1) { int pos = 1; const char *wrong_arg = 0; while(pos < argc) { switch(argv[pos][0]) { case '-': for(i = 1; i < strlen(argv[pos]); ++i) switch (argv[pos][i]) { case '2': icc_profile_flags |= OY_ICC_VERSION_2; break; case '4': icc_profile_flags |= OY_ICC_VERSION_4; break; case 'e': erase = 1; monitor_profile = 0; break; case 'c': x_color_region_target = 1; monitor_profile = 0; break; case 'd': server = 1; OY_PARSE_INT_ARG( device_pos ); break; case 'f': OY_PARSE_STRING_ARG(format); monitor_profile = 0; break; case 'l': list = 1; monitor_profile = 0; break; case 'm': device_meta_tag = 1; break; case 'o': OY_PARSE_STRING_ARG(output); monitor_profile = 0; break; case 'u': unset = 1; monitor_profile = 0; break; case 'x': server = 1; OY_PARSE_INT_ARG( x ); break; case 'y': server = 1; OY_PARSE_INT_ARG( y ); break; case 'v': if(verbose) oy_debug += 1; verbose = 1; break; case 's': setup = 1; break; /* implicite -> setup */ case 'h': case '-': if(i == 1) { if(OY_IS_ARG("erase")) { erase = 1; monitor_profile = 0; i=100; break; } else if(OY_IS_ARG("unset")) { unset = 1; monitor_profile = 0; i=100; break; } else if(strcmp(&argv[pos][2],"x_color_region_target") == 0) { x_color_region_target = 1; i=100; break; } else if(OY_IS_ARG("setup")) { setup = 1; i=100; break; } else if(OY_IS_ARG("daemon")) { daemon = 1; i=100; break; } else if(OY_IS_ARG("format")) { OY_PARSE_STRING_ARG2(format, "format"); break; } else if(OY_IS_ARG("output")) { OY_PARSE_STRING_ARG2(output, "output"); break; } else if(OY_IS_ARG("add-edid")) { OY_PARSE_STRING_ARG2(add_meta,"add-edid"); break; } else if(OY_IS_ARG("name")) { OY_PARSE_STRING_ARG2(new_profile_name, "name"); break; } else if(OY_IS_ARG("profile")) { OY_PARSE_STRING_ARG2(prof_name, "profile"); break; } else if(OY_IS_ARG("display")) { const char * t=0; OY_PARSE_STRING_ARG2(t, "display"); if(t) {display_name = strdup(t);} break; } else if(OY_IS_ARG("modules")) { list_modules = 1; i=100; break; } else if(OY_IS_ARG("module")) { OY_PARSE_STRING_ARG2(module_name, "module"); break; } else if(OY_IS_ARG("list")) { list = 1; monitor_profile = 0; i=100; break; } else if(OY_IS_ARG("list-taxi")) { list_taxi = 1; i=100; break; } else if(OY_IS_ARG("path")) { simple = 2; i=100; break;} else if(OY_IS_ARG("short")) { simple = 1; i=100; break;} else if(OY_IS_ARG("verbose")) { if(verbose) {oy_debug += 1;} verbose = 1; i=100; break;} else if(OY_IS_ARG("system-wide")) { scope = oySCOPE_SYSTEM; i=100; break; } } default: printf("\n"); printf("oyranos-monitor v%d.%d.%d %s\n", OYRANOS_VERSION_A,OYRANOS_VERSION_B,OYRANOS_VERSION_C, _("is a color profile administration tool for monitors")); printf("%s:\n", _("Usage")); printf(" %s\n", _("Set new profile:")); printf(" %s [-x pos -y pos | -d number] [--system-wide] %s\n", argv[0], _("profile name")); printf("\n"); printf(" %s\n", _("Erase profile:")); printf(" %s -e [-x pos -y pos | -d number] [--system-wide]\n", argv[0]); printf("\n"); printf(" %s\n", _("Activate profiles:")); printf(" %s [-x pos -y pos | -d number]\n", argv[0]); printf("\n"); printf(" %s\n", _("List devices:")); printf(" %s -l [-x pos -y pos | -d number] [--short|--path]\n", argv[0]); /* --short argument */ printf(" --short %s\n", _("print only the file name")); /* --path argument */ printf(" --path %s\n", _("print the full file name")); printf("\n"); printf(" %s\n", _("List Taxi DB profiles for selected device:")); printf(" %s --list-taxi [-x pos -y pos | -d number]\n", argv[0]); printf("\n"); printf(" %s\n", _("List modules:")); printf(" %s --modules\n", argv[0]); printf("\n"); printf(" %s\n", _("Dump data:")); printf(" %s -f=[edid|icc|edid_icc] [-o=edid.bin] [-x pos -y pos | -d number] [-m]\n", argv[0]); printf("\n"); printf(" %s\n", _("General options:")); printf(" %s\n", _("-v verbose")); printf(" %s\n", _("--module name")); printf(" %s\n", _("-d device_position_start_from_zero")); printf("\n"); printf(_("For more informations read the man page:")); printf("\n"); printf(" man oyranos-monitor\n"); exit (0); break; } break; default: monitor_profile = argv[pos]; erase = 0; unset = 0; } if( wrong_arg ) { printf("%s %s\n", _("wrong argument to option:"), wrong_arg); exit(1); } ++pos; } if(oy_debug) fprintf( stderr, "%s\n", argv[1] ); } if(verbose) fprintf(stderr, "oyranos-monitor v%d.%d.%d %s\n", OYRANOS_VERSION_A,OYRANOS_VERSION_B,OYRANOS_VERSION_C, _("is a color profile administration tool for monitors")); #ifdef HAVE_X11 if(module_name && strstr(module_name, "oyX1")) { #endif #ifndef __APPLE__ if(!display_name) { WARNc_S( _("DISPLAY variable not set: giving up.") ); error = 1; return error; } #endif /* cut off the screen information */ if(display_name && (ptr = strchr(display_name,':')) != 0) if( (ptr = strchr(ptr, '.')) != 0 ) ptr[0] = '\000'; #ifdef HAVE_X11 } #endif /* implicite selection for the most common default case */ if(!icc_profile_flags) icc_profile_flags = oyICCProfileSelectionFlagsFromOptions( OY_CMM_STD, "//" OY_TYPE_STD "/icc_color", NULL, 0 ); #ifdef XCM_HAVE_X11 if(daemon) { Display * display = XOpenDisplay( display_name ); if(XcmColorServerCapabilities( display ) & XCM_COLOR_SERVER_MANAGEMENT) daemon = 2; XCloseDisplay( display ); } /* we rely on any color server doing X11 setup by its own and do not want to interfere */ if(daemon != 2) #endif { if(!erase && !unset && !list && !setup && !format && !add_meta && !list_modules && !list_taxi) setup = 1; if(module_name) { STRING_ADD( device_class, "."); STRING_ADD( device_class, module_name); } /* by default a given monitor profile is used to setup the major monitor */ if(monitor_profile && !server && device_pos == -1) device_pos = 0; if(device_pos != -1) { error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/command", "properties", OY_CREATE_NEW ); error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/edid", "1", OY_CREATE_NEW ); #ifdef HAVE_X11 if(module_name && strstr(module_name, "oyX1")) { #endif if(server) error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/device_name", oy_display_name, OY_CREATE_NEW ); else error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/display_name", display_name, OY_CREATE_NEW ); #ifdef HAVE_X11 } #endif error = oyOptions_SetFromInt( &options, "//" OY_TYPE_STD "/icc_profile_flags", icc_profile_flags, 0, OY_CREATE_NEW ); error = oyDevicesGet( 0, device_class, options, &devices ); n = oyConfigs_Count( devices ); if(error <= 0 && 0 <= device_pos && device_pos < n ) { c = oyConfigs_Get( devices, device_pos ); oy_display_name = strdup( oyConfig_FindString( c, "device_name", 0 )); oyConfig_Release( &c ); } else fprintf( stderr, "%s %d. %s: %d\n", _("Could not resolve device"), device_pos, _("Available devices"), n); oyConfigs_Release( &devices ); oyOptions_Release( &options ); } else if(server) oy_display_name = oyGetDisplayNameFromPosition2 ( OY_TYPE_STD, device_class, display_name, x,y, oyAllocFunc); if(list_modules) { uint32_t count = 0, * rank_list = 0; char ** texts = 0; error = oyConfigDomainList( device_class, &texts, &count, &rank_list, 0 ); for(i = 0; i < count; ++i) printf("%s\n", strstr(texts[i],"monitor.") + 8 ); return error; } if(list_taxi) { oyConfig_s * taxi_dev; int32_t * ranks; int head = 0; devices = 0; if(!oy_display_name) { fprintf(stderr, "%s\n", _("Please specify a monitor with the -d option.") ); return error; } error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/command", "properties", OY_CREATE_NEW ); error = oyDeviceGet( OY_TYPE_STD, device_class, oy_display_name, 0, &device ); oyDevicesFromTaxiDB( device, options, &devices, NULL ); n = oyConfigs_Count( devices ); if(n == 0) fprintf(stderr, "%s\n", _("Zero profiles found in Taxi ICC DB") ); ranks = calloc(sizeof(int32_t), n*2+1); for(i = 0; i < n; ++i) { taxi_dev = oyConfigs_Get( devices, i ); ranks[2*i+0] = i; error = oyConfig_Compare( device, taxi_dev, &ranks[2*i+1] ); oyConfig_Release( &taxi_dev ); } qsort( ranks, n, sizeof(int32_t)*2, compareRanks ); for(i = 0; i < n; ++i) { taxi_dev = oyConfigs_Get( devices, ranks[2*i+0] ); if(ranks[2*i+1] <= 0 && !verbose) { oyConfig_Release( &taxi_dev ); continue; } if(!head) { oyOptions_s * cs_options = 0; char * text = NULL, * report = NULL; head = 1; if(verbose) { if(x_color_region_target) { /* get XCM_ICC_COLOR_SERVER_TARGET_PROFILE_IN_X_BASE */ error = oyOptions_SetFromText( &cs_options, "//"OY_TYPE_STD"/config/icc_profile.x_color_region_target", "yes", OY_CREATE_NEW ); } error = oyDeviceGetInfo( device, oyNAME_NICK, cs_options, &text, oyAllocFunc ); oyStringAddPrintf_( &report, oyAllocFunc, oyDeAllocFunc, "\"%s\" ", text ? text : "???" ); error = oyDeviceGetInfo( device, oyNAME_NAME, cs_options, &text, oyAllocFunc ); oyStringAddPrintf_( &report, oyAllocFunc, oyDeAllocFunc, "%s", text ? text : "???" ); fprintf( stderr, "%s: %s\n", _("Taxi DB entries for device"), report ); } fprintf( stderr, "%s [%s] \"%s\"\n", _("Taxi ID"), _("match value"), _("description") ); oyOptions_Release( &cs_options ); } printf("%s/0 [%d] ", oyNoEmptyString_m_( oyConfig_FindString(taxi_dev, "TAXI_id", 0)), ranks[2*i+1]); printf("\"%s\"\n", oyNoEmptyString_m_( oyConfig_FindString(taxi_dev, "TAXI_profile_description", 0))); if(oy_debug) { char * json_text = 0; oyDeviceToJSON( taxi_dev, 0, &json_text, oyAllocateFunc_ ); fprintf(stderr, "%s\n", json_text ); oyFree_m_(json_text); } oyConfig_Release( &taxi_dev ); } oyConfig_Release( &device ); oyConfigs_Release( &devices ); oyOptions_Release( &options ); return error; } if(format && (strcmp(format,"edid") == 0 || strcmp(format,"icc") == 0 || strcmp(format,"edid_icc") == 0)) { icHeader * header = 0; char * out_name = 0; error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/command", "properties", OY_CREATE_NEW ); error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/edid", "1", OY_CREATE_NEW ); if(oy_display_name) error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/device_name", oy_display_name, OY_CREATE_NEW ); #ifdef HAVE_X11 else if(module_name && strstr(module_name, "oyX1")) #endif error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/display_name", display_name, OY_CREATE_NEW ); error = oyOptions_SetFromInt( &options, "//" OY_TYPE_STD "/icc_profile_flags", icc_profile_flags, 0, OY_CREATE_NEW ); error = oyDevicesGet( 0, device_class, options, &devices ); n = oyConfigs_Count( devices ); if(!error) { for(i = 0; i < n; ++i) { c = oyConfigs_Get( devices, i ); if(strcmp(format,"edid_icc") == 0) { o = oyConfig_Find( c, "color_matrix.from_edid." "redx_redy_greenx_greeny_bluex_bluey_whitex_whitey_gamma"); if(o) { oyOptions_s * opts = oyOptions_New(0), * result = 0; error = oyOptions_MoveIn( opts, &o, -1 ); error = oyOptions_SetFromInt( &opts, "//" OY_TYPE_STD "/icc_profile_flags", icc_profile_flags, 0, OY_CREATE_NEW ); oyOptions_Handle( "///create_profile.icc", opts,"create_profile.icc_profile.color_matrix", &result ); prof = (oyProfile_s*)oyOptions_GetType( result, -1, "icc_profile", oyOBJECT_PROFILE_S ); oyOptions_Release( &result ); } if(prof) { uint32_t model_id = 0; const char * t = 0; error = oyProfile_AddTagText( prof, icSigProfileDescriptionTag, (char*) output ? output : format ); t = oyConfig_FindString( c, "EDID_manufacturer", 0 ); if(t) error = oyProfile_AddTagText( prof, icSigDeviceMfgDescTag, t ); t = oyConfig_FindString( c, "EDID_model", 0 ); if(t) error = oyProfile_AddTagText( prof, icSigDeviceModelDescTag, t); if(device_meta_tag) { oyOptions_s * opts = 0; error = oyOptions_SetFromText( &opts, "///key_prefix_required", "EDID_.OPENICC_" , OY_CREATE_NEW ); error = oyOptions_SetFromText( oyConfig_GetOptions( c,"backend_core" ), OY_TOP_SHARED OY_SLASH OY_DOMAIN_STD OY_SLASH OY_TYPE_STD OY_SLASH "device" OY_SLASH "config.icc_profile.monitor" OY_SLASH "OPENICC_automatic_generated", "1", OY_CREATE_NEW ); error = oyOptions_SetFromText( oyConfig_GetOptions( c,"backend_core" ), OY_TOP_SHARED OY_SLASH OY_DOMAIN_STD OY_SLASH OY_TYPE_STD OY_SLASH "device" OY_SLASH "config.icc_profile.monitor" OY_SLASH "prefix", "EDID_.OPENICC_", OY_CREATE_NEW ); oyProfile_AddDevice( prof, c, opts ); oyOptions_Release( &opts ); } data = oyProfile_GetMem( prof, &size, 0, oyAllocFunc ); header = (icHeader*) data; t = oyConfig_FindString( c, "EDID_mnft", 0 ); if(t) sprintf( (char*)&header->manufacturer, "%s", t ); t = oyConfig_FindString( c, "EDID_model_id", 0 ); if(t) model_id = atoi( t ); model_id = oyValueUInt32( model_id ); memcpy( &header->model, &model_id, 4 ); oyOption_Release( &o ); } } else if(strcmp(format,"edid") == 0) { o = oyConfig_Find( c, "edid" ); data = oyOption_GetData( o, &size, oyAllocFunc ); } else if(strcmp(format,"icc") == 0) { oyOptions_s * cs_options = 0; if(x_color_region_target) { /* get XCM_ICC_COLOR_SERVER_TARGET_PROFILE_IN_X_BASE */ error = oyOptions_SetFromText( &cs_options, "//"OY_TYPE_STD"/config/icc_profile.x_color_region_target", "yes", OY_CREATE_NEW ); } oyDeviceAskProfile2( c, cs_options, &prof ); oyOptions_Release( &cs_options ); if(device_meta_tag) { oyOptions_s * opts = 0; error = oyOptions_SetFromText( &opts, "///set_device_attributes", "true", OY_CREATE_NEW ); error = oyOptions_SetFromText( &opts, "///key_prefix_required", "EDID_" , OY_CREATE_NEW ); oyProfile_AddDevice( prof, c, opts ); oyOptions_Release( &opts ); } data = oyProfile_GetMem( prof, &size, 0, oyAllocFunc ); } if(data && size) { if(output) error = oyWriteMemToFile2_( output, data, size, 0x01, &out_name, oyAllocFunc ); else fwrite( data, sizeof(char), size, stdout ); oyDeAllocFunc( data ); size = 0; } else error = 1; if(!error) { if(verbose) fprintf( stderr, " written to %s\n", out_name ); } else printf( "Could not write %d bytes to %s\n", (int)size, out_name?out_name:format); if(out_name){ oyDeAllocFunc(out_name); out_name = 0; } oyProfile_Release( &prof ); oyOption_Release( &o ); oyConfig_Release( &c ); } } else WARNc2_S("oyDevicesGet %s %d", _("found issues"),error); oyConfigs_Release( &devices ); oyOptions_Release( &options ); } else if(prof_name && add_meta) { uint32_t id[4]; oyBlob_s * edid = oyBlob_New(0); char * edid_fn = oyResolveDirFileName_(add_meta); data = oyReadFileToMem_( edid_fn, &size, oyAllocateFunc_ ); oyBlob_SetFromData( edid, data, size, "edid" ); oyFree_m_(data); prof = oyProfile_FromName( prof_name, OY_NO_CACHE_READ | icc_profile_flags, 0 ); device = 0; oyOptions_Release( &options ); error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/command", "add_meta", OY_CREATE_NEW ); error = oyOptions_MoveInStruct( &options, "//" OY_TYPE_STD "/config/icc_profile", (oyStruct_s**)&prof, OY_CREATE_NEW ); error = oyOptions_MoveInStruct( &options, "//" OY_TYPE_STD "/config/edid", (oyStruct_s**)&edid, OY_CREATE_NEW ); error = oyDeviceGet( OY_TYPE_STD, device_class, ":0.0", options, &device); if(verbose && device) { /* We need a newly opened profile, otherwise we obtaine cached modifications. */ oyProfile_s * p = oyProfile_FromName( prof_name, OY_NO_CACHE_READ | icc_profile_flags, 0 ); oyConfig_s * p_device = oyConfig_FromRegistration( oyConfig_GetRegistration( device ), 0 ); int32_t rank = 0; int old_oy_debug = oy_debug; char * json = 0; oyProfile_GetDevice( p, p_device ); if(oy_debug > 1) { error = oyDeviceToJSON( p_device, 0, &json, oyAllocateFunc_ ); fprintf(stderr, "device from profile %s:\n%s\n", prof_name, json ); oyFree_m_( json ); } if(oy_debug > 1) { error = oyDeviceToJSON( device, 0, &json, oyAllocateFunc_ ); fprintf(stderr, "device from edid %s:\n%s\n", edid_fn, json ); oyFree_m_( json ); } /*p_device->db = oyOptions_Copy( p_device->backend_core, 0 ); device->db = oyOptions_Copy( device->backend_core, 0 );*/ if(oy_debug < 2) oy_debug = 2; error = oyConfig_Compare( p_device, device, &rank ); oy_debug = old_oy_debug; fprintf(stderr, "rank of edid to previous profile %d\n", rank); } oyConfig_Release( &device ); oyFree_m_(edid_fn); prof = (oyProfile_s*)oyOptions_GetType( options, -1, "icc_profile", oyOBJECT_PROFILE_S ); oyOptions_Release( &options ); if(new_profile_name) error = oyProfile_AddTagText( prof, icSigProfileDescriptionTag, new_profile_name ); /* serialise before requesting a ICC md5 */ data = oyProfile_GetMem( prof, &size, 0, oyAllocFunc ); oyFree_m_(data); oyProfile_GetMD5( prof, OY_COMPUTE, id ); oyProfile_ToFile_( (oyProfile_s_*)prof, prof_name ); oyProfile_Release( &prof ); } if(list) { char * text = 0, * report = 0; uint32_t n = 0, i; oyOptions_s * cs_options = 0; if(x_color_region_target) { /* get XCM_ICC_COLOR_SERVER_TARGET_PROFILE_IN_X_BASE */ error = oyOptions_SetFromText( &cs_options, "//"OY_TYPE_STD"/config/icc_profile.x_color_region_target", "yes", OY_CREATE_NEW ); } error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/command", "properties", OY_CREATE_NEW ); error = oyDevicesGet( 0, device_class, options, &devices ); n = oyConfigs_Count( devices ); if(error <= 0) { const char * device_name = 0; for(i = 0; i < n; ++i) { c = oyConfigs_Get( devices, i ); device_name = oyConfig_FindString( c, "device_name", 0 ); if( oy_display_name && device_name && strcmp( oy_display_name, device_name ) != 0 ) { oyConfig_Release( &c ); device_name = 0; continue; } if(verbose) fprintf(stderr,"------------------------ %d ---------------------------\n",i); error = oyDeviceGetInfo( c, oyNAME_NICK, cs_options, &text, oyAllocFunc ); if(!simple) { oyStringAddPrintf_( &report, oyAllocFunc, oyDeAllocFunc, "%d: ", i ); oyStringAddPrintf_( &report, oyAllocFunc, oyDeAllocFunc, "\"%s\" ", text ? text : "???" ); error = oyDeviceGetInfo( c, oyNAME_NAME, cs_options, &text, oyAllocFunc ); oyStringAddPrintf_( &report, oyAllocFunc, oyDeAllocFunc, "%s%s", text ? text : "???", (i+1 == n) || device_pos != -1 ? "" : "\n" ); } else { oyDeviceAskProfile2( c, cs_options, &prof ); data = oyProfile_GetMem( prof, &size, 0, oyAllocFunc); if(size && data) oyDeAllocFunc( data ); filename = oyProfile_GetFileName( prof, -1 ); oyStringAddPrintf_( &report, oyAllocFunc, oyDeAllocFunc, "%s%s", filename ? (simple == 1)?(strrchr(filename,OY_SLASH_C) ? strrchr(filename,OY_SLASH_C)+1:filename):filename : OY_PROFILE_NONE, (i+1 == n) || device_pos != -1 ? "" : "\n" ); } if(verbose) { error = oyDeviceGetInfo( c, oyNAME_DESCRIPTION, cs_options, &text, oyAllocFunc ); fprintf( stderr,"%s\n", text ? text : "???" ); } if(text) free( text ); /* verbose adds */ if(verbose) { oyDeviceAskProfile2( c, cs_options, &prof ); data = oyProfile_GetMem( prof, &size, 0, oyAllocFunc); if(size && data) oyDeAllocFunc( data ); filename = oyProfile_GetFileName( prof, -1 ); fprintf( stderr, " server profile \"%s\" size: %d\n", filename?filename:OY_PROFILE_NONE, (int)size ); text = 0; oyDeviceProfileFromDB( c, &text, oyAllocFunc ); fprintf( stderr, " DB profile \"%s\"\n keys: %s\n", text?text:OY_PROFILE_NONE, oyConfig_FindString( c, "key_set_name", 0 ) ? oyConfig_FindString( c, "key_set_name", 0 ) : OY_PROFILE_NONE ); oyProfile_Release( &prof ); oyDeAllocFunc( text ); } oyConfig_Release( &c ); } if(report) fprintf( stdout, "%s\n", report ); oyDeAllocFunc( report ); report = 0; } else WARNc2_S("oyDevicesGet %s %d", _("found issues"),error); oyConfigs_Release( &devices ); oyOptions_Release( &cs_options ); } if(oy_display_name) /* make shure the display name is correctly including the screen number */ { error = oyDeviceGet( OY_TYPE_STD, device_class, oy_display_name, 0, &device ); error = oyOptions_SetFromInt( &options, "//" OY_TYPE_STD "/icc_profile_flags", icc_profile_flags, 0, OY_CREATE_NEW ); if(monitor_profile) { if(verbose) fprintf( stdout, "oyDeviceSetProfile()\n" ); oyDeviceSetProfile( device, scope, monitor_profile ); if(verbose) fprintf( stdout, "oyDeviceUnset()\n" ); oyDeviceUnset( device ); } else if(erase || unset) { if(verbose) fprintf( stdout, "oyDeviceUnset()\n" ); oyDeviceUnset( device ); } if(erase) { if(verbose) fprintf( stdout, "oyConfig_EraseFromDB()\n" ); oyConfig_EraseFromDB( device, scope ); } if(setup) { if(monitor_profile) error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/skip_ask_for_profile", "yes", OY_CREATE_NEW ); if(verbose) fprintf( stdout, "oyDeviceSetup()\n" ); oyDeviceSetup( device, options ); } oyConfig_Release( &device ); } else if(erase || unset || setup) { error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/command", "list", OY_CREATE_NEW ); #ifdef HAVE_X11 if(module_name && strstr(module_name, "oyX1")) #endif error = oyOptions_SetFromText( &options, "//"OY_TYPE_STD"/config/display_name", display_name, OY_CREATE_NEW ); error = oyOptions_SetFromInt( &options, "//" OY_TYPE_STD "/icc_profile_flags", icc_profile_flags, 0, OY_CREATE_NEW ); error = oyDevicesGet( 0, device_class, options, &devices ); n = oyConfigs_Count( devices ); if(!error) { for(i = 0; i < n; ++i) { device = oyConfigs_Get( devices, i ); if(erase || unset) oyDeviceUnset( device ); if(erase) oyConfig_EraseFromDB( device, scope ); if(setup) oyDeviceSetup( device, options ); oyConfig_Release( &device ); } } oyConfigs_Release( &devices ); oyOptions_Release( &options ); } } if(oy_display_name) oyDeAllocFunc(oy_display_name); #if defined(XCM_HAVE_X11) if(daemon) error = runDaemon( display_name ); #else if(daemon) fprintf( stderr, "daemon mode not supported on your OS\n" ); #endif oyFinish_( FINISH_IGNORE_I18N | FINISH_IGNORE_CACHES ); return error; }
int updateOutputConfiguration( Display * display ) { int error = 0, i, n, update = 0; oyOptions_s * options = 0; oyConfigs_s * devices = 0; oyConfig_s * device = 0, * old_device = 0; /* allow Oyranos to see modifications made to the compiz Xlib context */ XFlush( display ); /* obtain device informations, including geometry and ICC profiles from the according Oyranos module */ error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/command", "list", OY_CREATE_NEW ); if(error) WARNc2_S("%s %d", _("found issues"),error); error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/device_rectangle", "true", OY_CREATE_NEW ); if(error) WARNc2_S("%s %d", _("found issues"),error); error = oyOptions_SetFromText( &options, "//" OY_TYPE_STD "/config/edid", "refresh", OY_CREATE_NEW ); error = oyDevicesGet( OY_TYPE_STD, "monitor", options, &devices ); if(error) WARNc2_S("%s %d", _("found issues"),error); n = oyOptions_Count( options ); oyOptions_Release( &options ); n = oyConfigs_Count( devices ); /* find out if monitors have changed at all * care only about EDID's and enumeration, no dimension */ if(n != oyConfigs_Count( old_devices )) update = 1; else for(i = 0; i < n; ++i) { const char * edid, * old_edid; device = oyConfigs_Get( devices, i ); old_device = oyConfigs_Get( old_devices, i ); edid = oyOptions_FindString( *oyConfig_GetOptions(device,"backend_core"),"EDID",0 ); old_edid = oyOptions_FindString( *oyConfig_GetOptions(old_device,"backend_core"),"EDID",0 ); if(edid && old_edid && strcmp(edid,old_edid)==0) update = 0; else update = 1; oyConfig_Release( &device ); oyConfig_Release( &old_device ); if(update) break; } if(!update) goto clean_update; cleanDisplay( display, n ); for(i = 0; i < n; ++i) { device = oyConfigs_Get( devices, i ); error = getDeviceProfile( display, device, i ); if(error) WARNc2_S("%s %d", _("found issues"),error); oyConfig_Release( &device ); } clean_update: oyConfigs_Release( &old_devices ); old_devices = devices; return 0; }
int DeviceAttributes_ ( ppd_file_t * ppd, oyOptions_s * options, oyConfig_s * device, const char * ppd_file_location ) { oyOption_s * o = 0; int error = !device; oyOption_s * value3 = oyOptions_Find( options, "device_context", oyNAME_PATTERN ); const char * device_name = oyConfig_FindString( device, "device_name", 0 ); if(!error) { char * manufacturer= 0, * model=0, * serial=0, * device_settings = 0; const char * system_port = 0, * host = 0; const char * keyword = 0; ppd_attr_t * attrs = 0; int attr_n, i, j; char ** color_key_words = 0, * tmp = 0; int color_key_words_n = 0; if(!device_name && !value3 && !ppd_file_location && !ppd) { message(oyMSG_WARN, (oyStruct_s*)options, _DBG_FORMAT_ "The \"device_name\" and \"device_context\" is\n" " missed to select a appropriate device.", _DBG_ARGS_ ); error = 1; return error; } if(!ppd) { message( oyMSG_DBG, (oyStruct_s*)0, _DBG_FORMAT_ "\n" "No PPD obtained for ", _DBG_ARGS_, device_name ); error = -1; return error; } manufacturer = ppd->manufacturer; model = ppd->modelname; serial = 0; /* Not known at this time. */ system_port = device_name; host = cupsServer(); attrs = ppdFindAttr(ppd, "cupsICCProfile", 0); if(attrs && attrs->text) device_settings = attrs->text; if(error <= 0) { size_t size = 0; char * data = 0; oyConfig_s * d = device; oyRankMap * rank_map = oyRankMapCopy( oyConfig_GetRankMap( device ), oyAllocateFunc_ ); if(!rank_map) rank_map = oyRankMapCopy( _api8.rank_map, oyAllocateFunc_ ); OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), manufacturer ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), model ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), serial ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), system_port ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), host ) OPTIONS_ADD( oyConfig_GetOptions(d,"backend_core"), device_settings ) if (value3) { /* open the PPD data */ if(ppd_file_location) { FILE * fp = fopen( ppd_file_location, "r" ); size_t lsize = 0; /* Find the total size. */ fseek(fp , 0, SEEK_END); lsize = ftell(fp); rewind (fp); /* Create buffer to read contents into a profile. */ data = (char*) malloc (sizeof(char)*lsize + 1); if (data == NULL) fputs ("Unable to open PPD size.",stderr); size = fread( data, 1, lsize, fp); data[size] = 0; } if(!error && data && size) { o = oyOption_FromRegistration( CMM_BASE_REG OY_SLASH "device_context.PPD.text", 0 ); error = !o; if(!error) error = oyOption_SetFromData( o, data, size ); if(!error) oyOptions_MoveIn( *oyConfig_GetOptions(device,"data"), &o, -1 ); } } /* Collect all ColorKeyWords. */ attr_n = ppd->num_attrs; for(i = 0; i < attr_n; i++) { char key[16]; keyword = ppd->attrs[i]->name; /* we support keys beginning with ColorKeyWords, e.g. "ColorKeyWords" "ColorKeyWords" ... */ snprintf( &key[0], 16, "%s", keyword ); key[14] = 0; if (strcmp(key, "ColorKeyWords") == 0) { if( tmp && tmp[oyStrlen_(tmp) - 1] != ';' ) STRING_ADD( tmp, ";" ); STRING_ADD( tmp, ppd->attrs[i]->value ); } } if(tmp) { color_key_words = oyStringSplit( tmp, ';', &color_key_words_n, oyAllocateFunc_); oyDeAllocateFunc_( tmp ); tmp = 0; } /* add the key/value pairs to the devices backend_core options. */ for(j = 0; j < color_key_words_n; ++j) { const char * keyword = color_key_words[j], * value = NULL; ppd_choice_t * c = ppdFindMarkedChoice( ppd, keyword ); ppd_option_t * o = ppdFindOption( ppd, keyword ); char * reg_name = 0; /* take the marked choice */ if(c) value = c->choice; /* fall back to a default */ else if(o) value = o->defchoice; else /* Scan PPD attributes for matching the ColorKeyWords and */ for(i = 0; i < attr_n; i++) if(oyStrcmp_( ppd->attrs[i]->name, keyword ) == 0) value = ppd->attrs[i]->value; STRING_ADD( reg_name, CMM_BASE_REG OY_SLASH ); STRING_ADD( reg_name, keyword ); if(value) { error= oyOptions_SetFromText( oyConfig_GetOptions(d,"backend_core"), reg_name, value, OY_CREATE_NEW ); oyRankMapAppend( &rank_map, reg_name, 2, -2, 0, 0,0 ); } if(reg_name) oyDeAllocateFunc_( reg_name ); reg_name = 0; } if( color_key_words && color_key_words_n) oyStringListRelease_( &color_key_words, color_key_words_n, oyDeAllocateFunc_ ); else { ppd_option_t * o; while((o = ppdNextOption(ppd)) != 0) { const char * value = 0; char * reg_name = 0; keyword = o->keyword; STRING_ADD( reg_name, CMM_BASE_REG OY_SLASH ); STRING_ADD( reg_name, keyword ); /* take the marked choice */ for(i = 0; i < o->num_choices; ++i) if(o->choices[i].marked) { value = o->choices[i].choice; break; } if(!value) value = o->defchoice; if(value) { error = oyOptions_SetFromText( oyConfig_GetOptions(d,"backend_core"), reg_name, value, OY_CREATE_NEW ); oyRankMapAppend( &rank_map, reg_name, 2, -2, 0, 0,0 ); } if(reg_name) oyDeAllocateFunc_( reg_name ); reg_name = 0; } } oyConfig_SetRankMap( device, rank_map ); oyRankMapRelease( &rank_map, oyDeAllocateFunc_ ); }