Implement CreateUrlCacheEntryW and CommitUrlCacheEntryW. Replace the

existing 'A' versions with calls to the 'W' versions.
This commit is contained in:
Troy Rollo 2005-03-21 12:33:17 +00:00 committed by Alexandre Julliard
parent f1565973b6
commit 9c7932d475
2 changed files with 252 additions and 98 deletions

View File

@ -1593,26 +1593,81 @@ BOOL WINAPI CreateUrlCacheEntryA(
OUT LPSTR lpszFileName,
IN DWORD dwReserved
)
{
DWORD len;
WCHAR *url_name;
WCHAR *file_extension;
WCHAR file_name[MAX_PATH];
BOOL bSuccess = FALSE;
DWORD dwError = 0;
if ((len = MultiByteToWideChar(CP_ACP, 0, lpszUrlName, -1, NULL, 0)) != 0 &&
(url_name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))) != 0)
{
MultiByteToWideChar(CP_ACP, 0, lpszUrlName, -1, url_name, len);
if ((len = MultiByteToWideChar(CP_ACP, 0, lpszFileExtension, -1, NULL, 0)) != 0 &&
(file_extension = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))) != 0)
{
MultiByteToWideChar(CP_ACP, 0, lpszFileExtension, -1, file_extension, len);
if (CreateUrlCacheEntryW(url_name, dwExpectedFileSize, file_extension, file_name, dwReserved))
{
if (WideCharToMultiByte(CP_ACP, 0, file_name, -1, lpszFileName, MAX_PATH, NULL, NULL) < MAX_PATH)
{
bSuccess = TRUE;
}
else
{
dwError = GetLastError();
}
}
else
{
dwError = GetLastError();
}
HeapFree(GetProcessHeap(), 0, file_extension);
}
else
{
dwError = GetLastError();
}
HeapFree(GetProcessHeap(), 0, url_name);
if (!bSuccess)
SetLastError(dwError);
}
return bSuccess;
}
/***********************************************************************
* CreateUrlCacheEntryW (WININET.@)
*
*/
BOOL WINAPI CreateUrlCacheEntryW(
IN LPCWSTR lpszUrlName,
IN DWORD dwExpectedFileSize,
IN LPCWSTR lpszFileExtension,
OUT LPWSTR lpszFileName,
IN DWORD dwReserved
)
{
URLCACHECONTAINER * pContainer;
LPURLCACHE_HEADER pHeader;
CHAR szFile[MAX_PATH];
CHAR szExtension[MAX_PATH];
LPCSTR lpszUrlPart;
LPCSTR lpszUrlEnd;
LPCSTR lpszFileNameExtension;
LPSTR lpszFileNameNoPath;
WCHAR szExtension[MAX_PATH];
LPCWSTR lpszUrlPart;
LPCWSTR lpszUrlEnd;
LPCWSTR lpszFileNameExtension;
LPWSTR lpszFileNameNoPath;
int i;
int countnoextension;
BYTE CacheDir;
LONG lBufferSize;
BOOL bFound = FALSE;
int count;
static WCHAR szWWW[] = {'w','w','w',0};
TRACE("(%s, 0x%08lx, %s, %p, 0x%08lx)\n",
debugstr_a(lpszUrlName),
debugstr_w(lpszUrlName),
dwExpectedFileSize,
debugstr_a(lpszFileExtension),
debugstr_w(lpszFileExtension),
lpszFileName,
dwReserved);
@ -1626,31 +1681,33 @@ BOOL WINAPI CreateUrlCacheEntryA(
for (lpszUrlEnd = lpszUrlName; *lpszUrlEnd; lpszUrlEnd++)
;
if (((lpszUrlEnd - lpszUrlName) > 1) && (*(lpszUrlEnd - 1) == '/'))
if (((lpszUrlEnd - lpszUrlName) > 1) && (*(lpszUrlEnd - 1) == '/' || *(lpszUrlEnd - 1) == '\\'))
lpszUrlEnd--;
for (lpszUrlPart = lpszUrlEnd;
(lpszUrlPart >= lpszUrlName);
lpszUrlPart--)
{
if ((*lpszUrlPart == '/') && ((lpszUrlEnd - lpszUrlPart) > 1))
if ((*lpszUrlPart == '/' || *lpszUrlPart == '\\') && ((lpszUrlEnd - lpszUrlPart) > 1))
{
bFound = TRUE;
lpszUrlPart++;
break;
}
}
if (!strcmp(lpszUrlPart, "www"))
if (!lstrcmpW(lpszUrlPart, szWWW))
{
lpszUrlPart += strlen("www");
lpszUrlPart += lstrlenW(szWWW);
}
count = lpszUrlEnd - lpszUrlPart;
if (bFound && (count < MAX_PATH))
{
memcpy(szFile, lpszUrlPart, count * sizeof(CHAR));
szFile[count] = '\0';
int len = WideCharToMultiByte(CP_ACP, 0, lpszUrlPart, count, szFile, sizeof(szFile) - 1, NULL, NULL);
if (!len)
return FALSE;
szFile[len] = '\0';
/* FIXME: get rid of illegal characters like \, / and : */
}
else
@ -1658,9 +1715,9 @@ BOOL WINAPI CreateUrlCacheEntryA(
FIXME("need to generate a random filename\n");
}
TRACE("File name: %s\n", szFile);
TRACE("File name: %s\n", debugstr_a(szFile));
if (!URLCacheContainers_FindContainerA(lpszUrlName, &pContainer))
if (!URLCacheContainers_FindContainerW(lpszUrlName, &pContainer))
return FALSE;
if (!URLCacheContainer_OpenIndex(pContainer))
@ -1672,31 +1729,37 @@ BOOL WINAPI CreateUrlCacheEntryA(
CacheDir = (BYTE)(rand() % pHeader->DirectoryCount);
lBufferSize = MAX_PATH * sizeof(CHAR);
URLCache_LocalFileNameToPathA(pContainer, pHeader, szFile, CacheDir, lpszFileName, &lBufferSize);
URLCache_LocalFileNameToPathW(pContainer, pHeader, szFile, CacheDir, lpszFileName, &lBufferSize);
URLCacheContainer_UnlockIndex(pContainer, pHeader);
lpszFileNameNoPath = lpszFileName + lBufferSize / sizeof(CHAR) + DIR_LENGTH + 1;
for (lpszFileNameNoPath = lpszFileName + lBufferSize / sizeof(CHAR) - 2;
lpszFileNameNoPath >= lpszFileName;
--lpszFileNameNoPath)
{
if (*lpszFileNameNoPath == '/' || *lpszFileNameNoPath == '\\')
break;
}
countnoextension = strlen(lpszFileNameNoPath);
lpszFileNameExtension = PathFindExtensionA(lpszFileNameNoPath);
countnoextension = lstrlenW(lpszFileNameNoPath);
lpszFileNameExtension = PathFindExtensionW(lpszFileNameNoPath);
if (lpszFileNameExtension)
countnoextension -= strlen(lpszFileNameExtension);
countnoextension -= lstrlenW(lpszFileNameExtension);
*szExtension = '\0';
if (lpszFileExtension)
{
szExtension[0] = '.';
strcpy(szExtension+1, lpszFileExtension);
lstrcpyW(szExtension+1, lpszFileExtension);
}
for (i = 0; i < 255; i++)
{
static WCHAR szFormat[] = {'[','%','u',']','%','s',0};
HANDLE hFile;
strncpy(lpszFileNameNoPath, szFile, countnoextension);
sprintf(lpszFileNameNoPath + countnoextension, "[%u]%s", i, szExtension);
TRACE("Trying: %s\n", lpszFileName);
hFile = CreateFileA(lpszFileName, GENERIC_READ, 0, NULL, CREATE_NEW, 0, NULL);
wsprintfW(lpszFileNameNoPath + countnoextension, szFormat, i, szExtension);
TRACE("Trying: %s\n", debugstr_w(lpszFileName));
hFile = CreateFileW(lpszFileName, GENERIC_READ, 0, NULL, CREATE_NEW, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
@ -1707,42 +1770,31 @@ BOOL WINAPI CreateUrlCacheEntryA(
return FALSE;
}
/***********************************************************************
* CreateUrlCacheEntryW (WININET.@)
* CommitUrlCacheEntryInternal (Compensates for an MS bug)
*
* The bug we are compensating for is that some drongo at Microsoft
* used lpHeaderInfo to pass binary data to CommitUrlCacheEntryA.
* As a consequence, CommitUrlCacheEntryA has been effectively
* redefined as LPBYTE rather than LPCSTR. But CommitUrlCacheEntryW
* is still defined as LPCWSTR. The result (other than madness) is
* that we always need to store lpHeaderInfo in CP_ACP rather than
* in UTF16, and we need to avoid converting lpHeaderInfo in
* CommitUrlCacheEntryA to UTF16 and then back to CP_ACP, since the
* result will lose data for arbitrary binary data.
*
*/
BOOL WINAPI CreateUrlCacheEntryW(
static BOOL WINAPI CommitUrlCacheEntryInternal(
IN LPCWSTR lpszUrlName,
IN DWORD dwExpectedFileSize,
IN LPCWSTR lpszFileExtension,
OUT LPWSTR lpszFileName,
IN DWORD dwReserved
)
{
FIXME("(%s, 0x%08lx, %s, %p, 0x%08lx) stub\n",
debugstr_w(lpszUrlName),
dwExpectedFileSize,
debugstr_w(lpszFileExtension),
lpszFileName,
dwReserved);
return TRUE;
}
/***********************************************************************
* CommitUrlCacheEntryA (WININET.@)
*
*/
BOOL WINAPI CommitUrlCacheEntryA(
IN LPCSTR lpszUrlName,
IN LPCSTR lpszLocalFileName,
IN LPCWSTR lpszLocalFileName,
IN FILETIME ExpireTime,
IN FILETIME LastModifiedTime,
IN DWORD CacheEntryType,
IN LPBYTE lpHeaderInfo,
IN DWORD dwHeaderSize,
IN LPCSTR lpszFileExtension,
IN LPCSTR dwReserved
IN LPCWSTR lpszFileExtension,
IN LPCWSTR lpszOriginalUrl
)
{
URLCACHECONTAINER * pContainer;
@ -1755,34 +1807,30 @@ BOOL WINAPI CommitUrlCacheEntryA(
DWORD dwFileSizeLow = 0;
DWORD dwFileSizeHigh = 0;
BYTE cDirectory = 0;
char achFile[MAX_PATH];
char achUrl[MAX_PATH];
char *pchLocalFileName = 0;
TRACE("(%s, %s, ..., ..., %lx, %p, %ld, %s, %p)\n",
debugstr_a(lpszUrlName),
debugstr_a(lpszLocalFileName),
TRACE("(%s, %s, ..., ..., %lx, %p, %ld, %s, %s)\n",
debugstr_w(lpszUrlName),
debugstr_w(lpszLocalFileName),
CacheEntryType,
lpHeaderInfo,
dwHeaderSize,
debugstr_a(lpszFileExtension),
dwReserved);
debugstr_w(lpszFileExtension),
debugstr_w(lpszOriginalUrl));
if (dwReserved)
{
ERR("dwReserved != 0\n");
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if (lpHeaderInfo == NULL)
{
FIXME("lpHeaderInfo == NULL - will crash at the moment\n");
}
if (lpszOriginalUrl)
WARN(": lpszOriginalUrl ignored\n");
if (lpszLocalFileName)
{
HANDLE hFile;
hFile = CreateFileA(lpszLocalFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
hFile = CreateFileW(lpszLocalFileName, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
ERR("couldn't open file %s (error is %ld)\n", debugstr_a(lpszLocalFileName), GetLastError());
ERR("couldn't open file %s (error is %ld)\n", debugstr_w(lpszLocalFileName), GetLastError());
return FALSE;
}
@ -1798,7 +1846,7 @@ BOOL WINAPI CommitUrlCacheEntryA(
CloseHandle(hFile);
}
if (!URLCacheContainers_FindContainerA(lpszUrlName, &pContainer))
if (!URLCacheContainers_FindContainerW(lpszUrlName, &pContainer))
return FALSE;
if (!URLCacheContainer_OpenIndex(pContainer))
@ -1807,7 +1855,9 @@ BOOL WINAPI CommitUrlCacheEntryA(
if (!(pHeader = URLCacheContainer_LockIndex(pContainer)))
return FALSE;
if (URLCache_FindEntryInHash(pHeader, lpszUrlName, &pEntry))
WideCharToMultiByte(CP_ACP, 0, lpszUrlName, -1, achUrl, -1, NULL, NULL);
if (URLCache_FindEntryInHash(pHeader, achUrl, &pEntry))
{
URLCacheContainer_UnlockIndex(pContainer, pHeader);
FIXME("entry already in cache - don't know what to do!\n");
@ -1821,29 +1871,24 @@ BOOL WINAPI CommitUrlCacheEntryA(
if (lpszLocalFileName)
{
BOOL bFound = FALSE;
char szContainerPath[MAX_PATH];
int container_path_len;
container_path_len = WideCharToMultiByte(CP_ACP, 0, pContainer->path, -1, szContainerPath, sizeof(szContainerPath), NULL, NULL);
if (!container_path_len)
{
/* WideCharToMultiByte should have called SetLastError */
return FALSE;
}
if (strncmp(lpszLocalFileName, szContainerPath, container_path_len))
if (strncmpW(lpszLocalFileName, pContainer->path, lstrlenW(pContainer->path)))
{
URLCacheContainer_UnlockIndex(pContainer, pHeader);
ERR("path %s must begin with cache content path %s\n", debugstr_a(lpszLocalFileName), debugstr_a(szContainerPath));
ERR("path %s must begin with cache content path %s\n", debugstr_w(lpszLocalFileName), debugstr_w(pContainer->path));
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
/* skip container path prefix */
lpszLocalFileName += container_path_len;
lpszLocalFileName += lstrlenW(pContainer->path);
WideCharToMultiByte(CP_ACP, 0, lpszLocalFileName, -1, achFile, -1, NULL, NULL);
pchLocalFileName = achFile;
for (cDirectory = 0; cDirectory < pHeader->DirectoryCount; cDirectory++)
{
if (!strncmp(pHeader->directory_data[cDirectory].filename, lpszLocalFileName, DIR_LENGTH))
if (!strncmp(pHeader->directory_data[cDirectory].filename, pchLocalFileName, DIR_LENGTH))
{
bFound = TRUE;
break;
@ -1853,7 +1898,7 @@ BOOL WINAPI CommitUrlCacheEntryA(
if (!bFound)
{
URLCacheContainer_UnlockIndex(pContainer, pHeader);
ERR("cache directory not found in path %s\n", lpszLocalFileName);
ERR("cache directory not found in path %s\n", debugstr_w(lpszLocalFileName));
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
@ -1861,11 +1906,11 @@ BOOL WINAPI CommitUrlCacheEntryA(
lpszLocalFileName += (DIR_LENGTH + 1); /* "1234WXYZ\" */
}
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(lpszUrlName) + 1);
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(achUrl) + 1);
if (lpszLocalFileName)
{
dwOffsetLocalFileName = dwBytesNeeded;
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(lpszLocalFileName) + 1);
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(pchLocalFileName) + 1);
}
if (lpHeaderInfo)
{
@ -1919,13 +1964,14 @@ BOOL WINAPI CommitUrlCacheEntryA(
pUrlEntry->dwUnknown7 = 0;
pUrlEntry->dwUnknown8 = 0;
strcpy(pUrlEntry->szSourceUrlName, lpszUrlName);
if (dwOffsetLocalFileName)
strcpy((LPSTR)((LPBYTE)pUrlEntry + dwOffsetLocalFileName), lpszLocalFileName);
if (dwOffsetHeader)
memcpy((LPSTR)((LPBYTE)pUrlEntry + dwOffsetHeader), lpHeaderInfo, dwHeaderSize);
if (!URLCache_AddEntryToHash(pHeader, lpszUrlName, (DWORD)((LPBYTE)pUrlEntry - (LPBYTE)pHeader)))
strcpy(pUrlEntry->szSourceUrlName, achUrl);
if (dwOffsetLocalFileName)
strcpy((LPSTR)((LPBYTE)pUrlEntry + dwOffsetLocalFileName), pchLocalFileName);
if (dwOffsetHeader)
memcpy((LPBYTE)pUrlEntry + dwOffsetHeader, lpHeaderInfo, dwHeaderSize);
if (!URLCache_AddEntryToHash(pHeader, achUrl, (DWORD)((LPBYTE)pUrlEntry - (LPBYTE)pHeader)))
{
URLCacheContainer_UnlockIndex(pContainer, pHeader);
return FALSE;
@ -1936,6 +1982,87 @@ BOOL WINAPI CommitUrlCacheEntryA(
return TRUE;
}
/***********************************************************************
* CommitUrlCacheEntryA (WININET.@)
*
*/
BOOL WINAPI CommitUrlCacheEntryA(
IN LPCSTR lpszUrlName,
IN LPCSTR lpszLocalFileName,
IN FILETIME ExpireTime,
IN FILETIME LastModifiedTime,
IN DWORD CacheEntryType,
IN LPBYTE lpHeaderInfo,
IN DWORD dwHeaderSize,
IN LPCSTR lpszFileExtension,
IN LPCSTR lpszOriginalUrl
)
{
DWORD len;
WCHAR *url_name;
WCHAR *local_file_name;
WCHAR *original_url = NULL;
BOOL bSuccess = FALSE;
DWORD dwError = 0;
TRACE("(%s, %s, ..., ..., %lx, %p, %ld, %s, %s)\n",
debugstr_a(lpszUrlName),
debugstr_a(lpszLocalFileName),
CacheEntryType,
lpHeaderInfo,
dwHeaderSize,
debugstr_a(lpszFileExtension),
debugstr_a(lpszOriginalUrl));
if (lpszFileExtension != 0)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if ((len = MultiByteToWideChar(CP_ACP, 0, lpszUrlName, -1, NULL, 0)) != 0 &&
(url_name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))) != 0)
{
MultiByteToWideChar(CP_ACP, 0, lpszUrlName, -1, url_name, len);
if ((len = MultiByteToWideChar(CP_ACP, 0, lpszLocalFileName, -1, NULL, 0)) != 0 &&
(local_file_name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))) != 0)
{
MultiByteToWideChar(CP_ACP, 0, lpszLocalFileName, -1, local_file_name, len);
if (!lpszOriginalUrl ||
((len = MultiByteToWideChar(CP_ACP, 0, lpszOriginalUrl, -1, NULL, 0)) != 0 &&
(original_url = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))) != 0))
{
if (original_url)
MultiByteToWideChar(CP_ACP, 0, lpszOriginalUrl, -1, original_url, len);
if (CommitUrlCacheEntryInternal(url_name, local_file_name, ExpireTime, LastModifiedTime,
CacheEntryType, lpHeaderInfo, dwHeaderSize,
NULL, original_url))
{
bSuccess = TRUE;
}
else
{
dwError = GetLastError();
}
if (original_url)
HeapFree(GetProcessHeap(), 0, original_url);
}
else
{
dwError = GetLastError();
}
HeapFree(GetProcessHeap(), 0, local_file_name);
}
else
{
dwError = GetLastError();
}
HeapFree(GetProcessHeap(), 0, url_name);
if (!bSuccess)
SetLastError(dwError);
}
return bSuccess;
}
/***********************************************************************
* CommitUrlCacheEntryW (WININET.@)
*
@ -1946,22 +2073,49 @@ BOOL WINAPI CommitUrlCacheEntryW(
IN FILETIME ExpireTime,
IN FILETIME LastModifiedTime,
IN DWORD CacheEntryType,
IN LPBYTE lpHeaderInfo,
IN LPWSTR lpHeaderInfo,
IN DWORD dwHeaderSize,
IN LPCWSTR lpszFileExtension,
IN LPCWSTR dwReserved
IN LPCWSTR lpszOriginalUrl
)
{
FIXME("(%s, %s, ..., ..., %lx, %p, %ld, %s, %p) stub\n",
DWORD dwError = 0;
BOOL bSuccess = FALSE;
DWORD len = 0;
CHAR *header_info = NULL;
TRACE("(%s, %s, ..., ..., %lx, %p, %ld, %s, %s)\n",
debugstr_w(lpszUrlName),
debugstr_w(lpszLocalFileName),
CacheEntryType,
lpHeaderInfo,
dwHeaderSize,
debugstr_w(lpszFileExtension),
dwReserved);
debugstr_w(lpszOriginalUrl));
return TRUE;
if (!lpHeaderInfo ||
((len = WideCharToMultiByte(CP_ACP, 0, lpHeaderInfo, -1, NULL, 0, NULL, NULL)) != 0 &&
(header_info = HeapAlloc(GetProcessHeap(), 0, sizeof(CHAR) * len)) != 0))
{
if (header_info)
WideCharToMultiByte(CP_ACP, 0, lpHeaderInfo, -1, header_info, len, NULL, NULL);
if (CommitUrlCacheEntryInternal(lpszUrlName, lpszLocalFileName, ExpireTime, LastModifiedTime,
CacheEntryType, header_info, len, lpszFileExtension, lpszOriginalUrl))
{
bSuccess = TRUE;
}
else
{
dwError = GetLastError();
}
if (header_info)
{
HeapFree(GetProcessHeap(), 0, header_info);
if (!bSuccess)
SetLastError(dwError);
}
}
return bSuccess;
}
/***********************************************************************

View File

@ -1400,7 +1400,7 @@ BOOLAPI CreateUrlCacheEntryW(LPCWSTR ,DWORD ,LPCWSTR ,LPWSTR ,DWORD);
#define CreateUrlCacheEntry WINELIB_NAME_AW(CreateUrlCacheEntry)
BOOLAPI CommitUrlCacheEntryA(LPCSTR,LPCSTR,FILETIME,FILETIME,DWORD,LPBYTE,DWORD,LPCSTR,LPCSTR);
BOOLAPI CommitUrlCacheEntryW(LPCWSTR,LPCWSTR,FILETIME,FILETIME,DWORD,LPBYTE,DWORD,LPCWSTR,LPCWSTR);
BOOLAPI CommitUrlCacheEntryW(LPCWSTR,LPCWSTR,FILETIME,FILETIME,DWORD,LPWSTR,DWORD,LPCWSTR,LPCWSTR);
#define CommitUrlCacheEntry WINELIB_NAME_AW(CommitUrlCacheEntry)
BOOLAPI ResumeSuspendedDownload(HINTERNET, DWORD);