//+--------------------------------------------------------------------------- // // 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