Loweynet
Revisão | 0753f12ff930efe77518679bf9523cb63efbb7f7 (tree) |
---|---|
Hora | 2012-01-25 22:19:55 |
Autor | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of simultaneous connection.
Change default settings for simultaneous connection.
Fix bugs of handling errors of transferring.
@@ -1837,7 +1837,8 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int | ||
1837 | 1837 | // 同時接続対応 |
1838 | 1838 | void RemoveReceivedData(SOCKET s); |
1839 | 1839 | int CheckClosedAndReconnect(void); |
1840 | -void CheckAllEventClosed(void); | |
1840 | +// 同時接続対応 | |
1841 | +int CheckClosedAndReconnectTrnSkt(SOCKET *Skt, int *CancelCheckWork); | |
1841 | 1842 | |
1842 | 1843 | /*===== updatebell.c =====*/ |
1843 | 1844 |
@@ -753,40 +753,40 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
753 | 753 | { |
754 | 754 | if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount()) |
755 | 755 | { |
756 | + ReleaseMutex(hListAccMutex); | |
756 | 757 | if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt) |
757 | - { | |
758 | - ReleaseMutex(hListAccMutex); | |
759 | 758 | ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]); |
760 | - // 同時ログイン数制限対策 | |
761 | - if(TrnSkt != INVALID_SOCKET) | |
762 | - LastUsed = timeGetTime(); | |
763 | - else | |
764 | - { | |
765 | - // 同時ログイン数制限に引っかかった可能性あり | |
766 | - // 負荷を下げるために約10秒間待機 | |
767 | - i = 10000; | |
768 | - while(NewCmdSkt != CmdSkt && i > 0) | |
769 | - { | |
770 | - BackgrndMessageProc(); | |
771 | - Sleep(1); | |
772 | - i--; | |
773 | - } | |
774 | - } | |
775 | -// WaitForSingleObject(hListAccMutex, INFINITE); | |
776 | - while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
759 | + else | |
760 | + CheckClosedAndReconnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]); | |
761 | + // 同時ログイン数制限対策 | |
762 | + if(TrnSkt != INVALID_SOCKET) | |
763 | + LastUsed = timeGetTime(); | |
764 | + else | |
765 | + { | |
766 | + // 同時ログイン数制限に引っかかった可能性あり | |
767 | + // 負荷を下げるために約10秒間待機 | |
768 | + i = 10000; | |
769 | + while(NewCmdSkt != CmdSkt && i > 0) | |
777 | 770 | { |
778 | 771 | BackgrndMessageProc(); |
779 | 772 | Sleep(1); |
773 | + i--; | |
780 | 774 | } |
781 | 775 | } |
776 | +// WaitForSingleObject(hListAccMutex, INFINITE); | |
777 | + while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
778 | + { | |
779 | + BackgrndMessageProc(); | |
780 | + Sleep(1); | |
781 | + } | |
782 | 782 | } |
783 | 783 | else |
784 | 784 | { |
785 | 785 | if(TrnSkt != INVALID_SOCKET) |
786 | 786 | { |
787 | 787 | // 同時ログイン数制限対策 |
788 | - // 10秒間は再利用を許可 | |
789 | - if(timeGetTime() - LastUsed > 10000) | |
788 | + // 60秒間使用されなければログアウト | |
789 | + if(timeGetTime() - LastUsed > 60000) | |
790 | 790 | { |
791 | 791 | ReleaseMutex(hListAccMutex); |
792 | 792 | SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]); |
@@ -1305,7 +1305,8 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork) | ||
1305 | 1305 | { |
1306 | 1306 | iRetCode = 500; |
1307 | 1307 | SetTaskMsg(MSGJPN085, GetFileName(Pkt->LocalFile)); |
1308 | - DispDownloadFinishMsg(Pkt, iRetCode); | |
1308 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
1309 | +// DispDownloadFinishMsg(Pkt, iRetCode); | |
1309 | 1310 | } |
1310 | 1311 | else if(Pkt->Mode != EXIST_IGNORE) |
1311 | 1312 | { |
@@ -1352,6 +1353,8 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork) | ||
1352 | 1353 | SetTaskMsg(MSGJPN089, Pkt->RemoteFile); |
1353 | 1354 | iRetCode = 200; |
1354 | 1355 | } |
1356 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
1357 | + DispDownloadFinishMsg(Pkt, iRetCode); | |
1355 | 1358 | return(iRetCode); |
1356 | 1359 | } |
1357 | 1360 |
@@ -1466,7 +1469,8 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) | ||
1466 | 1469 | iRetCode = 500; |
1467 | 1470 | SetErrorMsg(MSGJPN279); |
1468 | 1471 | } |
1469 | - DispDownloadFinishMsg(Pkt, iRetCode); | |
1472 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
1473 | +// DispDownloadFinishMsg(Pkt, iRetCode); | |
1470 | 1474 | |
1471 | 1475 | return(iRetCode); |
1472 | 1476 | } |
@@ -1563,7 +1567,8 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork) | ||
1563 | 1567 | else |
1564 | 1568 | SetErrorMsg(Buf); |
1565 | 1569 | |
1566 | - DispDownloadFinishMsg(Pkt, iRetCode); | |
1570 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
1571 | +// DispDownloadFinishMsg(Pkt, iRetCode); | |
1567 | 1572 | |
1568 | 1573 | return(iRetCode); |
1569 | 1574 | } |
@@ -2600,7 +2605,8 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt) | ||
2600 | 2605 | SetTaskMsg(MSGJPN105, Pkt->LocalFile); |
2601 | 2606 | iRetCode = 500; |
2602 | 2607 | Pkt->Abort = ABORT_ERROR; |
2603 | - DispUploadFinishMsg(Pkt, iRetCode); | |
2608 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
2609 | +// DispUploadFinishMsg(Pkt, iRetCode); | |
2604 | 2610 | } |
2605 | 2611 | } |
2606 | 2612 | else |
@@ -2609,6 +2615,8 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt) | ||
2609 | 2615 | SetTaskMsg(MSGJPN107, Pkt->LocalFile); |
2610 | 2616 | iRetCode = 200; |
2611 | 2617 | } |
2618 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
2619 | + DispUploadFinishMsg(Pkt, iRetCode); | |
2612 | 2620 | return(iRetCode); |
2613 | 2621 | } |
2614 | 2622 |
@@ -2737,7 +2745,8 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) | ||
2737 | 2745 | SetErrorMsg(MSGJPN279); |
2738 | 2746 | iRetCode = 500; |
2739 | 2747 | } |
2740 | - DispUploadFinishMsg(Pkt, iRetCode); | |
2748 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
2749 | +// DispUploadFinishMsg(Pkt, iRetCode); | |
2741 | 2750 | |
2742 | 2751 | return(iRetCode); |
2743 | 2752 | } |
@@ -2854,7 +2863,8 @@ static int UpLoadPassive(TRANSPACKET *Pkt) | ||
2854 | 2863 | else |
2855 | 2864 | SetErrorMsg(Buf); |
2856 | 2865 | |
2857 | - DispUploadFinishMsg(Pkt, iRetCode); | |
2866 | + // エラーによってはダイアログが表示されない場合があるバグ対策 | |
2867 | +// DispUploadFinishMsg(Pkt, iRetCode); | |
2858 | 2868 | |
2859 | 2869 | return(iRetCode); |
2860 | 2870 | } |
@@ -1344,7 +1344,7 @@ void CopyDefaultHost(HOSTDATA *Set) | ||
1344 | 1344 | strcpy(Set->PrivateKey, ""); |
1345 | 1345 | // 同時接続対応 |
1346 | 1346 | Set->MaxThreadCount = 1; |
1347 | - Set->ReuseCmdSkt = NO; | |
1347 | + Set->ReuseCmdSkt = YES; | |
1348 | 1348 | Set->NoDisplayUI = NO; |
1349 | 1349 | // MLSD対応 |
1350 | 1350 | Set->Feature = 0; |
@@ -699,10 +699,28 @@ END_ROUTINE | ||
699 | 699 | ATOM RegisterClassExM(CONST WNDCLASSEXA * v0) |
700 | 700 | { |
701 | 701 | ATOM r = 0; |
702 | + wchar_t* pw0 = NULL; | |
703 | + wchar_t* pw1 = NULL; | |
704 | + WNDCLASSEXW a0; | |
702 | 705 | START_ROUTINE |
703 | - // WNDPROCがShift_JIS用であるため | |
704 | - r = RegisterClassExA(v0); | |
706 | + a0.cbSize = sizeof(WNDCLASSEXW); | |
707 | + a0.style = v0->style; | |
708 | + a0.lpfnWndProc = v0->lpfnWndProc; | |
709 | + a0.cbClsExtra = v0->cbClsExtra; | |
710 | + a0.cbWndExtra = v0->cbWndExtra; | |
711 | + a0.hInstance = v0->hInstance; | |
712 | + a0.hIcon = v0->hIcon; | |
713 | + a0.hCursor = v0->hCursor; | |
714 | + a0.hbrBackground = v0->hbrBackground; | |
715 | + pw0 = DuplicateMtoW(v0->lpszMenuName, -1); | |
716 | + a0.lpszMenuName = pw0; | |
717 | + pw1 = DuplicateMtoW(v0->lpszClassName, -1); | |
718 | + a0.lpszClassName = pw1; | |
719 | + a0.hIconSm = v0->hIconSm; | |
720 | + r = RegisterClassExW(&a0); | |
705 | 721 | END_ROUTINE |
722 | + FreeDuplicatedString(pw0); | |
723 | + FreeDuplicatedString(pw1); | |
706 | 724 | return r; |
707 | 725 | } |
708 | 726 |
@@ -725,7 +743,6 @@ LONG GetWindowLongM(HWND hWnd, int nIndex) | ||
725 | 743 | { |
726 | 744 | LONG r = 0; |
727 | 745 | START_ROUTINE |
728 | - // WNDPROCがShift_JIS用であるため | |
729 | 746 | if(IsWindowUnicode(hWnd)) |
730 | 747 | r = GetWindowLongW(hWnd, nIndex); |
731 | 748 | else |
@@ -738,7 +755,6 @@ LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong) | ||
738 | 755 | { |
739 | 756 | LONG r = 0; |
740 | 757 | START_ROUTINE |
741 | - // WNDPROCがShift_JIS用であるため | |
742 | 758 | if(IsWindowUnicode(hWnd)) |
743 | 759 | r = SetWindowLongW(hWnd, nIndex, dwNewLong); |
744 | 760 | else |
@@ -751,7 +767,6 @@ LONG_PTR GetWindowLongPtrM(HWND hWnd, int nIndex) | ||
751 | 767 | { |
752 | 768 | LONG_PTR r = 0; |
753 | 769 | START_ROUTINE |
754 | - // WNDPROCがShift_JIS用であるため | |
755 | 770 | if(IsWindowUnicode(hWnd)) |
756 | 771 | r = GetWindowLongPtrW(hWnd, nIndex); |
757 | 772 | else |
@@ -764,7 +779,6 @@ LONG_PTR SetWindowLongPtrM(HWND hWnd, int nIndex, LONG_PTR dwNewLong) | ||
764 | 779 | { |
765 | 780 | LONG_PTR r = 0; |
766 | 781 | START_ROUTINE |
767 | - // WNDPROCがShift_JIS用であるため | |
768 | 782 | if(IsWindowUnicode(hWnd)) |
769 | 783 | r = SetWindowLongPtrW(hWnd, nIndex, dwNewLong); |
770 | 784 | else |
@@ -777,7 +791,6 @@ LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) | ||
777 | 791 | { |
778 | 792 | LRESULT r = 0; |
779 | 793 | START_ROUTINE |
780 | - // WNDPROCがShift_JIS用であるため | |
781 | 794 | if(IsWindowUnicode(hWnd)) |
782 | 795 | r = DefWindowProcW(hWnd, Msg, wParam, lParam); |
783 | 796 | else |
@@ -790,7 +803,6 @@ LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wPara | ||
790 | 803 | { |
791 | 804 | LRESULT r = 0; |
792 | 805 | START_ROUTINE |
793 | - // WNDPROCがShift_JIS用であるため | |
794 | 806 | if(IsWindowUnicode(hWnd)) |
795 | 807 | r = CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam); |
796 | 808 | else |
@@ -1978,6 +1990,7 @@ BOOL ChooseFontM(LPCHOOSEFONTA v0) | ||
1978 | 1990 | { |
1979 | 1991 | BOOL r = FALSE; |
1980 | 1992 | wchar_t* pw0 = NULL; |
1993 | + wchar_t* pw1 = NULL; | |
1981 | 1994 | CHOOSEFONTW a0; |
1982 | 1995 | LOGFONTW* pwlf; |
1983 | 1996 | START_ROUTINE |
@@ -2010,9 +2023,11 @@ START_ROUTINE | ||
2010 | 2023 | a0.rgbColors = v0->rgbColors; |
2011 | 2024 | a0.lCustData = v0->lCustData; |
2012 | 2025 | a0.lpfnHook = v0->lpfnHook; |
2013 | - a0.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1); | |
2026 | + pw0 = DuplicateMtoW(v0->lpTemplateName, -1); | |
2027 | + a0.lpTemplateName = pw0; | |
2014 | 2028 | a0.hInstance = v0->hInstance; |
2015 | - a0.lpszStyle = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4); | |
2029 | + pw1 = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4); | |
2030 | + a0.lpszStyle = pw1; | |
2016 | 2031 | a0.nFontType = v0->nFontType; |
2017 | 2032 | a0.nSizeMin = v0->nSizeMin; |
2018 | 2033 | a0.nSizeMax = v0->nSizeMax; |
@@ -2036,15 +2051,14 @@ START_ROUTINE | ||
2036 | 2051 | TerminateStringM(v0->lpLogFont->lfFaceName, LF_FACESIZE); |
2037 | 2052 | } |
2038 | 2053 | v0->rgbColors = a0.rgbColors; |
2039 | - WtoM(v0->lpszStyle, LF_FACESIZE, a0.lpszStyle, -1); | |
2054 | + WtoM(v0->lpszStyle, LF_FACESIZE, pw1, -1); | |
2040 | 2055 | TerminateStringM(v0->lpszStyle, LF_FACESIZE); |
2041 | 2056 | v0->nFontType = a0.nFontType; |
2042 | 2057 | if(pwlf) |
2043 | 2058 | free(pwlf); |
2044 | - FreeDuplicatedString((void*)a0.lpTemplateName); | |
2045 | - FreeDuplicatedString(a0.lpszStyle); | |
2046 | 2059 | END_ROUTINE |
2047 | 2060 | FreeDuplicatedString(pw0); |
2061 | + FreeDuplicatedString(pw1); | |
2048 | 2062 | return r; |
2049 | 2063 | } |
2050 | 2064 |
@@ -960,6 +960,12 @@ int LoadRegistory(void) | ||
960 | 960 | // 同時接続対応 |
961 | 961 | ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount); |
962 | 962 | ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt); |
963 | + // 1.98d以前で同時接続数が1より大きい場合はソケットの再利用なし | |
964 | + if(Version < 1985) | |
965 | + { | |
966 | + if(Host.MaxThreadCount > 1) | |
967 | + Host.ReuseCmdSkt = NO; | |
968 | + } | |
963 | 969 | // MLSD対応 |
964 | 970 | ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD); |
965 | 971 | // IPv6対応 |
@@ -1225,3 +1225,19 @@ int CheckClosedAndReconnect(void) | ||
1225 | 1225 | |
1226 | 1226 | |
1227 | 1227 | |
1228 | +// 同時接続対応 | |
1229 | +int CheckClosedAndReconnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) | |
1230 | +{ | |
1231 | + int Error; | |
1232 | + int Sts; | |
1233 | + | |
1234 | +//SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); | |
1235 | + | |
1236 | + Sts = FFFTP_SUCCESS; | |
1237 | + if(AskAsyncDone(*Skt, &Error, FD_CLOSE) == YES) | |
1238 | + { | |
1239 | + Sts = ReConnectTrnSkt(Skt, CancelCheckWork); | |
1240 | + } | |
1241 | + return(Sts); | |
1242 | +} | |
1243 | + |
@@ -1045,6 +1045,7 @@ BOOL LoadPuTTY() | ||
1045 | 1045 | // ビルドしたputty.dllに合わせてSHA1ハッシュ値を変更すること |
1046 | 1046 | RegisterTrustedModuleSHA1Hash("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"); |
1047 | 1047 | #endif |
1048 | + // デバッグ用 | |
1048 | 1049 | // g_hPuTTY = LoadLibrary("putty.dll"); |
1049 | 1050 | g_hPuTTY = LoadLibrary("C:\\SourceForge\\ffftp\\putty\\Debug\\PuTTY.dll"); |
1050 | 1051 | if(!g_hPuTTY |