From 2127cb654fcff1674de06dfbf8ec43574ce69cf1 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 22 Oct 2020 21:39:39 +0300 Subject: EMLanProto: - fixes #2599 (Em-LAN: binds to localhost); - code cleaning; - version bump; --- protocols/EmLanProto/src/lan.cpp | 59 +++++++++++-------- protocols/EmLanProto/src/lan.h | 113 +++++++++++++++++++------------------ protocols/EmLanProto/src/mlan.cpp | 101 +++++++++++++-------------------- protocols/EmLanProto/src/mlan.h | 28 ++++----- protocols/EmLanProto/src/stdafx.h | 1 + protocols/EmLanProto/src/version.h | 2 +- 6 files changed, 149 insertions(+), 155 deletions(-) (limited to 'protocols/EmLanProto') diff --git a/protocols/EmLanProto/src/lan.cpp b/protocols/EmLanProto/src/lan.cpp index d7737b2479..157470f2b0 100644 --- a/protocols/EmLanProto/src/lan.cpp +++ b/protocols/EmLanProto/src/lan.cpp @@ -5,12 +5,9 @@ CLan::CLan() { - m_income = INVALID_SOCKET; - m_filesoc = INVALID_SOCKET; - m_status = LS_OK; - m_mode = LM_OFF; - m_hListenThread = nullptr; - m_hAcceptTCPThread = nullptr; + memset(&m_curAddr, 0, sizeof(m_curAddr)); + memset(&m_hostAddr, 0, sizeof(m_hostAddr)); + Startup(); } @@ -19,6 +16,36 @@ CLan::~CLan() Shutdown(); } +bool CLan::ResetInterfaces() +{ + char hostname[256]; + if (gethostname(hostname, 256) != 0) { + m_status = LS_CANT_GET_HOSTADDR; + return false; + } + + int hostAddrCount = 0; + in_addr hostAddr[MAX_INTERNAL_IP]; + + hostent *host = gethostbyname(hostname); + char **pAddr = host->h_addr_list; + + while (*pAddr && hostAddrCount < MAX_INTERNAL_IP) { + in_addr addr; + addr.S_un.S_addr = *((u_long *)(*pAddr)); + hostAddr[hostAddrCount++] = addr; + pAddr++; + } + + // nothing changed? return false + if (m_hostAddrCount == hostAddrCount && !memcmp(m_hostAddr, hostAddr, sizeof(hostAddr))) + return false; + + m_hostAddrCount = hostAddrCount; + memcpy(m_hostAddr, hostAddr, sizeof(hostAddr)); + return true; +} + void CLan::Startup() { WSADATA wsa; @@ -26,22 +53,7 @@ void CLan::Startup() m_status = LS_OK; m_mode = LM_ON; - char hostname[256]; - if (gethostname(hostname, 256) == 0) { - hostent* host = gethostbyname(hostname); - char** pAddr = host->h_addr_list; - m_hostAddrCount = 0; - while (*pAddr && m_hostAddrCount < MAX_INTERNAL_IP) { - in_addr addr; - addr.S_un.S_addr = *((u_long*)(*pAddr)); - m_hostAddr[m_hostAddrCount++] = addr; - pAddr++; - } - m_curAddr = m_hostAddr[0]; - } - else { - m_status = LS_CANT_GET_HOSTADDR; - } + ResetInterfaces(); } else { m_status = LS_OK; @@ -91,6 +103,9 @@ void CLan::StartListen() if (m_mode != LM_ON) return; + if (m_curAddr.S_un.S_addr == 0) + return; + m_income = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); m_filesoc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (m_income == INVALID_SOCKET || m_filesoc == INVALID_SOCKET) { diff --git a/protocols/EmLanProto/src/lan.h b/protocols/EmLanProto/src/lan.h index c6dc217c64..9083281619 100644 --- a/protocols/EmLanProto/src/lan.h +++ b/protocols/EmLanProto/src/lan.h @@ -9,82 +9,85 @@ #define MAX_INTERNAL_IP 32 #define PORT_NUMBER MAKE_PORT(34074) -//! Class for operating with LAN +// Class for operating with LAN class CLan { public: - //! constructor + // constructor CLan(); - //! destructor + // destructor ~CLan(); - //! Helper function - returns status + // Helper function - returns status int GetStatus() { return m_status; } - //! Helper function - returns mode + // Helper function - returns mode int GetMode() { return m_mode; } - //! Getting host addresses count + // Getting host addresses count int GetHostAddrCount() { return m_hostAddrCount; } - //! Getting host addresses + // Getting host addresses in_addr GetHostAddress(int ind) { return m_hostAddr[ind]; } - //! Get current host address + // Get current host address in_addr GetCurHostAddress() { return m_curAddr; } protected: - //! Lan status + // Lan status enum enumStatus { - LS_OK, //!< no problems - LS_WRONG_WINSOCK, //!< not found winsock of propper version - LS_CANT_CREATE_SOCKET, //!< can not create income socket - LS_CANT_GET_HOSTADDR, //!< can not find host address - LS_CANT_TURN_ON_BROADCAST, //!< can not allow broadcast messages for socket - LS_CANT_BIND_SOCKET, //!< can not bind socket to the address - LS_CANT_START_LISTEN, //!< can not start listen on TCP socket - LS_CANT_CREATE_THREADS, //!< can not create threads for listen and accept + LS_OK, //< no problems + LS_WRONG_WINSOCK, //< not found winsock of propper version + LS_CANT_CREATE_SOCKET, //< can not create income socket + LS_CANT_GET_HOSTADDR, //< can not find host address + LS_CANT_TURN_ON_BROADCAST, //< can not allow broadcast messages for socket + LS_CANT_BIND_SOCKET, //< can not bind socket to the address + LS_CANT_START_LISTEN, //< can not start listen on TCP socket + LS_CANT_CREATE_THREADS, //< can not create threads for listen and accept }; - //! Lan mode + // Lan mode enum enumMode { - LM_OFF, //!< Winsock is turned off - LM_ON, //!< Winsock is on - LM_LISTEN, //!< Listening for incoming messages + LM_OFF, //< Winsock is turned off + LM_ON, //< Winsock is on + LM_LISTEN, //< Listening for incoming messages }; - //! Starts winsock + // Retrieve list of network interfaces + bool ResetInterfaces(); + + // Starts winsock void Startup(); - //! Stops winsock + // Stops winsock void Shutdown(); - //! Listen + // Listen void StartListen(); - //! Stop Listen + // Stop Listen void StopListen(); - //! Set current host address + // Set current host address void SetCurHostAddress(in_addr addr); - //! Send packet + // Send packet void SendPacket(in_addr addr, const u_char* mes, int len); - //! Send broadcast packet + // Send broadcast packet void SendPacketBroadcast(const u_char* mes, int len); - //! Event - called when packet is received + // Event - called when packet is received virtual void OnRecvPacket(u_char*, int, in_addr) { }; - //! Event - called when new incoming tcp connection is created (new thread is created) + // Event - called when new incoming tcp connection is created (new thread is created) virtual void OnInTCPConnection(u_long, SOCKET) { }; - //! Event - called when new outgoing tcp connection is created )new thread is created) + // Event - called when new outgoing tcp connection is created )new thread is created) virtual void OnOutTCPConnection(u_long, SOCKET, LPVOID) {}; - //! Creates new outgoing TCP connection + // Creates new outgoing TCP connection SOCKET CreateTCPConnection(u_long addr, LPVOID lpParameter); private: - //! Launches Listen procedure when in new thread + // Launches Listen procedure when in new thread static void __cdecl ListenProc(void *lpParameter); - //! Listnes for incoming messages + // Listnes for incoming messages void Listen(); - //! Listen thread handle - HANDLE m_hListenThread; - //! Structure passed to new TCP connection thread + // Listen thread handle + HANDLE m_hListenThread = nullptr; + // Structure passed to new TCP connection thread struct TTCPConnect { CLan* m_lan; @@ -92,33 +95,33 @@ private: SOCKET m_socket; LPVOID m_lpParameter; }; - //! Launches accept procedure for TCP connections in new thread + // Launches accept procedure for TCP connections in new thread static void __cdecl AcceptTCPProc(void *lpParameter); - //! Accepts TCP connections + // Accepts TCP connections void AcceptTCP(); - //! Accept TCP thread handle - HANDLE m_hAcceptTCPThread; + // Accept TCP thread handle + HANDLE m_hAcceptTCPThread = nullptr; - //! Called when new income TCP connection is created + // Called when new income TCP connection is created static void __cdecl OnInTCPConnectionProc(void *lpParameter); - //! Called when new ougoing TCP connectio is created + // Called when new ougoing TCP connectio is created static void __cdecl OnOutTCPConnectionProc(void *lpParameter); - //! Stores retrieved host addresses + // Stores retrieved host addresses in_addr m_hostAddr[MAX_INTERNAL_IP]; - //! Current address count - int m_hostAddrCount; + // Current address count + int m_hostAddrCount = 0; - //! Stores current host address + // Stores current host address in_addr m_curAddr; - //! Socket for income messages - SOCKET m_income; - //! Socket for income files - SOCKET m_filesoc; - //! Current status - int m_status; - //! Current mode - int m_mode; + // Socket for income messages + SOCKET m_income = INVALID_SOCKET; + // Socket for income files + SOCKET m_filesoc = INVALID_SOCKET; + // Current status + int m_status = LS_OK; + // Current mode + int m_mode = LM_OFF; }; #endif //__lan_h__ diff --git a/protocols/EmLanProto/src/mlan.cpp b/protocols/EmLanProto/src/mlan.cpp index 2db580c26b..961d5c2124 100644 --- a/protocols/EmLanProto/src/mlan.cpp +++ b/protocols/EmLanProto/src/mlan.cpp @@ -26,27 +26,12 @@ enum enuLEXT LEXT_SENDURL, }; -CMLan::CMLan() +CMLan::CMLan() : + m_timer(Miranda_GetSystemWindow(), (UINT_PTR)this) { - m_RequiredIp = 0; - m_UseHostName = true; - - m_mirStatus = ID_STATUS_OFFLINE; - m_pRootContact = nullptr; - m_hCheckThread = nullptr; - - m_handleId = 1; - - m_amesAway = nullptr; - m_amesNa = nullptr; - m_amesOccupied = nullptr; - m_amesDnd = nullptr; - m_amesFfc = nullptr; - - m_pFileConnectionList = nullptr; + m_timer.OnEvent = Callback(this, &CMLan::OnTimer); LoadSettings(); - SetAllOffline(); } @@ -116,25 +101,27 @@ void CMLan::SetAllOffline() void CMLan::StartChecking() { - if (m_hCheckThread) + if (m_bChecking) return; for (TContact *cont = m_pRootContact; cont; cont = cont->m_prev) cont->m_time = MLAN_CHECK + MLAN_TIMEOUT; - m_hCheckThread = mir_forkthread(CheckProc, this); + if (ResetInterfaces()) + LoadSettings(); + + m_bChecking = true; + m_timer.Start(MLAN_SLEEP); + StartListen(); RequestStatus(true); } void CMLan::StopChecking() { - { - mir_cslock lck(m_csAccessClass); - if (m_hCheckThread) { - TerminateThread(m_hCheckThread, 0); - m_hCheckThread = nullptr; - } + if (m_bChecking) { + m_bChecking = false; + m_timer.Stop(); } m_mirStatus = ID_STATUS_OFFLINE; @@ -150,30 +137,21 @@ void CMLan::StopChecking() SetAllOffline(); } -void __cdecl CMLan::CheckProc(void *lpParameter) +void CMLan::OnTimer(CTimer*) { - CMLan *lan = (CMLan*)lpParameter; - lan->Check(); -} + mir_cslock lck(m_csAccessClass); -void CMLan::Check() -{ - while (true) { - Sleep(MLAN_SLEEP); - mir_cslock lck(m_csAccessClass); - - for (TContact *cont = m_pRootContact; cont; cont = cont->m_prev) { - if (cont->m_status != ID_STATUS_OFFLINE) { - if (cont->m_time) - cont->m_time--; - if (cont->m_time == MLAN_TIMEOUT) - RequestStatus(true, cont->m_addr.S_un.S_addr); - if (!cont->m_time) { - cont->m_status = ID_STATUS_OFFLINE; - MCONTACT hContact = FindContact(cont->m_addr, cont->m_nick, false, false, false); - if (hContact) - g_plugin.setWord(hContact, "Status", ID_STATUS_OFFLINE); - } + for (TContact *cont = m_pRootContact; cont; cont = cont->m_prev) { + if (cont->m_status != ID_STATUS_OFFLINE) { + if (cont->m_time) + cont->m_time--; + if (cont->m_time == MLAN_TIMEOUT) + RequestStatus(true, cont->m_addr.S_un.S_addr); + if (!cont->m_time) { + cont->m_status = ID_STATUS_OFFLINE; + MCONTACT hContact = FindContact(cont->m_addr, cont->m_nick, false, false, false); + if (hContact) + g_plugin.setWord(hContact, "Status", ID_STATUS_OFFLINE); } } } @@ -1186,7 +1164,7 @@ void CMLan::OnInTCPConnection(u_long addr, SOCKET in_sock) void CMLan::OnOutTCPConnection(u_long, SOCKET out_socket, LPVOID lpParameter) { EMLOG("Sending OUT TCP connection"); - TFileConnection *conn = (TFileConnection*)lpParameter; + TFileConnection *conn = (TFileConnection *)lpParameter; if (out_socket == INVALID_SOCKET) { EMLOG("Can't create OUT socket"); @@ -1224,20 +1202,20 @@ void CMLan::OnOutTCPConnection(u_long, SOCKET out_socket, LPVOID lpParameter) filecount++; CloseHandle(hFile); - wchar_t* filepart; + wchar_t *filepart; GetFullPathName(*pf, MAX_PATH, name, &filepart); free(*pf); *pf = mir_wstrdup(name); - mir_strcpy((char*)buf + len, _T2A(filepart)); + mir_strcpy((char *)buf + len, _T2A(filepart)); len += (int)mir_wstrlen(filepart) + 1; pf++; } - mir_strcpy((char*)buf + len, _T2A(conn->m_szDescription)); + mir_strcpy((char *)buf + len, _T2A(conn->m_szDescription)); len += (int)mir_wstrlen(conn->m_szDescription) + 1; - *((int*)(buf + 1)) = size; - *((int*)(buf + 1 + 4)) = filecount; + *((int *)(buf + 1)) = size; + *((int *)(buf + 1 + 4)) = filecount; GetCurrentDirectory(MAX_PATH, name); conn->m_szDir = mir_wstrdup(name); @@ -1287,7 +1265,7 @@ void CMLan::OnOutTCPConnection(u_long, SOCKET out_socket, LPVOID lpParameter) u_char snd_buf[5]; snd_buf[0] = FCODE_SND_NEXTFILE; int fsize = GetFileSize(hFile, nullptr); - *((int*)(snd_buf + 1)) = fsize; + *((int *)(snd_buf + 1)) = fsize; EMLOG("Sending file size"); if (conn->Send(snd_buf, 5)) { CloseHandle(hFile); @@ -1398,12 +1376,12 @@ int CMLan::SendFile(CCSDATA *ccs) conn->m_cid = cid; conn->m_hContact = ccs->hContact; - conn->m_szDescription = mir_wstrdup((wchar_t*)ccs->wParam); + conn->m_szDescription = mir_wstrdup((wchar_t *)ccs->wParam); int files = 0; - wchar_t** ppszFiles = (wchar_t**)ccs->lParam; + wchar_t **ppszFiles = (wchar_t **)ccs->lParam; while (ppszFiles[files]) files++; - conn->m_szFiles = new wchar_t*[files + 1]; + conn->m_szFiles = new wchar_t *[files + 1]; for (int i = 0; i < files; i++) conn->m_szFiles[i] = mir_wstrdup(ppszFiles[i]); conn->m_szFiles[files] = nullptr; @@ -1428,7 +1406,7 @@ int CMLan::FileAllow(CCSDATA *ccs) mir_cslock connLck(conn->m_csAccess); conn->m_state = TFileConnection::FCS_ALLOW; - conn->m_szDir = mir_wstrdup((wchar_t*)ccs->lParam); + conn->m_szDir = mir_wstrdup((wchar_t *)ccs->lParam); return cid; } @@ -1464,11 +1442,8 @@ int CMLan::FileCancel(CCSDATA *ccs) return 0; } -int CMLan::FileResume(int cid, PROTOFILERESUME* pfr) +int CMLan::FileResume(int cid, PROTOFILERESUME *pfr) { - //int cid = (int)ccs->wParam; - //PROTOFILERESUME* pfr = (PROTOFILERESUME*)ccs->lParam; - TFileConnection *conn = m_pFileConnectionList; while (conn) { if (conn->m_cid == cid) diff --git a/protocols/EmLanProto/src/mlan.h b/protocols/EmLanProto/src/mlan.h index 8396f5d105..9a2e257720 100644 --- a/protocols/EmLanProto/src/mlan.h +++ b/protocols/EmLanProto/src/mlan.h @@ -89,9 +89,8 @@ private: char *m_nick; TContact *m_prev; }; - u_int m_mirStatus; - TContact *m_pRootContact; - HANDLE m_hCheckThread; + u_int m_mirStatus = ID_STATUS_OFFLINE; + TContact *m_pRootContact = nullptr; wchar_t m_name[MAX_HOSTNAME_LEN]; DWORD m_nameLen; @@ -103,12 +102,13 @@ private: MCONTACT FindContact(in_addr addr, const char *nick, bool add_to_list, bool make_permanent, bool make_visible, u_int status = ID_STATUS_ONLINE); void DeleteCache(); + CTimer m_timer; + BOOL m_bChecking = false; void StartChecking(); void StopChecking(); - static void __cdecl CheckProc(void *lpParameter); - void Check(); + void OnTimer(CTimer*); - int m_handleId; + int m_handleId = 1; int GetRandomProcId() { return m_handleId++; } // TODO: must create propper CRITICAL SECTION, cause there may be collisions static void __cdecl LaunchExt(void *lpParameter); @@ -133,15 +133,15 @@ private: void ParsePacket(TPacket& pak, u_char* buf, int len = 65536); void SendPacketExt(TPacket& pak, u_long addr); - bool m_UseHostName; - u_long m_RequiredIp; + bool m_UseHostName = true; + u_long m_RequiredIp = 0; HANDLE m_hookIcqMsgReq; - char* m_amesAway; - char* m_amesNa; - char* m_amesOccupied; - char* m_amesDnd; - char* m_amesFfc; + char* m_amesAway = nullptr; + char* m_amesNa = nullptr; + char* m_amesOccupied = nullptr; + char* m_amesDnd = nullptr; + char* m_amesFfc = nullptr; struct TFileConnection { @@ -187,7 +187,7 @@ private: void FileRemoveFromList(TFileConnection* conn); mir_cs m_csFileConnectionList; - TFileConnection* m_pFileConnectionList; + TFileConnection* m_pFileConnectionList = nullptr; }; #endif //__mlan_h__ diff --git a/protocols/EmLanProto/src/stdafx.h b/protocols/EmLanProto/src/stdafx.h index 527a5b57c2..057dc15473 100644 --- a/protocols/EmLanProto/src/stdafx.h +++ b/protocols/EmLanProto/src/stdafx.h @@ -18,6 +18,7 @@ #include #include #include +#include #include "resource.h" #include "version.h" diff --git a/protocols/EmLanProto/src/version.h b/protocols/EmLanProto/src/version.h index 4a9cf125ce..4efa8d4214 100644 --- a/protocols/EmLanProto/src/version.h +++ b/protocols/EmLanProto/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 0 #define __MINOR_VERSION 1 #define __RELEASE_NUM 0 -#define __BUILD_NUM 2 +#define __BUILD_NUM 3 #include #define __FILEVERSION_DWORD PLUGIN_MAKE_VERSION(__MAJOR_VERSION,__MINOR_VERSION,__RELEASE_NUM,__BUILD_NUM) -- cgit v1.2.3