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