Thank you, Jay. I should've peeked around more in the SDK =/

On Thu, May 15, 2008 at 12:00 AM, Jay Stelly <[EMAIL PROTECTED]> wrote:

> Our code does a search for the signature.
> There's code for this in src/public/zip_utils.cpp.  If that's not in the
> sdk then here's the relevant code:
>
> //----------------------------------------------------------------------
> -------
> // Purpose: Load pak file from raw buffer
> // Input  : *buffer -
> //                      bufferlength -
> //----------------------------------------------------------------------
> -------
> void CZipFile::ParseFromBuffer( void *buffer, int bufferlength )
> {
>        // Throw away old data
>        Reset();
>
>        // Initialize a buffer
>        CUtlBuffer buf( 0, bufferlength +1  );
> // +1 for null termination
>
>        // need to swap bytes, so set the buffer opposite the machine's
> endian
>        buf.ActivateByteSwapping( m_Swap.IsSwappingBytes() );
>
>        buf.Put( buffer, bufferlength );
>
>        buf.SeekGet( CUtlBuffer::SEEK_TAIL, 0 );
>        unsigned int fileLen = buf.TellGet();
>
>        // Start from beginning
>        buf.SeekGet( CUtlBuffer::SEEK_HEAD, 0 );
>
>        unsigned int offset;
>        ZIP_EndOfCentralDirRecord rec = { 0 };
>
>        bool bFoundEndOfCentralDirRecord = false;
>        for ( offset = fileLen - sizeof( ZIP_EndOfCentralDirRecord );
> offset >= 0; offset-- )
>        {
>                buf.SeekGet( CUtlBuffer::SEEK_HEAD, offset );
>                buf.GetObjects( &rec );
>                if ( rec.signature == PKID( 5, 6 ) )
>                {
>                        bFoundEndOfCentralDirRecord = true;
>
>                        // Set any xzip configuration
>                        if ( rec.commentLength )
>                        {
>                                char commentString[128];
>                                int commentLength = min(
> rec.commentLength, sizeof( commentString ) );
>                                buf.Get( commentString, commentLength );
>                                commentString[commentLength] = '\0';
>                                ParseXZipCommentString( commentString );
>                        }
>                        break;
>                }
>                else
>                {
>                        // wrong record
>                        rec.nCentralDirectoryEntries_Total = 0;
>                 }
>        }
>
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] On Behalf Of
> > Mark Chandler
> > Sent: Wednesday, May 14, 2008 8:33 PM
> > To: 'Discussion of Half-Life Programming'
> > Subject: Re: [hlcoders] Pakfile Lump Reading
> >
> > Just read in every thing but the comment into the struct.
> > Grab the size of the comment then read the comment. Not to
> > hard as I have done this about a week ago.
> >
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] On Behalf Of
> > theY4Kman
> > Sent: Thursday, May 15, 2008 10:00 AM
> > To: Discussion of Half-Life Programming
> > Subject: Re: [hlcoders] Pakfile Lump Reading
> >
> > I don't believe you understand my message correctly. The
> > ZIP_EndOfCentralDirRecord is essentially at the end of the
> > file. One would parse the file by fseek'ing to
> > (EOF-sizeof(ZIP_EndOfCentralDirRecord)) and fread'ing in the struct.
> > However, since the comment is of variable length, there is no
> > way to correctly read in the ZIP_EndOfCentralDirRecord. Thus,
> > there is no way to access commentLength.
> >
> > On Wed, May 14, 2008 at 9:53 PM, Mark Chandler
> > <[EMAIL PROTECTED]> wrote:
> >
> > > You can work out the size of the comment by commentLength
> > >
> > > -----Original Message-----
> > > From: [EMAIL PROTECTED]
> > > [mailto:[EMAIL PROTECTED] On Behalf Of
> > > theY4Kman
> > > Sent: Thursday, May 15, 2008 8:18 AM
> > > To: Discussion of Half-Life Programming
> > > Subject: [hlcoders] Pakfile Lump Reading
> > >
> > > I'm developing a C++ extension for SourceMod which will extract the
> > > files stored in the Pakfile lump of a BSP. I read over the
> > page, "The
> > > Source Engine BSP File Format
> > > <http://www.geocities.com/cofrdrbob/bspformat.html
> > > >,"
> > > by Rof and it has helped me a lot. I've been trying to retrieve the
> > > list
> > of
> > > ZIP_FileHeaders, but I've had some trouble: I don't know how it's
> > > possible to get the ZIP_EndOfCentralDirRecord. Rof's page
> > states that
> > > this struct
> > is
> > > at the end of the Pakfile lump. However, the struct has a variable
> > > length comment at the end of it. The only way I can know
> > the size of
> > > that comment is to have the ZIP_EndOfCentralDirRecord at
> > hand...You can see my dilemma.
> > >
> > > struct ZIP_EndOfCentralDirRecord
> > > {
> > >    DECLARE_BYTESWAP_DATADESC();
> > >    unsigned int    signature; // 4 bytes PK56
> > >    unsigned short    numberOfThisDisk;  // 2 bytes
> > >    unsigned short
> > numberOfTheDiskWithStartOfCentralDirectory; // 2
> > bytes
> > >    unsigned short    nCentralDirectoryEntries_ThisDisk;
> > // 2 bytes
> > >    unsigned short    nCentralDirectoryEntries_Total;    // 2 bytes
> > >    unsigned int    centralDirectorySize; // 4 bytes
> > >    unsigned int    startOfCentralDirOffset; // 4 bytes
> > >    unsigned short    commentLength; // 2 bytes
> > >    // zip file comment follows
> > > };
> > > _______________________________________________
> > > To unsubscribe, edit your list preferences, or view the
> > list archives,
> > > please visit:
> > > http://list.valvesoftware.com/mailman/listinfo/hlcoders
> > >
> > > _______________________________________________
> > > To unsubscribe, edit your list preferences, or view the
> > list archives,
> > > please visit:
> > > http://list.valvesoftware.com/mailman/listinfo/hlcoders
> > >
> > >
> > _______________________________________________
> > To unsubscribe, edit your list preferences, or view the list
> > archives, please visit:
> > http://list.valvesoftware.com/mailman/listinfo/hlcoders
> >
> > _______________________________________________
> > To unsubscribe, edit your list preferences, or view the list
> > archives, please visit:
> > http://list.valvesoftware.com/mailman/listinfo/hlcoders
> >
> >
>
> _______________________________________________
> To unsubscribe, edit your list preferences, or view the list archives,
> please visit:
> http://list.valvesoftware.com/mailman/listinfo/hlcoders
>
>
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please 
visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders

Reply via email to