Changeset e38c6d8
- Timestamp:
- 2013-03-17T16:49:05Z (12 years ago)
- Children:
- 93302ef
- Parents:
- 0147ca9
- Location:
- protocols/python
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/python/src/bpython.c
r0147ca9 re38c6d8 25 25 #include <bitlbee.h> 26 26 #include <Python.h> 27 #include "bytesobject.h" 28 29 static void load_pyfile(char * path, PyObject * main_dict) { 30 FILE * pyfile; 31 PyObject * err; 32 struct prpl *ret; 33 ret = g_new0(struct prpl, 1); 34 35 printf("Loading python file %s\n", path); 36 pyfile = fopen(path, "r"); 37 /* Copy main dict to make sure that separate plugins 38 run in separate environments */ 39 PyObject * main_dict_copy = PyDict_Copy(main_dict); 40 PyRun_File(pyfile, path, Py_file_input, main_dict_copy, main_dict_copy); 41 42 PyObject * pluginname = PyDict_GetItemString(main_dict_copy, "name"); 43 if ((err = PyErr_Occurred()) || !pluginname) { 44 printf("No plugin name\n"); 45 PyErr_Print(); 46 g_free(ret); 47 return; 48 } 49 PyObject * pluginname_unicode = PyObject_Unicode(pluginname); 50 PyObject * pluginname_encoded = PyUnicode_AsEncodedString(pluginname_unicode, "ascii", "ignore"); 51 if ((err = PyErr_Occurred())) { 52 printf("Error encoding plugin name\n"); 53 PyErr_Print(); 54 g_free(ret); 55 return; 56 } 57 char * pluginname_tmp; /* reference, do not modify */ 58 Py_ssize_t length; 59 PyBytes_AsStringAndSize(pluginname_encoded, &pluginname_tmp, &length); 60 if ((err = PyErr_Occurred())) { 61 printf("Bad plugin name\n"); 62 PyErr_Print(); 63 g_free(ret); 64 return; 65 } 66 ret->name = g_malloc0(length + 1); 67 memmove(ret->name, pluginname_tmp, length); 68 69 Py_DECREF(pluginname_encoded); 70 Py_DECREF(pluginname_unicode); 71 72 register_protocol(ret); 73 } 27 74 28 75 void init_plugin() { 29 struct prpl *ret = g_new0(struct prpl, 1);30 76 GDir *dir; 31 77 GError *error = NULL; … … 53 99 54 100 if (g_str_has_suffix(path, ".py")) { 55 printf("Loading python file %s\n", path); 56 FILE* pyfile = fopen(path, "r"); 57 /* Copy main dict to make sure that separate plugins 58 run in separate environments */ 59 PyObject* main_dict_copy = PyDict_Copy(main_dict); 60 PyRun_File(pyfile, path, Py_file_input, main_dict_copy, main_dict_copy); 61 101 load_pyfile(path, main_dict); 62 102 } 63 103 … … 65 105 } 66 106 } 67 68 69 ret->name = "bpython";70 71 register_protocol(ret);72 107 73 108 // Py_Finalize(); // TODO - there's no plugin_unload for us to do this in.
Note: See TracChangeset
for help on using the changeset viewer.