Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

persrc.cpp File Reference

#include "global.h"
#include "persrc.h"
#include <stdexcept>
#include <list>
#include "utils/f77auto_ptr"

Go to the source code of this file.

Compounds

struct  iconinfo
struct  WriteIconParam

Typedefs

typedef std::list< iconinfoTIconInfos

Functions

void CollectIconInfos (ICFile &file, const PeResourceDirectoryData *data, const PeResourceDirectoryInfo *info, unsigned level, void *param)
const iconinfofindIconInfo (const TIconInfos &infos, unsigned id)
void CopyFileToFile (const ICFile &from, ICFile &to, size_t bytes)
void WriteIcons (ICFile &file, const PeResourceDirectoryData *data, const PeResourceDirectoryInfo *info, unsigned level, void *param)


Typedef Documentation

typedef std::list<iconinfo> TIconInfos
 

Definition at line 43 of file persrc.cpp.

Referenced by findIconInfo().


Function Documentation

void CollectIconInfos ICFile   file,
const PeResourceDirectoryData   data,
const PeResourceDirectoryInfo   info,
unsigned    level,
void *    param
[static]
 

Definition at line 45 of file persrc.cpp.

References _DEBUG_, PeResourceDirectoryData::data, PeResourceDirectoryInfo::highLevel, iconinfo::id, PeResourceId::id, PeResourceId::name, iconinfo::pos, _PE_IMAGE_RESOURCE_DATA_ENTRY::Size, iconinfo::size, and ICFile::Tell().

Referenced by ResourceExtract::ExtractIcons().

00046 {
00047   _DEBUG_(fprintf(stderr,"data %p level %d name %p id %d\n", data, level, info->name, info->id ));
00048   if (data != NULL && level == 3 && info->name == NULL && info->highLevel->id == 3)
00049   {
00050     _DEBUG_(fprintf(stderr,"---data %p level %d name %p id %d\n", data, level, info->name, info->highLevel->id));
00051     iconinfo iinfo;
00052     iinfo.id = info->id;
00053     iinfo.pos = file.Tell();
00054     iinfo.size = data->data.Size;
00055     _DEBUG_(fprintf(stderr,"---id %d pos %ld size %d\n", iinfo.id, iinfo.pos, iinfo.size));
00056     
00057     (*reinterpret_cast<TIconInfos*>(param)).push_back(iinfo);
00058   }
00059 }

void CopyFileToFile const ICFile   from,
ICFile   to,
size_t    bytes
[static]
 

Definition at line 78 of file persrc.cpp.

References f77_min(), ICFile::RawRead(), and ICFile::RawWrite().

Referenced by WriteIcons().

00079 {
00080   char buffer[128];
00081   while(bytes > 0)
00082   {
00083     size_t len = f77_min(bytes,(size_t)128);
00084     from.RawRead(buffer,len);
00085     to.RawWrite(buffer,len);
00086     bytes -= len;
00087   }
00088 }

const iconinfo* findIconInfo const TIconInfos   infos,
unsigned    id
[static]
 

Definition at line 69 of file persrc.cpp.

References TIconInfos.

Referenced by WriteIcons().

00070 {
00071   TIconInfos::const_iterator end = infos.end();
00072   for(TIconInfos::const_iterator i = infos.begin(); i != end; ++i)
00073     if ( (*i).id == id )
00074       return &(*i);
00075   return NULL;
00076 }

void WriteIcons ICFile   file,
const PeResourceDirectoryData   data,
const PeResourceDirectoryInfo   info,
unsigned    level,
void *    param
[static]
 

Definition at line 90 of file persrc.cpp.

References RESDIR::BytesInRes, CopyFileToFile(), findIconInfo(), freddy77::auto_delete_ptr< _Ty >::get(), PeResourceDirectoryInfo::highLevel, RESDIR::IconCursorId, WriteIconParam::iconInfos, PeResourceId::id, WriteIconParam::n, iconinfo::pos, ICFile::RawRead(), RawRead(), CFile::RawWrite(), RawWrite(), NEWHEADER::ResCount, ICFile::Seek(), and iconinfo::size.

Referenced by ResourceExtract::ExtractIcons().

00091 {
00092   static const char zeroes[2] = { 0, 0 };
00093   if (data != NULL && level == 3 && info->highLevel->id == 14)
00094   {
00095     WriteIconParam *p = reinterpret_cast<WriteIconParam*>(param);
00096     
00097     // ok, write this icon
00098     NEWHEADER hdr;
00099     RawRead(file,hdr);
00100     
00101     char buffer[128];
00102     sprintf(buffer,"resico%d.ico",p->n);
00103     ++p->n;
00104     CFile ico(buffer,"wb");
00105     
00106     // save header
00107     RawWrite(ico,hdr);
00108     
00109     
00110     freddy77::auto_delete_ptr<const iconinfo*> icons(new const iconinfo*[hdr.ResCount]);
00111     int i;
00112     for( i = 0; i < hdr.ResCount; ++i )
00113     {
00114       RESDIR resico;
00115       // !!! fix pack problem
00116       file.RawRead(&resico,14);
00117       
00118       // save icon header
00119       // !!! fix pack problem
00120       ico.RawWrite(&resico,14);
00121       ico.RawWrite(zeroes,2);
00122       
00123       // find icon and save it
00124       const iconinfo* info = findIconInfo(p->iconInfos,resico.IconCursorId);
00125       *(icons.get()+i) = info;
00126       if (!info)
00127         throw std::runtime_error("icon not found for icon group");
00128       if (resico.BytesInRes != info->size)
00129         throw std::runtime_error("icon with wrong size");
00130       // !!! check icon dimension and colors
00131     }
00132     for( i = 0; i < hdr.ResCount; ++i )
00133     {
00134       const iconinfo* info = *(icons.get()+i);
00135       file.Seek(info->pos);
00136       CopyFileToFile(file,ico,info->size);
00137     }
00138   }
00139 }


Generated on Mon Jan 13 22:20:35 2003 for perdr by doxygen1.2.15