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 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; }
static HRESULT set_event_handler_disp(EventTarget *event_target, eventid_t eid, IDispatch *disp) { event_target_t *data; remove_event_handler(event_target, eid); if(!disp) return S_OK; data = get_event_target_data(event_target, TRUE); if(!data) return E_OUTOFMEMORY; if(!alloc_handler_vector(data, eid, 0)) return E_OUTOFMEMORY; data->event_table[eid]->handler_prop = disp; IDispatch_AddRef(disp); bind_event(event_target, eid); return S_OK; }
static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDocumentNode *doc, eventid_t eid, IDispatch *disp) { event_target_t *event_target; if(!disp) return remove_event_handler(event_target_ptr, eid); event_target = get_event_target(event_target_ptr); if(!event_target) return E_OUTOFMEMORY; if(!alloc_handler_vector(event_target, eid, 0)) return E_OUTOFMEMORY; if(event_target->event_table[eid]->handler_prop) IDispatch_Release(event_target->event_table[eid]->handler_prop); event_target->event_table[eid]->handler_prop = disp; IDispatch_AddRef(disp); return ensure_nsevent_handler(doc, event_target, eid); }