ll_libload wininet, "wininet.dll"
ll_getproc InternetOpen, "InternetOpenA", wininet
ll_getproc InternetCloseHandle, "InternetCloseHandle", wininet
ll_getproc InternetConnect, "InternetConnectA", wininet
ll_getproc InternetFindNextFile, "InternetFindNextFileA", wininet
ll_getproc FtpFindFirstFile, "FtpFindFirstFileA", wininet
ll_libload kernel, "kernel32.dll"
ll_getproc FileTimeToSystemTime, "FileTimeToSystemTime", kernel
#module
#deffunc lpeek val, val, int
mref write, 16 : mref read, 17 : mref index, 2
wpeek tmp.0, read, index
wpeek tmp.1, read, index + 2
write = tmp.1 << 16 + tmp.0
return
#deffunc inetinit
mref stt, 64
prm = 0, 0, 0, 0, 0
agent = "hspbc"
ll_getptr agent : ll_ret prm
ll_callfunc prm, 5, InternetOpen@
ll_ret hinet : stt = hinet
return
#deffunc inetend onexit
if hinet : ll_callfunc hinet, 1, InternetCloseHandle@
return
#deffunc inetlogin str, str, int, int
mref server, 32 : mref info, 33 : mref service, 2 : mref option, 3
mref stt, 64
instr i, info, ":"
strlen i.1, info
strmid user, info, , i
strmid pass, info, i + 1, i.1 - i - 1
if hinet = 0 : inetinit
if user = "" : i.0 = 0 : else : ll_getptr user : ll_ret i.0
if pass = "" : i.1 = 0 : else : ll_getptr pass : ll_ret i.1
switch service
case 2: i.2 = 0x0002, 0 : swbreak
case 3: i.2 = 0x0003, 0 : swbreak
default: i.2 = 0x0001, option ! 0 * 0x08000000
swend
ll_getptr server : ll_ret i.5
prm = hinet, i.5, 0, i.0, i.1, i.2, i.3, 0
ll_callfunc prm, 8, InternetConnect@
ll_ret hsess : stt = hsess
return
#deffunc inetlogout onexit
if hsess : ll_callfunc hsess, 1, InternetCloseHandle@
return
#deffunc inetdirlist val, str, int
mref lst, 24 : mref url, 33 : mref getinfo, 2
dim wfd, 80
prm = hsess
ll_getptr url : ll_ret prm.1
ll_getptr wfd : ll_ret prm.2
ll_callfunc prm, 3, FtpFindFirstFile@
ll_ret h
if h {
repeat
sdim s, 400
if getinfo & 1 ! 0 | (getinfo = 0) : getstr s, wfd, 44
if getinfo & 2 ! 0 | (getinfo = 0) {
if s ! "" : s += "\t"
lpeek i, wfd
if i & 0x0010 {
s += "<DIR>"
} else {
lpeek i, wfd, 32 // 上位32ビットは無視(約4GB以下のみ)
s += "" + i
}
}
if getinfo & 4 ! 0 | (getinfo = 0) {
dim j, 4
lpeek i.0, wfd, 20
lpeek i.1, wfd, 24
ll_getptr i : ll_ret prm.0
ll_getptr j : ll_ret prm.1
ll_callfunc prm, 2, FileTimeToSystemTime@
wpeek i.0, j.0
wpeek i.1, j.0, 2
wpeek i.2, j.1, 2
wpeek i.3, j.2
wpeek i.4, j.2, 2
wpeek i.5, j.3
if s ! "" : s += "\t"
s += "" + i.0 + "/" + i.1 + "/" + i.2 + " " + i.3 + ":" + i.4 + ":" + i.5
}
if lst ! "" : lst += "\n"
lst += s
prm = h
ll_getptr wfd : ll_ret prm.1
ll_callfunc prm, 2, InternetFindNextFile@
ll_ret i
if i = 0 : break
loop
}
return
#global
server = "" : user = "" : pass = "" // 接続先を指定すること
inetlogin server, user + ":" + pass
sdim list, 1000
inetdirlist list, "/"
mesbox list, 640, 480
stop
|