static HRESULT WINAPI PersistFile_Save(IPersistFile *pFile, LPCOLESTR pszFileName, BOOL fRemember) { HRESULT hr = S_OK; INT len; CHAR *url; InternetShortcut *This = impl_from_IPersistFile(pFile); TRACE("(%p, %s, %d)\n", pFile, debugstr_w(pszFileName), fRemember); if (pszFileName != NULL && fRemember) { LPOLESTR oldFile = This->currentFile; This->currentFile = co_strdupW(pszFileName); if (This->currentFile == NULL) { This->currentFile = oldFile; return E_OUTOFMEMORY; } CoTaskMemFree(oldFile); } if (This->url == NULL) return E_FAIL; /* Windows seems to always write: * ASCII "[InternetShortcut]" headers * ASCII names in "name=value" pairs * An ASCII (probably UTF8?) value in "URL=..." */ len = WideCharToMultiByte(CP_UTF8, 0, This->url, -1, NULL, 0, 0, 0); url = heap_alloc(len); if (url != NULL) { HANDLE file; WideCharToMultiByte(CP_UTF8, 0, This->url, -1, url, len, 0, 0); file = CreateFileW(pszFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file != INVALID_HANDLE_VALUE) { DWORD bytesWritten; char str_header[] = "[InternetShortcut]"; char str_URL[] = "URL="; char str_eol[] = "\r\n"; WriteFile(file, str_header, lstrlenA(str_header), &bytesWritten, NULL); WriteFile(file, str_eol, lstrlenA(str_eol), &bytesWritten, NULL); WriteFile(file, str_URL, lstrlenA(str_URL), &bytesWritten, NULL); WriteFile(file, url, lstrlenA(url), &bytesWritten, NULL); WriteFile(file, str_eol, lstrlenA(str_eol), &bytesWritten, NULL); CloseHandle(file); if (pszFileName == NULL || fRemember) This->isDirty = FALSE; } else hr = E_FAIL; heap_free(url); } else hr = E_OUTOFMEMORY; return hr; }
static HRESULT WINAPI PersistFile_Load(IPersistFile *pFile, LPCOLESTR pszFileName, DWORD dwMode) { WCHAR str_header[] = {'I','n','t','e','r','n','e','t','S','h','o','r','t','c','u','t',0}; WCHAR str_URL[] = {'U','R','L',0}; WCHAR *filename = NULL; HRESULT hr; InternetShortcut *This = impl_from_IPersistFile(pFile); TRACE("(%p, %s, 0x%x)\n", pFile, debugstr_w(pszFileName), dwMode); if (dwMode != 0) FIXME("ignoring unimplemented mode 0x%x\n", dwMode); filename = co_strdupW(pszFileName); if (filename != NULL) { DWORD len = 128; DWORD r; WCHAR *url = CoTaskMemAlloc(len*sizeof(WCHAR)); if (url != NULL) { r = GetPrivateProfileStringW(str_header, str_URL, NULL, url, len, pszFileName); while (r == len-1) { CoTaskMemFree(url); len *= 2; url = CoTaskMemAlloc(len*sizeof(WCHAR)); if (url == NULL) break; r = GetPrivateProfileStringW(str_header, str_URL, NULL, url, len, pszFileName); } if (r == 0) hr = E_FAIL; else if (url != NULL) { CoTaskMemFree(This->currentFile); This->currentFile = filename; CoTaskMemFree(This->url); This->url = url; This->isDirty = FALSE; return S_OK; } else hr = E_OUTOFMEMORY; CoTaskMemFree(url); } else hr = E_OUTOFMEMORY; CoTaskMemFree(filename); } else hr = E_OUTOFMEMORY; return hr; }
static HRESULT WINAPI PersistFile_GetCurFile(IPersistFile *pFile, LPOLESTR *ppszFileName) { HRESULT hr = S_OK; InternetShortcut *This = impl_from_IPersistFile(pFile); TRACE("(%p, %p)\n", pFile, ppszFileName); if (This->currentFile == NULL) *ppszFileName = NULL; else { *ppszFileName = co_strdupW(This->currentFile); if (*ppszFileName == NULL) hr = E_OUTOFMEMORY; } return hr; }
static HRESULT WINAPI UniformResourceLocatorW_GetUrl(IUniformResourceLocatorW *url, LPWSTR *ppszURL) { HRESULT hr = S_OK; InternetShortcut *This = impl_from_IUniformResourceLocatorW(url); TRACE("(%p, %p)\n", url, ppszURL); if (This->url == NULL) *ppszURL = NULL; else { *ppszURL = co_strdupW(This->url); if (*ppszURL == NULL) hr = E_OUTOFMEMORY; } return hr; }
static HRESULT WINAPI UniformResourceLocatorW_GetUrl(IUniformResourceLocatorW *url, LPWSTR *ppszURL) { InternetShortcut *This = impl_from_IUniformResourceLocatorW(url); TRACE("(%p, %p)\n", url, ppszURL); if (!This->url) { *ppszURL = NULL; return S_FALSE; } *ppszURL = co_strdupW(This->url); if (!*ppszURL) return E_OUTOFMEMORY; return S_OK; }
static HRESULT WINAPI UniformResourceLocatorW_SetUrl(IUniformResourceLocatorW *url, LPCWSTR pcszURL, DWORD dwInFlags) { WCHAR *newURL = NULL; InternetShortcut *This = impl_from_IUniformResourceLocatorW(url); TRACE("(%p, %s, 0x%x)\n", url, debugstr_w(pcszURL), dwInFlags); if (dwInFlags != 0) FIXME("ignoring unsupported flags 0x%x\n", dwInFlags); if (pcszURL != NULL) { newURL = co_strdupW(pcszURL); if (newURL == NULL) return E_OUTOFMEMORY; } CoTaskMemFree(This->url); This->url = newURL; This->isDirty = TRUE; return S_OK; }
static HRESULT WINAPI PersistFile_Save(IPersistFile *pFile, LPCOLESTR pszFileName, BOOL fRemember) { HRESULT hr = S_OK; INT len; CHAR *url; InternetShortcut *This = impl_from_IPersistFile(pFile); TRACE("(%p, %s, %d)\n", pFile, debugstr_w(pszFileName), fRemember); if (pszFileName != NULL && fRemember) { LPOLESTR oldFile = This->currentFile; This->currentFile = co_strdupW(pszFileName); if (This->currentFile == NULL) { This->currentFile = oldFile; return E_OUTOFMEMORY; } CoTaskMemFree(oldFile); } if (This->url == NULL) return E_FAIL; /* Windows seems to always write: * ASCII "[InternetShortcut]" headers * ASCII names in "name=value" pairs * An ASCII (probably UTF8?) value in "URL=..." */ len = WideCharToMultiByte(CP_UTF8, 0, This->url, -1, NULL, 0, 0, 0); url = heap_alloc(len); if (url != NULL) { HANDLE file; WideCharToMultiByte(CP_UTF8, 0, This->url, -1, url, len, 0, 0); file = CreateFileW(pszFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (file != INVALID_HANDLE_VALUE) { DWORD bytesWritten; char *iconfile; char str_header[] = "[InternetShortcut]"; char str_URL[] = "URL="; char str_ICONFILE[] = "ICONFILE="; char str_eol[] = "\r\n"; IPropertyStorage *pPropStgRead; PROPSPEC ps[2]; PROPVARIANT pvread[2]; ps[0].ulKind = PRSPEC_PROPID; ps[0].u.propid = PID_IS_ICONFILE; ps[1].ulKind = PRSPEC_PROPID; ps[1].u.propid = PID_IS_ICONINDEX; WriteFile(file, str_header, lstrlenA(str_header), &bytesWritten, NULL); WriteFile(file, str_eol, lstrlenA(str_eol), &bytesWritten, NULL); WriteFile(file, str_URL, lstrlenA(str_URL), &bytesWritten, NULL); WriteFile(file, url, lstrlenA(url), &bytesWritten, NULL); WriteFile(file, str_eol, lstrlenA(str_eol), &bytesWritten, NULL); hr = IPropertySetStorage_Open(This->property_set_storage, &FMTID_Intshcut, STGM_READ|STGM_SHARE_EXCLUSIVE, &pPropStgRead); if (SUCCEEDED(hr)) { hr = IPropertyStorage_ReadMultiple(pPropStgRead, 2, ps, pvread); if (hr == S_FALSE) { /* None of the properties are present, that's ok */ hr = S_OK; IPropertyStorage_Release(pPropStgRead); } else if (SUCCEEDED(hr)) { char indexString[50]; len = WideCharToMultiByte(CP_UTF8, 0, pvread[0].u.pwszVal, -1, NULL, 0, 0, 0); iconfile = heap_alloc(len); if (iconfile != NULL) { WideCharToMultiByte(CP_UTF8, 0, pvread[0].u.pwszVal, -1, iconfile, len, 0, 0); WriteFile(file, str_ICONFILE, lstrlenA(str_ICONFILE), &bytesWritten, NULL); WriteFile(file, iconfile, lstrlenA(iconfile), &bytesWritten, NULL); WriteFile(file, str_eol, lstrlenA(str_eol), &bytesWritten, NULL); } sprintf(indexString, "ICONINDEX=%d", pvread[1].u.iVal); WriteFile(file, indexString, lstrlenA(indexString), &bytesWritten, NULL); WriteFile(file, str_eol, lstrlenA(str_eol), &bytesWritten, NULL); IPropertyStorage_Release(pPropStgRead); PropVariantClear(&pvread[0]); PropVariantClear(&pvread[1]); } else { TRACE("Unable to read properties.\n"); } } else { TRACE("Unable to get the IPropertyStorage.\n"); } CloseHandle(file); if (pszFileName == NULL || fRemember) This->isDirty = FALSE; StartLinkProcessor(pszFileName); } else hr = E_FAIL; heap_free(url); } else hr = E_OUTOFMEMORY; return hr; }
static HRESULT WINAPI PersistFile_Load(IPersistFile *pFile, LPCOLESTR pszFileName, DWORD dwMode) { WCHAR str_header[] = {'I','n','t','e','r','n','e','t','S','h','o','r','t','c','u','t',0}; WCHAR str_URL[] = {'U','R','L',0}; WCHAR str_iconfile[] = {'i','c','o','n','f','i','l','e',0}; WCHAR str_iconindex[] = {'i','c','o','n','i','n','d','e','x',0}; WCHAR *filename = NULL; HRESULT hr; InternetShortcut *This = impl_from_IPersistFile(pFile); TRACE("(%p, %s, 0x%x)\n", pFile, debugstr_w(pszFileName), dwMode); if (dwMode != 0) FIXME("ignoring unimplemented mode 0x%x\n", dwMode); filename = co_strdupW(pszFileName); if (filename != NULL) { DWORD r; WCHAR *url; r = get_profile_string(str_header, str_URL, pszFileName, &url); if (url == NULL) { hr = E_OUTOFMEMORY; CoTaskMemFree(filename); } else if (r == 0) { hr = E_FAIL; CoTaskMemFree(filename); } else { hr = S_OK; CoTaskMemFree(This->currentFile); This->currentFile = filename; CoTaskMemFree(This->url); This->url = url; This->isDirty = FALSE; } /* Now we're going to read in the iconfile and iconindex. If we don't find them, that's not a failure case -- it's possible that they just aren't in there. */ if (SUCCEEDED(hr)) { IPropertyStorage *pPropStg; WCHAR *iconfile; WCHAR *iconindexstring; hr = IPropertySetStorage_Open(This->property_set_storage, &FMTID_Intshcut, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, &pPropStg); r = get_profile_string(str_header, str_iconfile, pszFileName, &iconfile); if (iconfile != NULL) { PROPSPEC ps; PROPVARIANT pv; ps.ulKind = PRSPEC_PROPID; ps.u.propid = PID_IS_ICONFILE; pv.vt = VT_LPWSTR; pv.u.pwszVal = iconfile; hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0); if (FAILED(hr)) { TRACE("Failed to store the iconfile to our property storage. hr = 0x%x\n", hr); } CoTaskMemFree(iconfile); } r = get_profile_string(str_header, str_iconindex, pszFileName, &iconindexstring); if (iconindexstring != NULL) { int iconindex; PROPSPEC ps; PROPVARIANT pv; char *iconindexastring = co_strdupWtoA(iconindexstring); sscanf(iconindexastring, "%d", &iconindex); CoTaskMemFree(iconindexastring); ps.ulKind = PRSPEC_PROPID; ps.u.propid = PID_IS_ICONINDEX; pv.vt = VT_I4; pv.u.iVal = iconindex; hr = IPropertyStorage_WriteMultiple(pPropStg, 1, &ps, &pv, 0); if (FAILED(hr)) { TRACE("Failed to store the iconindex to our property storage. hr = 0x%x\n", hr); } CoTaskMemFree(iconindexstring); } IPropertyStorage_Release(pPropStg); } else hr = E_OUTOFMEMORY; } else hr = E_OUTOFMEMORY; return hr; }