From 48493314b8b44d99dc8378b7a4688b9c2b375a4c Mon Sep 17 00:00:00 2001 From: twinaphex <libretro@gmail.com> Date: Wed, 13 Aug 2014 06:53:35 +0200 Subject: [PATCH] Add content struct that fetches all members from db file --- tools/retrolaunch/main.c | 84 ++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/tools/retrolaunch/main.c b/tools/retrolaunch/main.c index cfa80960b8..c73ab64a53 100644 --- a/tools/retrolaunch/main.c +++ b/tools/retrolaunch/main.c @@ -23,33 +23,57 @@ #define SHA1_LEN 40 #define HASH_LEN SHA1_LEN -static int find_hash(int fd, const char *hash, char *game_name, size_t max_len) +struct core_file { - char token[MAX_TOKEN_LEN] = {0}; + char name[PATH_MAX]; + char desc[PATH_MAX]; + char serial[PATH_MAX]; + char size[PATH_MAX]; + char sha1[PATH_MAX]; +}; + +static int find_hash(int fd, const char *hash, char *game_name, size_t max_len, + struct core_file *info_content) +{ + if (!info_content) + return -1; + while (1) { - if (find_token(fd, "game") < 0) - return -1; - - if (find_token(fd, "name") < 0) - return -1; + if (find_token(fd, "game") < 0) return -1; + if (find_token(fd, "name") < 0) return -1; if (get_token(fd, game_name, max_len) < 0) return -1; - if (find_token(fd, "sha1") < 0) + if (find_token(fd, "description") < 0) return -1; + + if (get_token(fd, info_content->desc, sizeof(info_content->desc)) < 0) return -1; - if (get_token(fd, token, MAX_TOKEN_LEN) < 0) + if (find_token(fd, "size") < 0) return -1; + + if (get_token(fd, info_content->size, sizeof(info_content->size)) < 0) return -1; - if (!strcasecmp(hash, token)) +#if 0 + if (find_token(fd, "serial") == 0) + get_token(fd, info_content->serial, sizeof(info_content->serial)); +#endif + + if (find_token(fd, "sha1") < 0) return -1; + + if (get_token(fd, info_content->sha1, MAX_TOKEN_LEN) < 0) + return -1; + + if (!strcasecmp(hash, info_content->sha1)) return 0; } } static int -find_content_canonical_name(const char *hash, char *game_name, size_t max_len) +find_content_canonical_name(const char *hash, char *game_name, size_t max_len, + struct core_file *info_content) { // TODO: Error handling size_t i; @@ -75,7 +99,8 @@ find_content_canonical_name(const char *hash, char *game_name, size_t max_len) if (fd < 0) continue; - if (find_hash(fd, hash, game_name + offs, max_len - offs) == 0) + if (find_hash(fd, hash,game_name + offs, + max_len - offs, info_content) == 0) { rv = 0; close(fd); @@ -207,9 +232,10 @@ static int get_run_info(struct RunInfo *info, const char *game_name) } -static int detect_content_game(const char *path, char *game_name, size_t max_len) +static int detect_content_game(const char *path, char *game_name, + size_t max_len, struct core_file *info_content) { - char hash[HASH_LEN + 1]; + char hash[HASH_LEN + 1], *substr; const char *suffix = strrchr(path, '.'); if (!suffix) @@ -226,16 +252,21 @@ static int detect_content_game(const char *path, char *game_name, size_t max_len LOG_WARN("Could not calculate hash: %s", strerror(-rv)); #endif - if (find_content_canonical_name(hash, game_name, max_len) < 0) + if (find_content_canonical_name(hash, game_name, max_len, info_content) < 0) { LOG_DEBUG("Could not detect content with hash `%s`.", hash); return -EINVAL; } + substr = strrchr(game_name, '.'); + if (substr) + strcpy(info_content->name, substr + 1); + return 0; } -int detect_file(const char *path, char *game_name, size_t max_len) +int detect_file(const char *path, char *game_name, size_t max_len, + struct core_file *info_content) { if ((!strcasecmp(path + strlen(path) - 4, ".cue")) || (!strcasecmp(path + strlen(path) - 4, ".m3u"))) @@ -244,14 +275,14 @@ int detect_file(const char *path, char *game_name, size_t max_len) return detect_cd_game(path, game_name, max_len); } - LOG_INFO("Starting game content detection..."); - return detect_content_game(path, game_name, max_len); + return detect_content_game(path, game_name, max_len, info_content); } #ifndef RARCH_CONSOLE int main(int argc, char *argv[]) { struct RunInfo info; + struct core_file info_content; int rv; char game_name[MAX_TOKEN_LEN], game_name_test[256]; char *path = argv[1]; @@ -263,21 +294,18 @@ int main(int argc, char *argv[]) } LOG_INFO("Analyzing '%s'", path); - if ((rv = detect_file(path, game_name, MAX_TOKEN_LEN)) < 0) + if ((rv = detect_file(path, game_name, MAX_TOKEN_LEN, &info_content)) < 0) { LOG_WARN("Could not detect game: %s", strerror(-rv)); return -1; } - LOG_INFO("Game is `%s`", game_name); - char *substr = strrchr(game_name, '.'); - if (!substr) - *substr = '\0'; - else - { - substr = substr + 1; - LOG_INFO("Game description name is `%s`", substr); - } + LOG_INFO("Content Name : `%s`", info_content.name); + LOG_INFO("Content Description : `%s`", info_content.desc); + LOG_INFO("Content Serial : `%s`", info_content.serial); + LOG_INFO("Content Size : `%s`", info_content.size); + LOG_INFO("Content SHA-1 : `%s`", info_content.sha1); + if ((rv = get_run_info(&info, game_name)) < 0) { LOG_WARN("Could not detect run info: %s", strerror(-rv));