diff --git a/console/griffin/griffin.c b/console/griffin/griffin.c
index b83fb7dac4..e57806cb6b 100644
--- a/console/griffin/griffin.c
+++ b/console/griffin/griffin.c
@@ -112,10 +112,8 @@
/*============================================================
FILE
============================================================ */
-#if defined(__CELLOS_LV2__)
+#if defined(__CELLOS_LV2__) || defined(_XBOX)
#include "../../ps3/file_browser.c"
-#elif defined(_XBOX)
-#include "../../360/file_browser.c"
#endif
#include "../../file.c"
diff --git a/ps3/file_browser.c b/ps3/file_browser.c
index 1ec92454b7..8a7e174269 100644
--- a/ps3/file_browser.c
+++ b/ps3/file_browser.c
@@ -16,11 +16,14 @@
* If not, see .
*/
-#include
+#ifdef _XBOX
+#include
+#endif
#include "file_browser.h"
static int less_than_key(const void * a, const void * b)
{
+#ifdef __CELLOS_LV2__
DirectoryEntry * a_dir = (DirectoryEntry*)a;
DirectoryEntry * b_dir = (DirectoryEntry*)b;
@@ -31,6 +34,9 @@ static int less_than_key(const void * a, const void * b)
return 1;
return strcasecmp(a_dir->d_name, b_dir->d_name);
+#else
+ return 0;
+#endif
}
static const char * filebrowser_get_extension(const char * filename)
@@ -45,7 +51,7 @@ static const char * filebrowser_get_extension(const char * filename)
static void filebrowser_clear_current_entries(filebrowser_t * filebrowser)
{
- for(uint32_t i = 0; i < MAX_FILE_LIMIT_CFS; i++)
+ for(uint32_t i = 0; i < MAX_FILE_LIMIT; i++)
{
filebrowser->cur[filebrowser->file_count].d_type = 0;
filebrowser->cur[filebrowser->file_count].d_namlen = 0;
@@ -53,14 +59,81 @@ static void filebrowser_clear_current_entries(filebrowser_t * filebrowser)
}
}
-static bool filebrowser_parse_directory(filebrowser_t * filebrowser,
+static void filebrowser_parse_directory(filebrowser_t * filebrowser,
const char * path, const char * extensions)
{
+ int error = 0;
+#if defined(_XBOX)
+ filebrowser->file_count = 0;
+
+ WIN32_FIND_DATA ffd;
+ HANDLE hFind = INVALID_HANDLE_VALUE;
+
+ char path_buf[PATH_MAX];
+
+ if (strlcpy(path_buf, path, sizeof(path_buf)) >= sizeof(path_buf))
+ {
+ error = 1;
+ goto error;
+ }
+ if (strlcat(path_buf, "\\*", sizeof(path_buf)) >= sizeof(path_buf))
+ {
+ error = 1;
+ goto error;
+ }
+
+ hFind = FindFirstFile(path_buf, &ffd);
+ if (hFind == INVALID_HANDLE_VALUE)
+ {
+ error = 1;
+ goto error;
+ }
+
+ do
+ {
+ strcpy(filebrowser->dir[filebrowser->directory_stack_size], path);
+ bool found_dir = false;
+ if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ char tmp_extensions[512];
+ strncpy(tmp_extensions, extensions, sizeof(tmp_extensions));
+ const char * current_extension = filebrowser_get_extension(ffd.cFileName);
+ bool found_rom = false;
+
+ if(current_extension)
+ {
+ char * pch = strtok(tmp_extensions, "|");
+ while (pch != NULL)
+ {
+ if(strcmp(current_extension, pch) == 0)
+ {
+ found_rom = true;
+ break;
+ }
+ pch = strtok(NULL, "|");
+ }
+ }
+
+ if(!found_rom)
+ continue;
+ }
+ else if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ found_dir = true;
+
+ filebrowser->cur[filebrowser->file_count].d_type = found_dir ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL;
+ sprintf(filebrowser->cur[filebrowser->file_count].d_name, ffd.cFileName);
+
+ filebrowser->file_count++;
+ }while (FindNextFile(hFind, &ffd) != 0 && (filebrowser->file_count + 1) < MAX_FILE_LIMIT);
+#elif defined(__CELLOS_LV2__)
int fd;
/* bad path*/
if (strcmp(path,"") == 0)
- return false;
+ {
+ error = 1;
+ goto error;
+ }
/* delete old path*/
filebrowser_clear_current_entries(filebrowser);
@@ -122,18 +195,29 @@ const char * path, const char * extensions)
cellFsClosedir(fd);
}
else
- return false;
+ {
+ error = 1;
+ goto error;
+ }
qsort(filebrowser->cur, filebrowser->file_count, sizeof(DirectoryEntry), less_than_key);
-
- return true;
+#endif
+ error:
+ if(error)
+ {
+ SSNES_ERR("Failed to open directory: \"%s\"\n", path);
+ }
+#ifdef _XBOX
+ FindClose(hFind);
+#endif
}
void filebrowser_new(filebrowser_t * filebrowser, const char * start_dir,
const char * extensions)
{
+ filebrowser_clear_current_entries(filebrowser);
filebrowser->directory_stack_size = 0;
- strncpy(filebrowser->extensions, extensions, sizeof(filebrowser->extensions));
+ strlcpy(filebrowser->extensions, extensions, sizeof(filebrowser->extensions));
filebrowser_parse_directory(filebrowser, start_dir, filebrowser->extensions);
}
@@ -142,9 +226,8 @@ const char * extensions)
void filebrowser_reset_start_directory(filebrowser_t * filebrowser, const char * start_dir,
const char * extensions)
{
- filebrowser_clear_current_entries(filebrowser);
filebrowser->directory_stack_size = 0;
- strncpy(filebrowser->extensions, extensions, sizeof(filebrowser->extensions));
+ strlcpy(filebrowser->extensions, extensions, sizeof(filebrowser->extensions));
filebrowser_parse_directory(filebrowser, start_dir, filebrowser->extensions);
}
@@ -153,7 +236,6 @@ void filebrowser_push_directory(filebrowser_t * filebrowser, const char * path,
bool with_extension)
{
filebrowser->directory_stack_size++;
-
if(with_extension)
filebrowser_parse_directory(filebrowser, path, filebrowser->extensions);
else
diff --git a/ps3/file_browser.h b/ps3/file_browser.h
index 518c907e44..aa4f9f5a60 100644
--- a/ps3/file_browser.h
+++ b/ps3/file_browser.h
@@ -41,24 +41,27 @@
#define MAXJOLIET 255
#define MAX_PATH_LENGTH 1024
-#define CELL_FS_MAX_FS_FILE_NAME_LENGTH (255)
-#define MAX_FILE_LIMIT_CFS 30000
+#include
+#include
+
+#ifdef __CELLOS_LV2__
#include
#include
-
-#include
-
#include
-
-#ifdef __cplusplus
-extern "C" {
+#define FS_MAX_PATH 256
+#define FS_MAX_FS_PATH_LENGTH 255
+#define MAX_FILE_LIMIT 30000
+#elif defined(_XBOX)
+#define FS_MAX_PATH MAX_PATH
+#define FS_MAX_FS_PATH_LENGTH 2048
+#define MAX_FILE_LIMIT 4096
#endif
typedef struct {
uint8_t d_type;
uint8_t d_namlen;
- char d_name[CELL_FS_MAX_FS_FILE_NAME_LENGTH+1];
+ char d_name[FS_MAX_PATH];
} DirectoryEntry;
typedef struct
@@ -66,8 +69,8 @@ typedef struct
uint32_t file_count; /* amount of files in current dir*/
uint32_t currently_selected; /* currently select browser entry*/
uint32_t directory_stack_size;
- char dir[128][CELL_FS_MAX_FS_PATH_LENGTH]; /* info of the current directory*/
- DirectoryEntry cur[MAX_FILE_LIMIT_CFS]; /* current file listing*/
+ char dir[128][FS_MAX_FS_PATH_LENGTH]; /* info of the current directory*/
+ DirectoryEntry cur[MAX_FILE_LIMIT]; /* current file listing*/
char extensions[512]; /* allowed extensions*/
} filebrowser_t;
@@ -113,8 +116,4 @@ void filebrowser_pop_directory (filebrowser_t * filebrowser);
#define FILEBROWSER_IS_CURRENT_A_FILE(filebrowser) (filebrowser.cur[filebrowser.currently_selected].d_type == CELL_FS_TYPE_REGULAR)
#define FILEBROWSER_IS_CURRENT_A_DIRECTORY(filebrowser) (filebrowser.cur[filebrowser.currently_selected].d_type == CELL_FS_TYPE_DIRECTORY)
-#ifdef __cplusplus
-}
-#endif
-
#endif /* FILEBROWSER_H_ */
|