//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: reftest.cxx // // Contents: Reference tests // // Classes: // // Functions: // //---------------------------------------------------------------------------- #ifdef _MSC_VER #define INITGUID #endif #include #include #include #include "../../h/storage.h" // enable debugging features of memory allocation #include "../../h/dbg.hxx" #ifdef _MSC_VER #undef INITGUID #endif #include "refilb.hxx" #ifndef _WIN32 #include #else #include #endif #define STGP(x) STGM_SHARE_EXCLUSIVE | x #define STMP(x) STGM_SHARE_EXCLUSIVE | x #define ROOTP(x) STGP(x) #define EXIT_BADSC 1 int g_fTestInterop = 0; #define olHChk(e) \ if FAILED(sc = e) \ goto EH_Err #define olChk(e) olHChk(e) #include #define olAssert assert #ifdef NDEBUG #define verify(exp) 1 #else #define verify(exp) assert(exp) #endif #define ULIGetLow(ui) (ui.LowPart) // // some global variables used by all the tests // OLECHAR ocsDRT [ sizeof("drt.dfl")+1 ]; OLECHAR ocsChild [ sizeof("Child") +1 ]; OLECHAR ocsChild1[ sizeof("Child1") +1 ]; OLECHAR ocsChild2[ sizeof("Child2") +1 ]; OLECHAR ocsStream[ sizeof("Stream") +1 ]; OLECHAR ocsRenamedStream[ sizeof("RenamedStream") +1 ]; OLECHAR ocsRenamedChild[ sizeof("RenamedChild") +1 ]; void error(int code, char *fmt, ...) { va_list args; args = va_start(args, fmt); printf("** Fatal error **: "); vprintf(fmt, args); va_end(args); exit(code); } BOOL IsEqualTime(FILETIME ttTime, FILETIME ttCheck) { return ttTime.dwLowDateTime == ttCheck.dwLowDateTime && ttTime.dwHighDateTime == ttCheck.dwHighDateTime; } SCODE t_create(BOOL fTestStorage, BOOL fLarge) { IStorage *pstgRoot, *pstgChild, *pstgChild2; IStream *pstm; SCODE sc; ILockBytes *pilb=NULL; if (!fTestStorage) { printf("Testing Create ILB\n"); pilb = new CFileILB(ocsDRT, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk( StgCreateDocfileOnILockBytes( pilb, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } else if (fLarge) { STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; printf("Testing Create large storage\n"); olHChk(StgCreateStorageEx ( ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstgRoot)); } else { printf("Testing Create storage\n"); olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } olHChk(pstgRoot->CreateStorage(ocsChild, STGP(STGM_READWRITE), 0, 0, &pstgChild)); olHChk(pstgChild->CreateStorage(ocsChild2, STGP(STGM_READWRITE), 0, 0, &pstgChild2)); olHChk(pstgChild2->CreateStream(ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); pstm->Release(); olHChk(pstgChild2->Commit(0)); pstgChild2->Release(); olHChk(pstgChild->Commit(0)); pstgChild->Release(); pstgRoot->Release(); if (pilb) pilb->Release(); EH_Err: return sc; } SCODE t_open(BOOL fTestStorage, BOOL fLarge) { SCODE sc; IStorage *pstgRoot, *pstgChild, *pstgChild2; IStream *pstm; ILockBytes *pilb=NULL; if (!fTestStorage) { printf("Testing Open ILB\n"); pilb = new CFileILB(ocsDRT, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk(StgCreateDocfileOnILockBytes(pilb, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } else if (fLarge) { STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; printf("Testing Open large storage\n"); olHChk(StgCreateStorageEx ( ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstgRoot)); } else { // create a storage printf("Testing Open storage\n"); olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } olHChk(pstgRoot->CreateStorage(ocsChild, STGP(STGM_READWRITE), 0, 0, &pstgChild)); olHChk(pstgChild->CreateStorage(ocsChild2, STGP(STGM_READWRITE), 0, 0, &pstgChild2)); olHChk(pstgChild2->CreateStream(ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); pstm->Release(); pstgChild2->Release(); pstgChild->Release(); olHChk(pstgRoot->Commit(0)); pstgRoot->Release(); if (!fTestStorage) { olHChk(StgOpenStorageOnILockBytes(pilb, NULL, ROOTP(STGM_READWRITE), NULL, 0, &pstgRoot)); } else { olHChk(StgOpenStorage(ocsDRT, NULL, ROOTP(STGM_READWRITE), NULL, 0, &pstgRoot)); } olHChk(pstgRoot->OpenStorage( ocsChild, NULL, STGP(STGM_READWRITE), NULL, 0, &pstgChild)); olHChk(pstgChild->OpenStorage( ocsChild2, NULL, STGP(STGM_READWRITE), NULL, 0, &pstgChild2)); olHChk(pstgChild2->OpenStream( ocsStream, NULL, STMP(STGM_READWRITE), 0, &pstm)); pstm->Release(); pstgChild2->Release(); pstgChild->Release(); pstgRoot->Release(); if (pilb) pilb->Release(); EH_Err: return sc; } // t_open SCODE t_addref(BOOL fTestStorage, BOOL fLarge) { SCODE sc; IStorage *pstg; IStream *pstm; ULONG ul; ILockBytes *pilb=NULL; if (!fTestStorage) { printf("Testing Addref ILB\n"); pilb = new CFileILB(ocsDRT, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk(StgCreateDocfileOnILockBytes(pilb, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstg)); } else if (fLarge) { STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; printf("Testing AddRef large storage\n"); olHChk(StgCreateStorageEx ( ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstg)); } else { printf("Testing Addref Storage\n"); olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstg)); } olHChk(pstg->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); if ((ul = pstm->AddRef()) != 2) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstm->Release()) != 1) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); pstm->Release(); if ((ul = pstg->AddRef()) != 2) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstg->Release()) != 1) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); pstg->Release(); if (pilb) pilb->Release(); EH_Err: return sc; } // t_addref SCODE t_dmodify(BOOL fTestStorage, BOOL fLarge) { SCODE sc; IStorage *pstgRoot, *pstgChild, *pstgChild2; IStream *pstm; ILockBytes *pilb=NULL; DECLARE_OLESTR(ocs88, "88"); DECLARE_OLESTR(ocs84, "84"); DECLARE_OLESTR(ocs92, "92"); DECLARE_OLESTR(ocs64, "64"); DECLARE_OLESTR(ocs32, "32"); DECLARE_OLESTR(ocs96, "96"); DECLARE_OLESTR(ocs80, "80"); if (!fTestStorage) { printf("Testing Modify ILB\n"); pilb = new CFileILB(ocsDRT, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk(StgCreateDocfileOnILockBytes(pilb, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } else if (fLarge) { STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; printf("Testing Modify large storage\n"); olHChk(StgCreateStorageEx ( ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstgRoot)); } else { printf("Testing Modify Storage\n"); olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } olHChk(pstgRoot->CreateStorage(ocsChild, STGP(STGM_READWRITE), 0, 0, &pstgChild)); olHChk(pstgChild->CreateStorage(ocsChild2, STGP(STGM_READWRITE), 0, 0, &pstgChild2)); olHChk(pstgChild2->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); pstm->Release(); // Test renaming a closed stream olHChk(pstgChild2->RenameElement(ocsStream, ocsRenamedStream)); // Test destroying a stream olHChk(pstgChild2->DestroyElement(ocsRenamedStream)); // Test renaming an open stream olHChk(pstgChild2->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); olHChk(pstgChild2->RenameElement(ocsStream, ocsRenamedStream)); olHChk(pstgChild2->DestroyElement(ocsRenamedStream)); pstm->Release(); pstgChild2->Release(); // Test renaming a storage olHChk(pstgChild->RenameElement(ocsChild2, ocsRenamedChild)); olHChk(pstgChild->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); pstm->Release(); olHChk(pstgChild->DestroyElement(ocsStream)); // Test SetElementTimes FILETIME tm; STATSTG stat; tm.dwLowDateTime = 0x12345678; tm.dwHighDateTime = 0x9abcdef0; // Set when element not open olHChk(pstgChild->SetElementTimes(ocsRenamedChild, &tm, NULL, NULL)); olHChk(pstgChild->SetElementTimes(ocsRenamedChild, NULL, &tm, NULL)); olHChk(pstgChild->SetElementTimes(ocsRenamedChild, NULL, NULL, &tm)); olHChk(pstgChild->OpenStorage( ocsRenamedChild, NULL, STMP(STGM_READWRITE), NULL, 0, &pstgChild2)); olHChk(pstgChild2->Stat(&stat, STATFLAG_NONAME)); if (!IsEqualTime(stat.ctime, tm) || !IsEqualTime(stat.mtime, tm)) error(EXIT_BADSC, "Times don't match those set by SetElementTimes\n"); // Test SetClass and SetStateBits olHChk(pstgChild2->SetClass(IID_IStorage)); olHChk(pstgChild2->SetStateBits(0xff00ff00, 0xffffffff)); olHChk(pstgChild2->SetStateBits(0x00880088, 0xeeeeeeee)); olHChk(pstgChild2->Stat(&stat, STATFLAG_NONAME)); if (!IsEqualCLSID(stat.clsid, IID_IStorage)) error(EXIT_BADSC, "Class ID set improperly\n"); if (stat.grfStateBits != 0x11881188) error(EXIT_BADSC, "State bits set improperly: has %lX vs. %lX\n", stat.grfStateBits, 0x11881188); pstgChild2->Release(); pstgChild->Release(); olHChk(pstgRoot->Revert()); olHChk(pstgRoot->Commit(0)); olHChk(pstgRoot->DestroyElement(ocsChild)); olHChk(pstgRoot->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); ULARGE_INTEGER ulSize; ULISet32(ulSize, 65536); olHChk(pstm->SetSize(ulSize)); pstm->Release(); olHChk(pstgRoot->DestroyElement(ocsStream)); olHChk(pstgRoot->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); olHChk(pstm->SetSize(ulSize)); pstm->Release(); pstgRoot->Release(); if (pilb) pilb->Release(); if (!fTestStorage) { pilb = new CFileILB((TCHAR*)NULL, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk(StgCreateDocfileOnILockBytes(pilb, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } else { olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } // removal cases // 1) no right child olHChk(pstgRoot->CreateStorage(ocs64, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->CreateStorage(ocs32, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->DestroyElement(ocs64)); // 2) right child has no left child olHChk(pstgRoot->CreateStorage(ocs64, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->DestroyElement(ocs32)); // 3) right child has left child olHChk(pstgRoot->CreateStorage(ocs96, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->CreateStorage(ocs80, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->DestroyElement(ocs64)); // 4) right child's left child has children olHChk(pstgRoot->CreateStorage(ocs88, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->CreateStorage(ocs84, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->CreateStorage(ocs92, STGP(STGM_READWRITE), 0, 0, &pstgChild)); pstgChild->Release(); olHChk(pstgRoot->DestroyElement(ocs80)); pstgRoot->Release(); if (pilb) pilb->Release(); EH_Err: return sc; } SCODE t_stat(BOOL fTestStorage, BOOL fLarge) { SCODE sc; IStorage *pstgRoot, *pstgChild; IStream *pstm; STATSTG stat; ILockBytes *pilb=NULL; if (!fTestStorage) { printf("Testing Stat ILB\n"); pilb = new CFileILB(ocsDRT, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk(StgCreateDocfileOnILockBytes(pilb, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } else if (fLarge) { STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; printf("Testing Stat large storage\n"); olHChk(StgCreateStorageEx ( ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstgRoot)); } else { printf("Testing Stat Storage\n"); // create a storage olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstgRoot)); } olHChk(pstgRoot->CreateStorage(ocsChild, STGP(STGM_READWRITE), 0, 0, &pstgChild)); olHChk(pstgChild->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); olHChk(pstm->Stat(&stat, 0)); delete [] stat.pwcsName; olHChk(pstm->Stat(&stat, STATFLAG_NONAME)); pstm->Release(); olHChk(pstgChild->Stat(&stat, 0)); delete [] stat.pwcsName; olHChk(pstgChild->Stat(&stat, STATFLAG_NONAME)); pstgChild->Release(); olHChk(pstgRoot->Stat(&stat, 0)); delete[] stat.pwcsName; olHChk(pstgRoot->Stat(&stat, STATFLAG_NONAME)); pstgRoot->Release(); if (pilb) pilb->Release(); EH_Err: return sc; } static char NUMBERS[] = "12345678901234567890123456789012345678901234567890"; SCODE t_stream(BOOL fTestStorage, BOOL fCreate, BOOL fLarge) { SCODE sc; IStorage *pstg=NULL, *pstg1=NULL, *pstg2=NULL, *pstg3=NULL; IStream *pstm=NULL, *pstmC=NULL, *pstm1=NULL, *pstm2=NULL; char buf[sizeof(NUMBERS)*2]; ULONG cb; ULARGE_INTEGER ulPos, ulSize; LARGE_INTEGER lPos; ILockBytes *pilb=NULL; int i=0; DECLARE_OLESTR(ocsStorage1, "Storage1"); DECLARE_OLESTR(ocsStorage1Stream1, "Storage1Stream1"); DECLARE_OLESTR(ocsStorage2, "Storage2"); DECLARE_OLESTR(ocsStorage2Storage1, "Storage2Storage1"); DECLARE_OLESTR(ocsStorage3Stream1, "Storage3Stream1"); if (fCreate) { if (!fTestStorage) { printf("Testing streams for ILB\n"); pilb = new CFileILB(ocsDRT, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk(StgCreateDocfileOnILockBytes(pilb, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstg)); } else if (fLarge) { STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; printf("Testing streams for large storage\n"); olHChk(StgCreateStorageEx ( ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstg)); } else { printf("Testing streams for Storage\n"); // create a storage on the ILockBytes olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, 0, &pstg)); } olHChk(pstg->CreateStream( ocsStream, STMP(STGM_READWRITE), 0, 0, &pstm)); olHChk(pstg->CreateStorage( ocsStorage1, STMP(STGM_READWRITE), 0, 0, &pstg1)); olHChk(pstg1->CreateStream( ocsStorage1Stream1, STMP(STGM_READWRITE), 0, 0, &pstm1)); olHChk(pstg->CreateStorage( ocsStorage2, STMP(STGM_READWRITE), 0, 0, &pstg2)); olHChk(pstg2->CreateStorage( ocsStorage2Storage1, STMP(STGM_READWRITE), 0, 0, &pstg3)); olHChk(pstg3->CreateStream( ocsStorage3Stream1, STMP(STGM_READWRITE), 0, 0, &pstm2)); for (i=0; i<20; i++) olHChk(pstm->Write(NUMBERS, sizeof(NUMBERS), &cb)); for (i=0; i<20; i++) olHChk(pstm2->Write(NUMBERS, sizeof(NUMBERS), &cb)); olHChk(pstm->Commit(0)); unsigned long ul; if ((ul = pstm->Release())!=0) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstm1->Release())!=0) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstm2->Release())!=0) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstg->Release())!=0) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstg1->Release())!=0) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstg2->Release())!=0) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if ((ul = pstg3->Release())!=0) error(EXIT_BADSC, "Wrong reference count - %lu\n", ul); if (pilb) verify (0 == pilb->Release()); return sc; } if (!fTestStorage) { pilb = new CFileILB(ocsDRT, (DWORD)NULL); if (pilb == NULL) error(EXIT_BADSC, "Unable to allocate an ILockBytes\n"); // create a storage on the ILockBytes olHChk(StgOpenStorageOnILockBytes(pilb, NULL, ROOTP(STGM_READWRITE), NULL, 0, &pstg)); } else { olHChk(StgOpenStorage(ocsDRT, NULL, ROOTP(STGM_READWRITE), NULL, 0, &pstg)); } olHChk(pstg->OpenStream( ocsStream, NULL, STMP(STGM_READWRITE), 0, &pstm)); olHChk(pstg->OpenStorage( ocsStorage1, NULL, STMP(STGM_READWRITE), 0, 0, &pstg1)); olHChk(pstg1->OpenStream( ocsStorage1Stream1, NULL, STMP(STGM_READWRITE), 0, &pstm1)); olHChk(pstg->OpenStorage( ocsStorage2, NULL, STMP(STGM_READWRITE), 0, 0, &pstg2)); olHChk(pstg2->OpenStorage( ocsStorage2Storage1, 0, STMP(STGM_READWRITE), 0, 0, &pstg3)); olHChk(pstg3->OpenStream( ocsStorage3Stream1, 0, STMP(STGM_READWRITE), 0, &pstm2)); lPos.QuadPart = 0; olHChk(pstm->Seek(lPos, STREAM_SEEK_SET, &ulPos)); if (ulPos.QuadPart != 0) error(EXIT_BADSC, "Incorrect seek, ptr is %lu\n", ulPos.QuadPart); for (i=0; i<20; i++) { olHChk(pstm->Read(buf, sizeof(NUMBERS), &cb)); if (strcmp(buf, NUMBERS)) error(EXIT_BADSC, "Incorrect stream contents\n"); } ulPos.QuadPart = 0; olHChk(pstm2->Seek(lPos, STREAM_SEEK_SET, &ulPos)); if (ulPos.QuadPart != 0) error(EXIT_BADSC, "Incorrect seek, ptr is %lu\n", ulPos.QuadPart); for (i=0; i<20; i++) { olHChk(pstm2->Read(buf, sizeof(NUMBERS), &cb)); if (strcmp(buf, NUMBERS)) error(EXIT_BADSC, "Incorrect stream contents\n"); } if (!g_fTestInterop) { // some tests that changes the contents ULISet32(ulSize, sizeof(NUMBERS)/2); olHChk(pstm->SetSize(ulSize)); olHChk(pstm->Seek(lPos, STREAM_SEEK_SET, NULL)); olHChk(pstm->Read(buf, sizeof(NUMBERS), &cb)); if (cb != sizeof(NUMBERS)/2) error(EXIT_BADSC, "SetSize failed to size stream properly\n"); if (memcmp(buf, NUMBERS, sizeof(NUMBERS)/2)) error(EXIT_BADSC, "SetSize corrupted contents\n"); olHChk(pstm->Clone(&pstmC)); olHChk(pstm->Seek(lPos, STREAM_SEEK_SET, NULL)); olHChk(pstm->CopyTo(pstmC, ulSize, NULL, NULL)); olHChk(pstm->Seek(lPos, STREAM_SEEK_SET, NULL)); ULISet32(ulSize, sizeof(NUMBERS)&~1); olHChk(pstm->CopyTo(pstmC, ulSize, NULL, NULL)); olHChk(pstm->Seek(lPos, STREAM_SEEK_SET, NULL)); olHChk(pstm->Read(buf, (sizeof(NUMBERS)&~1)*2, &cb)); if (memcmp(buf, NUMBERS, sizeof(NUMBERS)/2) || memcmp(buf+sizeof(NUMBERS)/2, NUMBERS, sizeof(NUMBERS)/2) || memcmp(buf+(sizeof(NUMBERS)&~1), NUMBERS, sizeof(NUMBERS)/2) || memcmp(buf+3*(sizeof(NUMBERS)/2), NUMBERS, sizeof(NUMBERS)/2)) error(EXIT_BADSC, "Stream contents incorrect\n"); verify( 0 == pstmC->Release()); } EH_Err: if (pstm) verify( 0 == pstm->Release() ); if (pstm1) verify( 0 == pstm1->Release() ); if (pstm2) verify( 0 == pstm2->Release() ); if (pstg) verify( 0 == pstg->Release() ); if (pstg1) verify( 0 == pstg1->Release() ); if (pstg2) verify( 0 == pstg2->Release() ); if (pstg3) verify( 0 == pstg3->Release() ); if (pilb) verify( 0 == pilb->Release() ); return sc; } SCODE t_stgmisc(BOOL fLarge) { SCODE sc; IStorage *pstg; FILE *f; _unlink("drt.dfl"); // create zero byte file f= fopen("drt.dfl", "w+b"); fclose(f); olAssert(StgIsStorageFile(ocsDRT)==S_FALSE); _unlink("drt.dfl"); if (fLarge) { STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; olHChk(StgCreateStorageEx ( ocsDRT, STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstg)); } else olHChk(StgCreateDocfile(ocsDRT, STGM_READWRITE|STGM_CREATE|STGM_SHARE_EXCLUSIVE, 0, &pstg)); olAssert(StgIsStorageFile(ocsDRT)==S_OK); pstg->Release(); EH_Err: return sc; } SCODE t_large () { IStorage *pstg = NULL; IStream *pstm = NULL; SCODE sc = S_OK; STGOPTIONS stgoptions; stgoptions.usVersion = STGOPTIONS_VERSION; stgoptions.reserved = 0; stgoptions.ulSectorSize = 4096; stgoptions.pwcsTemplateFile = NULL; olChk(StgCreateStorageEx ( _T("large.dfl"), STGM_READWRITE | STGM_CREATE | STGM_SHARE_EXCLUSIVE, STGFMT_DOCFILE, 0, &stgoptions, 0, IID_IStorage, (void **) &pstg)); olChk(pstg->CreateStream( _T("large"), STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &pstm)); ULARGE_INTEGER ulSize; ulSize.QuadPart = MAX_ULONG + (ULONGLONG) sizeof(NUMBERS); olChk(pstm->SetSize(ulSize)); for (ULONG i=0; i < MAX_ULONG/sizeof(NUMBERS) + 1; i++) { ULONG cb; olChk(pstm->Write(NUMBERS, sizeof(NUMBERS), &cb)); } olChk(pstg->Commit(STGC_DEFAULT)); EH_Err: if (pstm != NULL) pstm->Release(); if (pstg != NULL) pstg->Release(); return sc; } void terminate(void) { printf("Terminate() called!\n"); exit(-1); } int main(int argc, char** argv) { SCODE sc; int fCreate=0; // change the following line to whatever number to detect mem leaks //_CrtSetBreakAlloc(146); // initialize the strings INIT_OLESTR(ocsDRT, "drt.dfl"); INIT_OLESTR(ocsChild, "Child"); INIT_OLESTR(ocsChild1, "Child1"); INIT_OLESTR(ocsChild2, "Child2"); INIT_OLESTR(ocsStream, "Stream"); INIT_OLESTR(ocsRenamedStream, "RenamedStream"); INIT_OLESTR(ocsRenamedChild, "RenamedChild"); printf("Reference storage tests:\n"); printf("Optional features:\n"); printf("Use '%s c' to create a test file\n", argv[0]); printf("Use '%s r' to verify read of the test file\n", argv[0]); printf("-----\n"); if (argc==2) { printf(" * Interops testing --- "); if (*(argv[1])=='c') { printf("Create\n"); fCreate=1; } else if (*(argv[1])=='r') printf("Read\n"); else { printf("Wrong args: usage\nreftest [c|r]\nc - Create\nr - read\n"); return 0; } g_fTestInterop = 1; } if (g_fTestInterop) { olChk(t_stream(FALSE, fCreate, FALSE)); printf("\nTests passed successfully.\n"); exit(0); } printf("\nTesting ILockBytes\n\n"); olChk(t_create(FALSE, FALSE)); olChk(t_open(FALSE, FALSE)); olChk(t_addref(FALSE, FALSE)); olChk(t_stream(FALSE, TRUE, FALSE)); olChk(t_stat(FALSE, FALSE)); olChk(t_dmodify(FALSE, FALSE)); printf("\nTesting Storage\n\n"); olChk(t_create(TRUE, FALSE)); olChk(t_open(TRUE, FALSE)); olChk(t_addref(TRUE, FALSE)); olChk(t_dmodify(TRUE, FALSE)); olChk(t_stream(TRUE, TRUE, FALSE)); olChk(t_stat(TRUE, FALSE)); olChk(t_stgmisc(FALSE)); printf("\nTesting large Storage\n\n"); olChk(t_create(TRUE, TRUE)); olChk(t_open(TRUE, TRUE)); olChk(t_addref(TRUE, TRUE)); olChk(t_dmodify(TRUE, TRUE)); olChk(t_stream(TRUE, TRUE, TRUE)); olChk(t_stat(TRUE, TRUE)); olChk(t_stgmisc(TRUE)); #ifdef TEST_LARGE olChk(t_large()); #endif printf("\nTests passed successfully.\n"); return 0; EH_Err: printf("Tests failed with error %lX\n",sc); return EXIT_BADSC; } #ifdef _MSC_VER // some of these functions are a nuisance #pragma warning (disable:4127) // conditional expression is constant #pragma warning (disable:4514) // unreferenced inline function #endif