summaryrefslogtreecommitdiff
path: root/plugins/HTTPServer/src/FileShareNode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/HTTPServer/src/FileShareNode.cpp')
-rw-r--r--plugins/HTTPServer/src/FileShareNode.cpp375
1 files changed, 375 insertions, 0 deletions
diff --git a/plugins/HTTPServer/src/FileShareNode.cpp b/plugins/HTTPServer/src/FileShareNode.cpp
new file mode 100644
index 0000000000..d2e9f62731
--- /dev/null
+++ b/plugins/HTTPServer/src/FileShareNode.cpp
@@ -0,0 +1,375 @@
+//This file is part of HTTPServer a Miranda IM plugin
+//Copyright (C)2002 Kennet Nielsen
+//
+//This program is free software; you can redistribute it and/or
+//modify it under the terms of the GNU General Public License
+//as published by the Free Software Foundation; either
+//version 2 of the License, or (at your option) any later version.
+//
+//This program is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+//
+//You should have received a copy of the GNU General Public License
+//along with this program; if not, write to the Free Software
+//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
+#include "Glob.h"
+
+CLFileShareNode * pclFirstNode = NULL;
+CRITICAL_SECTION csFileShareListAccess;
+
+
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : CLShareUser
+// Type : Private / Public / Protected
+// Parameters : None
+// Returns :
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030918, 18 september 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+CLShareUser::CLShareUser(HANDLE hCon, in_addr stAdd) {
+ hConnection = hCon;
+ stAddr = stAdd;
+ pclNext = NULL;
+ dwTotalSize = 0;
+ dwCurrentDL = 0;
+ dwSpeed = 0;
+}
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : ~CLShareUser
+// Type : Private / Public / Protected
+// Parameters : None
+// Returns :
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 031124, 24 november 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+CLShareUser::~CLShareUser() {
+ if (hConnection) {
+ CloseSocket();
+ Netlib_CloseHandle(hConnection);
+ }
+}
+
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : CloseSend
+// Type : Private / Public / Protected
+// Parameters : None
+// Returns : void
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 031124, 24 november 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+void CLShareUser::CloseSocket() {
+ SOCKET s = CallService(MS_NETLIB_GETSOCKET, (WPARAM) hConnection, 0);
+ if (s != INVALID_SOCKET) {
+ shutdown(s, SD_SEND);
+ int nBytesRead;
+ do {
+ char szBuf[100];
+ nBytesRead = Netlib_Recv(hConnection, szBuf, sizeof(szBuf), 0);
+ } while (nBytesRead && nBytesRead != SOCKET_ERROR);
+ //shutdown( s, SD_RECEIVE );
+ }
+}
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : dwGetDownloadSpeed
+// Type : Private / Public / Protected
+// Parameters : None
+// Returns : DWORD
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030918, 18 september 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+DWORD CLShareUser::dwGetDownloadSpeed() {
+ return dwSpeed;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : CLFileShareNode
+// Type : Private / Public / Protected
+// Parameters : NULL - ?
+// Returns :
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030826, 26 august 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+CLFileShareNode::CLFileShareNode(char * pszSrvPath, char * pszRealPath) {
+ memset(&st, 0, sizeof(STFileShareInfo));
+ st.lStructSize = sizeof(STFileShareInfo);
+ pclNext = NULL;
+ pclCurrentUsers = NULL;
+
+ bSetPaths(pszSrvPath, pszRealPath);
+}
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : CLFileShareNode
+// Type : Global
+// Parameters : pstInfo - ?
+// Returns :
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030829, 29 august 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+CLFileShareNode::CLFileShareNode(STFileShareInfo * pstInfo) {
+ memset(&st, 0, sizeof(STFileShareInfo));
+ st.lStructSize = sizeof(STFileShareInfo);
+ pclNext = NULL;
+ pclCurrentUsers = NULL;
+
+ bSetInfo(pstInfo);
+}
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : ~CLFileShareNode
+// Type : Private / Public / Protected
+// Parameters : None
+// Returns :
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030826, 26 august 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+CLFileShareNode::~CLFileShareNode() {
+ delete [] st.pszSrvPath;
+ delete [] st.pszRealPath;
+
+ CLShareUser * pclCur = pclCurrentUsers;
+ while (pclCur) {
+ CLShareUser * pclNext = pclCur->pclNext;
+ delete pclCur;
+ pclCur = pclNext;
+ }
+}
+
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : bSetPaths
+// Type : Private / Public / Protected
+// Parameters : pszSrvPath - ?
+// pszRealPath - ?
+// Returns : Returns true if
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030829, 29 august 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+bool CLFileShareNode::bSetPaths(char * pszSrvPath, char * pszRealPath) {
+ /* This might be a problem !!
+ if( nDownloadsInProgress > 0 )
+ return false;
+ */
+
+ if (!pszSrvPath || !pszRealPath)
+ return false;
+
+ delete [] st.pszSrvPath;
+ delete [] st.pszRealPath;
+
+ st.dwMaxSrvPath = strlen(pszSrvPath) + 1;
+ st.pszSrvPath = new char[ st.dwMaxSrvPath ];
+ strcpy(st.pszSrvPath, pszSrvPath);
+
+ int nRealLen = strlen(pszRealPath);
+ if (nRealLen <= 2 || !(pszRealPath[1] == ':' ||
+ (pszRealPath[0] == '\\' && pszRealPath[1] == '\\'))) {
+ // Relative path
+ // we will prepend plugin path to avoid problems
+ st.dwMaxRealPath = nPluginPathLen + nRealLen + 1;
+ st.pszRealPath = new char[ st.dwMaxRealPath ];
+ strcpy(st.pszRealPath, szPluginPath);
+ pszOrigRealPath = &st.pszRealPath[nPluginPathLen];
+ } else {
+ st.dwMaxRealPath = nRealLen + 1;
+ st.pszRealPath = new char[ st.dwMaxRealPath ];
+ pszOrigRealPath = st.pszRealPath;
+ }
+ strcpy(pszOrigRealPath, pszRealPath);
+ return true;
+}
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : bSetInfo
+// Type : Private / Public / Protected
+// Parameters : pstInfo - ?
+// Returns : Returns true if
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030829, 29 august 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+bool CLFileShareNode::bSetInfo(STFileShareInfo * pstInfo) {
+ if (! bSetPaths(pstInfo->pszSrvPath, pstInfo->pszRealPath))
+ return false;
+ if (pstInfo->nMaxDownloads < -1)
+ return false;
+
+ st.dwAllowedIP = pstInfo->dwAllowedIP;
+ st.dwAllowedMask = pstInfo->dwAllowedMask;
+ st.nMaxDownloads = pstInfo->nMaxDownloads;
+ st.dwOptions = pstInfo->dwOptions;
+ return true;
+}
+
+/*
+/////////////////////////////////////////////////////////////////////
+// Member Function : bAddHttpUser
+// Type : Private / Public / Protected
+// Parameters : hConnection - ?
+// stAddr - ?
+// Returns : Returns true if
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030902, 02 september 2003
+// Developer : KN, Houdini
+/////////////////////////////////////////////////////////////////////
+
+CLHttpUser * CLFileShareNode::pclAddHttpUser( HANDLE hConnection, in_addr stAddr )
+{
+ CLHttpUser * pclCur = pclCurrentUsers;
+ while( pclCur )
+ {
+ if( pclCur->hConnection == hConnection )
+ {
+ return NULL;
+ }
+ pclCur = pclCur->pclNext;
+ }
+ pclCurrentUsers = new CLHttpUser( hConnection, stAddr, pclCurrentUsers );
+ UpdateStatisticsView();
+ return pclCurrentUsers;
+}
+*/
+
+bool CLFileShareNode::bAddUser(CLShareUser * pclUser) {
+ // deny access
+ if (bIsOnline || !bLimitOnlyWhenOnline) {
+ int nConnectionCount = 0;
+ int nUserConnectionCount = 0;
+
+ // iterate through all shares
+ CLFileShareNode * pclShare = pclFirstNode;
+ while (pclShare) {
+ // iterate through its users
+ CLShareUser * pclCur = pclShare->pclCurrentUsers;
+ while (pclCur) {
+ //strcmp(pclCur->szCurrentDLSrvPath, pclUser->szCurrentDLSrvPath) == 0) // same file
+ if (memcmp(&pclCur->stAddr, &pclUser->stAddr, sizeof(in_addr)) == 0) // same IP
+ nUserConnectionCount++;
+
+ nConnectionCount++;
+
+ pclCur = pclCur->pclNext;
+ }
+ pclShare = pclShare->pclNext;
+ }
+
+ if (nMaxConnectionsTotal >= 0)
+ if (nConnectionCount + 1 > nMaxConnectionsTotal)
+ return false;
+
+ if (nMaxConnectionsPerUser >= 0)
+ if (nUserConnectionCount + 1 > nMaxConnectionsPerUser)
+ return false;
+ }
+
+ pclUser->pclNext = pclCurrentUsers;
+ pclCurrentUsers = pclUser;
+ UpdateStatisticsView();
+ return true;
+}
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : bRemoveUser
+// Type : Private / Public / Protected
+// Parameters : pclUser - ?
+// Returns : Returns true if
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030918, 18 september 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+bool CLFileShareNode::bRemoveUser(CLShareUser * pclUser) {
+ CLShareUser **pclPrev = &pclCurrentUsers;
+ CLShareUser * pclCur = pclCurrentUsers;
+ while (pclCur) {
+ if (pclCur == pclUser) {
+ *pclPrev = pclCur->pclNext;
+ UpdateStatisticsView();
+ return true;
+ }
+ pclPrev = &pclCur->pclNext;
+ pclCur = pclCur->pclNext;
+ }
+ return false;
+}
+
+/////////////////////////////////////////////////////////////////////
+// Member Function : CloseAllTransfers
+// Type : Private / Public / Protected
+// Parameters : None
+// Returns : void
+// Description :
+//
+// References : -
+// Remarks : -
+// Created : 030902, 02 september 2003
+// Developer : KN
+/////////////////////////////////////////////////////////////////////
+
+void CLFileShareNode::CloseAllTransfers() {
+ CLShareUser * pclCur = pclCurrentUsers;
+ while (pclCur) {
+ pclCur->CloseSocket();
+ pclCur = pclCur->pclNext;
+ }
+} \ No newline at end of file