From 865d8717a3270f3b913a3fbfa64bcfc5ca746db4 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Tue, 19 Dec 2006 22:43:15 +0000 Subject: * Change the GameList typedef to a proper class with an additional constructor which takes a PlainGameDescriptor 'list' * Replaced real_ADVANCED_DETECTOR_GAMEID_LIST by this new constructor * Removed ADVANCED_DETECTOR_GAMEID_LIST and ADVANCED_DETECTOR_FIND_GAMEID * Some minor cleanup svn-id: r24893 --- common/advancedDetector.cpp | 28 ++++------ common/advancedDetector.h | 121 ++++++++++++++++++++------------------------ 2 files changed, 64 insertions(+), 85 deletions(-) (limited to 'common') 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 ADList; typedef Array 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 -- cgit v1.2.3