HRESULT attach_event(event_target_t **event_target_ptr, HTMLDocument *doc, BSTR name, IDispatch *disp, VARIANT_BOOL *res) { event_target_t *event_target; eventid_t eid; DWORD i = 0; eid = attr_to_eid(name); if(eid == EVENTID_LAST) { WARN("Unknown event\n"); *res = VARIANT_TRUE; return S_OK; } event_target = get_event_target(event_target_ptr); if(!event_target) return E_OUTOFMEMORY; if(event_target->event_table[eid]) { while(i < event_target->event_table[eid]->handler_cnt && event_target->event_table[eid]->handlers[i]) i++; if(i == event_target->event_table[eid]->handler_cnt && !alloc_handler_vector(event_target, eid, i+1)) return E_OUTOFMEMORY; }else if(!alloc_handler_vector(event_target, eid, i+1)) { return E_OUTOFMEMORY; } IDispatch_AddRef(disp); event_target->event_table[eid]->handlers[i] = disp; *res = VARIANT_TRUE; return ensure_nsevent_handler(doc->doc_node, event_target, eid); }
HRESULT detach_event(event_target_t *event_target, HTMLDocument *doc, BSTR name, IDispatch *disp) { eventid_t eid; DWORD i = 0; if(!event_target) return S_OK; eid = attr_to_eid(name); if(eid == EVENTID_LAST) { WARN("Unknown event\n"); return S_OK; } if(!event_target->event_table[eid]) return S_OK; while(i < event_target->event_table[eid]->handler_cnt) { if(event_target->event_table[eid]->handlers[i] == disp) { IDispatch_Release(event_target->event_table[eid]->handlers[i]); event_target->event_table[eid]->handlers[i] = NULL; } i++; } return S_OK; }
HRESULT detach_event(EventTarget *event_target, BSTR name, IDispatch *disp) { event_target_t *data; eventid_t eid; DWORD i = 0; eid = attr_to_eid(name); if(eid == EVENTID_LAST) { WARN("Unknown event\n"); return S_OK; } data = get_event_target_data(event_target, FALSE); if(!data) return S_OK; if(!data->event_table[eid]) return S_OK; while(i < data->event_table[eid]->handler_cnt) { if(data->event_table[eid]->handlers[i] == disp) { IDispatch_Release(data->event_table[eid]->handlers[i]); data->event_table[eid]->handlers[i] = NULL; } i++; } return S_OK; }
HRESULT attach_event(EventTarget *event_target, BSTR name, IDispatch *disp, VARIANT_BOOL *res) { event_target_t *data; eventid_t eid; DWORD i = 0; eid = attr_to_eid(name); if(eid == EVENTID_LAST) { WARN("Unknown event\n"); *res = VARIANT_TRUE; return S_OK; } data = get_event_target_data(event_target, TRUE); if(!data) return E_OUTOFMEMORY; if(data->event_table[eid]) { while(i < data->event_table[eid]->handler_cnt && data->event_table[eid]->handlers[i]) i++; if(i == data->event_table[eid]->handler_cnt && !alloc_handler_vector(data, eid, i+1)) return E_OUTOFMEMORY; }else if(!alloc_handler_vector(data, eid, i+1)) { return E_OUTOFMEMORY; } IDispatch_AddRef(disp); data->event_table[eid]->handlers[i] = disp; bind_event(event_target, eid); *res = VARIANT_TRUE; return S_OK; }
HRESULT dispatch_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *event_var, VARIANT_BOOL *cancelled) { HTMLEventObj *event_obj = NULL; eventid_t eid; HRESULT hres; eid = attr_to_eid(event_name); if(eid == EVENTID_LAST) { WARN("unknown event %s\n", debugstr_w(event_name)); return E_INVALIDARG; } if(event_var && V_VT(event_var) != VT_EMPTY && V_VT(event_var) != VT_ERROR) { if(V_VT(event_var) != VT_DISPATCH) { FIXME("event_var %s not supported\n", debugstr_variant(event_var)); return E_NOTIMPL; } if(V_DISPATCH(event_var)) { IHTMLEventObj *event_iface; hres = IDispatch_QueryInterface(V_DISPATCH(event_var), &IID_IHTMLEventObj, (void**)&event_iface); if(FAILED(hres)) { FIXME("No IHTMLEventObj iface\n"); return hres; } event_obj = unsafe_impl_from_IHTMLEventObj(event_iface); if(!event_obj) { ERR("Not our IHTMLEventObj?\n"); IHTMLEventObj_Release(event_iface); return E_FAIL; } } } if(event_obj) { hres = set_event_info(event_obj, node, eid, NULL); if(SUCCEEDED(hres)) fire_event_obj(node->doc, eid, event_obj, node->nsnode, NULL); IHTMLEventObj_Release(&event_obj->IHTMLEventObj_iface); if(FAILED(hres)) return hres; }else { if(!(event_info[eid].flags & EVENT_DEFAULTLISTENER)) { FIXME("not EVENT_DEFAULTEVENTHANDLER\n"); return E_NOTIMPL; } fire_event(node->doc, eid, TRUE, node->nsnode, NULL, NULL); } *cancelled = VARIANT_TRUE; /* FIXME */ return S_OK; }
void bind_node_event(HTMLDocumentNode *doc, event_target_t **event_target, HTMLDOMNode *node, const WCHAR *event, IDispatch *disp) { eventid_t eid; TRACE("(%p %p %p %s %p)\n", doc, event_target, node, debugstr_w(event), disp); eid = attr_to_eid(event); if(eid == EVENTID_LAST) { WARN("Unsupported event %s\n", debugstr_w(event)); return; } set_event_handler_disp(event_target, doc, eid, disp); }
void bind_elem_event(HTMLDocumentNode *doc, HTMLElement *elem, const WCHAR *event, IDispatch *disp) { eventid_t eid; TRACE("(%p %p %s %p)\n", doc, elem, debugstr_w(event), disp); eid = attr_to_eid(event); if(eid == EVENTID_LAST) { WARN("Unsupported event %s\n", debugstr_w(event)); return; } set_event_handler_disp(&elem->node.event_target, elem->node.nsnode, doc, eid, disp); }
HRESULT dispatch_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *event_obj, VARIANT_BOOL *cancelled) { eventid_t eid; eid = attr_to_eid(event_name); if(eid == EVENTID_LAST) { WARN("unknown event %s\n", debugstr_w(event_name)); return E_INVALIDARG; } if(event_obj && V_VT(event_obj) != VT_EMPTY && V_VT(event_obj) != VT_ERROR) FIXME("event_obj not implemented\n"); if(!(event_info[eid].flags & EVENT_DEFAULTLISTENER)) { FIXME("not EVENT_DEFAULTEVENTHANDLER\n"); return E_NOTIMPL; } fire_event(node->doc, eid, TRUE, node->nsnode, NULL); *cancelled = VARIANT_TRUE; /* FIXME */ return S_OK; }