Change default settings for simultaneous connection.
Fix bugs of handling errors of transferring.
// 同時接続対応\r
void RemoveReceivedData(SOCKET s);\r
int CheckClosedAndReconnect(void);\r
-void CheckAllEventClosed(void);\r
+// 同時接続対応\r
+int CheckClosedAndReconnectTrnSkt(SOCKET *Skt, int *CancelCheckWork);\r
\r
/*===== updatebell.c =====*/\r
\r
{\r
if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
{\r
+ ReleaseMutex(hListAccMutex);\r
if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
- {\r
- ReleaseMutex(hListAccMutex);\r
ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
- // 同時ログイン数制限対策\r
- if(TrnSkt != INVALID_SOCKET)\r
- LastUsed = timeGetTime();\r
- else\r
- {\r
- // 同時ログイン数制限に引っかかった可能性あり\r
- // 負荷を下げるために約10秒間待機\r
- i = 10000;\r
- while(NewCmdSkt != CmdSkt && i > 0)\r
- {\r
- BackgrndMessageProc();\r
- Sleep(1);\r
- i--;\r
- }\r
- }\r
-// WaitForSingleObject(hListAccMutex, INFINITE);\r
- while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+ else\r
+ CheckClosedAndReconnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
+ // 同時ログイン数制限対策\r
+ if(TrnSkt != INVALID_SOCKET)\r
+ LastUsed = timeGetTime();\r
+ else\r
+ {\r
+ // 同時ログイン数制限に引っかかった可能性あり\r
+ // 負荷を下げるために約10秒間待機\r
+ i = 10000;\r
+ while(NewCmdSkt != CmdSkt && i > 0)\r
{\r
BackgrndMessageProc();\r
Sleep(1);\r
+ i--;\r
}\r
}\r
+// WaitForSingleObject(hListAccMutex, INFINITE);\r
+ while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+ {\r
+ BackgrndMessageProc();\r
+ Sleep(1);\r
+ }\r
}\r
else\r
{\r
if(TrnSkt != INVALID_SOCKET)\r
{\r
// 同時ログイン数制限対策\r
- // 10秒間は再利用を許可\r
- if(timeGetTime() - LastUsed > 10000)\r
+ // 60秒間使用されなければログアウト\r
+ if(timeGetTime() - LastUsed > 60000)\r
{\r
ReleaseMutex(hListAccMutex);\r
SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
{\r
iRetCode = 500;\r
SetTaskMsg(MSGJPN085, GetFileName(Pkt->LocalFile));\r
- DispDownloadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispDownloadFinishMsg(Pkt, iRetCode);\r
}\r
else if(Pkt->Mode != EXIST_IGNORE)\r
{\r
SetTaskMsg(MSGJPN089, Pkt->RemoteFile);\r
iRetCode = 200;\r
}\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+ DispDownloadFinishMsg(Pkt, iRetCode);\r
return(iRetCode);\r
}\r
\r
iRetCode = 500;\r
SetErrorMsg(MSGJPN279);\r
}\r
- DispDownloadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispDownloadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
else\r
SetErrorMsg(Buf);\r
\r
- DispDownloadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispDownloadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
SetTaskMsg(MSGJPN105, Pkt->LocalFile);\r
iRetCode = 500;\r
Pkt->Abort = ABORT_ERROR;\r
- DispUploadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispUploadFinishMsg(Pkt, iRetCode);\r
}\r
}\r
else\r
SetTaskMsg(MSGJPN107, Pkt->LocalFile);\r
iRetCode = 200;\r
}\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+ DispUploadFinishMsg(Pkt, iRetCode);\r
return(iRetCode);\r
}\r
\r
SetErrorMsg(MSGJPN279);\r
iRetCode = 500;\r
}\r
- DispUploadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispUploadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
else\r
SetErrorMsg(Buf);\r
\r
- DispUploadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispUploadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
strcpy(Set->PrivateKey, "");\r
// 同時接続対応\r
Set->MaxThreadCount = 1;\r
- Set->ReuseCmdSkt = NO;\r
+ Set->ReuseCmdSkt = YES;\r
Set->NoDisplayUI = NO;\r
// MLSD対応\r
Set->Feature = 0;\r
ATOM RegisterClassExM(CONST WNDCLASSEXA * v0)\r
{\r
ATOM r = 0;\r
+ wchar_t* pw0 = NULL;\r
+ wchar_t* pw1 = NULL;\r
+ WNDCLASSEXW a0;\r
START_ROUTINE\r
- // WNDPROCがShift_JIS用であるため\r
- r = RegisterClassExA(v0);\r
+ a0.cbSize = sizeof(WNDCLASSEXW);\r
+ a0.style = v0->style;\r
+ a0.lpfnWndProc = v0->lpfnWndProc;\r
+ a0.cbClsExtra = v0->cbClsExtra;\r
+ a0.cbWndExtra = v0->cbWndExtra;\r
+ a0.hInstance = v0->hInstance;\r
+ a0.hIcon = v0->hIcon;\r
+ a0.hCursor = v0->hCursor;\r
+ a0.hbrBackground = v0->hbrBackground;\r
+ pw0 = DuplicateMtoW(v0->lpszMenuName, -1);\r
+ a0.lpszMenuName = pw0;\r
+ pw1 = DuplicateMtoW(v0->lpszClassName, -1);\r
+ a0.lpszClassName = pw1;\r
+ a0.hIconSm = v0->hIconSm;\r
+ r = RegisterClassExW(&a0);\r
END_ROUTINE\r
+ FreeDuplicatedString(pw0);\r
+ FreeDuplicatedString(pw1);\r
return r;\r
}\r
\r
{\r
LONG r = 0;\r
START_ROUTINE\r
- // WNDPROCがShift_JIS用であるため\r
if(IsWindowUnicode(hWnd))\r
r = GetWindowLongW(hWnd, nIndex);\r
else\r
{\r
LONG r = 0;\r
START_ROUTINE\r
- // WNDPROCがShift_JIS用であるため\r
if(IsWindowUnicode(hWnd))\r
r = SetWindowLongW(hWnd, nIndex, dwNewLong);\r
else\r
{\r
LONG_PTR r = 0;\r
START_ROUTINE\r
- // WNDPROCがShift_JIS用であるため\r
if(IsWindowUnicode(hWnd))\r
r = GetWindowLongPtrW(hWnd, nIndex);\r
else\r
{\r
LONG_PTR r = 0;\r
START_ROUTINE\r
- // WNDPROCがShift_JIS用であるため\r
if(IsWindowUnicode(hWnd))\r
r = SetWindowLongPtrW(hWnd, nIndex, dwNewLong);\r
else\r
{\r
LRESULT r = 0;\r
START_ROUTINE\r
- // WNDPROCがShift_JIS用であるため\r
if(IsWindowUnicode(hWnd))\r
r = DefWindowProcW(hWnd, Msg, wParam, lParam);\r
else\r
{\r
LRESULT r = 0;\r
START_ROUTINE\r
- // WNDPROCがShift_JIS用であるため\r
if(IsWindowUnicode(hWnd))\r
r = CallWindowProcW(lpPrevWndFunc, hWnd, Msg, wParam, lParam);\r
else\r
{\r
BOOL r = FALSE;\r
wchar_t* pw0 = NULL;\r
+ wchar_t* pw1 = NULL;\r
CHOOSEFONTW a0;\r
LOGFONTW* pwlf;\r
START_ROUTINE\r
a0.rgbColors = v0->rgbColors;\r
a0.lCustData = v0->lCustData;\r
a0.lpfnHook = v0->lpfnHook;\r
- a0.lpTemplateName = DuplicateMtoW(v0->lpTemplateName, -1);\r
+ pw0 = DuplicateMtoW(v0->lpTemplateName, -1);\r
+ a0.lpTemplateName = pw0;\r
a0.hInstance = v0->hInstance;\r
- a0.lpszStyle = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4);\r
+ pw1 = DuplicateMtoWBuffer(v0->lpszStyle, -1, LF_FACESIZE * 4);\r
+ a0.lpszStyle = pw1;\r
a0.nFontType = v0->nFontType;\r
a0.nSizeMin = v0->nSizeMin;\r
a0.nSizeMax = v0->nSizeMax;\r
TerminateStringM(v0->lpLogFont->lfFaceName, LF_FACESIZE);\r
}\r
v0->rgbColors = a0.rgbColors;\r
- WtoM(v0->lpszStyle, LF_FACESIZE, a0.lpszStyle, -1);\r
+ WtoM(v0->lpszStyle, LF_FACESIZE, pw1, -1);\r
TerminateStringM(v0->lpszStyle, LF_FACESIZE);\r
v0->nFontType = a0.nFontType;\r
if(pwlf)\r
free(pwlf);\r
- FreeDuplicatedString((void*)a0.lpTemplateName);\r
- FreeDuplicatedString(a0.lpszStyle);\r
END_ROUTINE\r
FreeDuplicatedString(pw0);\r
+ FreeDuplicatedString(pw1);\r
return r;\r
}\r
\r
// 同時接続対応\r
ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount);\r
ReadIntValueFromReg(hKey5, "ReuseCmdSkt", &Host.ReuseCmdSkt);\r
+ // 1.98d以前で同時接続数が1より大きい場合はソケットの再利用なし\r
+ if(Version < 1985)\r
+ {\r
+ if(Host.MaxThreadCount > 1)\r
+ Host.ReuseCmdSkt = NO;\r
+ }\r
// MLSD対応\r
ReadIntValueFromReg(hKey5, "MLSD", &Host.UseMLSD);\r
// IPv6対応\r
\r
\r
\r
+// 同時接続対応\r
+int CheckClosedAndReconnectTrnSkt(SOCKET *Skt, int *CancelCheckWork)\r
+{\r
+ int Error;\r
+ int Sts;\r
+\r
+//SetTaskMsg("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");\r
+\r
+ Sts = FFFTP_SUCCESS;\r
+ if(AskAsyncDone(*Skt, &Error, FD_CLOSE) == YES)\r
+ {\r
+ Sts = ReConnectTrnSkt(Skt, CancelCheckWork);\r
+ }\r
+ return(Sts);\r
+}\r
+\r
// ビルドしたputty.dllに合わせてSHA1ハッシュ値を変更すること\r
RegisterTrustedModuleSHA1Hash("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00");\r
#endif\r
+ // デバッグ用\r
// g_hPuTTY = LoadLibrary("putty.dll");\r
g_hPuTTY = LoadLibrary("C:\\SourceForge\\ffftp\\putty\\Debug\\PuTTY.dll");\r
if(!g_hPuTTY\r