diff options
-rw-r--r-- | base/game.h | 12 | ||||
-rw-r--r-- | common/advancedDetector.cpp | 28 | ||||
-rw-r--r-- | common/advancedDetector.h | 121 | ||||
-rw-r--r-- | engines/kyra/plugin.cpp | 26 |
4 files changed, 86 insertions, 101 deletions
diff --git a/base/game.h b/base/game.h index cb95f1730e..eca0050c51 100644 --- a/base/game.h +++ b/base/game.h @@ -55,7 +55,17 @@ struct GameDescriptor { }; /** List of games. */ -typedef Common::Array<GameDescriptor> GameList; +class GameList : public Common::Array<GameDescriptor> { +public: + GameList() {} + GameList(const GameList &list) : Common::Array<GameDescriptor>(list) {} + GameList(const PlainGameDescriptor *g) { + while (g->gameid) { + push_back(*g); + g++; + } + } +}; diff --git a/common/advancedDetector.cpp b/common/advancedDetector.cpp index 3a7028cd11..d385bbdaef 100644 --- a/common/advancedDetector.cpp +++ b/common/advancedDetector.cpp @@ -72,16 +72,6 @@ PluginError real_ADVANCED_DETECTOR_ENGINE_CREATE( return kNoGameDataFoundError; } -GameList real_ADVANCED_DETECTOR_GAMEID_LIST(const PlainGameDescriptor *list) { - GameList games; - const PlainGameDescriptor *g = list; - while (g->gameid) { - games.push_back(*g); - g++; - } - return games; -} - GameDescriptor real_ADVANCED_DETECTOR_FIND_GAMEID( const char *gameid, const PlainGameDescriptor *list, @@ -110,7 +100,7 @@ GameDescriptor real_ADVANCED_DETECTOR_FIND_GAMEID( return gs; } -DetectedGame toDetectedGame(const ADGameDescription &g, const PlainGameDescriptor *sg) { +static DetectedGame toDetectedGame(const ADGameDescription &g, const PlainGameDescriptor *sg) { const char *title = 0; while (sg->gameid) { @@ -132,7 +122,7 @@ DetectedGameList real_ADVANCED_DETECTOR_DETECT_GAMES_FUNCTION( const PlainGameDescriptor *list ) { DetectedGameList detectedGames; - Common::AdvancedDetector AdvDetector; + Common::AdvancedDetector ad; Common::ADList matches; Common::ADGameDescList descList; const byte *descPtr; @@ -140,12 +130,12 @@ DetectedGameList real_ADVANCED_DETECTOR_DETECT_GAMES_FUNCTION( for (descPtr = descs; *descPtr != 0; descPtr += descItemSize) descList.push_back((const ADGameDescription *)descPtr); - AdvDetector.registerGameDescriptions(descList); - AdvDetector.setFileMD5Bytes(md5Bytes); + ad.registerGameDescriptions(descList); + ad.setFileMD5Bytes(md5Bytes); debug(3, "%s: cnt: %d", ((const ADGameDescription *)descs)->name, descList.size()); - matches = AdvDetector.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown); + matches = ad.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown); for (uint i = 0; i < matches.size(); i++) detectedGames.push_back(toDetectedGame(*(const ADGameDescription *)(descs + matches[i] * descItemSize), list)); @@ -162,7 +152,7 @@ int real_ADVANCED_DETECTOR_DETECT_INIT_GAME( int gameNumber = -1; DetectedGameList detectedGames; - Common::AdvancedDetector AdvDetector; + Common::AdvancedDetector ad; Common::ADList matches; Common::ADGameDescList descList; const byte *descPtr; @@ -180,10 +170,10 @@ int real_ADVANCED_DETECTOR_DETECT_INIT_GAME( for (descPtr = descs; *descPtr != 0; descPtr += descItemSize) descList.push_back((const ADGameDescription *)descPtr); - AdvDetector.registerGameDescriptions(descList); - AdvDetector.setFileMD5Bytes(md5Bytes); + ad.registerGameDescriptions(descList); + ad.setFileMD5Bytes(md5Bytes); - matches = AdvDetector.detectGame(0, language, platform); + matches = ad.detectGame(0, language, platform); for (uint i = 0; i < matches.size(); i++) { if (toDetectedGame(*(const ADGameDescription *)(descs + matches[i] * descItemSize), list).gameid == gameid) { diff --git a/common/advancedDetector.h b/common/advancedDetector.h index ac64c4bb8c..437f17d8f9 100644 --- a/common/advancedDetector.h +++ b/common/advancedDetector.h @@ -53,11 +53,55 @@ struct ADObsoleteGameID { typedef Array<int> ADList; typedef Array<const ADGameDescription*> ADGameDescList; -// FIXME/TODO: Rename this function to something more sensible. -// Possibly move it inside class AdvancedDetector ? -// Maybe rename it to something like asGameList or pgdArrayToGameList, -// and move it to base/game.h. Or add a constructor to GameList ... ? -GameList real_ADVANCED_DETECTOR_GAMEID_LIST(const PlainGameDescriptor *list); + + +// TODO/FIXME: Fingolfin asks: Why is AdvancedDetector a class, considering that +// it is only used as follow: +// 1) Create an instance of it on the stack +// 2) invoke registerGameDescriptions and setFileMD5Bytes +// 3) invoke detectGame *once* +// Obviously, 2) could also be handled by passing more params to detectGame. +// So it seem we could replace this class by a simple advancedDetectGame(...) +// function, w/o a class or instantiating object... ? Or is there a deeper +// reason I miss? +class AdvancedDetector { + +public: + AdvancedDetector(); + ~AdvancedDetector() {}; + + + void registerGameDescriptions(ADGameDescList gameDescriptions) { + _gameDescriptions = gameDescriptions; + } + + /** + * Specify number of bytes which are used to calculate MD5. + * Default value is 0 which means whole file. + */ + void setFileMD5Bytes(int bytes) { _fileMD5Bytes = bytes; } + + /** + * Detect games in specified directory. + * Parameters language and platform are used to pass on values + * specified by the user. I.e. this is used to restrict search scope. + * + * @param fslist FSList to scan or NULL for scanning all specified + * default directories. + * @param language restrict results to specified language only + * @param platform restrict results to specified platform only + * @return list of indexes to GameDescriptions of matched games + */ + ADList detectGame(const FSList *fslist, Language language, Platform platform); + +private: + ADGameDescList _gameDescriptions; + + int _fileMD5Bytes; + + String getDescription(int num) const; +}; + // FIXME/TODO: Rename this function to something more sensible. // Possibly move it inside class AdvancedDetector ? @@ -102,18 +146,6 @@ PluginError real_ADVANCED_DETECTOR_ENGINE_CREATE( ); -#define ADVANCED_DETECTOR_GAMEID_LIST(engine,list) \ - GameList Engine_##engine##_gameIDList() { \ - return Common::real_ADVANCED_DETECTOR_GAMEID_LIST(list); \ - } \ - void dummyFuncToAllowTrailingSemicolon() - -#define ADVANCED_DETECTOR_FIND_GAMEID(engine,list,obsoleteList) \ - GameDescriptor Engine_##engine##_findGameID(const char *gameid) { \ - return Common::real_ADVANCED_DETECTOR_FIND_GAMEID(gameid,list,obsoleteList); \ - } \ - void dummyFuncToAllowTrailingSemicolon() - #define ADVANCED_DETECTOR_DETECT_GAMES(engine,detectFunc) \ DetectedGameList Engine_##engine##_detectGames(const FSList &fslist) { \ return detectFunc(fslist); \ @@ -132,59 +164,16 @@ PluginError real_ADVANCED_DETECTOR_ENGINE_CREATE( void dummyFuncToAllowTrailingSemicolon() #define ADVANCED_DETECTOR_DEFINE_PLUGIN(engine,createFunction,detectFunc,list,obsoleteList) \ - ADVANCED_DETECTOR_GAMEID_LIST(engine, list); \ - ADVANCED_DETECTOR_FIND_GAMEID(engine, list, obsoleteList); \ + GameList Engine_##engine##_gameIDList() { \ + return GameList(list); \ + } \ + GameDescriptor Engine_##engine##_findGameID(const char *gameid) { \ + return Common::real_ADVANCED_DETECTOR_FIND_GAMEID(gameid,list,obsoleteList); \ + } \ ADVANCED_DETECTOR_DETECT_GAMES(engine, detectFunc); \ ADVANCED_DETECTOR_ENGINE_CREATE(engine, createFunction, detectFunc, obsoleteList) -// TODO/FIXME: Fingolfin asks: Why is AdvancedDetector a class, considering that -// it is only used as follow: -// 1) Create an instance of it on the stack -// 2) invoke registerGameDescriptions and setFileMD5Bytes -// 3) invoke detectGame *once* -// Obviously, 2) could also be handled by passing more params to detectGame. -// So it seem we could replace this class by a simple advancedDetectGame(...) -// function, w/o a class or instantiating object... ? Or is there a deeper -// reason I miss? -class AdvancedDetector { - -public: - AdvancedDetector(); - ~AdvancedDetector() {}; - - - void registerGameDescriptions(ADGameDescList gameDescriptions) { - _gameDescriptions = gameDescriptions; - } - - /** - * Specify number of bytes which are used to calculate MD5. - * Default value is 0 which means whole file. - */ - void setFileMD5Bytes(int bytes) { _fileMD5Bytes = bytes; } - - /** - * Detect games in specified directory. - * Parameters language and platform are used to pass on values - * specified by the user. I.e. this is used to restrict search scope. - * - * @param fslist FSList to scan or NULL for scanning all specified - * default directories. - * @param language restrict results to specified language only - * @param platform restrict results to specified platform only - * @return list of indexes to GameDescriptions of matched games - */ - ADList detectGame(const FSList *fslist, Language language, Platform platform); - -private: - ADGameDescList _gameDescriptions; - - int _fileMD5Bytes; - - String getDescription(int num) const; -}; - } // End of namespace Common #endif diff --git a/engines/kyra/plugin.cpp b/engines/kyra/plugin.cpp index 9c24e243a8..cb98666805 100644 --- a/engines/kyra/plugin.cpp +++ b/engines/kyra/plugin.cpp @@ -39,7 +39,7 @@ enum { }; struct KYRAGameDescription { - ADGameDescription desc; + Common::ADGameDescription desc; const char *id; GameFlags flags; @@ -151,27 +151,23 @@ const KYRAGameDescription adGameDescs[] = { { { NULL, NULL, NULL, UNK_LANG, kPlatformUnknown }, NULL, KYRA2_UNK_FLAGS } }; -ADGameDescList getADDescList() { - ADGameDescList gameDesc; +static ADList detectKyraGames(const FSList &fslist) { + Common::AdvancedDetector ad; + Common::ADList matches; + Common::ADGameDescList descList; for (int i = 0; i < ARRAYSIZE(adGameDescs) - 1; ++i) { - gameDesc.push_back(&adGameDescs[i].desc); + descList.push_back(&adGameDescs[i].desc); } - return gameDesc; -} - -ADList detectKyraGames(const FSList &fslist) { - AdvancedDetector ad; - - ad.registerGameDescriptions(getADDescList()); + ad.registerGameDescriptions(descList); ad.setFileMD5Bytes(kMD5FileSizeLimit); - ADList list = ad.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown); - return list; + matches = ad.detectGame(&fslist, Common::UNK_LANG, Common::kPlatformUnknown); + return matches; } -bool setupGameFlags(const ADList &list, GameFlags &flags) { +static bool setupGameFlags(const ADList &list, GameFlags &flags) { if (!list.size()) { // maybe add non md5 based detection again? return false; @@ -224,7 +220,7 @@ const PlainGameDescriptor gameList[] = { } // End of anonymous namespace GameList Engine_KYRA_gameIDList() { - return Common::real_ADVANCED_DETECTOR_GAMEID_LIST(gameList); + return GameList(gameList); } GameDescriptor Engine_KYRA_findGameID(const char *gameid) { |