260 lines
4.8 KiB
C
260 lines
4.8 KiB
C
|
#include "acFileAttr.h"
|
||
|
#include "attr.h"
|
||
|
#include "version.h"
|
||
|
|
||
|
#include <assert.h>
|
||
|
|
||
|
extern FILEATTR g_arrFileAttr[];
|
||
|
|
||
|
LPVOID
|
||
|
Alloc(
|
||
|
SIZE_T cbSize)
|
||
|
{
|
||
|
return HeapAlloc(GetProcessHeap(), 0, cbSize);
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
Free(
|
||
|
LPVOID p)
|
||
|
{
|
||
|
return HeapFree(GetProcessHeap(), 0, p);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
BOOL APIENTRY
|
||
|
DllMain(
|
||
|
HANDLE hModule,
|
||
|
DWORD ul_reason,
|
||
|
LPVOID lpReserved)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
CleanupFileManager(
|
||
|
PFILEATTRMGR pMgr)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; i < VTID_LASTID - 2; i++) {
|
||
|
Free(pMgr->arrAttr[i].pszValue);
|
||
|
|
||
|
pMgr->arrAttr[i].pszValue = NULL;
|
||
|
|
||
|
pMgr->arrAttr[i].dwFlags = 0;
|
||
|
pMgr->arrAttr[i].dwValue = 0;
|
||
|
}
|
||
|
DeleteVersionStruct(&pMgr->ver);
|
||
|
|
||
|
Free(pMgr);
|
||
|
}
|
||
|
|
||
|
HANDLE
|
||
|
ReadFileAttributes(
|
||
|
LPCSTR pszFile,
|
||
|
int* pnCount
|
||
|
)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
PFILEATTRMGR pMgr = (PFILEATTRMGR)Alloc(sizeof(FILEATTRMGR));
|
||
|
|
||
|
if (pMgr == NULL) {
|
||
|
LogMsg("ReadFileAttributes: Failed to allocate %d bytes\n",
|
||
|
sizeof(FILEATTRMGR));
|
||
|
*pnCount = 0;
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
ZeroMemory(pMgr, sizeof(FILEATTRMGR));
|
||
|
|
||
|
pMgr->ver.pszFile = (PSTR)pszFile;
|
||
|
|
||
|
// initialize the version information
|
||
|
|
||
|
InitVersionStruct(&pMgr->ver);
|
||
|
|
||
|
// query the values for each attribute
|
||
|
|
||
|
for (i = 0; i < VTID_LASTID - 2; i++) {
|
||
|
g_arrFileAttr[i].QueryValue(pMgr, pMgr->arrAttr + i);
|
||
|
}
|
||
|
|
||
|
// Post processing
|
||
|
|
||
|
if (pMgr->arrAttr[VTID_FILEDATEHI - VTID_REQFILE - 1].dwValue == 0 &&
|
||
|
pMgr->arrAttr[VTID_FILEDATELO - VTID_REQFILE - 1].dwValue == 0) {
|
||
|
|
||
|
pMgr->arrAttr[VTID_FILEDATEHI - VTID_REQFILE - 1].dwFlags = 0;
|
||
|
pMgr->arrAttr[VTID_FILEDATELO - VTID_REQFILE - 1].dwFlags = 0;
|
||
|
}
|
||
|
|
||
|
// mark that the initialization was successful
|
||
|
|
||
|
pMgr->bInitialized = TRUE;
|
||
|
|
||
|
*pnCount = i;
|
||
|
|
||
|
return pMgr;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
GetAttrIndex(
|
||
|
DWORD Id)
|
||
|
{
|
||
|
int nInd;
|
||
|
|
||
|
for (nInd = 0; nInd < VTID_LASTID - 2; nInd++) {
|
||
|
if (g_arrFileAttr[nInd].dwId == Id) {
|
||
|
return nInd;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
GetAttrId(
|
||
|
int nAttrInd)
|
||
|
{
|
||
|
return g_arrFileAttr[nAttrInd].dwId;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
IsAttrAvailable(
|
||
|
HANDLE hFileMgr,
|
||
|
int nAttrInd)
|
||
|
{
|
||
|
PFILEATTRMGR pMgr = (PFILEATTRMGR)hFileMgr;
|
||
|
|
||
|
return (pMgr->arrAttr[nAttrInd].dwFlags & ATTR_FLAG_AVAILABLE);
|
||
|
}
|
||
|
|
||
|
PSTR
|
||
|
GetAttrName(
|
||
|
int nAttrInd)
|
||
|
{
|
||
|
return g_arrFileAttr[nAttrInd].pszDisplayName;
|
||
|
}
|
||
|
|
||
|
PSTR
|
||
|
GetAttrNameXML(
|
||
|
int nAttrInd)
|
||
|
{
|
||
|
return g_arrFileAttr[nAttrInd].pszNameXML;
|
||
|
}
|
||
|
|
||
|
PSTR
|
||
|
GetAttrValue(
|
||
|
HANDLE hFileMgr,
|
||
|
int nAttrInd)
|
||
|
{
|
||
|
PFILEATTRMGR pMgr = (PFILEATTRMGR)hFileMgr;
|
||
|
|
||
|
return pMgr->arrAttr[nAttrInd].pszValue;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
SelectAttr(
|
||
|
HANDLE hFileMgr,
|
||
|
int nAttrInd,
|
||
|
BOOL bSelect)
|
||
|
{
|
||
|
PFILEATTRMGR pMgr = (PFILEATTRMGR)hFileMgr;
|
||
|
|
||
|
if (!(pMgr->arrAttr[nAttrInd].dwFlags & ATTR_FLAG_AVAILABLE)) {
|
||
|
LogMsg("Attribute %s not available. Cannot be selected\n",
|
||
|
g_arrFileAttr[nAttrInd].pszDisplayName);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (bSelect) {
|
||
|
pMgr->arrAttr[nAttrInd].dwFlags |= ATTR_FLAG_SELECTED;
|
||
|
} else {
|
||
|
pMgr->arrAttr[nAttrInd].dwFlags &= ~ATTR_FLAG_SELECTED;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
IsAttrSelected(
|
||
|
HANDLE hFileMgr,
|
||
|
int nAttrInd)
|
||
|
{
|
||
|
PFILEATTRMGR pMgr = (PFILEATTRMGR)hFileMgr;
|
||
|
|
||
|
return (pMgr->arrAttr[nAttrInd].dwFlags & ATTR_FLAG_SELECTED);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
Dump(
|
||
|
HANDLE hFileMgr,
|
||
|
int nAttrInd,
|
||
|
BYTE* pBlob)
|
||
|
{
|
||
|
PFILEATTRMGR pMgr = (PFILEATTRMGR)hFileMgr;
|
||
|
|
||
|
return g_arrFileAttr[nAttrInd].DumpToBlob(nAttrInd + VTID_REQFILE + 1,
|
||
|
pMgr->arrAttr + nAttrInd,
|
||
|
pBlob);
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
BlobToString(
|
||
|
BYTE* pBlob,
|
||
|
DWORD cbSize,
|
||
|
char* pszBuff)
|
||
|
{
|
||
|
|
||
|
DWORD attrId;
|
||
|
DWORD cbRet;
|
||
|
|
||
|
pszBuff += lstrlen(pszBuff);
|
||
|
|
||
|
attrId = *(DWORD*)pBlob;
|
||
|
|
||
|
while (attrId) {
|
||
|
|
||
|
if (attrId >= VTID_LASTID) {
|
||
|
LogMsg("Unsupported attribute %d\n", attrId);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (attrId == VTID_REQFILE) {
|
||
|
|
||
|
pBlob += sizeof(DWORD);
|
||
|
|
||
|
cbRet = *(DWORD*)pBlob;
|
||
|
|
||
|
if (!cbRet) {
|
||
|
// should never happen
|
||
|
cbRet = 1;
|
||
|
}
|
||
|
pBlob += sizeof(DWORD);
|
||
|
|
||
|
wsprintf(pszBuff, "\r\nAttributes for %ws:\r\n", pBlob);
|
||
|
pszBuff += lstrlen(pszBuff);
|
||
|
|
||
|
pBlob += cbRet;
|
||
|
|
||
|
} else {
|
||
|
|
||
|
wsprintf(pszBuff, " %-22s ", g_arrFileAttr[attrId - VTID_REQFILE - 1].pszDisplayName);
|
||
|
pszBuff += lstrlen(pszBuff);
|
||
|
|
||
|
pBlob += sizeof(DWORD);
|
||
|
|
||
|
cbRet = g_arrFileAttr[attrId - VTID_REQFILE - 1].BlobToString(pBlob, pszBuff);
|
||
|
|
||
|
pszBuff += lstrlen(pszBuff);
|
||
|
pBlob += cbRet;
|
||
|
}
|
||
|
attrId = *(DWORD*)pBlob;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|