1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
|
/* -*- mode: C++; tab-width: 4 -*- */
/* ===================================================================== *\
Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries.
All rights reserved.
This file is part of the Palm OS Emulator.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
\* ===================================================================== */
#ifndef EmROMReader_h
#define EmROMReader_h
/*
This file defines EmROMReader, a class used to parse up raw ROM
images and return information about them, such as the version number
in the version resource, card header information, and whether or not
the splash screen is in color. This information is used when trying
to determine on what device or devices the ROM can run.
NOTE: this class used to be a template class, parameterized on LAS
and PAS in EmPalmStructs.h. The intent was that it could be used to
access a raw ROM image from disk (using LAS) or the ROM image as
utilized in the emulated address space (using PAS). However, VC++
had problems trying to compile the nested classes in the EmROMReader
class template, so that feature was sacrificed.
*/
#include "EmPalmStructs.h"
// Define this to 1 if you want to dump a list of databases
// to the log file as the ROM is being enumerated. This is
// handy when trying to find something in the ROM that differentiates
// it from other ROMs.
#define LOG_DATABASES_HACK 0
#if LOG_DATABASES_HACK
#include "Logging.h" // LogAppendMsg
#endif
#include <vector>
#include <map>
#include <string>
typedef LAS A;
class EmROMReader
{
public:
typedef A::ptr_type ptr_type;
class ChunkType
{
public:
ChunkType(void);
ChunkType(const EmAliasROMHeapChunkHdr2Type<A>& chunk, UInt32 addr);
ChunkType(const EmAliasROMHeapChunkHdr1Type<A>& chunk, UInt32 addr);
public:
bool Free(void) { return fFree; }
int Owner(void) { return fOwner; }
unsigned long TotalSize(void) { return fSize; }
size_t Size(void) { return fSize - fHdrSize - fSizeAdj; }
ptr_type GetHdrPtr(void) { return fPtr; }
ptr_type GetPtr(void) { return A::add(fPtr, (int)(fHdrSize)); }
UInt32 LocalID(void) { return fAddress; }
bool Contains(ptr_type pos, size_t len=1)
{ return (A::diff(pos, fPtr) >= 0) &&
((A::diff(pos, fPtr) + len) <= fSize); }
private:
friend class EmROMReader;
unsigned long fSize;
bool fFree;
unsigned long fSizeAdj;
int fLockCount;
int fHOffset;
int fOwner;
ptr_type fPtr;
unsigned long fAddress;
int fHdrSize;
unsigned long recordNumber;
unsigned long dbNumber;
enum
{
typeOther,
typeRecord,
typeDBHeader,
typeDBTable,
typeFree
} type;
};
typedef map<unsigned long, ChunkType> ChunkList;
class DatabaseItemType
{
public:
DatabaseItemType(void);
DatabaseItemType(const EmAliasROMDBRecordHeader1Type<A> record, EmROMReader* rom);
DatabaseItemType(const EmAliasROMDBResourceHeader1Type<A> resource, EmROMReader* rom);
public:
bool Deleted(void) { return fDeleted; }
bool Dirty(void) { return fDirty; }
bool Busy(void) { return fBusy; }
bool Secret(void) { return fSecret; }
int Category(void) { return fCategory; }
unsigned long ID(void) { return fID; }
unsigned long Type(void) { return fType; }
bool Record(void) { return fRecord; }
ChunkType* Chunk(void) { return fChunk; }
private:
friend class EmROMReader;
bool fRecord;
unsigned long fID;
unsigned long fType;
int fCategory;
bool fDeleted;
bool fDirty;
bool fBusy;
bool fSecret;
UInt32 fChunkLID;
ChunkType* fChunk;
};
typedef vector<DatabaseItemType> DatabaseItemList;
class DatabaseType
{
public:
DatabaseType(void);
DatabaseType(ChunkType* hdr, EmROMReader* rom);
public:
string& Name(void) { return fName; }
const string& Name(void) const { return fName; }
DatabaseItemList& Items(void) { return fItems; }
unsigned long CreationTime(void) { return fCreationTime; }
unsigned long ModificationTime(void) { return fModificationTime; }
unsigned long BackupTime(void) { return fBackupTime; }
unsigned int Flags(void) { return fFlags; }
unsigned int Version(void) { return fVersion; }
unsigned long UniqueIDSeed(void) { return fUniqueIDSeed; }
unsigned long Creator(void) { return fCreator; }
unsigned long Type(void) { return fType; }
private:
friend class EmROMReader;
DatabaseItemList fItems;
string fName;
unsigned long fCreator, fType;
unsigned long fCreationTime, fModificationTime, fBackupTime;
unsigned int fFlags, fVersion;
unsigned long fUniqueIDSeed;
ChunkType* fAppInfoChunk;
ChunkType* fSortInfoChunk;
};
typedef vector<DatabaseType> DatabaseList;
typedef map<unsigned long, map<int, int> > FeatureList;
public:
EmROMReader(ptr_type arenaPtr, size_t arenaSize);
~EmROMReader(void);
bool AcquireCardHeader(void);
UInt32 GuessCardAddress(void);
void SetCardAddress(UInt32 address);
bool AcquireROMHeap(void);
bool AcquireDatabases(void);
bool AcquireFeatures(void);
bool AcquireSplashDB(void);
bool ContainsDB(string dbName) const;
void Version(int& major,
int& minor,
int& fix,
int& stage,
int& build) const;
unsigned long Version(void) const;
static int IsBitmapColor (ChunkType& chunk, bool bootScreen);
public:
ChunkList& Chunks(void) { return fChunks; }
DatabaseList& Databases(void) { return fDatabases; }
FeatureList& Features(void) { return fFeatures; }
ChunkType* GetSplashChunk(void) const { return fSplashChunk; }
ptr_type GetCardHeaderPtr(void) const { return fPtr; }
ptr_type GetCardStorePtr(void) const { return A::add(fPtr, EmAliasROMCardHeader5Type<A>::GetSize()); }
bool GetFlag328(void) const { return fFlag328; }
bool GetFlagEZ(void) const { return fFlagEZ; }
bool GetFlagVZ(void) const { return fFlagVZ; }
bool GetFlagSZ(void) const { return fFlagSZ; }
UInt16 GetCardVersion(void) const { return fCardVersion; }
string GetCardName(void) const { return fCardName; }
string GetCardManufacturer(void) const { return fCardManuf; }
UInt16 GetStoreVersion(void) const { return fStoreVersion; }
UInt32 GetCompanyID(void) const { return fCompanyID; }
UInt32 GetHalID(void) const { return fHalID; }
UInt32 GetRomVersion(void) const { return fRomVersion; }
string GetRomVersionString(void) const { return fRomVersionString; }
private:
ptr_type fPtr;
size_t fSize;
ptr_type fEndPtr;
UInt32 fCardAddress;
ChunkList fChunks;
DatabaseList fDatabases;
FeatureList fFeatures;
bool fFlag328;
bool fFlagEZ;
bool fFlagVZ;
bool fFlagSZ;
UInt16 fCardVersion;
string fCardName, fCardManuf;
UInt16 fStoreVersion;
UInt32 fCompanyID, fHalID;
UInt32 fRomVersion;
string fRomVersionString;
ChunkType* fSplashChunk;
};
#endif // EmROMReader_h
|