/** function to generate a Person "object" from a preferences description */ static NftResult _person_from_prefs(NftPrefs *p, void **newObj, NftPrefsNode *node, void *userptr) { static size_t i; /* only fill reserved space, not more */ if(i >= sizeof(persons)/sizeof(struct Person)) return NFT_FAILURE; char *name; if(!(name = nft_prefs_node_prop_string_get(node, "name"))) { NFT_LOG(L_ERROR, "failed to get property \"name\" from prefs-node"); return NFT_FAILURE; } char *email; if(!(email = nft_prefs_node_prop_string_get(node, "email"))) { NFT_LOG(L_ERROR, "failed to get property \"email\" from prefs-node"); return NFT_FAILURE; } int age; if(!nft_prefs_node_prop_int_get(node, "age", &age)) { NFT_LOG(L_ERROR, "failed to get property \"age\" from prefs-node"); return NFT_FAILURE; } bool alive; if(!nft_prefs_node_prop_boolean_get(node, "alive", &alive)) { NFT_LOG(L_ERROR, "failed to get property \"alive\" from prefs-node"); return NFT_FAILURE; } strncpy(persons[i].name, name, sizeof(persons[i].name)); strncpy(persons[i].email, email, sizeof(persons[i].email)); persons[i].age = age; persons[i].alive = alive; /* free strings */ nft_prefs_free(name); nft_prefs_free(email); /* save pointer to new object */ *newObj = &persons[i++]; return NFT_SUCCESS; }
/** function to update a Person prefs-node from version 0 to version 1 */ NftResult _update_person(NftPrefsNode *node, unsigned int version, void *userptr) { /* get "email" property from node */ char *email; if(!(email = nft_prefs_node_prop_string_get(node, "email"))) { NFT_LOG(L_ERROR, "failed to get \"email\" property from node \"%s\"", nft_prefs_node_get_name(node)); return NFT_FAILURE; } /* function result */ NftResult result = NFT_FAILURE; /* split "email" property into "email_user" and "email_host" */ char *email_user = strtok(email, "@"); char *email_host = strtok(NULL, "@"); NFT_LOG(L_NOTICE, "Extracted email_host: \"%s\" and email_user: \"%s\"", email_user, email_host); /* add new "email_user" property to node */ if(!(nft_prefs_node_prop_string_set(node, "email_user", email_user))) { NFT_LOG(L_ERROR, "failed to set \"email_user\" property to \"%s\"", email_user); goto _up_exit; } /* add new "email_user" property to node */ if(!(nft_prefs_node_prop_string_set(node, "email_host", email_host))) { NFT_LOG(L_ERROR, "failed to set \"email_host\" property to \"%s\"", email_host); goto _up_exit; } /* remove old "email" property */ if(!(nft_prefs_node_prop_unset(node, "email"))) { NFT_LOG(L_ERROR, "failed to remove \"email\" property from node."); goto _up_exit; } result = NFT_SUCCESS; _up_exit: /* free string */ nft_prefs_free(email); return result; }
/** configure from preferences */ static NftResult _this_from_prefs( NftPrefs * prefs, void **newObj, NftPrefsNode * node, void *userptr) { /* window geometry */ gint x = 0, y = 0, width = 0, height = 0; nft_prefs_node_prop_int_get(node, "x", &x); nft_prefs_node_prop_int_get(node, "y", &y); nft_prefs_node_prop_int_get(node, "width", &width); nft_prefs_node_prop_int_get(node, "height", &height); if(width > 0 && height > 0) gtk_window_resize(GTK_WINDOW(UI("window")), width, height); if(x > 0 && y > 0) gtk_window_move(GTK_WINDOW(UI("window")), x, y); /* log visible? */ bool boolean = false; nft_prefs_node_prop_boolean_get(node, "window-visible", &boolean); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(niftyconf_ui("item_log_win")), boolean); ui_log_show(boolean); /* log level */ char *loglevel; if((loglevel = nft_prefs_node_prop_string_get(node, "loglevel"))) { nft_log_level_set(nft_log_level_from_string(loglevel)); nft_prefs_free(loglevel); } /* log flags */ nft_prefs_node_prop_boolean_get(node, "show-file", &boolean); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(UI("checkbutton_file")), boolean); nft_prefs_node_prop_boolean_get(node, "show-line", &boolean); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(UI("checkbutton_line")), boolean); nft_prefs_node_prop_boolean_get(node, "show-function", &boolean); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(UI("checkbutton_function")), boolean); return NFT_SUCCESS; }
/** * Config-to-Object function. * Creates a LedHardware model from a prefs node * @note you shouldn't call this function directly. * It's used by nft_prefs_obj_from_node() etc. */ static NftResult _prefs_to_hardware(LedPrefs * p, void **newObj, NftPrefsNode * n, void *userptr) { if(!p || !newObj || !n) NFT_LOG_NULL(NFT_FAILURE); /** initial result */ NftResult r = NFT_FAILURE; char *name = NULL; char *id = NULL; char *plugin_name = NULL; LedHardware *h = NULL; /* get hardware name */ if(! (name = nft_prefs_node_prop_string_get(n, LED_HARDWARE_PROP_NAME))) { NFT_LOG(L_ERROR, "\"hardware\" has no name"); goto _pth_end; } /* get plugin-name */ if(! (plugin_name = nft_prefs_node_prop_string_get(n, LED_HARDWARE_PROP_PLUGIN))) { NFT_LOG(L_ERROR, "\"hardware\" has no \"plugin\" type"); goto _pth_end; } /* get plugin-id */ if(!(id = nft_prefs_node_prop_string_get(n, LED_HARDWARE_PROP_ID))) { NFT_LOG(L_ERROR, "\"hardware\" has no \"id\" type"); goto _pth_end; } /* get stride */ LedCount stride; if(! (nft_prefs_node_prop_int_get (n, LED_HARDWARE_PROP_STRIDE, (int *) &stride))) { NFT_LOG(L_WARNING, "\"hardware\" has no \"stride\". Using 0 as default."); stride = 0; } /* create new hardware object */ if(!(h = led_hardware_new(name, plugin_name))) { NFT_LOG(L_ERROR, "Failed to initialize \"%s\" from \"%s\" plugin.", name, plugin_name); goto _pth_end; } /* set stride */ if(!(led_hardware_set_stride(h, stride))) { NFT_LOG(L_ERROR, "Failed to set stride (%d) of hardware \"%s\"", stride, name); goto _pth_end; } /* set id */ if(!(led_hardware_set_id(h, id))) { NFT_LOG(L_ERROR, "Failed to set ID \"%s\" of hardware \"%s\"", id, name); goto _pth_end; } /** @todo handle custom properties */ /* process child nodes */ LedPrefsNode *child; for(child = nft_prefs_node_get_first_child(n); child; child = nft_prefs_node_get_next(child)) { /* is child a tile node? */ if(led_prefs_is_tile_node(child)) { if(!led_hardware_append_tile (h, led_prefs_tile_from_node(p, child))) { NFT_LOG(L_ERROR, "Failed to add \"tile\" to \"%s\". Aborting.", name); goto _pth_end; } continue; } /* is child a chain node? */ else if(led_prefs_is_chain_node(child)) { LedChain *c; if(!(c = led_prefs_chain_from_node(p, child))) { NFT_LOG(L_ERROR, "Failed to create \"chain\" node of hardware %s", name); goto _pth_end; } if(!led_hardware_init (h, id, led_chain_get_ledcount(c), led_pixel_format_to_string(led_chain_get_format (c)))) { NFT_LOG(L_WARNING, "Failed to initialize hardware \"%s\"", name); } led_chain_destroy(c); } /* is child a plugin-property node? */ else if(strcmp (nft_prefs_node_get_name(child), LED_HARDWARE_PROPERTY_NAME) == 0) { char *name = NULL; char *type = NULL; char *value = NULL; /* get name of property */ if(! (name = nft_prefs_node_prop_string_get(child, LED_HARDWARE_PROPERTY_PROP_NAME))) { NFT_LOG(L_ERROR, "\"%s\" has no \"%s\" property", LED_HARDWARE_PROPERTY_NAME, LED_HARDWARE_PROPERTY_PROP_NAME); goto _pthp_end; } /* type of property */ if(! (type = nft_prefs_node_prop_string_get(child, LED_HARDWARE_PROPERTY_PROP_TYPE))) { NFT_LOG(L_ERROR, "\"%s\" has no \"%s\" property", LED_HARDWARE_PROPERTY_NAME, LED_HARDWARE_PROPERTY_PROP_TYPE); goto _pthp_end; } /* property value */ if(! (value = nft_prefs_node_prop_string_get(child, LED_HARDWARE_PROPERTY_PROP_VALUE))) { NFT_LOG(L_ERROR, "\"%s\" has no \"%s\" property", LED_HARDWARE_PROPERTY_NAME, LED_HARDWARE_PROPERTY_PROP_VALUE); goto _pthp_end; } /* decide about type */ switch (led_hardware_plugin_prop_type_from_string (type)) { /* int */ case LED_HW_CUSTOM_PROP_INT: { int integer; if(sscanf(value, "%32d", &integer) != 1) { NFT_LOG(L_ERROR, "Failed to parse integer from \"%s\" property (\"%s\")", LED_HARDWARE_PROPERTY_PROP_VALUE, value); goto _pthp_end; } if(!led_hardware_plugin_prop_set_int (h, name, integer)) { NFT_LOG(L_ERROR, "Failed to set \"%s\" = %d)", name, integer); goto _pthp_end; } break; } /* float */ case LED_HW_CUSTOM_PROP_FLOAT: { float f; if(sscanf(value, "%64f", &f) != 1) { NFT_LOG(L_ERROR, "Failed to parse float from \"%s\" property (\"%s\")", LED_HARDWARE_PROPERTY_PROP_VALUE, value); goto _pthp_end; } if(!led_hardware_plugin_prop_set_float (h, name, f)) { NFT_LOG(L_ERROR, "Failed to set \"%s\" = %f)", name, f); goto _pthp_end; } break; } /* string */ case LED_HW_CUSTOM_PROP_STRING: { if(!led_hardware_plugin_prop_set_string(h, name, value)) { NFT_LOG(L_ERROR, "Failed to set \"%s\" = \"%s\")", name, value); goto _pthp_end; } break; } /* huh? */ default: { NFT_LOG(L_ERROR, "Invalid plugin-property type: \"%s\"", type); break; } } _pthp_end: nft_prefs_free(name); nft_prefs_free(type); nft_prefs_free(value); continue; } else { NFT_LOG(L_WARNING, "Attempt to add \"%s\" node to hardware. Not allowed. (Ignoring node)", nft_prefs_node_get_name(child)); continue; } } /* everything pico bello */ r = NFT_SUCCESS; _pth_end: /* free strings */ nft_prefs_free(id); nft_prefs_free(plugin_name); nft_prefs_free(name); /* newly created hardware object */ *newObj = h; return r; }
/** * Config-to-Object function. * Creates a LedHardware model from a prefs node * @note you shouldn't call this function directly * It's used by nft_prefs_obj_from_node() etc. */ static NftResult _prefs_to_chain(LedPrefs * p, void **newObj, NftPrefsNode * n, void *userptr) { if(!p || !newObj) NFT_LOG_NULL(NFT_FAILURE); /* LedCount of chain */ int ledcount = 0; if(!nft_prefs_node_prop_int_get (n, LED_CHAIN_PROP_LEDCOUNT, &ledcount)) { NFT_LOG(L_WARNING, "chain has no \"%s\" property. Using %d as default.", LED_CHAIN_PROP_LEDCOUNT, ledcount); } /* new chain */ LedChain *c; /* get format of this chain */ char *format; if(!(format = nft_prefs_node_prop_string_get(n, LED_CHAIN_PROP_FORMAT))) { #define LED_CHAIN_DEFAULT_FORMAT "RGB u8" NFT_LOG(L_WARNING, "chain has no \"%s\" property. Using \"%s\" as default.", LED_CHAIN_PROP_FORMAT, LED_CHAIN_DEFAULT_FORMAT); /* new chain (with default format) */ if(!(c = led_chain_new((LedCount) ledcount, LED_CHAIN_DEFAULT_FORMAT))) { NFT_LOG(L_ERROR, "Failed to create new LedSetup object"); return NFT_FAILURE; } /* free string */ nft_prefs_free(format); } /* create new chain with given format */ else { /* new chain */ if(!(c = led_chain_new(ledcount, format))) { NFT_LOG(L_ERROR, "Failed to create new LedSetup object"); return NFT_FAILURE; } } /* free string */ nft_prefs_free(format); /* process child nodes (LEDs) */ NftPrefsNode *child; LedCount i = 0; for(child = nft_prefs_node_get_first_child(n); child; child = nft_prefs_node_get_next(child)) { /* check if node describes a Led object */ if(!led_prefs_is_led_node(child)) { NFT_LOG(L_ERROR, "\"chain\" may only contain \"%s\" children. Skipping \"%s\".", LED_LED_NAME, nft_prefs_node_get_name(child)); continue; } /* create Led from node */ Led *l = led_chain_get_nth(c, i++); if(!led_prefs_led_from_node(p, child, l)) goto _ptc_error; } /* save new chain-object to "newObj" pointer */ *newObj = c; return NFT_SUCCESS; _ptc_error: led_chain_destroy(c); return NFT_FAILURE; }