mirror of
https://github.com/deltachat/deltachat-core.git
synced 2025-10-04 10:19:16 +02:00
do some string conversions less hackish and address one review comment on how to call the callback and return results
This commit is contained in:
parent
aab06cda70
commit
1ff06c071b
4 changed files with 56 additions and 23 deletions
|
@ -13,9 +13,10 @@ def py_dc_callback(ctx, evt, data1, data2):
|
||||||
looks up the correct event handler for the given context.
|
looks up the correct event handler for the given context.
|
||||||
"""
|
"""
|
||||||
callback = _DC_CALLBACK_MAP.get(ctx, lambda *a: 0)
|
callback = _DC_CALLBACK_MAP.get(ctx, lambda *a: 0)
|
||||||
ret = callback(ctx, evt, data1, data2)
|
try:
|
||||||
if ret is None:
|
ret = callback(ctx, evt, data1, data2)
|
||||||
return 0
|
except:
|
||||||
|
ret = 0
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -29,12 +29,31 @@ def ffibuilder():
|
||||||
'deltachat.capi',
|
'deltachat.capi',
|
||||||
"""
|
"""
|
||||||
#include <deltachat/deltachat.h>
|
#include <deltachat/deltachat.h>
|
||||||
|
const char * dupstring_helper(const char* string)
|
||||||
|
{
|
||||||
|
return strdup(string);
|
||||||
|
}
|
||||||
|
int dc_get_event_signature_types(int e)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
if (DC_EVENT_DATA1_IS_STRING(e))
|
||||||
|
result |= 1;
|
||||||
|
if (DC_EVENT_DATA2_IS_STRING(e))
|
||||||
|
result |= 2;
|
||||||
|
if (DC_EVENT_RETURNS_STRING(e))
|
||||||
|
result |= 4;
|
||||||
|
if (DC_EVENT_RETURNS_INT(e))
|
||||||
|
result |= 8;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
""",
|
""",
|
||||||
libraries=['deltachat'],
|
libraries=['deltachat'],
|
||||||
)
|
)
|
||||||
builder.cdef("""
|
builder.cdef("""
|
||||||
typedef int... time_t;
|
typedef int... time_t;
|
||||||
void free(void *ptr);
|
void free(void *ptr);
|
||||||
|
extern const char * dupstring_helper(const char* string);
|
||||||
|
extern int dc_get_event_signature_types(int);
|
||||||
""")
|
""")
|
||||||
cc = distutils.ccompiler.new_compiler(force=True)
|
cc = distutils.ccompiler.new_compiler(force=True)
|
||||||
distutils.sysconfig.customize_compiler(cc)
|
distutils.sysconfig.customize_compiler(cc)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
import deltachat
|
import deltachat
|
||||||
|
import re
|
||||||
import requests
|
import requests
|
||||||
from deltachat import capi, get_dc_event_name
|
from deltachat import capi, get_dc_event_name
|
||||||
from deltachat.capi import ffi
|
from deltachat.capi import ffi
|
||||||
|
@ -28,18 +29,30 @@ def test_cb(register_dc_callback):
|
||||||
def test_basic_events(dc_context, dc_threads, register_dc_callback, tmpdir, userpassword):
|
def test_basic_events(dc_context, dc_threads, register_dc_callback, tmpdir, userpassword):
|
||||||
q = queue.Queue()
|
q = queue.Queue()
|
||||||
def cb(dc_context, evt, data1, data2):
|
def cb(dc_context, evt, data1, data2):
|
||||||
# print (evt1, data1, data2)
|
# the following code relates to the deltachat/_build.py's helper
|
||||||
data1 = try_cast_to_string(data1)
|
# function which provides us signature info of an event call
|
||||||
data2 = try_cast_to_string(data2)
|
event_sig_types = capi.lib.dc_get_event_signature_types(evt)
|
||||||
|
if data1 and event_sig_types & 1:
|
||||||
|
data1 = ffi.string(ffi.cast('char*', data1))
|
||||||
|
if data2 and event_sig_types & 2:
|
||||||
|
data2 = ffi.string(ffi.cast('char*', data2))
|
||||||
evt_name = get_dc_event_name(evt)
|
evt_name = get_dc_event_name(evt)
|
||||||
print (evt_name, data1, data2)
|
print (evt_name, data1, data2)
|
||||||
if evt_name == "DC_EVENT_HTTP_GET":
|
if evt_name == "DC_EVENT_HTTP_GET":
|
||||||
content = read_url(data1)
|
content = read_url(data1)
|
||||||
# XXX how to give this string back to delta-core properly?
|
s = content.encode("utf-8")
|
||||||
# for now we just return nothing
|
# we need to return a pointer that the core owns
|
||||||
else:
|
dupped = capi.lib.dupstring_helper(s)
|
||||||
q.put((evt_name, data1, data2))
|
return ffi.cast('uintptr_t', dupped)
|
||||||
|
elif evt_name == "DC_EVENT_IS_OFFLINE":
|
||||||
|
return 0
|
||||||
|
elif event_sig_types & (4|8): # returning string or int means it's a sync event
|
||||||
|
print ("dropping sync event: no handler for", evt_name)
|
||||||
|
return 0
|
||||||
|
# async event
|
||||||
|
q.put((evt_name, data1, data2))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
register_dc_callback(dc_context, cb)
|
register_dc_callback(dc_context, cb)
|
||||||
|
|
||||||
dbfile = tmpdir.join("test.db")
|
dbfile = tmpdir.join("test.db")
|
||||||
|
@ -48,25 +61,25 @@ def test_basic_events(dc_context, dc_threads, register_dc_callback, tmpdir, user
|
||||||
capi.lib.dc_set_config(dc_context, "mail_pw", userpassword[1])
|
capi.lib.dc_set_config(dc_context, "mail_pw", userpassword[1])
|
||||||
capi.lib.dc_configure(dc_context)
|
capi.lib.dc_configure(dc_context)
|
||||||
|
|
||||||
while 1:
|
imap_ok = smtp_ok = False
|
||||||
evt_name, data1, data2 = q.get(timeout=2.0)
|
while not imap_ok or not smtp_ok:
|
||||||
|
evt_name, data1, data2 = q.get(timeout=5.0)
|
||||||
if evt_name == "DC_EVENT_ERROR":
|
if evt_name == "DC_EVENT_ERROR":
|
||||||
assert 0
|
assert 0
|
||||||
# XXX look for successful termination once we make things pass
|
if evt_name == "DC_EVENT_INFO":
|
||||||
|
if re.match("imap-login.*ok.", data2.lower()):
|
||||||
|
imap_ok = True
|
||||||
|
if re.match("smtp-login.*ok.", data2.lower()):
|
||||||
|
smtp_ok = True
|
||||||
|
assert 0
|
||||||
|
# assert capi.lib.dc_imap_is_connected(dc_context)
|
||||||
|
# assert capi.lib.dc_smtp_is_connected(dc_context)
|
||||||
|
|
||||||
|
|
||||||
def read_url(url):
|
def read_url(url):
|
||||||
try:
|
try:
|
||||||
r = requests.get(url)
|
r = requests.get(url)
|
||||||
except requests.ConnectionError:
|
except requests.ConnectionError:
|
||||||
pass
|
return ''
|
||||||
else:
|
else:
|
||||||
return r.content
|
return r.content
|
||||||
|
|
||||||
|
|
||||||
def try_cast_to_string(obj):
|
|
||||||
if isinstance(obj, long):
|
|
||||||
if obj > 100000:
|
|
||||||
return ffi.string(ffi.cast('char*', obj))
|
|
||||||
# print ("failed to convert", repr(obj))
|
|
||||||
return obj
|
|
||||||
|
|
|
@ -911,7 +911,7 @@ time_t dc_lot_get_timestamp (const dc_lot_t*);
|
||||||
|
|
||||||
#define DC_EVENT_DATA1_IS_STRING(e) ((e)==DC_EVENT_HTTP_GET || (e)==DC_EVENT_IMEX_FILE_WRITTEN || (e)==DC_EVENT_FILE_COPIED)
|
#define DC_EVENT_DATA1_IS_STRING(e) ((e)==DC_EVENT_HTTP_GET || (e)==DC_EVENT_IMEX_FILE_WRITTEN || (e)==DC_EVENT_FILE_COPIED)
|
||||||
#define DC_EVENT_DATA2_IS_STRING(e) ((e)==DC_EVENT_INFO || (e)==DC_EVENT_WARNING || (e)==DC_EVENT_ERROR)
|
#define DC_EVENT_DATA2_IS_STRING(e) ((e)==DC_EVENT_INFO || (e)==DC_EVENT_WARNING || (e)==DC_EVENT_ERROR)
|
||||||
#define DC_EVENT_RETURNS_INT ((e)==DC_EVENT_IS_OFFLINE)
|
#define DC_EVENT_RETURNS_INT(e) ((e)==DC_EVENT_IS_OFFLINE)
|
||||||
#define DC_EVENT_RETURNS_STRING(e) ((e)==DC_EVENT_GET_QUANTITY_STRING || (e)==DC_EVENT_GET_STRING || (e)==DC_EVENT_HTTP_GET)
|
#define DC_EVENT_RETURNS_STRING(e) ((e)==DC_EVENT_GET_QUANTITY_STRING || (e)==DC_EVENT_GET_STRING || (e)==DC_EVENT_HTTP_GET)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue