From 79c442dc8fc9de970727f7ce086e4dc135b6ad24 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Tue, 20 Apr 2010 16:42:47 +0000 Subject: [PATCH] - Sync inetcomm, inseng, jscript to Wine-1.1.43. svn path=/trunk/; revision=46956 --- reactos/dll/win32/inetcomm/mimeintl.c | 2 +- reactos/dll/win32/inetcomm/mimeole.c | 72 ++++++++-------- reactos/dll/win32/inseng/inseng_main.c | 1 - reactos/dll/win32/jscript/jscript.h | 1 + reactos/dll/win32/jscript/regexp.c | 111 +++++++++++++++++++++---- reactos/dll/win32/jscript/string.c | 59 +++---------- 6 files changed, 145 insertions(+), 101 deletions(-) diff --git a/reactos/dll/win32/inetcomm/mimeintl.c b/reactos/dll/win32/inetcomm/mimeintl.c index 6d37147e2bf..97b482ed3c7 100644 --- a/reactos/dll/win32/inetcomm/mimeintl.c +++ b/reactos/dll/win32/inetcomm/mimeintl.c @@ -268,7 +268,7 @@ static HRESULT WINAPI MimeInternat_FindCharset(IMimeInternational *iface, LPCSTR if(SUCCEEDED(hr)) *phCharset = add_charset(&This->charsets, &mlang_info, - (HCHARSET)InterlockedIncrement(&This->next_charset_handle)); + UlongToHandle(InterlockedIncrement(&This->next_charset_handle))); } LeaveCriticalSection(&This->cs); diff --git a/reactos/dll/win32/inetcomm/mimeole.c b/reactos/dll/win32/inetcomm/mimeole.c index 992949a44ef..f297c2973b4 100644 --- a/reactos/dll/win32/inetcomm/mimeole.c +++ b/reactos/dll/win32/inetcomm/mimeole.c @@ -1419,7 +1419,7 @@ static HRESULT create_sub_stream(IStream *stream, ULARGE_INTEGER start, ULARGE_I typedef struct body_t { struct list entry; - HBODY hbody; + DWORD index; IMimeBody *mime_body; struct body_t *parent; @@ -1434,7 +1434,7 @@ typedef struct MimeMessage IStream *stream; struct list body_tree; - HBODY next_hbody; + DWORD next_index; } MimeMessage; static HRESULT WINAPI MimeMessage_QueryInterface(IMimeMessage *iface, REFIID riid, void **ppv) @@ -1512,13 +1512,13 @@ static HRESULT WINAPI MimeMessage_IsDirty( return E_NOTIMPL; } -static body_t *new_body_entry(IMimeBody *mime_body, HBODY hbody, body_t *parent) +static body_t *new_body_entry(IMimeBody *mime_body, DWORD index, body_t *parent) { body_t *body = HeapAlloc(GetProcessHeap(), 0, sizeof(*body)); if(body) { body->mime_body = mime_body; - body->hbody = hbody; + body->index = index; list_init(&body->children); body->parent = parent; } @@ -1630,8 +1630,7 @@ static body_t *create_sub_body(MimeMessage *msg, IStream *pStm, BODYOFFSETS *off offset->cbBodyStart = cur.u.LowPart + offset->cbHeaderStart; if(parent) MimeBody_set_offsets(impl_from_IMimeBody(mime_body), offset); IMimeBody_SetData(mime_body, IET_BINARY, NULL, NULL, &IID_IStream, pStm); - body = new_body_entry(mime_body, msg->next_hbody, parent); - msg->next_hbody = (HBODY)((DWORD)msg->next_hbody + 1); + body = new_body_entry(mime_body, msg->next_index++, parent); if(IMimeBody_IsContentType(mime_body, "multipart", NULL) == S_OK) { @@ -1812,7 +1811,7 @@ static HRESULT find_body(struct list *list, HBODY hbody, body_t **body) LIST_FOR_EACH_ENTRY(cur, list, body_t, entry) { - if(cur->hbody == hbody) + if(cur->index == HandleToUlong(hbody)) { *body = cur; return S_OK; @@ -1948,7 +1947,7 @@ static HRESULT WINAPI MimeMessage_GetBody( hr = get_body(This, location, hPivot, &body); - if(hr == S_OK) *phBody = body->hbody; + if(hr == S_OK) *phBody = UlongToHandle(body->index); return hr; } @@ -2003,38 +2002,35 @@ static HRESULT WINAPI MimeMessage_CountBodies( return S_OK; } -static HRESULT find_next(IMimeMessage *msg, LPFINDBODY find_body, HBODY *out) +static HRESULT find_next(IMimeMessage *msg, body_t *body, LPFINDBODY find, HBODY *out) { - HRESULT hr; - IMimeBody *mime_body; + MimeMessage *This = (MimeMessage *)msg; + struct list *ptr; HBODY next; - if(find_body->dwReserved == 0) - find_body->dwReserved = (DWORD)HBODY_ROOT; - else + for (;;) { - hr = IMimeMessage_GetBody(msg, IBL_FIRST, (HBODY)find_body->dwReserved, &next); - if(hr == S_OK) - find_body->dwReserved = (DWORD)next; + if (!body) ptr = list_head( &This->body_tree ); else { - hr = IMimeMessage_GetBody(msg, IBL_NEXT, (HBODY)find_body->dwReserved, &next); - if(hr == S_OK) - find_body->dwReserved = (DWORD)next; - else - return MIME_E_NOT_FOUND; + ptr = list_head( &body->children ); + while (!ptr) + { + if (!body->parent) return MIME_E_NOT_FOUND; + if (!(ptr = list_next( &body->parent->children, &body->entry ))) body = body->parent; + } + } + + body = LIST_ENTRY( ptr, body_t, entry ); + next = UlongToHandle( body->index ); + find->dwReserved = body->index; + if (IMimeBody_IsContentType(body->mime_body, find->pszPriType, find->pszSubType) == S_OK) + { + *out = next; + return S_OK; } } - - hr = IMimeMessage_BindToObject(msg, (HBODY)find_body->dwReserved, &IID_IMimeBody, (void**)&mime_body); - if(IMimeBody_IsContentType(mime_body, find_body->pszPriType, find_body->pszSubType) == S_OK) - { - IMimeBody_Release(mime_body); - *out = (HBODY)find_body->dwReserved; - return S_OK; - } - IMimeBody_Release(mime_body); - return find_next(msg, find_body, out); + return MIME_E_NOT_FOUND; } static HRESULT WINAPI MimeMessage_FindFirst( @@ -2045,7 +2041,7 @@ static HRESULT WINAPI MimeMessage_FindFirst( TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); pFindBody->dwReserved = 0; - return find_next(iface, pFindBody, phBody); + return find_next( iface, NULL, pFindBody, phBody ); } static HRESULT WINAPI MimeMessage_FindNext( @@ -2053,9 +2049,15 @@ static HRESULT WINAPI MimeMessage_FindNext( LPFINDBODY pFindBody, LPHBODY phBody) { + MimeMessage *This = (MimeMessage *)iface; + body_t *body; + HRESULT hr; + TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); - return find_next(iface, pFindBody, phBody); + hr = find_body( &This->body_tree, UlongToHandle( pFindBody->dwReserved ), &body ); + if (hr != S_OK) return MIME_E_NOT_FOUND; + return find_next( iface, body, pFindBody, phBody ); } static HRESULT WINAPI MimeMessage_ResolveURL( @@ -2562,7 +2564,7 @@ HRESULT MimeMessage_create(IUnknown *outer, void **obj) This->refs = 1; This->stream = NULL; list_init(&This->body_tree); - This->next_hbody = (HBODY)1; + This->next_index = 1; *obj = &This->lpVtbl; return S_OK; diff --git a/reactos/dll/win32/inseng/inseng_main.c b/reactos/dll/win32/inseng/inseng_main.c index 8ceb252b511..f1f148b4398 100644 --- a/reactos/dll/win32/inseng/inseng_main.c +++ b/reactos/dll/win32/inseng/inseng_main.c @@ -61,7 +61,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) HRESULT WINAPI DllCanUnloadNow(void) { - FIXME("\n"); return S_FALSE; } diff --git a/reactos/dll/win32/jscript/jscript.h b/reactos/dll/win32/jscript/jscript.h index 00688273de8..c1c8e60f35b 100644 --- a/reactos/dll/win32/jscript/jscript.h +++ b/reactos/dll/win32/jscript/jscript.h @@ -324,6 +324,7 @@ HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,con DWORD*,DWORD*,match_result_t*); HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*); HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*); +HRESULT regexp_string_match(script_ctx_t*,DispatchEx*,BSTR,VARIANT*,jsexcept_t*); static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i) { diff --git a/reactos/dll/win32/jscript/regexp.c b/reactos/dll/win32/jscript/regexp.c index 04575458105..7861d229826 100644 --- a/reactos/dll/win32/jscript/regexp.c +++ b/reactos/dll/win32/jscript/regexp.c @@ -2384,7 +2384,7 @@ SimpleMatch(REGlobalData *gData, REMatchState *x, REOp op, RECharSet *charSet; const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, + TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), (int)gData->stateStackTop * 2, "", opname); switch (op) { @@ -2623,7 +2623,7 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x) for (;;) { const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, + TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), (int)gData->stateStackTop * 2, "", opname); if (REOP_IS_SIMPLE(op)) { @@ -3637,25 +3637,25 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, VARIANT *arg, jsexce hres = to_string(ctx, arg, ei, &string); if(FAILED(hres)) return hres; + length = SysStringLen(string); }else { - string = SysAllocStringLen(NULL, 0); - if(!string) - return E_OUTOFMEMORY; + string = NULL; + length = 0; } - if(regexp->last_index < 0) { - SysFreeString(string); - set_last_index(regexp, 0); - *ret = VARIANT_FALSE; - if(input) { - *input = NULL; + if(regexp->jsregexp->flags & JSREG_GLOB) { + if(regexp->last_index < 0) { + SysFreeString(string); + set_last_index(regexp, 0); + *ret = VARIANT_FALSE; + if(input) { + *input = NULL; + } + return S_OK; } - return S_OK; - } - length = SysStringLen(string); - if(regexp->jsregexp->flags & JSREG_GLOB) last_index = regexp->last_index; + } cp = string + last_index; hres = regexp_match_next(ctx, ®exp->dispex, REM_RESET_INDEX, string, length, &cp, parens, @@ -3878,6 +3878,87 @@ HRESULT create_regexp_var(script_ctx_t *ctx, VARIANT *src_arg, VARIANT *flags_ar return create_regexp(ctx, src, -1, flags, ret); } +HRESULT regexp_string_match(script_ctx_t *ctx, DispatchEx *re, BSTR str, + VARIANT *retv, jsexcept_t *ei) +{ + RegExpInstance *regexp = (RegExpInstance*)re; + match_result_t *match_result; + DWORD match_cnt, i, length; + DispatchEx *array; + VARIANT var; + HRESULT hres; + + length = SysStringLen(str); + + if(!(regexp->jsregexp->flags & JSREG_GLOB)) { + match_result_t match, *parens = NULL; + DWORD parens_cnt, parens_size = 0; + const WCHAR *cp = str; + + hres = regexp_match_next(ctx, ®exp->dispex, 0, str, length, &cp, &parens, &parens_size, &parens_cnt, &match); + if(FAILED(hres)) + return hres; + + if(retv) { + if(hres == S_OK) { + IDispatch *ret; + + hres = create_match_array(ctx, str, &match, parens, parens_cnt, ei, &ret); + if(SUCCEEDED(hres)) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = ret; + } + }else { + V_VT(retv) = VT_NULL; + } + } + + heap_free(parens); + return S_OK; + } + + hres = regexp_match(ctx, ®exp->dispex, str, length, FALSE, &match_result, &match_cnt); + if(FAILED(hres)) + return hres; + + if(!match_cnt) { + TRACE("no match\n"); + + if(retv) + V_VT(retv) = VT_NULL; + return S_OK; + } + + hres = create_array(ctx, match_cnt, &array); + if(FAILED(hres)) + return hres; + + V_VT(&var) = VT_BSTR; + + for(i=0; i < match_cnt; i++) { + V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); + if(!V_BSTR(&var)) { + hres = E_OUTOFMEMORY; + break; + } + + hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); + SysFreeString(V_BSTR(&var)); + if(FAILED(hres)) + break; + } + + heap_free(match_result); + + if(SUCCEEDED(hres) && retv) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); + }else { + jsdisp_release(array); + } + return hres; +} + static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { diff --git a/reactos/dll/win32/jscript/string.c b/reactos/dll/win32/jscript/string.c index df43fee27ed..510dcc272c6 100644 --- a/reactos/dll/win32/jscript/string.c +++ b/reactos/dll/win32/jscript/string.c @@ -622,11 +622,9 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { const WCHAR *str; - match_result_t *match_result; DispatchEx *regexp; - DispatchEx *array; - VARIANT var, *arg_var; - DWORD length, match_cnt, i; + VARIANT *arg_var; + DWORD length; BSTR val_str = NULL; HRESULT hres = S_OK; @@ -645,7 +643,7 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP case VT_DISPATCH: regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg_var)); if(regexp) { - if(regexp->builtin_info->class == JSCLASS_REGEXP) + if(is_class(regexp, JSCLASS_REGEXP)) break; jsdisp_release(regexp); } @@ -664,54 +662,17 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP } hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str); - if(SUCCEEDED(hres)) - hres = regexp_match(ctx, regexp, str, length, FALSE, &match_result, &match_cnt); - jsdisp_release(regexp); - if(FAILED(hres)) { - SysFreeString(val_str); - return hres; - } - - if(!match_cnt) { - TRACE("no match\n"); - - if(retv) - V_VT(retv) = VT_NULL; - - SysFreeString(val_str); - return S_OK; - } - - hres = create_array(ctx, match_cnt, &array); - if(FAILED(hres)) { - SysFreeString(val_str); - return hres; - } - - V_VT(&var) = VT_BSTR; - - for(i=0; i < match_cnt; i++) { - V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); - if(!V_BSTR(&var)) { + if(SUCCEEDED(hres)) { + if(!val_str) + val_str = SysAllocStringLen(str, length); + if(val_str) + hres = regexp_string_match(ctx, regexp, val_str, retv, ei); + else hres = E_OUTOFMEMORY; - break; - } - - hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); - SysFreeString(V_BSTR(&var)); - if(FAILED(hres)) - break; } - heap_free(match_result); + jsdisp_release(regexp); SysFreeString(val_str); - - if(SUCCEEDED(hres) && retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); - }else { - jsdisp_release(array); - } return hres; }