mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 05:12:55 +00:00
* Create a branch for USB experiments.
svn path=/branches/usb-experiments/; revision=72629
This commit is contained in:
parent
28d8ba0d3e
commit
0ee830d7a4
23049 changed files with 0 additions and 1313991 deletions
292
base/applications/rapps_new/available.cpp
Normal file
292
base/applications/rapps_new/available.cpp
Normal file
|
@ -0,0 +1,292 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications Manager
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/rapps_new/available.cpp
|
||||
* PURPOSE: Functions for working with availabled applications
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
|
||||
*/
|
||||
|
||||
#include "rapps.h"
|
||||
|
||||
#define ADD_TEXT(a, b, c, d) \
|
||||
if (b[0] != '\0') \
|
||||
{ \
|
||||
LoadStringW(hInst, a, szText, _countof(szText)); \
|
||||
InsertRichEditText(szText, c); \
|
||||
InsertRichEditText(b, d); \
|
||||
} \
|
||||
|
||||
#define GET_STRING1(a, b) \
|
||||
if (!ParserGetString(a, b, _countof(b), FindFileData.cFileName)) \
|
||||
continue;
|
||||
|
||||
#define GET_STRING2(a, b) \
|
||||
if (!ParserGetString(a, b, _countof(b), FindFileData.cFileName)) \
|
||||
b[0] = '\0';
|
||||
|
||||
LIST_ENTRY CachedEntriesHead = { &CachedEntriesHead, &CachedEntriesHead };
|
||||
PLIST_ENTRY pCachedEntry = &CachedEntriesHead;
|
||||
|
||||
BOOL
|
||||
ShowAvailableAppInfo(INT Index)
|
||||
{
|
||||
PAPPLICATION_INFO Info = (PAPPLICATION_INFO) ListViewGetlParam(Index);
|
||||
WCHAR szText[MAX_STR_LEN];
|
||||
|
||||
if (!Info) return FALSE;
|
||||
|
||||
NewRichEditText(Info->szName, CFE_BOLD);
|
||||
|
||||
InsertRichEditText(L"\n", 0);
|
||||
|
||||
ADD_TEXT(IDS_AINFO_VERSION, Info->szVersion, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_SIZE, Info->szSize, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_URLSITE, Info->szUrlSite, CFE_BOLD, CFE_LINK);
|
||||
ADD_TEXT(IDS_AINFO_DESCRIPTION, Info->szDesc, CFE_BOLD, 0);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
DeleteCurrentAppsDB(VOID)
|
||||
{
|
||||
HANDLE hFind = INVALID_HANDLE_VALUE;
|
||||
WIN32_FIND_DATAW FindFileData;
|
||||
WCHAR szCabPath[MAX_PATH];
|
||||
WCHAR szSearchPath[MAX_PATH];
|
||||
WCHAR szPath[MAX_PATH];
|
||||
WCHAR szTmp[MAX_PATH];
|
||||
HRESULT hr;
|
||||
BOOL result = TRUE;
|
||||
|
||||
if (!GetStorageDirectory(szPath, _countof(szPath)))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
|
||||
L"%ls\\rappmgr.cab",
|
||||
szPath);
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
result = result && DeleteFileW(szCabPath);
|
||||
|
||||
hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbPrintfW(szSearchPath, sizeof(szSearchPath),
|
||||
L"%ls*.txt",
|
||||
szPath);
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
hFind = FindFirstFileW(szSearchPath, &FindFileData);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
return result;
|
||||
|
||||
do
|
||||
{
|
||||
hr = StringCbPrintfW(szTmp, sizeof(szTmp),
|
||||
L"%ls%ls",
|
||||
szPath, FindFileData.cFileName);
|
||||
if (FAILED(hr))
|
||||
continue;
|
||||
result = result && DeleteFileW(szTmp);
|
||||
|
||||
} while (FindNextFileW(hFind, &FindFileData) != 0);
|
||||
|
||||
FindClose(hFind);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
UpdateAppsDB(VOID)
|
||||
{
|
||||
WCHAR szPath[MAX_PATH];
|
||||
WCHAR szAppsPath[MAX_PATH];
|
||||
WCHAR szCabPath[MAX_PATH];
|
||||
|
||||
if (!DeleteCurrentAppsDB())
|
||||
return FALSE;
|
||||
|
||||
DownloadApplicationsDB(APPLICATION_DATABASE_URL);
|
||||
|
||||
if (!GetStorageDirectory(szPath, _countof(szPath)))
|
||||
return FALSE;
|
||||
|
||||
if (FAILED(StringCbPrintfW(szCabPath, sizeof(szCabPath),
|
||||
L"%ls\\rappmgr.cab",
|
||||
szPath)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (FAILED(StringCbPrintfW(szAppsPath, sizeof(szAppsPath),
|
||||
L"%ls\\rapps\\",
|
||||
szPath)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
ExtractFilesFromCab(szCabPath, szAppsPath);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
|
||||
{
|
||||
HANDLE hFind = INVALID_HANDLE_VALUE;
|
||||
WIN32_FIND_DATAW FindFileData;
|
||||
WCHAR szPath[MAX_PATH];
|
||||
WCHAR szAppsPath[MAX_PATH];
|
||||
WCHAR szCabPath[MAX_PATH];
|
||||
PAPPLICATION_INFO Info;
|
||||
HRESULT hr;
|
||||
|
||||
if (!GetStorageDirectory(szPath, _countof(szPath)))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
|
||||
L"%ls\\rappmgr.cab",
|
||||
szPath);
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbCopyW(szAppsPath, sizeof(szAppsPath), szPath);
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
if (!CreateDirectory(szPath, NULL) &&
|
||||
GetLastError() != ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
hr = StringCbCatW(szPath, sizeof(szPath), L"*.txt");
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
hFind = FindFirstFileW(szPath, &FindFileData);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (GetFileAttributesW(szCabPath) == INVALID_FILE_ATTRIBUTES)
|
||||
DownloadApplicationsDB(APPLICATION_DATABASE_URL);
|
||||
|
||||
ExtractFilesFromCab(szCabPath, szAppsPath);
|
||||
hFind = FindFirstFileW(szPath, &FindFileData);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
/* loop for all the cached entries */
|
||||
for (pCachedEntry = CachedEntriesHead.Flink; pCachedEntry != &CachedEntriesHead; pCachedEntry = pCachedEntry->Flink)
|
||||
{
|
||||
Info = CONTAINING_RECORD(pCachedEntry, APPLICATION_INFO, List);
|
||||
|
||||
/* do we already have this entry in cache? */
|
||||
if(_wcsicmp(FindFileData.cFileName, Info->cFileName) == 0)
|
||||
{
|
||||
/* is it current enough, or the file has been modified since our last time here? */
|
||||
if (CompareFileTime(&FindFileData.ftLastWriteTime, &Info->ftCacheStamp) == 1)
|
||||
{
|
||||
/* recreate our cache, this is the slow path */
|
||||
RemoveEntryList(&Info->List);
|
||||
HeapFree(GetProcessHeap(), 0, Info);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* speedy path, compare directly, we already have the data */
|
||||
goto skip_if_cached;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* create a new entry */
|
||||
Info = (PAPPLICATION_INFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APPLICATION_INFO));
|
||||
|
||||
if(!Info)
|
||||
break;
|
||||
|
||||
Info->Category = ParserGetInt(L"Category", FindFileData.cFileName);
|
||||
|
||||
/* copy the cache-related fields for the next time */
|
||||
RtlCopyMemory(&Info->cFileName, &FindFileData.cFileName, MAX_PATH);
|
||||
RtlCopyMemory(&Info->ftCacheStamp, &FindFileData.ftLastWriteTime, sizeof(FILETIME));
|
||||
|
||||
/* add our cached entry to the cached list */
|
||||
InsertTailList(&CachedEntriesHead, &Info->List);
|
||||
|
||||
skip_if_cached:
|
||||
|
||||
if (Info->Category == FALSE)
|
||||
continue;
|
||||
|
||||
if (EnumType != Info->Category && EnumType != ENUM_ALL_AVAILABLE)
|
||||
continue;
|
||||
|
||||
/* if our cache hit was only partial, we need to parse
|
||||
and lazily fill the rest of fields only when needed */
|
||||
|
||||
if (Info->szUrlDownload[0] == 0)
|
||||
{
|
||||
GET_STRING1(L"Name", Info->szName);
|
||||
GET_STRING1(L"URLDownload", Info->szUrlDownload);
|
||||
|
||||
GET_STRING2(L"RegName", Info->szRegName);
|
||||
GET_STRING2(L"Version", Info->szVersion);
|
||||
GET_STRING2(L"License", Info->szLicense);
|
||||
GET_STRING2(L"Description", Info->szDesc);
|
||||
GET_STRING2(L"Size", Info->szSize);
|
||||
GET_STRING2(L"URLSite", Info->szUrlSite);
|
||||
GET_STRING2(L"CDPath", Info->szCDPath);
|
||||
GET_STRING2(L"SHA1", Info->szSHA1);
|
||||
}
|
||||
|
||||
if (!lpEnumProc(Info))
|
||||
break;
|
||||
|
||||
} while (FindNextFileW(hFind, &FindFileData) != 0);
|
||||
|
||||
FindClose(hFind);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID FreeCachedAvailableEntries(VOID)
|
||||
{
|
||||
PAPPLICATION_INFO Info;
|
||||
|
||||
/* loop and deallocate all the cached app infos in the list */
|
||||
for (pCachedEntry = CachedEntriesHead.Flink; pCachedEntry != &CachedEntriesHead;)
|
||||
{
|
||||
Info = CONTAINING_RECORD(pCachedEntry, APPLICATION_INFO, List);
|
||||
|
||||
/* grab a reference to the next linked entry before getting rid of the current one */
|
||||
pCachedEntry = pCachedEntry->Flink;
|
||||
|
||||
/* flush them down the toilet :D */
|
||||
RemoveEntryList(&Info->List);
|
||||
HeapFree(GetProcessHeap(), 0, Info);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue