mirror of
https://github.com/reactos/reactos.git
synced 2024-12-30 19:14:31 +00:00
- Sync inetcomm, inseng, jscript to Wine-1.1.43.
svn path=/trunk/; revision=46956
This commit is contained in:
parent
0cb69766f3
commit
79c442dc8f
6 changed files with 145 additions and 101 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -61,7 +61,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
|
|||
|
||||
HRESULT WINAPI DllCanUnloadNow(void)
|
||||
{
|
||||
FIXME("\n");
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue