#include "includes.h" #include "tools.h" #include "socket.h" #include "buffer.h" #include "list.h" #define DLLEXPORT extern "C" __declspec(dllexport) CList buffers; CList sockets; CList files; int AddSocket(CSocket*); int AddBuffer(CBuffer*); int AddFile(HANDLE); //Sockets DLLEXPORT double tcpconnect(char*ip, double port, double mode) { CSocket* sock = new CSocket(); if(sock->tcpconnect(ip, (int)port, (int)mode)) return AddSocket(sock); delete sock; return -1; } DLLEXPORT double tcplisten(double port, double max, double mode) { CSocket* sock = new CSocket(); if(sock->tcplisten((int)port, (int) max,(int)mode)) return AddSocket(sock); delete sock; return -1; } DLLEXPORT double tcpaccept(double sockid, double mode) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return -1; CSocket*sock2 = sock->tcpaccept((int)mode); if(sock2 != NULL)return AddSocket(sock2); return -1; } DLLEXPORT char* tcpip(double sockid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return NULL; return sock->tcpip(); } DLLEXPORT double setnagle(double sockid, double value) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return 0; if(value) sock->setnagle(true); else sock->setnagle(false); return 1; } DLLEXPORT double tcpconnected(double sockid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return 0; if(sock->tcpconnected())return 1; else return 0; } DLLEXPORT double udpconnect(double port, double mode) { CSocket* sock = new CSocket(); if(sock->udpconnect((int)port, (int)mode)) return AddSocket(sock); delete sock; return -1; } DLLEXPORT double sendmessage(double sockid, char*ip, double port, double buffid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(sock == NULL)return -1; if(buff == NULL)return -2; int size = sock->sendmessage(ip, (int)port, buff); if(size < 0)return -sock->lasterror(); return size; } DLLEXPORT double receivemessage(double sockid, double len, double buffid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(sock == NULL)return -1; if(buff == NULL)return -2; int size = sock->receivemessage((int)len, buff); if(size < 0) { int error = sock->lasterror(); if(error == 10054)return 0; return -error; } return size; } DLLEXPORT double peekmessage(double sockid, double len, double buffid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(sock == NULL)return -1; if(buff == NULL)return -2; int size = sock->peekmessage((int)len, buff); if(size < 0) { int error = sock->lasterror(); if(error == 10054)return 0; return -error; } return size; } DLLEXPORT double setformat(double sockid, double mode, char*sep) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return -1; return sock->SetFormat((int)mode, sep); } DLLEXPORT char* lastinIP() { return CSocket::lastinIP(); } DLLEXPORT double lastinPort() { return CSocket::lastinPort(); } DLLEXPORT double setsync(double sockid, double mode) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return -1; sock->setsync((int)mode); return 1; } DLLEXPORT double closesock(double sockid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return -1; delete sock; sockets.set((int)sockid, NULL); return 1; } DLLEXPORT double socklasterror(double sockid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return -1; return -sock->lasterror(); } DLLEXPORT char* myhost() { return CSocket::myhost(); } DLLEXPORT double compareip(char*ip, char*mask) { return CTools::comparematch(ip, mask); } DLLEXPORT double sockexit() { CSocket::SockExit(); return 1; } DLLEXPORT double sockstart() { CSocket::SockStart(); return 1; } DLLEXPORT char* hostip(char*host) { return CSocket::GetIp(host); } DLLEXPORT double getsocketid(double sockid) { CSocket*sock = (CSocket*)sockets.item((int)sockid); if(sock == NULL)return -1; return sock->sockid; } //Buffers DLLEXPORT double writebyte(double val, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writebyte((unsigned char)val); } DLLEXPORT double writeshort(double val, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writeshort((short)val); } DLLEXPORT double writeushort(double val, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writeushort((unsigned short)val); } DLLEXPORT double writeint(double val, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writeint((int)val); } DLLEXPORT double writeuint(double val, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writeuint((unsigned int)val); } DLLEXPORT double writefloat(double val, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writefloat((float)val); } DLLEXPORT double writedouble(double val, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writedouble(val); } DLLEXPORT double writechars(char*str, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writechars(str); } DLLEXPORT double writestring(char*str, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->writestring(str); } DLLEXPORT double readbyte(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->readbyte(); } DLLEXPORT double readshort(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->readshort(); } DLLEXPORT double readushort(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->readushort(); } DLLEXPORT double readint(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->readint(); } DLLEXPORT double readuint(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->readuint(); } DLLEXPORT double readfloat(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->readfloat(); } DLLEXPORT double readdouble(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->readdouble(); } DLLEXPORT char* readchars(double len, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return NULL; return buff->readchars((int)len); } DLLEXPORT char* readstring(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return NULL; return buff->readstring(); } DLLEXPORT char* readsep(char*sep, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return NULL; return buff->readsep(sep); } DLLEXPORT double getpos(double pos, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; if(pos == 0)return buff->writepos; else return buff->readpos; } DLLEXPORT double clearbuffer(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; buff->clear(); return 1; } DLLEXPORT double buffsize(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->count; } DLLEXPORT double setpos(double pos, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; buff->readpos = (int)pos; buff->writepos = (int)pos; return pos; } DLLEXPORT double bytesleft(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return buff->bytesleft(); } DLLEXPORT double createbuffer() { CBuffer* buff = new CBuffer(); return AddBuffer(buff); } DLLEXPORT double freebuffer(double buffid) { if(buffid == 0)return 0; //no deleting default buffer CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; delete buff; buffers.set((int)buffid, NULL); return 1; } DLLEXPORT double copybuffer(double destinationid, double sourceid) { CBuffer*destination = (CBuffer*)buffers.item((int)destinationid); if(destination == NULL)return 0; CBuffer*source = (CBuffer*)buffers.item((int)sourceid); if(source == NULL)return 0; destination->addBuffer(source); return 1; } DLLEXPORT double copybuffer2(double destinationid, double start, double len, double sourceid) { CBuffer*destination = (CBuffer*)buffers.item((int)destinationid); if(destination == NULL)return 0; CBuffer*source = (CBuffer*)buffers.item((int)sourceid); if(source == NULL)return 0; destination->addBuffer(source->data+(int)start, (int)len); return 1; } //tools DLLEXPORT char* getmacaddress() { return CTools::getmacaddress(); } DLLEXPORT char* md5string(char*str) { return CTools::md5string(str); } DLLEXPORT char* md5buffer(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return NULL; return CTools::md5buffer(buff); } DLLEXPORT double bufferencrypt(char*pass, double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; CTools::encryptedbuffer(buff, pass); return 1; } DLLEXPORT double adler32(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return CTools::adler32(buff); } DLLEXPORT double bufferexists(double buffid) { CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return 0; return 1; } DLLEXPORT double netconnected() { return CTools::netconnected(); } DLLEXPORT double fileopen(char*name, double mode) { HANDLE file = CTools::BinOpen(name, (int)mode); if(file != NULL) return AddFile(file); return -1; } DLLEXPORT double fileclose(double fileid) { HANDLE file = (HANDLE)files.item((int)fileid); if(file == NULL)return -1; files.set((int)fileid, NULL); return CTools::BinClose(file); } DLLEXPORT double filewrite(double fileid, double buffid) { HANDLE file = (HANDLE)files.item((int)fileid); if(file == NULL)return -1; CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return -1; return CTools::BinWrite(file, buff); } DLLEXPORT double fileread(double fileid, double bytes, double buffid) { HANDLE file = (HANDLE)files.item((int)fileid); if(file == NULL)return -1; CBuffer*buff = (CBuffer*)buffers.item((int)buffid); if(buff == NULL)return -1; return CTools::BinRead(file, (int)bytes, buff); } DLLEXPORT double filepos(double fileid) { HANDLE file = (HANDLE)files.item((int)fileid); if(file == NULL)return -1; return CTools::BinGetPos(file); } DLLEXPORT double filesetpos(double fileid, double pos) { HANDLE file = (HANDLE)files.item((int)fileid); if(file == NULL)return -1; return CTools::BinSetPos(file, (int)pos); } DLLEXPORT double filesize(double fileid) { HANDLE file = (HANDLE)files.item((int)fileid); if(file == NULL)return -1; return CTools::BinFileSize(file); } DLLEXPORT double iptouint(char*ip) { return CTools::ip2uint(ip); } DLLEXPORT char* uinttoip(double ip) { return CTools::uint2ip((unsigned int)ip); } int AddBuffer(CBuffer*b) { for(int i = 0; i < buffers.count; i ++) { if(buffers[i] == NULL) { buffers.set(i, b); return i; } } buffers.Add(b); return buffers.count-1; } int AddSocket(CSocket*b) { for(int i = 0; i < sockets.count; i ++) { if(sockets[i] == NULL) { sockets.set(i, b); return i; } } sockets.Add(b); return sockets.count-1; } int AddFile(HANDLE b) { for(int i = 0; i < files.count; i ++) { if(files[i] == NULL) { files.set(i, b); return i; } } files.Add(b); return files.count-1; } DLLEXPORT double dllInit() { CSocket::SockStart(); buffers.Add(new CBuffer()); sockets.Add(new CSocket()); //dummy socket return 1; } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_DETACH: CSocket::SockExit(); for(int i = 0; i < buffers.count; i++) if(buffers[i] != NULL) delete (CBuffer*)buffers.item(i); for(int i = 0; i < sockets.count; i++) if(sockets[i] != NULL) delete (CSocket*)sockets.item(i); for(int i = 0; i < files.count; i ++) if(files[i] != NULL) CTools::BinClose((HANDLE)files.item(i)); break; } return TRUE; }