Call:
Action = %1command%%2command%
StringReplace, Action, Action, %A_Space%, `%20, All
Call = GET /xbmcCmds/xbmcHttp?command=%Action% HTTP/1.1`nHost: localhost`nProxy-Connection: Close`nAccept-Charset: windows-1251`n`n
socketInit()
s := socketConnect("" Host "", Port)
socketSendStr(s, Call)
if msg = 1
{
msgbox % socketReadStr(s) ; %
msg = 0
}
socketClose(s)
Return
global socketError = 0
if(!socketBufferSize)
socketBufferSize := 0x8000
socketBuffer := DllCall("LocalAlloc", "uint", 0, "ptr", socketBufferSize, "ptr")
socketInit()
;читает строку в кодировке CP1251
socketReadStrA(Socket)
{
return socketReadStr(Socket, "CP1251")
}
;отправляет строку в кодировке CP1251
socketSendStrA(Socket, String)
{
return socketSendStr(Socket, String, "CP1251")
}
;инициализация
socketInit()
{
if(DllCall("LoadLibrary", "str", "Ws2_32.dll", "ptr")=0)
{
SocketError := 1
return 1
}
VarSetCapacity(WSAData, 108, 0)
if(DllCall("Ws2_32.dll\WSAStartup", "ushort", 0x0202, "ptr", &WSAData))
{
SocketError := 2
}
VarSetCapacity(WSAData, 0)
return
}
;отправляет строку в указанной кодировке
socketSendStr(Socket, String, Encoding="UTF-8")
{
BufSize := (strlen(String)+1)*2
VarSetCapacity(Buffer, BufSize, 0)
BufSize := StrPut(String, &Buffer, BufSize, Encoding)
ret := DllCall("Ws2_32.dll\send", "ptr", Socket, "ptr", &Buffer, "int", BufSize, "int", 0)
VarSetCapacity(Buffer, 0)
return ret
}
;сколько байт данных не прочитано
socketNewDataLength(Socket)
{
ret := DllCall("Ws2_32.dll\ioctlsocket", "ptr", Socket, "uint", 0x4004667f, "uint*", Size, "int")
if(!ret)
return Size
return -1
}
;читает данные
socketReadData(Socket, ByRef len, WaitTime = 1000)
{
global socketBuffer
StartTime := A_TickCount
NewData := socketNewDataLength(Socket)
while((NewData<=0)&&(A_TickCount-StartTime<WaitTime))
NewData := socketNewDataLength(Socket)
if(NewData>0)
{
len:=DllCall("Ws2_32.dll\recv", "ptr", Socket, "ptr", socketBuffer, "int", NewData, "int", 0, "int")
return socketBuffer
}
return 0
}
;закрывает соединение
socketClose(s)
{
return DllCall("Ws2_32.dll\closesocket", "ptr", s)
}
;читает строку в указанной кодировке
socketReadStr(Socket, Encoding="UTF-8")
{
critical
str := ""
loop
{
Data := socketReadData(Socket, len, 100)
if(Data)
str .= StrGet(Data, len, Encoding)
else
break
}
SocketError := 0
if(str != "")
return str
SocketError := -1
return 0
}
;устанавливает подключение к порту "Port", хоста "HostOrIP".
socketConnect(HostOrIP, Port = 80, LocalPort = 0)
{
global socketBufferSize
if(!((Port>=0&&Port<=0xFFFF)&&(LocalPort>=0&&LocalPort<=0xFFFF)))
return -10
ret := 0
VarSetCapacity(SockAddr, 16, 0)
Socket := 0
Socket := DllCall("Ws2_32.dll\socket", "int", 2, "int", 1, "int", 6, "ptr")
if(Socket=-1)
{
ret := -11
goto Clear
}
DllCall("Ws2_32.dll\setsockopt", "ptr", Socket, "int", 0xFFFF, "int", 0x1002, "int*", socketBufferSize, "int", 4, "int")
if(LocalPort)
{
NumPut(2, &SockAddr, 0, "short")
NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort")
NumPut(0, &SockAddr, 4, "uint")
if(DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
{
ret := -12
goto Clear
}
}
NumPut(2, &SockAddr, 0, "short")
NumPut(sockethtons(Port), &SockAddr, 2, "ushort")
if(socketIsIP(HostOrIP))
{
NumPut(inet_addr(HostOrIP), &SockAddr, 4, "uint")
}
else
{
RemoteHost := DllCall("Ws2_32.dll\gethostbyname", "AStr", HostOrIP, "ptr")
if(!RemoteHost)
{
ret := -13
goto Clear
}
RemoteHost:=NumGet(NumGet(NumGet(RemoteHost|0, A_PtrSize*3, "ptr"), 0, "ptr"), 0, "uint")
NumPut(RemoteHost, &SockAddr, 4, "uint")
}
if(DllCall("Ws2_32.dll\connect", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
{
ret := -14
goto Clear
}
return Socket
Clear:
if(Socket)
DllCall("Ws2_32.dll\closesocket", "ptr", Socket)
return ret
}
;в слове меняет порядок байт на сетевой
sockethtons(port)
{
return ((port&0xFF)<<8)|(port>>8)
}
;конвертирует строку с IP-адресом в четырёхбайтовое число.
inet_addr(StringWithIP)
{
RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
VarSetCapacity(ip, 4, 0)
NumPut(ArrayWithIP1, &ip, 0, "uchar")
NumPut(ArrayWithIP2, &ip, 1, "uchar")
NumPut(ArrayWithIP3, &ip, 2, "uchar")
NumPut(ArrayWithIP4, &ip, 3, "uchar")
return NumGet(&ip, 0, "uint")
}
;Возвращает 1 если строка является корректным IP-адресом и 0 в ином случае.
socketIsIP(StringWithIP)
{
ret := RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
if((ret="")||(ret=0))
return 0
if((ArrayWithIP1>255)||(ArrayWithIP2>255)||(ArrayWithIP3>255)||(ArrayWithIP4>255))
return 0
return 1
}
По "двойке" команда GetCurrentlyPlaying с первоначальной либой возвращает желаемое, с последней либой возвращает "0".
Наверно я что то намудрил в этом месте, точнее оставил как есть от старой либы