"Fossies" - the Fresh Open Source Software archive 
Member "pavuk-0.9.35/src/iecache.c" of archive pavuk-0.9.35.tar.gz:
/***************************************************************************/
/* This code is part of WWW grabber called pavuk */
/* Copyright (c) 1997 - 2001 Stefan Ondrejicka */
/* Distributed under GPL 2 or later */
/***************************************************************************/
#include "config.h"
#ifdef __CYGWIN__
#include <windows.h>
#include "tools.h"
typedef struct _CACHE_ENTRY_INFO
{
DWORD dwStructSize;
LPSTR lpszSourceUrlName;
LPSTR lpszLocalFileName;
DWORD CacheEntryType;
DWORD dwUseCount;
DWORD dwHitRate;
DWORD dwSizeLow;
DWORD dwSizeHigh;
FILETIME LastModifiedTime;
FILETIME ExpireTime;
FILETIME LastAccessTime;
FILETIME LastSyncTime;
LPBYTE lpHeaderInfo;
DWORD dwHeaderInfoSize;
LPSTR lpszFileExtension;
union
{
DWORD dwReserved;
DWORD dwExemptDelta;
};
} INTERNET_CACHE_ENTRY_INFO, *LPINTERNET_CACHE_ENTRY_INFO;
char *ie_cache_find_localname(char *urlstr)
{
LPINTERNET_CACHE_ENTRY_INFO info;
static bool_t exist = TRUE;
static HMODULE hModule = NULL;
static BOOL(WINAPI * RetrieveUrlCacheEntryFile)
(LPCSTR, LPINTERNET_CACHE_ENTRY_INFO, LPDWORD, DWORD);
static char *buf = NULL;
static int buf_size = 0;
DWORD s = 0;
DWORD err;
char *rv;
if(!hModule && exist)
{
hModule = LoadLibrary("wininet.dll");
if(!hModule)
{
exist = FALSE;
return NULL;
}
RetrieveUrlCacheEntryFile = (void *) GetProcAddress(hModule,
"RetrieveUrlCacheEntryFileA");
if(!RetrieveUrlCacheEntryFile)
{
exist = FALSE;
FreeLibrary(hModule);
return NULL;
}
}
if(!buf)
{
buf_size = 256;
buf = _malloc(buf_size);
}
memset(buf, '\0', s);
do
{
s = buf_size;
info = (void *) buf;
if(RetrieveUrlCacheEntryFile(urlstr, info, &s, 0) && info)
{
rv = cvt_win32_to_unix_path(info->lpszLocalFileName);
break;
}
else
{
err = GetLastError();
if(err == ERROR_INSUFFICIENT_BUFFER)
{
buf_size = s;
buf = _realloc(buf, buf_size);
}
}
}
while(err == ERROR_INSUFFICIENT_BUFFER);
return rv;
}
#endif