int PreShutdown(WPARAM /*wparam*/, LPARAM /*lparam*/) { { CLFileShareListAccess clCrit; bShutdownInProgress = true; for (CLFileShareNode * pclCur = pclFirstNode; pclCur ; pclCur = pclCur->pclNext) { pclCur->CloseAllTransfers(); } } if (hDirectBoundPort) nToggelAcceptConnections(0, 0); Netlib_CloseHandle(hNetlibUser); return 0; }
static INT_PTR nAddChangeRemoveShare(WPARAM wParam, LPARAM lParam) { if (!lParam) return 1001; STFileShareInfo * pclNew = (STFileShareInfo*)lParam; // make the server path lowercase char* pszPos = pclNew->pszSrvPath; while (*pszPos) { *pszPos = (char)tolower(*pszPos); pszPos++; } if (pclNew->lStructSize != sizeof(STFileShareInfo)) return 1002; CLFileShareListAccess clCritSection; bool bIsDirectory = (pclNew->pszSrvPath[strlen(pclNew->pszSrvPath)-1] == '/'); CLFileShareNode **pclPrev = &pclFirstNode; CLFileShareNode * pclCur = pclFirstNode; // insert files after directories if (!bIsDirectory) { while (pclCur && pclCur->bIsDirectory()) { pclPrev = &pclCur->pclNext; pclCur = pclCur->pclNext; } } while (pclCur) { if (_stricmp(pclCur->st.pszSrvPath, pclNew->pszSrvPath) == 0) { if (pclCur->bAnyUsers()) { // Some downloads are in progress we will try an terminate them !! // we try for 5 sec. pclCur->CloseAllTransfers(); int nTryCount = 0; do { nTryCount++; if (nTryCount >= 100) return 1004; clCritSection.Unlock(); Sleep(50); clCritSection.Lock(); } while (pclCur->bAnyUsers()); } if (!pclNew->pszRealPath || pclNew->pszRealPath[0] == 0) { // remove this one *pclPrev = pclCur->pclNext; delete pclCur; } else { // update info !! if (! pclCur->bSetInfo(pclNew)) return 1003; } return !bWriteConfigurationFile(); } pclPrev = &pclCur->pclNext; pclCur = pclCur->pclNext; } // Node was not found we will add a new one. CLFileShareNode* pclNewNode = new CLFileShareNode(pclNew); pclNewNode->pclNext = *pclPrev; *pclPrev = pclNewNode; /* Add by Sérgio Vieira Rolanski */ if (pclNew->dwOptions & OPT_SEND_LINK) SendLinkToUser(wParam, pclNew->pszSrvPath); return !bWriteConfigurationFile(); }