// // EX16CON.CPP // // C++/DOS Example program for ArchiveLib 2.0 // // Copyright (c) Greenleaf Software, Inc. 1994 - 1996 // All Rights Reserved // // MEMBERS/FUNCTIONS DEMONSTRATED // // ALEntry::~ALEntry() // ALEntry::ClearMark() // ALEntry::CompressionRatio() // ALEntry::GetCrc32() // ALEntry::SetMarkState() // ALStatus::GetStatusDetail() // ALStatus::GetStatusString() // // DESCRIPTION // // This example is a grab-bag, designed to highlight a bunch of barely // related functions. So don't look for any sort of intelligence at // work here, you won't find it. The program first creates a whole // bunch of ALMemory objects, initializing them with a bunch of fixed // data so that they compress fairly well. It then does a bunch of // manipulation of the memory objects in their list, deleting some, // changing the compression engine of others, and clearing the marks // of even more. Finally, it creates the archive, then displays the // list for your viewing pleasure. // // // REVISION HISTORY // // February 1, 1996 2.0A : Second release // #include #include #include #include #include #include #include "arclib.h" #include "pkarc.h" #include "glarc.h" #include "glengn.h" #include "pkengn.h" #include "bargraph.h" #include "memstore.h" #include "copyengn.h" main() { cout << "Archive Library 2.0\nEX16CON.CPP\n\n"; cout << "This example is a grab-bag, designed to highlight a bunch of barely\n"; cout << "related functions. So don't look for any sort of intelligence at\n"; cout << "work here, you won't find it. The program first creates a whole\n"; cout << "bunch of ALMemory objects, initializing them with a bunch of fixed\n"; cout << "data so that they compress fairly well. It then does a bunch of\n"; cout << "manipulation of the memory objects in their list, deleting some,\n"; cout << "changing the compression engine of others, and clearing the marks\n"; cout << "of even more. Finally, it creates the archive, then displays the\n"; cout << "list for your viewing pleasure.\n\n"; getch(); char temp[ 128 ]; ALBarGraph monitor( AL_MONITOR_JOB ); #if defined( ZIP ) ALPkArchive archive( "dos16.zip" ); #else ALGlArchive archive( "dos16.gal" ); #endif ALEntryList list( &monitor ); // // The first step is to create 24 ALMemory objects. Each one has the // contents of the temp buffer written out to it, with the temp buffer // being just a little different every time. As each object is created, // I add it to the list, along with a new copy of the greenleaf engine. // memset( temp, 'A', 128 ); for ( int i = 0 ; i < 24 ; i++ ) { char name[ 20 ]; sprintf( name, "Buffer %02d", i ); ALStorage *obj = new ALMemory( name ); obj->Create(); memset( temp + i, i, i ); obj->WriteBuffer( (unsigned char *) temp, 128 ); obj->Close(); #if defined( ZIP ) new ALEntry( list, obj, new ALPkCompressor, new ALPkDecompressor ); #else new ALEntry( list, obj, new ALGlCompressor, new ALGlDecompressor ); #endif } // // Now for fun, I am going to delete every third entry in list // ALEntry *entry = list.GetFirstEntry(); for ( ; entry != 0 ; ) { ALEntry *next_entry = entry->GetNextEntry(); delete entry; entry = next_entry->GetNextEntry(); if ( entry ) entry = entry->GetNextEntry(); } // // Now, for more fun, I am going to change the compression engine in every // third entry. // entry = list.GetFirstEntry(); for ( ; entry != 0 ; ) { if ( entry->mpCompressor->miCompressionType != #if defined( ZIP ) AL_COMPRESSION_DEFLATE ) { #else AL_COMPRESSION_GREENLEAF ) { #endif cout << "Unknown engine type!\n"; exit( 1 ); } delete entry->mpCompressor; entry->mpCompressor = new ALCopyCompressor; entry->SetComment( "No compression here" ); entry = entry->GetNextEntry(); if ( entry ) entry = entry->GetNextEntry(); if ( entry ) entry = entry->GetNextEntry(); } // // Now, for the last bit of fun, I unmark every other entry // entry = list.GetFirstEntry(); for ( ; entry != 0 ; ) { entry->ClearMark(); entry = entry->GetNextEntry(); if ( entry ) { entry->SetMarkState( 1 ); entry = entry->GetNextEntry(); } } // // Having done all that, it is time to create the archive, then print // out the list, along with the CRC and compression ratio for all // the entries. // int status = archive.Create( list ); cout << "Archive status: " << archive.mStatus << endl; cout << "\nList status:\n\n"; if ( status >= 0 ) { for ( entry = list.GetFirstEntry() ; entry ; entry = entry->GetNextEntry() ) { cout << entry->mpStorageObject->mName << " : "; if ( entry->GetMark() ) { cout << entry->CompressionRatio() << "% "; (void) cout.width( 8 ); cout << hex << entry->GetCrc32() << dec << "\n"; } else { cout << "Not marked\n"; } } } cout << "\n"; cout << "List code: " << (int) list.mStatus << "\n"; cout << "List string: " << list.mStatus.GetStatusString() << "\n"; cout << "List detail: " << list.mStatus.GetStatusDetail() << "\n"; return status; }