diff options
Diffstat (limited to 'objects/factory.c')
| -rw-r--r-- | objects/factory.c | 326 |
1 files changed, 0 insertions, 326 deletions
diff --git a/objects/factory.c b/objects/factory.c deleted file mode 100644 index 49336e6..0000000 --- a/objects/factory.c +++ /dev/null @@ -1,326 +0,0 @@ -#include <Python.h> -#include "pyirssi.h" -#include "factory.h" - -/* Irssi object factory works for all items with at least a type member. - * - * Use py_irssi_new() or py_irssi_chat_new() to get a new wrapper for an - * IrssiObject or an IrssiChatObject, respectively. - * - * For objects not descending from IrssiObject or IrssiChatObject, you must - * use the object-specific init function directly. - */ - -#define MAKEKEY(type, chat) ((chat << 16 ) | type) -#define GETTYPE(key) (key & 0xffff) -#define GETCHAT(key) ((key >> 16) & 0xffff) - - -GHashTable *init_map = NULL; - -static int init_objects(void); -static void register_chat(CHAT_PROTOCOL_REC *rec); -static void unregister_chat(CHAT_PROTOCOL_REC *rec); -static void insert_map(int type, int chat_type, InitFunc func); -static int remove_chat(void *key, void *value, void *chat_typep); -static void register_nonchat(void); -static InitFunc find_map(int type, int chat_type); - -static int init_objects(void) -{ - if (!pyscript_init()) - return 0; - - /* order is somewhat important here */ - if (!base_objects_init()) - return 0; - - if (!window_item_object_init()) - return 0; - - if (!channel_object_init()) - return 0; - - if (!query_object_init()) - return 0; - - if (!server_object_init()) - return 0; - - if (!connect_object_init()) - return 0; - - if (!irc_server_object_init()) - return 0; - - if (!irc_connect_object_init()) - return 0; - - if (!irc_channel_object_init()) - return 0; - - if (!ban_object_init()) - return 0; - - if (!nick_object_init()) - return 0; - - if (!chatnet_object_init()) - return 0; - - if (!reconnect_object_init()) - return 0; - - if (!window_object_init()) - return 0; - - if (!textdest_object_init()) - return 0; - - if (!rawlog_object_init()) - return 0; - - if (!log_object_init()) - return 0; - - if (!logitem_object_init()) - return 0; - - if (!ignore_object_init()) - return 0; - - if (!dcc_object_init()) - return 0; - - if (!dcc_chat_object_init()) - return 0; - - if (!dcc_get_object_init()) - return 0; - - if (!dcc_send_object_init()) - return 0; - - if (!netsplit_object_init()) - return 0; - - if (!netsplit_server_object_init()) - return 0; - - if (!netsplit_channel_object_init()) - return 0; - - if (!notifylist_object_init()) - return 0; - - if (!process_object_init()) - return 0; - - if (!command_object_init()) - return 0; - - if (!theme_object_init()) - return 0; - - if (!statusbar_item_object_init()) - return 0; - - if (!main_window_object_init()) - return 0; - - return 1; -} - -static InitFunc find_map(int type, int chat_type) -{ - unsigned hash; - - g_return_val_if_fail(type <= 0xffff, NULL); - g_return_val_if_fail(chat_type <= 0xffff, NULL); - - hash = MAKEKEY(type, chat_type); - return g_hash_table_lookup(init_map, GUINT_TO_POINTER(hash)); -} - -static void insert_map(int type, int chat_type, InitFunc func) -{ - unsigned hash; - - g_return_if_fail(type <= 0xffff); - g_return_if_fail(chat_type <= 0xffff); - - hash = MAKEKEY(type, chat_type); - g_hash_table_insert(init_map, GUINT_TO_POINTER(hash), func); -} - -static void register_chat(CHAT_PROTOCOL_REC *rec) -{ - int type; - int chat_type; - int is_irc = 0; - - /* chat_type == rec->id ??? */ - chat_type = chat_protocol_lookup(rec->name); - g_return_if_fail(chat_type >= 0 && chat_type < 0xffff); - - if (!g_strcasecmp(rec->name, "IRC")) - is_irc = 1; - - type = module_get_uniq_id("SERVER", 0); - if (is_irc) - insert_map(type, chat_type, (InitFunc)pyirc_server_new); - else - insert_map(type, chat_type, (InitFunc)pyserver_new); - - type = module_get_uniq_id("SERVER CONNECT", 0); - if (is_irc) - insert_map(type, chat_type, (InitFunc)pyirc_connect_new); - else - insert_map(type, chat_type, (InitFunc)pyconnect_new); - - type = module_get_uniq_id_str("WINDOW ITEM TYPE", "CHANNEL"); - if (is_irc) - insert_map(type, chat_type, (InitFunc)pyirc_channel_new); - else - insert_map(type, chat_type, (InitFunc)pychannel_new); - - type = module_get_uniq_id_str("WINDOW ITEM TYPE", "QUERY"); - insert_map(type, chat_type, (InitFunc)pyquery_new); - - type = module_get_uniq_id("CHATNET", 0); - insert_map(type, chat_type, (InitFunc)pychatnet_new); - - type = module_get_uniq_id("NICK", 0); - insert_map(type, chat_type, (InitFunc)pynick_new); -} - -/* register funcs for objects without a chat type */ -static void register_nonchat(void) -{ - int type; - int chat_type = 0xffff; - - type = module_get_uniq_id_str("DCC", "CHAT"); - insert_map(type, chat_type, (InitFunc)pydcc_chat_new); - - type = module_get_uniq_id_str("DCC", "GET"); - insert_map(type, chat_type, (InitFunc)pydcc_get_new); - - type = module_get_uniq_id_str("DCC", "SEND"); - insert_map(type, chat_type, (InitFunc)pydcc_send_new); - - type = module_get_uniq_id_str("DCC", "SERVER"); - insert_map(type, chat_type, (InitFunc)pydcc_new); -} - -static int remove_chat(void *key, void *value, void *chat_typep) -{ - unsigned hash = GPOINTER_TO_UINT(key); - int chat_type = GPOINTER_TO_INT(chat_type); - - if (GETCHAT(hash) == chat_type) - return TRUE; - - return FALSE; -} - -/* remove all items matching chat_type */ -static void unregister_chat(CHAT_PROTOCOL_REC *rec) -{ - /*int chat_type = chat_protocol_lookup(rec->name);*/ - g_hash_table_foreach_remove(init_map, - (GHRFunc)remove_chat, - GINT_TO_POINTER(rec->id)); -} - -PyObject *py_irssi_new(void *typeobj, int managed) -{ - IRSSI_BASE_REC *base = typeobj; - InitFunc ifunc; - - if (!base) - Py_RETURN_NONE; - - ifunc = find_map(base->type, 0xffff); - - if (ifunc) - return ifunc(typeobj, managed); - - return PyErr_Format(PyExc_RuntimeError, "no initfunc for object type %d", base->type); -} - -PyObject *py_irssi_chat_new(void *typeobj, int managed) -{ - IRSSI_CHAT_REC *chat = typeobj; - InitFunc ifunc; - - if (!chat) - Py_RETURN_NONE; - - ifunc = find_map(chat->type, chat->chat_type); - - if (ifunc) - return ifunc(typeobj, managed); - - return PyErr_Format(PyExc_RuntimeError, "no initfunc for object type %d, chat_type %d", - chat->type, chat->chat_type); -} - -PyObject *py_irssi_objlist_new(GSList *node, int managed, InitFunc init) -{ - PyObject *list = NULL; - - list = PyList_New(0); - if (!list) - goto error; - - for (; node != NULL; node = node->next) - { - int ret; - PyObject *obj = init(node->data, managed); - - if (!obj) - goto error; - - ret = PyList_Append(list, obj); - Py_DECREF(obj); - - if (ret != 0) - goto error; - } - - return list; - -error: - Py_XDECREF(list); - return NULL; -} - -int factory_init(void) -{ - g_return_val_if_fail(init_map == NULL, 0); - - if (!init_objects()) - return 0; - - init_map = g_hash_table_new(g_direct_hash, g_direct_equal); - g_slist_foreach(chat_protocols, (GFunc) register_chat, NULL); - register_nonchat(); - - signal_add("chat protocol created", (SIGNAL_FUNC) register_chat); - signal_add("chat protocol destroyed", (SIGNAL_FUNC) unregister_chat); - - return 1; -} - -void factory_deinit(void) -{ - g_return_if_fail(init_map != NULL); - - g_hash_table_destroy(init_map); - init_map = NULL; - - signal_remove("chat protocol created", (SIGNAL_FUNC) register_chat); - signal_remove("chat protocol destroyed", (SIGNAL_FUNC) unregister_chat); -} - |
