Subversion Repositories pspware

Rev

Rev 140 | Rev 143 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
140 nevyn 1
#include <stdlib.h>
2
#include <pspkernel.h>
141 shine 3
#include <pspusb.h>
4
#include <pspusbstor.h>
140 nevyn 5
#include "luaplayer.h"
6
 
7
#include <unistd.h>
8
 
141 shine 9
static int usbActivated = 0;
140 nevyn 10
 
11
 
12
static int lua_getCurrentDirectory(lua_State *L)
13
{
14
        char path[256];
15
        getcwd(path, 256);
16
        lua_pushstring(L, path);
17
 
18
        return 1;
19
}
20
 
21
static int lua_setCurrentDirectory(lua_State *L)
22
{
23
        const char *path = luaL_checkstring(L, 1);
24
        if(!path) return luaL_error(L, "Argument error: System.currentDirectory(file) takes a filename as string as argument.");
25
 
26
        lua_getCurrentDirectory(L);
27
        chdir(path);
28
 
29
        return 1;
30
}
31
 
32
static int lua_curdir(lua_State *L) {
33
        int argc = lua_gettop(L);
34
        if(argc == 0) return lua_getCurrentDirectory(L);
35
        if(argc == 1) return lua_setCurrentDirectory(L);
36
        return luaL_error(L, "Argument error: System.currentDirectory([file]) takes zero or one argument.");
37
}
38
 
39
 
40
 
41
 
42
static int lua_dir(lua_State *L)
43
{
44
        int argc = lua_gettop(L);
45
        if (argc != 0 && argc != 1) return luaL_error(L, "Argument error: System.listDirectory([path]) takes zero or one argument.");
46
 
47
        const char *path = "";
48
        if (argc == 0) {
49
                path = "";
50
        } else {
51
                path = luaL_checkstring(L, 1);
52
        }
53
        int fd = sceIoDopen(path);
54
        SceIoDirent g_dir;
55
        if (fd < 0) {
56
                lua_pushnil(L);  /* return nil */
57
                return 1;
58
        }
59
        lua_newtable(L);
60
        int i = 1;
61
        while (sceIoDread(fd, &g_dir) > 0) {
62
                lua_pushnumber(L, i++);  /* push key for file entry */
63
 
64
                lua_newtable(L);
65
 
66
                lua_pushstring(L, "name");
67
                lua_pushstring(L, g_dir.d_name);
68
                lua_settable(L, -3);
69
 
70
                lua_pushstring(L, "size");
71
                lua_pushnumber(L, g_dir.d_stat.st_size);
72
                lua_settable(L, -3);
73
 
74
                lua_pushstring(L, "directory");
75
 
76
                lua_pushboolean(L, g_dir.d_stat.st_attr & FIO_SO_IFDIR);
77
                lua_settable(L, -3);
78
 
79
                lua_settable(L, -3);
80
        }
81
 
82
        sceIoDclose(fd);
83
 
84
        return 1;  /* table is already on top */
85
}
86
 
141 shine 87
static int LoadStartModule(char *path)
88
{
89
    u32 loadResult;
90
    u32 startResult;
91
    int status;
92
 
93
    loadResult = sceKernelLoadModule(path, 0, NULL);
94
    if (loadResult & 0x80000000)
95
        return -1;
96
    else
97
        startResult =
98
            sceKernelStartModule(loadResult, 0, NULL, &status, NULL);
99
 
100
    if (loadResult != startResult)
101
        return -2;
102
 
103
    return 0;
104
}
105
 
106
static int lua_usbActivate(lua_State *L)
107
{
108
        if (lua_gettop(L) != 0) return luaL_error(L, "wrong number of arguments");
109
        if (usbActivated) return 0;
110
 
111
        static int modulesLoaded = 0;
112
        if (!modulesLoaded) {
113
                //start necessary drivers 
114
                LoadStartModule("flash0:/kd/semawm.prx");
115
                LoadStartModule("flash0:/kd/usbstor.prx");
116
                LoadStartModule("flash0:/kd/usbstormgr.prx");
117
                LoadStartModule("flash0:/kd/usbstorms.prx");
118
                LoadStartModule("flash0:/kd/usbstorboot.prx");
119
 
120
                //setup USB drivers 
121
                int retVal = sceUsbStart(PSP_USBBUS_DRIVERNAME, 0, 0);
122
                if (retVal != 0) {
123
                        printf("Error starting USB Bus driver (0x%08X)\n", retVal);
124
                        sceKernelSleepThread();
125
                }
126
                retVal = sceUsbStart(PSP_USBSTOR_DRIVERNAME, 0, 0);
127
                if (retVal != 0) {
128
                        printf("Error starting USB Mass Storage driver (0x%08X)\n", retVal);
129
                        sceKernelSleepThread();
130
                }
131
                retVal = sceUsbstorBootSetCapacity(0x800000);
132
                if (retVal != 0) {
133
                        printf("Error setting capacity with USB Mass Storage driver (0x%08X)\n", retVal);
134
                        sceKernelSleepThread();
135
                }
136
                retVal = 0;
137
                modulesLoaded = 1;
138
        }
139
        sceUsbActivate(0x1c8);
140
        usbActivated = 1;
141
        return 0;
142
}
143
 
144
static int lua_usbDeactivate(lua_State *L)
145
{
146
        if (lua_gettop(L) != 0) return luaL_error(L, "wrong number of arguments");
147
        if (!usbActivated) return 0;
148
 
149
        sceUsbDeactivate();
150
        usbActivated = 0;
151
        return 0;
152
}
153
 
140 nevyn 154
static const luaL_reg System_functions[] = {
155
  {"currentDirectory",          lua_curdir},
156
  {"listDirectory",             lua_dir},
141 shine 157
  {"usbActivate",               lua_usbActivate},
158
  {"usbDeactivate",             lua_usbDeactivate},
140 nevyn 159
  {0, 0}
160
};
161
void luaSystem_init(lua_State *L) {
162
        luaL_openlib(L, "System", System_functions, 0);
163
}
164