diff --git a/src/Http_Worker.c b/src/Http_Worker.c index 53ece16cf..cc89a73e6 100644 --- a/src/Http_Worker.c +++ b/src/Http_Worker.c @@ -811,7 +811,7 @@ static void Http_AddHeader(struct HttpRequest* req, const char* key, const cc_st CFRelease(valCF); } -static void Http_CheckHeader(void* k, void* v, void* ctx) { +static void Http_CheckHeader(const void* k, const void* v, void* ctx) { cc_string line; char lineBuffer[2048]; char keyBuf[128] = { 0 }; char valBuf[1024] = { 0 }; @@ -825,12 +825,27 @@ static void Http_CheckHeader(void* k, void* v, void* ctx) { ctx = NULL; } +static cc_result ParseResponseHeaders(struct HttpRequest* req, CFReadStreamRef stream) { + CFHTTPMessageRef response = CFReadStreamCopyProperty(stream, kCFStreamPropertyHTTPResponseHeader); + if (!response) return ERR_INVALID_ARGUMENT; + + CFDictionaryRef headers = CFHTTPMessageCopyAllHeaderFields(response); + CFDictionaryApplyFunction(headers, Http_CheckHeader, req); + req->statusCode = CFHTTPMessageGetResponseStatusCode(response); + + CFRelease(headers); + CFRelease(response); + return 0; +} + static cc_result HttpBackend_Do(struct HttpRequest* req, cc_string* url) { static CFStringRef verbs[] = { CFSTR("GET"), CFSTR("HEAD"), CFSTR("POST") }; - CFHTTPMessageRef request, response; + cc_bool gotHeaders = false; char tmp[NATIVE_STR_LEN]; + CFHTTPMessageRef request; CFStringRef urlCF; CFURLRef urlRef; + cc_result result = 0; Platform_EncodeUtf8(tmp, url); urlCF = CFStringCreateWithCString(NULL, tmp, kCFStringEncodingUTF8); @@ -839,6 +854,7 @@ static cc_result HttpBackend_Do(struct HttpRequest* req, cc_string* url) { request = CFHTTPMessageCreateRequest(NULL, verbs[req->requestType], urlRef, kCFHTTPVersion1_1); req->meta = request; Http_SetRequestHeaders(req); + CFRelease(urlRef); if (req->data && req->size) { CFDataRef body = CFDataCreate(NULL, req->data, req->size); @@ -854,13 +870,18 @@ static cc_result HttpBackend_Do(struct HttpRequest* req, cc_string* url) { CFReadStreamSetProperty(stream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue); //CFHTTPReadStreamSetRedirectsAutomatically(stream, TRUE); CFReadStreamOpen(stream); - CFIndex read = 0; - char buf[1024]; + UInt8 buf[1024]; for (;;) { CFIndex read = CFReadStreamRead(stream, buf, sizeof(buf)); if (read <= 0) break; + // reading headers before for loop doesn't work + if (!gotHeaders) { + gotHeaders = true; + if ((result = ParseResponseHeaders(req, stream))) break; + } + if (!req->_capacity) Http_BufferInit(req); Http_BufferEnsure(req, read); @@ -868,17 +889,11 @@ static cc_result HttpBackend_Do(struct HttpRequest* req, cc_string* url) { Http_BufferExpanded(req, read); } - response = CFReadStreamCopyProperty(stream, kCFStreamPropertyHTTPResponseHeader); - if (!response) return ERR_INVALID_ARGUMENT; /* TODO mem leak? */ + if (!gotHeaders) + result = ParseResponseHeaders(req, stream); - CFDictionaryRef headers = CFHTTPMessageCopyAllHeaderFields(response); - CFDictionaryApplyFunction(headers, Http_CheckHeader, req); - req->statusCode = CFHTTPMessageGetResponseStatusCode(response); - - CFRelease(headers); - CFRelease(response); CFRelease(request); - return 0; + return result; } #endif diff --git a/src/interop_ios.m b/src/interop_ios.m index 5a9b43311..faf43fce0 100644 --- a/src/interop_ios.m +++ b/src/interop_ios.m @@ -629,7 +629,7 @@ static void LBackend_HandleButton(id btn_obj) { btn->OnClick(btn); } -void LBackend_InitButton(struct LButton* w, int width, int height) { +void LBackend_ButtonInit(struct LButton* w, int width, int height) { UIButton* btn = [[UIButton alloc] init]; btn.frame = CGRectMake(0, 0, width, height); // TODO should be app_handle, because win_handle can change @@ -650,7 +650,7 @@ void LBackend_InitButton(struct LButton* w, int width, int height) { [btn setBackgroundImage:ToUIImage(&bmp2) forState:UIControlStateHighlighted]; } -void LBackend_UpdateButton(struct LButton* w) { +void LBackend_ButtonUpdate(struct LButton* w) { UIButton* btn = (__bridge UIButton*)w->meta; NSString* str = ToNSString(&w->text); @@ -659,21 +659,21 @@ void LBackend_UpdateButton(struct LButton* w) { } -void LBackend_DrawButton(struct LButton* w) { +void LBackend_ButtonDraw(struct LButton* w) { } /*########################################################################################################################* *-----------------------------------------------------CheckboxWidget------------------------------------------------------* *#########################################################################################################################*/ -void LBackend_InitCheckbox(struct LCheckbox* w) { +void LBackend_CheckboxInit(struct LCheckbox* w) { UISwitch* swt = [[UISwitch alloc] init]; AssignView(w, swt); UpdateWidgetDimensions(w); } -void LBackend_DrawCheckbox(struct LCheckbox* w) { +void LBackend_CheckboxDraw(struct LCheckbox* w) { } @@ -693,7 +693,7 @@ static void LBackend_HandleInput(id ipt_obj) { if (ipt->TextChanged) ipt->TextChanged(ipt); } -void LBackend_InitInput(struct LInput* w, int width) { +void LBackend_InputInit(struct LInput* w, int width) { UITextField* fld = [[UITextField alloc] init]; fld.frame = CGRectMake(0, 0, width, 30); fld.borderStyle = UITextBorderStyleBezel; @@ -716,24 +716,24 @@ void LBackend_InitInput(struct LInput* w, int width) { UpdateWidgetDimensions(w); } -void LBackend_UpdateInput(struct LInput* w) { +void LBackend_InputUpdate(struct LInput* w) { UITextField* fld = (__bridge UITextField*)w->meta; fld.text = ToNSString(&w->text); UpdateWidgetDimensions(w); } -void LBackend_DrawInput(struct LInput* w) { +void LBackend_InputDraw(struct LInput* w) { } -void LBackend_TickInput(struct LInput* w) { } -void LBackend_SelectInput(struct LInput* w, int idx, cc_bool wasSelected) { } -void LBackend_UnselectInput(struct LInput* w) { } +void LBackend_InputTick(struct LInput* w) { } +void LBackend_InputSelect(struct LInput* w, int idx, cc_bool wasSelected) { } +void LBackend_InputUnselect(struct LInput* w) { } /*########################################################################################################################* *------------------------------------------------------LabelWidget--------------------------------------------------------* *#########################################################################################################################*/ -void LBackend_InitLabel(struct LLabel* w) { +void LBackend_LabelInit(struct LLabel* w) { UILabel* lbl = [[UILabel alloc] init]; lbl.textColor = [UIColor whiteColor]; @@ -741,7 +741,7 @@ void LBackend_InitLabel(struct LLabel* w) { UpdateWidgetDimensions(w); } -void LBackend_UpdateLabel(struct LLabel* w) { +void LBackend_LabelUpdate(struct LLabel* w) { UILabel* lbl = (__bridge UILabel*)w->meta; char raw[NATIVE_STR_LEN]; Platform_EncodeUtf8(raw, &w->text); @@ -753,14 +753,14 @@ void LBackend_UpdateLabel(struct LLabel* w) { UpdateWidgetDimensions(w); } -void LBackend_DrawLabel(struct LLabel* w) { +void LBackend_LabelDraw(struct LLabel* w) { } /*########################################################################################################################* *-------------------------------------------------------LineWidget--------------------------------------------------------* *#########################################################################################################################*/ -void LBackend_InitLine(struct LLine* w, int width) { +void LBackend_LineInit(struct LLine* w, int width) { UIView* view = [[UIView alloc] init]; view.frame = CGRectMake(0, 0, width, 2); @@ -771,14 +771,14 @@ void LBackend_InitLine(struct LLine* w, int width) { UpdateWidgetDimensions(w); } -void LBackend_DrawLine(struct LLine* w) { +void LBackend_LineDraw(struct LLine* w) { } /*########################################################################################################################* *------------------------------------------------------SliderWidget-------------------------------------------------------* *#########################################################################################################################*/ -void LBackend_InitSlider(struct LSlider* w, int width, int height) { +void LBackend_SliderInit(struct LSlider* w, int width, int height) { UIProgressView* prg = [[UIProgressView alloc] init]; prg.frame = CGRectMake(0, 0, width, height); @@ -786,11 +786,30 @@ void LBackend_InitSlider(struct LSlider* w, int width, int height) { UpdateWidgetDimensions(w); } -void LBackend_UpdateSlider(struct LSlider* w) { +void LBackend_SliderUpdate(struct LSlider* w) { UIProgressView* lbl = (__bridge UIProgressView*)w->meta; lbl.progress = w->value / 100.0f; } -void LBackend_DrawSlider(struct LSlider* w) { +void LBackend_SliderDraw(struct LSlider* w) { } + + +/*########################################################################################################################* + *------------------------------------------------------TableWidget-------------------------------------------------------* + *#########################################################################################################################*/ +void LBackend_TableInit(struct LTableView* w) { + UITableView* tbl = [[UITableView alloc] init]; + tbl.frame = CGRectMake(0, 0, 200, 30); + + AssignView(w, tbl); + UpdateWidgetDimensions(w); +} + +void LBackend_TableDraw(struct LTable* w) { } +void LBackend_TableReposition(struct LTable* w) { } + +void LBackend_TableMouseDown(struct LTable* w, int idx) { } +void LBackend_TableMouseUp(struct LTable* w, int idx) { } +void LBackend_TableMouseMove(struct LTable* w, int idx) { }