Skip to content

Commit 8d6d8f3

Browse files
committed
Can now pass in a callable as a callback - this will allow closures to work
1 parent 6072490 commit 8d6d8f3

File tree

1 file changed

+60
-28
lines changed

1 file changed

+60
-28
lines changed

context.c

Lines changed: 60 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,15 +1114,15 @@ context_general(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
11141114
getdns_return_t ret;
11151115
void *userarg = 0;
11161116
getdns_transaction_t tid = 0;
1117-
char *callback = 0;
1117+
PyObject *callback = 0;
11181118
struct getdns_dict *resp;
11191119
PyObject *callback_func;
11201120

11211121
if ((context = PyCapsule_GetPointer(self->py_context, "context")) == NULL) {
11221122
PyErr_SetString(getdns_error, GETDNS_RETURN_BAD_CONTEXT_TEXT);
11231123
return NULL;
11241124
}
1125-
if (!PyArg_ParseTupleAndKeywords(args, keywds, "sH|OsLs", kwlist,
1125+
if (!PyArg_ParseTupleAndKeywords(args, keywds, "sH|OsLO", kwlist,
11261126
&name, &request_type,
11271127
&extensions_obj, &userarg, &tid, &callback)) {
11281128
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
@@ -1154,13 +1154,21 @@ context_general(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
11541154
}
11551155
if (userarg)
11561156
strncpy(blob->userarg, userarg, BUFSIZ-1);
1157-
if ((callback_func = get_callback("__main__", callback)) == (PyObject *)NULL) {
1158-
PyObject *err_type, *err_value, *err_traceback;
1159-
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1160-
PyErr_Restore(err_type, err_value, err_traceback);
1157+
if (PyString_Check(callback)) {
1158+
if ((callback_func = get_callback("__main__", PyString_AsString(callback))) == (PyObject *)NULL) {
1159+
PyObject *err_type, *err_value, *err_traceback;
1160+
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1161+
PyErr_Restore(err_type, err_value, err_traceback);
1162+
return NULL;
1163+
}
1164+
blob->callback_func = callback_func;
1165+
} else if (PyCallable_Check(callback)) {
1166+
blob->callback_func = callback;
1167+
} else {
1168+
PyErr_SetString(getdns_error, "Invalid callback value");
11611169
return NULL;
11621170
}
1163-
blob->callback_func = callback_func;
1171+
11641172
if ((ret = getdns_general(context, name, request_type,
11651173
extensions_dict, (void *)blob, &tid, callback_shim)) !=
11661174
GETDNS_RETURN_GOOD) {
@@ -1202,14 +1210,14 @@ context_address(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
12021210
struct getdns_dict *extensions_dict = 0;
12031211
char *userarg = 0;
12041212
getdns_transaction_t tid;
1205-
char *callback = 0;
1213+
PyObject *callback = 0;
12061214
struct getdns_dict *resp;
12071215

12081216
if ((context = PyCapsule_GetPointer(self->py_context, "context")) == NULL) {
12091217
PyErr_SetString(getdns_error, GETDNS_RETURN_BAD_CONTEXT_TEXT);
12101218
return NULL;
12111219
}
1212-
if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|OsLs", kwlist,
1220+
if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|OsLO", kwlist,
12131221
&name,
12141222
&extensions_obj, &userarg, &tid, &callback)) {
12151223
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
@@ -1244,13 +1252,21 @@ context_address(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
12441252
} else {
12451253
blob->userarg[0] = 0;
12461254
}
1247-
if ((callback_func = get_callback("__main__", callback)) == (PyObject *)NULL) {
1248-
PyObject *err_type, *err_value, *err_traceback;
1249-
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1250-
PyErr_Restore(err_type, err_value, err_traceback);
1255+
if (PyString_Check(callback)) {
1256+
if ((callback_func = get_callback("__main__", PyString_AsString(callback))) == (PyObject *)NULL) {
1257+
PyObject *err_type, *err_value, *err_traceback;
1258+
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1259+
PyErr_Restore(err_type, err_value, err_traceback);
1260+
return NULL;
1261+
}
1262+
blob->callback_func = callback_func;
1263+
} else if (PyCallable_Check(callback)) {
1264+
blob->callback_func = callback;
1265+
} else {
1266+
PyErr_SetString(getdns_error, "Invalid callback value");
12511267
return NULL;
12521268
}
1253-
blob->callback_func = callback_func;
1269+
12541270
if ((ret = getdns_address(context, name, extensions_dict, (void *)blob, &tid, callback_shim)) !=
12551271
GETDNS_RETURN_GOOD) {
12561272
PyErr_SetString(getdns_error, getdns_get_errorstr_by_id(ret));
@@ -1287,7 +1303,7 @@ context_hostname(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
12871303
struct getdns_dict *extensions_dict = 0;
12881304
void *userarg = 0;
12891305
getdns_transaction_t tid;
1290-
char * callback = 0;
1306+
PyObject* callback = 0;
12911307
struct getdns_dict *resp;
12921308
getdns_context *context;
12931309
struct getdns_dict *addr_dict;
@@ -1298,7 +1314,7 @@ context_hostname(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
12981314
PyErr_SetString(getdns_error, GETDNS_RETURN_BAD_CONTEXT_TEXT);
12991315
return NULL;
13001316
}
1301-
if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|OsLs", kwlist,
1317+
if (!PyArg_ParseTupleAndKeywords(args, keywds, "O|OsLO", kwlist,
13021318
&address,
13031319
&extensions_obj, &userarg, &tid, &callback)) {
13041320
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
@@ -1339,13 +1355,21 @@ context_hostname(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
13391355
} else {
13401356
blob->userarg[0] = 0;
13411357
}
1342-
if ((callback_func = get_callback("__main__", callback)) == (PyObject *)NULL) {
1343-
PyObject *err_type, *err_value, *err_traceback;
1344-
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1345-
PyErr_Restore(err_type, err_value, err_traceback);
1358+
if (PyString_Check(callback)) {
1359+
if ((callback_func = get_callback("__main__", PyString_AsString(callback))) == (PyObject *)NULL) {
1360+
PyObject *err_type, *err_value, *err_traceback;
1361+
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1362+
PyErr_Restore(err_type, err_value, err_traceback);
1363+
return NULL;
1364+
}
1365+
blob->callback_func = callback_func;
1366+
} else if (PyCallable_Check(callback)) {
1367+
blob->callback_func = callback;
1368+
} else {
1369+
PyErr_SetString(getdns_error, "Invalid callback value");
13461370
return NULL;
13471371
}
1348-
blob->callback_func = callback_func;
1372+
13491373
if ((ret = getdns_hostname(context, addr_dict, extensions_dict, (void *)blob, &tid, callback_shim)) !=
13501374
GETDNS_RETURN_GOOD) {
13511375
PyErr_SetString(getdns_error, getdns_get_errorstr_by_id(ret));
@@ -1383,7 +1407,7 @@ context_service(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
13831407
getdns_return_t ret;
13841408
void *userarg;
13851409
getdns_transaction_t tid;
1386-
char *callback = 0;
1410+
PyObject *callback = 0;
13871411
struct getdns_dict *resp;
13881412
getdns_context *context;
13891413
PyObject *callback_func;
@@ -1392,7 +1416,7 @@ context_service(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
13921416
PyErr_SetString(getdns_error, GETDNS_RETURN_BAD_CONTEXT_TEXT);
13931417
return NULL;
13941418
}
1395-
if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|OsLs", kwlist,
1419+
if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|OsLO", kwlist,
13961420
&name,
13971421
&extensions_obj, &userarg, &tid, &callback)) {
13981422
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
@@ -1427,13 +1451,21 @@ context_service(getdns_ContextObject *self, PyObject *args, PyObject *keywds)
14271451
} else {
14281452
blob->userarg[0] = 0;
14291453
}
1430-
if ((callback_func = get_callback("__main__", callback)) == (PyObject *)NULL) {
1431-
PyObject *err_type, *err_value, *err_traceback;
1432-
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1433-
PyErr_Restore(err_type, err_value, err_traceback);
1454+
if (PyString_Check(callback)) {
1455+
if ((callback_func = get_callback("__main__", PyString_AsString(callback))) == (PyObject *)NULL) {
1456+
PyObject *err_type, *err_value, *err_traceback;
1457+
PyErr_Fetch(&err_type, &err_value, &err_traceback);
1458+
PyErr_Restore(err_type, err_value, err_traceback);
1459+
return NULL;
1460+
}
1461+
blob->callback_func = callback_func;
1462+
} else if (PyCallable_Check(callback)) {
1463+
blob->callback_func = callback;
1464+
} else {
1465+
PyErr_SetString(getdns_error, "Invalid callback value");
14341466
return NULL;
14351467
}
1436-
blob->callback_func = callback_func;
1468+
14371469
if ((ret = getdns_service(context, name, extensions_dict, (void *)blob, &tid, callback_shim)) !=
14381470
GETDNS_RETURN_GOOD) {
14391471
PyErr_SetString(getdns_error, getdns_get_errorstr_by_id(ret));

0 commit comments

Comments
 (0)