1 /*---------------------------------------------------------------------------*
2 Project: File selection window system for Dolphin DVD error handling demo
3 File: selectfile.c
4
5 Copyright 2001 Nintendo. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Log: selectfile.c,v $
14 Revision 1.2 02/20/2006 04:13:09 mitu
15 changed include path from dolphin/ to revolution/.
16
17 Revision 1.1 2006/01/17 02:43:50 hiratsu
18 Initial check in.
19
20
21 1 6/15/01 9:03p Hashida
22 Initial revision.
23
24 $NoKeywords: $
25 *---------------------------------------------------------------------------*/
26
27 #include <demo.h>
28 #include <revolution.h>
29 #include <demo/DEMOWin.h>
30 #include <string.h>
31 #include <stdio.h>
32 #include "selectfile.h"
33
34 /*---------------------------------------------------------------------------*
35 * Directory listing stuff!
36 *---------------------------------------------------------------------------*/
37 #define MAX_DIR_ENTRIES 512
38 #define MAX_FILENAME_LENGTH 128
39
40 static DEMOWinMenuItem dir_entry[MAX_DIR_ENTRIES+1];
41 static DEMOWinMenuInfo dir_list;
42
43 static char dir_entry_name[MAX_DIR_ENTRIES][MAX_FILENAME_LENGTH];
44
45 static void MNU_select_file(DEMOWinMenuInfo *menu, u32 item, u32 *result);
46 static void MNU_change_dir_up(DEMOWinMenuInfo *menu, u32 item, u32 *result);
47 static void MNU_change_dir(DEMOWinMenuInfo *menu, u32 item, u32 *result);
48 static DEMOWinMenuInfo *__create_dir_menu(void);
49 static char toupper(char c);
50 static BOOL compare_strings(char *s1, char *s2);
51
52 static DEMOWinInfo *Debug_win;
53
54
InitSelectFile(DEMOWinInfo * debug_win)55 void InitSelectFile(DEMOWinInfo *debug_win)
56 {
57 Debug_win = debug_win;
58 }
59
60
toupper(char c)61 static char toupper(char c)
62 {
63 if ((c >= 'a') && (c <= 'z'))
64 return((char)(c-32));
65 else
66 return(c);
67 }
68
69
compare_strings(char * s1,char * s2)70 static BOOL compare_strings(char *s1, char *s2)
71 {
72 u32 i;
73
74 for (i=0; i<strlen(s1); i++)
75 {
76 if (toupper(s1[i]) != toupper(s2[i]))
77 return(FALSE);
78 }
79 return(TRUE);
80 }
81
82
MNU_select_file(DEMOWinMenuInfo * menu,u32 item,u32 * result)83 static void MNU_select_file(DEMOWinMenuInfo *menu, u32 item, u32 *result)
84 {
85 DEMOWinLogPrintf(Debug_win, " '%s' was selected\n", menu->items[item].name);
86
87 *result = (u32)menu->items[item].name;
88
89 } // end __select_file
90
91
SelectFile(DEMOWinInfo * handle)92 char* SelectFile(DEMOWinInfo *handle)
93 {
94 DEMOWinMenuInfo *m; // directory menu
95 u32 val = 0;
96
97 DEMOWinSetWindowColor(handle, DEMOWIN_COLOR_CAPTION,
98 50, 50, 50, 255);
99 do
100 {
101 m = __create_dir_menu();
102 if (m)
103 {
104 DEMOWinCreateMenuWindow(m, (u16)(handle->x2-10), (u16)(handle->y1+24));
105 val = DEMOWinMenu(m);
106 DEMOWinDestroyMenuWindow(m);
107 }
108 else
109 {
110 DEMOWinLogPrintf(Debug_win, "Failed to create directory list!\n");
111 }
112
113 } while (!val);
114
115 DEMOWinSetWindowColor(handle, DEMOWIN_COLOR_RESET, 0, 0, 0, 0);
116
117 return (char*)val;
118 }
119
MNU_change_dir_up(DEMOWinMenuInfo * menu,u32 item,u32 * result)120 static void MNU_change_dir_up(DEMOWinMenuInfo *menu, u32 item, u32 *result)
121 {
122 #pragma unused(menu)
123 #pragma unused(item)
124 #pragma unused(result)
125
126 menu->items[item].flags |= DEMOWIN_ITM_EOF;
127
128 DEMOWinLogPrintf(Debug_win, "\nChanging to parent directory...\n");
129
130 DVDChangeDir("..");
131
132 *result = 0;
133
134 } // MNU_change_dir_up
135
136 /*---------------------------------------------------------------------------*
137 * Name :
138 * Description :
139 * Arguments : None.
140 * Returns : None.
141 *---------------------------------------------------------------------------*/
142
MNU_change_dir(DEMOWinMenuInfo * menu,u32 item,u32 * result)143 static void MNU_change_dir(DEMOWinMenuInfo *menu, u32 item, u32 *result)
144 {
145 #pragma unused(result)
146
147 DVDDir dir;
148 DVDDirEntry dirent;
149
150 u32 i;
151
152
153 DEMOWinLogPrintf(Debug_win, "\nChanging directory to: '%s'...\n", menu->items[item].name);
154
155 DVDOpenDir(".", &dir);
156 for (i=1; i<=item; i++)
157 {
158 DVDReadDir(&dir, &dirent);
159 }
160 if (dirent.isDir)
161 {
162 DVDChangeDir(dirent.name);
163 menu->items[item].flags |= DEMOWIN_ITM_EOF;
164
165 }
166 else
167 {
168 DEMOWinLogPrintf(Debug_win, "\nUnable to change directory...??\n");
169 menu->items[item].flags &= ~DEMOWIN_ITM_EOF;
170 }
171
172 DVDCloseDir(&dir);
173
174 *result = 0;
175
176 } // MNU_change_dir
177
__create_dir_menu(void)178 static DEMOWinMenuInfo *__create_dir_menu(void)
179 {
180 DVDDir dir;
181 DVDDirEntry dirent;
182
183 u32 index;
184 u32 len;
185
186 index = 0;
187
188
189 // first entry is always parent directory
190 strcpy(dir_entry_name[index], "../");
191
192 dir_entry[index].name = &dir_entry_name[index][0];
193 dir_entry[index].flags = DEMOWIN_ITM_EOF;
194 dir_entry[index].function = MNU_change_dir_up;
195 dir_entry[index].link = NULL;
196
197 index++;
198
199
200 DVDOpenDir(".", &dir);
201
202 while ( (DVDReadDir(&dir, &dirent)) && (index < MAX_DIR_ENTRIES))
203 {
204 // get name, append '/' if it's a directory
205 strcpy(dir_entry_name[index], dirent.name);
206 if (dirent.isDir)
207 {
208 len = strlen(dirent.name);
209 dir_entry_name[index][len] = '/';
210 dir_entry_name[index][len+1] = 0;
211
212 dir_entry[index].function = MNU_change_dir;
213 dir_entry[index].flags = DEMOWIN_ITM_EOF;
214 }
215 else
216 {
217 dir_entry[index].function = MNU_select_file;
218 dir_entry[index].flags = DEMOWIN_ITM_EOF;
219 }
220
221 dir_entry[index].name = &dir_entry_name[index][0];
222 dir_entry[index].link = NULL;
223 index++;
224 }
225
226 // terminate list
227 dir_entry[index].flags = DEMOWIN_ITM_TERMINATOR;
228 dir_entry[index].function = NULL;
229 dir_entry[index].link = NULL;
230
231
232 // Initialize Menu info structure
233
234 dir_list.title = "Directory Listing"; // later, init with directory name
235 dir_list.handle = NULL; // placeholder for window handle
236 dir_list.items = &dir_entry[0]; // list of items
237
238 dir_list.max_display_items = 24; // display 22 files at a time
239 dir_list.flags = 0; // no flags
240
241 dir_list.cb_open = NULL; // no callbacks
242 dir_list.cb_move = NULL;
243 dir_list.cb_select = NULL;
244 dir_list.cb_cancel = NULL;
245
246 // private members; initialize to zero, they will be calculated at runtime
247 dir_list.num_display_items = 0;
248 dir_list.num_items = 0;
249 dir_list.max_str_len = 0;
250 dir_list.curr_pos = 0;
251 dir_list.display_pos = 0;
252
253 DVDCloseDir(&dir);
254
255 if (index)
256 {
257 return(&dir_list);
258 }
259 else
260 {
261 return(NULL);
262 }
263
264
265 } // end __create_dir_menu()
266
267