static int internalnotificationRegisterCallback (Plugin * plugin, Key * key, ElektraNotificationChangeCallback callback) { size_t address = elektraPluginGetFunction (plugin, "registerCallback"); // Register key with plugin return ((ElektraNotificationPluginRegisterCallback) address) (plugin, key, callback); }
static int internalnotificationRegisterInt (Plugin * plugin, Key * key, int * variable) { size_t address = elektraPluginGetFunction (plugin, "registerInt"); // Register key with plugin return ((ElektraNotificationPluginRegisterInt) address) (plugin, key, variable); }
int elektraNotificationRegisterCallbackSameOrBelow (KDB * kdb, Key * key, ElektraNotificationChangeCallback callback, void * context) { if (!kdb || !key || !callback) { ELEKTRA_LOG_WARNING ("null pointer passed"); return 0; } // Find notification plugin Plugin * notificationPlugin = getNotificationPlugin (kdb); if (!notificationPlugin) { return 0; } // Get register function from plugin size_t func = elektraPluginGetFunction (notificationPlugin, "registerCallbackSameOrBelow"); if (!func) { return 0; } // Call register function ElektraNotificationPluginRegisterCallbackSameOrBelow registerFunc = (ElektraNotificationPluginRegisterCallbackSameOrBelow) func; return registerFunc (notificationPlugin, key, callback, context); }
int elektraNotificationSetConversionErrorCallback (KDB * kdb, ElektraNotificationConversionErrorCallback callback, void * context) { if (!kdb || !callback) { ELEKTRA_LOG_WARNING ("null pointer passed"); return 0; } // Find notification plugin Plugin * notificationPlugin = getNotificationPlugin (kdb); if (!notificationPlugin) { return 0; } // Get register function from plugin size_t func = elektraPluginGetFunction (notificationPlugin, "setConversionErrorCallback"); if (!func) { return 0; } // Call register function ElektraNotificationSetConversionErrorCallback setCallbackFunc = (ElektraNotificationSetConversionErrorCallback) func; setCallbackFunc (notificationPlugin, callback, context); return 1; }
int elektraNotificationOpen (KDB * kdb) { // Make sure kdb is not null if (!kdb) { ELEKTRA_LOG_WARNING ("kdb was not set"); return 0; } // Allow open only once if (kdb->notificationPlugin) { ELEKTRA_LOG_WARNING ("elektraNotificationOpen already called for kdb"); return 0; } Plugin * notificationPlugin = loadPlugin (kdb, "internalnotification", NULL); if (!notificationPlugin) { return 0; } int mountResult = mountGlobalPlugin (kdb, notificationPlugin); if (!mountResult) { Key * errorKey = keyNew (0); elektraPluginClose (notificationPlugin, errorKey); keyDel (errorKey); return 0; } // Create context for notification callback ElektraNotificationCallbackContext * context = elektraMalloc (sizeof (*context)); if (context == NULL) { unmountGlobalPlugin (kdb, notificationPlugin); Key * errorKey = keyNew (0); elektraPluginClose (notificationPlugin, errorKey); keyDel (errorKey); return 0; } context->kdb = kdb; context->kdbUpdate = &elektraNotificationKdbUpdate; context->notificationPlugin = notificationPlugin; // Get notification callback from notification plugin size_t func = elektraPluginGetFunction (notificationPlugin, "notificationCallback"); if (!func) { unmountGlobalPlugin (kdb, notificationPlugin); Key * errorKey = keyNew (0); elektraPluginClose (notificationPlugin, errorKey); keyDel (errorKey); return 0; } ElektraNotificationCallback notificationCallback = (ElektraNotificationCallback) func; // Open notification for plugins pluginsOpenNotification (kdb, notificationCallback, context); kdb->notificationPlugin = notificationPlugin; kdb->notificationCallbackContext = context; return 1; }