/*********************************************************************** * UPDOWN_GetBuddyInt * Tries to read the pos from the buddy window and if it succeeds, * it stores it in the control's CurVal * returns: * TRUE - if it read the integer from the buddy successfully * FALSE - if an error occurred */ static BOOL UPDOWN_GetBuddyInt (UPDOWN_INFO *infoPtr) { WCHAR txt[20], sep, *src, *dst; int newVal; if (!((infoPtr->dwStyle & UDS_SETBUDDYINT) && IsWindow(infoPtr->Buddy))) return FALSE; /*if the buddy is a list window, we must set curr index */ if (UPDOWN_IsBuddyListbox(infoPtr)) { newVal = SendMessageW(infoPtr->Buddy, LB_GETCARETINDEX, 0, 0); if(newVal < 0) return FALSE; } else { /* we have a regular window, so will get the text */ /* note that a zero-length string is a legitimate value for 'txt', * and ought to result in a successful conversion to '0'. */ if (GetWindowTextW(infoPtr->Buddy, txt, COUNT_OF(txt)) < 0) return FALSE; sep = UPDOWN_GetThousandSep(); /* now get rid of the separators */ for(src = dst = txt; *src; src++) if(*src != sep) *dst++ = *src; *dst = 0; /* try to convert the number and validate it */ newVal = strtolW(txt, &src, infoPtr->Base); if(*src || !UPDOWN_InBounds (infoPtr, newVal)) return FALSE; } TRACE("new value(%d) from buddy (old=%d)\n", newVal, infoPtr->CurVal); infoPtr->CurVal = newVal; return TRUE; }
static WCHAR *decode_url( LPCWSTR url, DWORD *len ) { const WCHAR *p = url; WCHAR hex[3], *q, *ret; if (!(ret = heap_alloc( *len * sizeof(WCHAR) ))) return NULL; q = ret; while (*len > 0) { if (p[0] == '%' && isxdigitW( p[1] ) && isxdigitW( p[2] )) { hex[0] = p[1]; hex[1] = p[2]; hex[2] = 0; *q++ = strtolW( hex, NULL, 16 ); p += 3; *len -= 3; } else { *q++ = *p++; *len -= 1; } } *len = q - ret; return ret; }
static HRESULT return_nscolor(nsresult nsres, nsAString *nsstr, VARIANT *p) { const PRUnichar *color; if(NS_FAILED(nsres)) { ERR("failed: %08x\n", nsres); nsAString_Finish(nsstr); return E_FAIL; } nsAString_GetData(nsstr, &color); if(*color == '#') { V_VT(p) = VT_I4; V_I4(p) = strtolW(color+1, NULL, 16); }else { V_VT(p) = VT_BSTR; V_BSTR(p) = SysAllocString(color); if(!V_BSTR(p)) { nsAString_Finish(nsstr); return E_OUTOFMEMORY; } } nsAString_Finish(nsstr); TRACE("ret %s\n", debugstr_variant(p)); return S_OK; }
static void nscolor_to_variant(const nsAString *nsstr, VARIANT *p) { const PRUnichar *color; nsAString_GetData(nsstr, &color); if(*color == '#') { V_VT(p) = VT_I4; V_I4(p) = strtolW(color+1, NULL, 16); }else { V_VT(p) = VT_BSTR; V_BSTR(p) = SysAllocString(color); } }
INFSTATUS InfpGetIntField(PINFCONTEXT Context, ULONG FieldIndex, INT *IntegerValue) { PINFCACHELINE CacheLine; PINFCACHEFIELD CacheField; ULONG Index; PWCHAR Ptr; if (Context == NULL || Context->Line == NULL || IntegerValue == NULL) { DPRINT("Invalid parameter\n"); return INF_STATUS_INVALID_PARAMETER; } CacheLine = (PINFCACHELINE)Context->Line; if (FieldIndex > (ULONG)CacheLine->FieldCount) { DPRINT("Invalid parameter\n"); return INF_STATUS_INVALID_PARAMETER; } if (FieldIndex == 0) { Ptr = CacheLine->Key; } else { CacheField = CacheLine->FirstField; for (Index = 1; Index < FieldIndex; Index++) CacheField = CacheField->Next; Ptr = CacheField->Data; } *IntegerValue = (LONG)strtolW(Ptr, NULL, 0); return INF_STATUS_SUCCESS; }
BOOL WINAPI SetupGetSourceFileLocationW( HINF hinf, PINFCONTEXT context, PCWSTR filename, PUINT source_id, PWSTR buffer, DWORD buffer_size, PDWORD required_size ) { INFCONTEXT ctx; WCHAR *end, *source_id_str; TRACE("%p, %p, %s, %p, %p, 0x%08x, %p\n", hinf, context, debugstr_w(filename), source_id, buffer, buffer_size, required_size); if (!context) context = &ctx; if (!(source_id_str = get_source_id( hinf, context, filename ))) return FALSE; *source_id = strtolW( source_id_str, &end, 10 ); if (end == source_id_str || *end) { HeapFree( GetProcessHeap(), 0, source_id_str ); return FALSE; } HeapFree( GetProcessHeap(), 0, source_id_str ); if (SetupGetStringFieldW( context, 4, buffer, buffer_size, required_size )) return TRUE; if (required_size) *required_size = 1; if (buffer) { if (buffer_size >= 1) buffer[0] = 0; else { SetLastError( ERROR_INSUFFICIENT_BUFFER ); return FALSE; } } return TRUE; }
static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *reg_count) { LPBYTE out_data = NULL; *reg_count = 0; switch (reg_type) { case REG_SZ: { *reg_count = (lstrlenW(data) + 1) * sizeof(WCHAR); out_data = HeapAlloc(GetProcessHeap(),0,*reg_count); lstrcpyW((LPWSTR)out_data,data); break; } case REG_DWORD: { LPWSTR rest; DWORD val; val = strtolW(data, &rest, 0); if (rest == data) { static const WCHAR nonnumber[] = {'E','r','r','o','r',':',' ','/','d',' ','r','e','q','u','i','r','e','s',' ','n','u','m','b','e','r','.','\n',0}; reg_printfW(nonnumber); break; } *reg_count = sizeof(DWORD); out_data = HeapAlloc(GetProcessHeap(),0,*reg_count); ((LPDWORD)out_data)[0] = val; break; } default: { static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0}; reg_printfW(unhandled, reg_type,data); } } return out_data; }
static HRESULT do_process_key(LPCOLESTR *pstr, HKEY parent_key, strbuf *buf, BOOL do_register) { LPCOLESTR iter = *pstr; HRESULT hres; LONG lres; HKEY hkey = 0; strbuf name; enum { NORMAL, NO_REMOVE, IS_VAL, FORCE_REMOVE, DO_DELETE } key_type = NORMAL; static const WCHAR wstrNoRemove[] = {'N','o','R','e','m','o','v','e',0}; static const WCHAR wstrForceRemove[] = {'F','o','r','c','e','R','e','m','o','v','e',0}; static const WCHAR wstrDelete[] = {'D','e','l','e','t','e',0}; static const WCHAR wstrval[] = {'v','a','l',0}; iter = *pstr; hres = get_word(&iter, buf); if(FAILED(hres)) return hres; strbuf_init(&name); while(buf->str[1] || buf->str[0] != '}') { key_type = NORMAL; if(!lstrcmpiW(buf->str, wstrNoRemove)) key_type = NO_REMOVE; else if(!lstrcmpiW(buf->str, wstrForceRemove)) key_type = FORCE_REMOVE; else if(!lstrcmpiW(buf->str, wstrval)) key_type = IS_VAL; else if(!lstrcmpiW(buf->str, wstrDelete)) key_type = DO_DELETE; if(key_type != NORMAL) { hres = get_word(&iter, buf); if(FAILED(hres)) break; } TRACE("name = %s\n", debugstr_w(buf->str)); if(do_register) { if(key_type == IS_VAL) { hkey = parent_key; strbuf_write(buf->str, &name, -1); }else if(key_type == DO_DELETE) { TRACE("Deleting %s\n", debugstr_w(buf->str)); lres = RegDeleteTreeW(parent_key, buf->str); }else { if(key_type == FORCE_REMOVE) RegDeleteTreeW(parent_key, buf->str); lres = RegCreateKeyW(parent_key, buf->str, &hkey); if(lres != ERROR_SUCCESS) { WARN("Could not create(open) key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } } }else if(key_type != IS_VAL && key_type != DO_DELETE) { strbuf_write(buf->str, &name, -1); lres = RegOpenKeyW(parent_key, buf->str, &hkey); if(lres != ERROR_SUCCESS) WARN("Could not open key %s: %08x\n", debugstr_w(name.str), lres); } if(key_type != DO_DELETE && *iter == '=') { iter++; hres = get_word(&iter, buf); if(FAILED(hres)) break; if(buf->len != 1) { WARN("Wrong registry type: %s\n", debugstr_w(buf->str)); hres = DISP_E_EXCEPTION; break; } if(do_register) { switch(buf->str[0]) { case 's': hres = get_word(&iter, buf); if(FAILED(hres)) break; lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_SZ, (PBYTE)buf->str, (lstrlenW(buf->str)+1)*sizeof(WCHAR)); if(lres != ERROR_SUCCESS) { WARN("Could set value of key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } break; case 'd': { WCHAR *end; DWORD dw; if(*iter == '0' && iter[1] == 'x') { iter += 2; dw = strtolW(iter, &end, 16); }else { dw = strtolW(iter, &end, 10); } iter = end; lres = RegSetValueExW(hkey, name.len ? name.str : NULL, 0, REG_DWORD, (PBYTE)&dw, sizeof(dw)); if(lres != ERROR_SUCCESS) { WARN("Could set value of key: %08x\n", lres); hres = HRESULT_FROM_WIN32(lres); break; } break; } default: WARN("Wrong resource type: %s\n", debugstr_w(buf->str)); hres = DISP_E_EXCEPTION; }; if(FAILED(hres)) break; }else { if(*iter == '-') iter++; hres = get_word(&iter, buf); if(FAILED(hres)) break; } }else if(key_type == IS_VAL) { WARN("value not set!\n"); hres = DISP_E_EXCEPTION; break; } if(key_type != IS_VAL && key_type != DO_DELETE && *iter == '{' && isspaceW(iter[1])) { hres = get_word(&iter, buf); if(FAILED(hres)) break; hres = do_process_key(&iter, hkey, buf, do_register); if(FAILED(hres)) break; } TRACE("%x %x\n", do_register, key_type); if(!do_register && (key_type == NORMAL || key_type == FORCE_REMOVE)) { TRACE("Deleting %s\n", debugstr_w(name.str)); RegDeleteKeyW(parent_key, name.str); } if(hkey && key_type != IS_VAL) RegCloseKey(hkey); hkey = 0; name.len = 0; hres = get_word(&iter, buf); if(FAILED(hres)) break; } HeapFree(GetProcessHeap(), 0, name.str); if(hkey && key_type != IS_VAL) RegCloseKey(hkey); *pstr = iter; return hres; }
/********************************************************************* * wcstol (NTDLL.@) */ LONG __cdecl NTDLL_wcstol(LPCWSTR s, LPWSTR *end, INT base) { return strtolW( s, end, base ); }
static HRESULT WINAPI ResProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink* pOIProtSink, IInternetBindInfo* pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) { ResProtocol *This = ResProtocol_from_IInternetProtocol(iface); WCHAR *url_dll, *url_file, *url, *mime, *res_type = (LPWSTR)RT_HTML, *ptr; DWORD grfBINDF = 0, len; BINDINFO bindinfo; HMODULE hdll; HRSRC src; HRESULT hres; static const WCHAR wszRes[] = {'r','e','s',':','/','/'}; TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink, pOIBindInfo, grfPI, dwReserved); memset(&bindinfo, 0, sizeof(bindinfo)); bindinfo.cbSize = sizeof(BINDINFO); hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &grfBINDF, &bindinfo); if(FAILED(hres)) return hres; ReleaseBindInfo(&bindinfo); len = strlenW(szUrl)+16; url = heap_alloc(len*sizeof(WCHAR)); hres = CoInternetParseUrl(szUrl, PARSE_ENCODE, 0, url, len, &len, 0); if(FAILED(hres)) { WARN("CoInternetParseUrl failed: %08x\n", hres); heap_free(url); IInternetProtocolSink_ReportResult(pOIProtSink, hres, 0, NULL); return hres; } if(len < sizeof(wszRes)/sizeof(wszRes[0]) || memcmp(url, wszRes, sizeof(wszRes))) { WARN("Wrong protocol of url: %s\n", debugstr_w(url)); IInternetProtocolSink_ReportResult(pOIProtSink, E_INVALIDARG, 0, NULL); heap_free(url); return E_INVALIDARG; } url_dll = url + sizeof(wszRes)/sizeof(wszRes[0]); if(!(res_type = strchrW(url_dll, '/'))) { WARN("wrong url: %s\n", debugstr_w(url)); IInternetProtocolSink_ReportResult(pOIProtSink, MK_E_SYNTAX, 0, NULL); heap_free(url); return MK_E_SYNTAX; } *res_type++ = 0; if ((url_file = strchrW(res_type, '/'))) { *url_file++ = 0; }else { url_file = res_type; res_type = MAKEINTRESOURCEW(RT_HTML); } /* Ignore query and hash parts. */ if((ptr = strchrW(url_file, '?'))) *ptr = 0; if((ptr = strchrW(url_file, '#'))) *ptr = 0; hdll = LoadLibraryExW(url_dll, NULL, LOAD_LIBRARY_AS_DATAFILE); if(!hdll) { WARN("Could not open dll: %s\n", debugstr_w(url_dll)); IInternetProtocolSink_ReportResult(pOIProtSink, HRESULT_FROM_WIN32(GetLastError()), 0, NULL); heap_free(url); return HRESULT_FROM_WIN32(GetLastError()); } TRACE("trying to find resource type %s, name %s\n", debugstr_w(res_type), debugstr_w(url_file)); src = FindResourceW(hdll, url_file, res_type); if(!src) { LPWSTR endpoint = NULL; DWORD file_id = strtolW(url_file, &endpoint, 10); if(endpoint == url_file+strlenW(url_file)) src = FindResourceW(hdll, MAKEINTRESOURCEW(file_id), res_type); if(!src) { WARN("Could not find resource\n"); IInternetProtocolSink_ReportResult(pOIProtSink, HRESULT_FROM_WIN32(GetLastError()), 0, NULL); heap_free(url); return HRESULT_FROM_WIN32(GetLastError()); } } if(This->data) { WARN("data already loaded\n"); heap_free(This->data); } This->data_len = SizeofResource(hdll, src); This->data = heap_alloc(This->data_len); memcpy(This->data, LoadResource(hdll, src), This->data_len); This->cur = 0; FreeLibrary(hdll); hres = FindMimeFromData(NULL, url_file, This->data, This->data_len, NULL, 0, &mime, 0); heap_free(url); if(SUCCEEDED(hres)) { IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_MIMETYPEAVAILABLE, mime); CoTaskMemFree(mime); } IInternetProtocolSink_ReportData(pOIProtSink, BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION | BSCF_DATAFULLYAVAILABLE, This->data_len, This->data_len); IInternetProtocolSink_ReportResult(pOIProtSink, S_OK, 0, NULL); return S_OK; }
static HRESULT PROPVAR_ConvertNumber(REFPROPVARIANT pv, int dest_bits, BOOL dest_signed, LONGLONG *res) { BOOL src_signed; switch (pv->vt) { case VT_I1: src_signed = TRUE; *res = pv->u.cVal; break; case VT_UI1: src_signed = FALSE; *res = pv->u.bVal; break; case VT_I2: src_signed = TRUE; *res = pv->u.iVal; break; case VT_UI2: src_signed = FALSE; *res = pv->u.uiVal; break; case VT_I4: src_signed = TRUE; *res = pv->u.lVal; break; case VT_UI4: src_signed = FALSE; *res = pv->u.ulVal; break; case VT_I8: src_signed = TRUE; *res = pv->u.hVal.QuadPart; break; case VT_UI8: src_signed = FALSE; *res = pv->u.uhVal.QuadPart; break; case VT_EMPTY: src_signed = FALSE; *res = 0; break; case VT_LPSTR: { char *end; *res = strtoll(pv->u.pszVal, &end, 0); if (pv->u.pszVal == end) return DISP_E_TYPEMISMATCH; src_signed = *res < 0; break; } case VT_LPWSTR: case VT_BSTR: { WCHAR *end; *res = strtolW(pv->u.pwszVal, &end, 0); if (pv->u.pwszVal == end) return DISP_E_TYPEMISMATCH; src_signed = *res < 0; break; } default: FIXME("unhandled vt %d\n", pv->vt); return E_NOTIMPL; } if (*res < 0 && src_signed != dest_signed) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); if (dest_bits < 64) { if (dest_signed) { if (*res >= ((LONGLONG)1 << (dest_bits-1)) || *res < ((LONGLONG)-1 << (dest_bits-1))) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); } else { if ((ULONGLONG)(*res) >= ((ULONGLONG)1 << dest_bits)) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); } } return S_OK; }