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);
typedef struct body_t
{
struct list entry;
- HBODY hbody;
+ DWORD index;
IMimeBody *mime_body;
struct body_t *parent;
IStream *stream;
struct list body_tree;
- HBODY next_hbody;
+ DWORD next_index;
} MimeMessage;
static HRESULT WINAPI MimeMessage_QueryInterface(IMimeMessage *iface, REFIID riid, void **ppv)
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;
}
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)
{
LIST_FOR_EACH_ENTRY(cur, list, body_t, entry)
{
- if(cur->hbody == hbody)
+ if(cur->index == HandleToUlong(hbody))
{
*body = cur;
return S_OK;
hr = get_body(This, location, hPivot, &body);
- if(hr == S_OK) *phBody = body->hbody;
+ if(hr == S_OK) *phBody = UlongToHandle(body->index);
return hr;
}
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;
+ }
}
- }
- 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;
+ 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;
+ }
}
- IMimeBody_Release(mime_body);
- return find_next(msg, find_body, out);
+ return MIME_E_NOT_FOUND;
}
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(
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(
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;
HRESULT WINAPI DllCanUnloadNow(void)
{
- FIXME("\n");
return S_FALSE;
}
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)
{
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) {
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)) {
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,
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)
{
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;
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);
}
}
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;
}