299 lines
7.2 KiB
C++
299 lines
7.2 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1996.
|
|
//
|
|
// File: layoutui.cxx
|
|
//
|
|
// Contents: debug UI implementation on Docfile Layout Tool
|
|
//
|
|
// Classes: CLayoutApp
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 07-Apr-96 SusiA Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "layoutui.hxx"
|
|
|
|
#if DBG==1
|
|
|
|
BOOL CompareStatStg(STATSTG *pstat1, STATSTG *pstat2)
|
|
{
|
|
if (Laylstrcmp(pstat1->pwcsName, pstat2->pwcsName) != 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (pstat1->type != pstat2->type)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (!IsEqualIID(pstat1->clsid, pstat2->clsid))
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (pstat1->type == STGTY_STREAM)
|
|
{
|
|
if ((pstat1->cbSize).QuadPart != (pstat2->cbSize).QuadPart)
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
//Also check statebits and timestamps?
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CompareStreams(IStream *pstm1, IStream *pstm2)
|
|
{
|
|
const ULONG BUFSIZE = 4096;
|
|
BYTE buffer1[BUFSIZE];
|
|
BYTE buffer2[BUFSIZE];
|
|
ULONG cbRead1;
|
|
ULONG cbRead2;
|
|
STATSTG stat1;
|
|
STATSTG stat2;
|
|
LARGE_INTEGER li;
|
|
li.QuadPart = 0;
|
|
|
|
pstm1->Seek(li, STREAM_SEEK_SET, NULL);
|
|
pstm2->Seek(li, STREAM_SEEK_SET, NULL);
|
|
|
|
do
|
|
{
|
|
SCODE sc;
|
|
sc = pstm1->Read(buffer1, BUFSIZE, &cbRead1);
|
|
if (FAILED(sc))
|
|
{
|
|
return FALSE;
|
|
}
|
|
sc = pstm2->Read(buffer2, BUFSIZE, &cbRead2);
|
|
if (FAILED(sc))
|
|
{
|
|
return FALSE;
|
|
}
|
|
if ((cbRead1 != cbRead2) || (memcmp(buffer1, buffer2, cbRead1) != 0))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
while (cbRead1 == BUFSIZE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CompareStorages(IStorage *pstg1, IStorage *pstg2)
|
|
{
|
|
SCODE sc1, sc2, sc;
|
|
HRESULT hr = TRUE;
|
|
|
|
IStorage *pstgChild1,
|
|
*pstgChild2;
|
|
|
|
IStream *pstmChild1,
|
|
*pstmChild2;
|
|
|
|
IEnumSTATSTG *penum1 = NULL,
|
|
*penum2 = NULL;
|
|
STATSTG stat1,
|
|
stat2;
|
|
|
|
pstg1->EnumElements(0, 0, 0, &penum1);
|
|
|
|
if (!penum1)
|
|
return FALSE;
|
|
|
|
pstg2->EnumElements(0, 0, 0, &penum2);
|
|
|
|
if (!penum2)
|
|
{
|
|
penum1->Release();
|
|
return FALSE;
|
|
}
|
|
|
|
do
|
|
{
|
|
ULONG celtFetched1, celtFetched2;
|
|
|
|
sc1 = penum1->Next(1, &stat1, &celtFetched1);
|
|
if (FAILED(sc1))
|
|
{
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
sc2 = penum2->Next(1, &stat2, &celtFetched2);
|
|
if (FAILED(sc2) || (celtFetched1 != celtFetched2) || (sc1 != sc2))
|
|
{
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
if (celtFetched1 == 0)
|
|
{
|
|
// we are done
|
|
hr = TRUE;
|
|
goto Done;
|
|
|
|
}
|
|
|
|
if (!CompareStatStg(&stat1, &stat2))
|
|
{
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
|
|
//Items have compared OK so far. Now compare contents.
|
|
if (stat1.type == STGTY_STREAM)
|
|
{
|
|
sc = pstg1->OpenStream(stat1.pwcsName,
|
|
0,
|
|
STGM_DIRECT |
|
|
STGM_READ | STGM_SHARE_EXCLUSIVE,
|
|
0,
|
|
&pstmChild1);
|
|
if (FAILED(sc))
|
|
{
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
sc = pstg2->OpenStream(stat2.pwcsName,
|
|
0,
|
|
STGM_DIRECT |
|
|
STGM_READ | STGM_SHARE_EXCLUSIVE,
|
|
0,
|
|
&pstmChild2);
|
|
if (FAILED(sc))
|
|
{
|
|
pstmChild1->Release();
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
if (!CompareStreams(pstmChild1, pstmChild2))
|
|
{
|
|
pstmChild1->Release();
|
|
pstmChild2->Release();
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
pstmChild1->Release();
|
|
pstmChild2->Release();
|
|
}
|
|
else
|
|
{
|
|
//Compare storages
|
|
sc = pstg1->OpenStorage(stat1.pwcsName,
|
|
NULL,
|
|
STGM_DIRECT | STGM_READ |
|
|
STGM_SHARE_EXCLUSIVE,
|
|
NULL,
|
|
0,
|
|
&pstgChild1);
|
|
if (FAILED(sc))
|
|
{
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
|
|
sc = pstg2->OpenStorage(stat2.pwcsName,
|
|
NULL,
|
|
STGM_DIRECT | STGM_READ |
|
|
STGM_SHARE_EXCLUSIVE,
|
|
NULL,
|
|
0,
|
|
&pstgChild2);
|
|
if (FAILED(sc))
|
|
{
|
|
pstgChild1->Release();
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
if (!CompareStorages(pstgChild1, pstgChild2))
|
|
{
|
|
pstgChild1->Release();
|
|
pstgChild2->Release();
|
|
hr = FALSE;
|
|
goto Done;
|
|
}
|
|
pstgChild1->Release();
|
|
pstgChild2->Release();
|
|
}
|
|
|
|
CoTaskMemFree(stat1.pwcsName);
|
|
CoTaskMemFree(stat2.pwcsName);
|
|
|
|
} while (sc1 != S_FALSE);
|
|
|
|
|
|
Done:
|
|
|
|
penum1->Release();
|
|
penum2->Release();
|
|
|
|
return hr;
|
|
|
|
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CLayoutApp::IdenticalFiles public
|
|
//
|
|
// Synopsis: Check two docfiles to ensure they are the same
|
|
//
|
|
// Returns: TRUE is the files are identical, FALSE is they are not
|
|
//
|
|
// History: 07-April-96 SusiA Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CLayoutApp::IdenticalFiles( TCHAR *patcFileOne,
|
|
TCHAR *patcFileTwo)
|
|
{
|
|
|
|
SCODE sc;
|
|
IStorage *pstgOne,
|
|
*pstgTwo;
|
|
OLECHAR awcNewFileOne[MAX_PATH];
|
|
OLECHAR awcNewFileTwo[MAX_PATH];
|
|
|
|
|
|
sc = StgOpenStorage(TCharToOleChar(patcFileOne, awcNewFileOne, MAX_PATH),
|
|
NULL,
|
|
STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE,
|
|
NULL,
|
|
0,
|
|
&pstgOne);
|
|
if (FAILED(sc))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
sc = StgOpenStorage (TCharToOleChar(patcFileTwo, awcNewFileTwo, MAX_PATH),
|
|
NULL,
|
|
STGM_DIRECT | STGM_READ | STGM_SHARE_EXCLUSIVE,
|
|
NULL,
|
|
0,
|
|
&pstgTwo);
|
|
if (FAILED(sc))
|
|
{
|
|
pstgOne->Release();
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
sc = CompareStorages(pstgOne, pstgTwo);
|
|
|
|
pstgOne->Release();
|
|
pstgTwo->Release();
|
|
|
|
if (sc)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
#endif
|