From: s_kawamoto Date: Mon, 19 Sep 2011 04:26:00 +0000 (+0900) Subject: Add support for simultaneous connection for file transfer (sometimes freezes). X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=commitdiff_plain;h=3456a73457a7cc6ddcdd8900f275cd28a9c3b6b7 Add support for simultaneous connection for file transfer (sometimes freezes). --- diff --git a/FFFTP.vc90.vcproj b/FFFTP.vc90.vcproj index e7124f0..6ea6f40 100644 --- a/FFFTP.vc90.vcproj +++ b/FFFTP.vc90.vcproj @@ -1,4 +1,4 @@ - + + + + Next; + // ディレクトリ操作は非同期で行わない +// ReleaseMutex(hListAccMutex); if(hWndTrans == NULL) { - if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) || - (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) || - (strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) || - (strncmp(TransPacketBase->Cmd, "L-", 2) == 0) || - (strncmp(TransPacketBase->Cmd, "R-", 2) == 0)) +// if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) || +// (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) || +// (strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) || +// (strncmp(TransPacketBase->Cmd, "L-", 2) == 0) || +// (strncmp(TransPacketBase->Cmd, "R-", 2) == 0)) + if((strncmp(Pos->Cmd, "RETR", 4) == 0) || + (strncmp(Pos->Cmd, "STOR", 4) == 0) || + (strncmp(Pos->Cmd, "MKD", 3) == 0) || + (strncmp(Pos->Cmd, "L-", 2) == 0) || + (strncmp(Pos->Cmd, "R-", 2) == 0)) { hWndTrans = CreateDialog(GetFtpInst(), MAKEINTRESOURCE(transfer_dlg), HWND_DESKTOP, (DLGPROC)TransDlgProc); if(MoveToForeground == YES) SetForegroundWindow(hWndTrans); ShowWindow(hWndTrans, SW_SHOWNOACTIVATE); + GetWindowRect(hWndTrans, &WndRect); + SetWindowPos(hWndTrans, NULL, WndRect.left, WndRect.top + (WndRect.bottom - WndRect.top) * ThreadCount - (WndRect.bottom - WndRect.top) * (AskMaxThreadCount() - 1) / 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } } - TransPacketBase->hWndTrans = hWndTrans; +// TransPacketBase->hWndTrans = hWndTrans; + Pos->hWndTrans = hWndTrans; + Pos->ctrl_skt = TrnSkt; + Pos->ThreadCount = ThreadCount; if(hWndTrans != NULL) { @@ -612,60 +691,85 @@ static ULONG WINAPI TransferThread(void *Dummy) } if(hWndTrans != NULL) - SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)TransPacketBase); +// SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)TransPacketBase); + SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)Pos); /* ダウンロード */ - if(strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) +// if(strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) + if(strncmp(Pos->Cmd, "RETR", 4) == 0) { + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため +// ReleaseMutex(hListAccMutex); /* 不正なパスを検出 */ - if(CheckPathViolation(TransPacketBase) == NO) +// if(CheckPathViolation(TransPacketBase) == NO) + if(CheckPathViolation(Pos) == NO) { /* フルパスを使わないための処理 */ - if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) +// if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) + if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS) { - if(strncmp(TransPacketBase->Cmd, "RETR-S", 6) == 0) +// if(strncmp(TransPacketBase->Cmd, "RETR-S", 6) == 0) + if(strncmp(Pos->Cmd, "RETR-S", 6) == 0) { /* サイズと日付を取得 */ - DoSIZE(TransPacketBase->RemoteFile, &TransPacketBase->Size); - DoMDTM(TransPacketBase->RemoteFile, &TransPacketBase->Time); - strcpy(TransPacketBase->Cmd, "RETR "); +// DoSIZE(TransPacketBase->RemoteFile, &TransPacketBase->Size); +// DoMDTM(TransPacketBase->RemoteFile, &TransPacketBase->Time); +// strcpy(TransPacketBase->Cmd, "RETR "); + DoSIZE(TrnSkt, Pos->RemoteFile, &Pos->Size); + DoMDTM(TrnSkt, Pos->RemoteFile, &Pos->Time); + strcpy(Pos->Cmd, "RETR "); } Down = YES; // if(DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO) == 429) // { // if(ReConnectTrnSkt() == FFFTP_SUCCESS) - DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled); +// DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled); + DoDownLoad(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]); // } } } + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため + ReleaseMutex(hListAccMutex); } /* アップロード */ - else if(strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) +// else if(strncmp(TransPacketBase->Cmd, "STOR", 4) == 0) + else if(strncmp(Pos->Cmd, "STOR", 4) == 0) { + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため +// ReleaseMutex(hListAccMutex); /* フルパスを使わないための処理 */ - if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) +// if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) + if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS) { Up = YES; // if(DoUpLoad(AskTrnCtrlSkt(), TransPacketBase) == 429) // { // if(ReConnectTrnSkt() == FFFTP_SUCCESS) - DoUpLoad(AskTrnCtrlSkt(), TransPacketBase); +// DoUpLoad(AskTrnCtrlSkt(), TransPacketBase); + DoUpLoad(TrnSkt, Pos); // } } + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため + ReleaseMutex(hListAccMutex); } /* フォルダ作成(ローカルまたはホスト) */ - else if(strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) +// else if(strncmp(TransPacketBase->Cmd, "MKD", 3) == 0) + else if(strncmp(Pos->Cmd, "MKD", 3) == 0) { - DispTransFileInfo(TransPacketBase, MSGJPN078, FALSE, YES); +// DispTransFileInfo(TransPacketBase, MSGJPN078, FALSE, YES); + DispTransFileInfo(Pos, MSGJPN078, FALSE, YES); - if(strlen(TransPacketBase->RemoteFile) > 0) +// if(strlen(TransPacketBase->RemoteFile) > 0) + if(strlen(Pos->RemoteFile) > 0) { /* フルパスを使わないための処理 */ CwdSts = FTP_COMPLETE; - strcpy(Tmp, TransPacketBase->RemoteFile); - if(ProcForNonFullpath(Tmp, CurDir, hWndTrans, 1) == FFFTP_FAIL) +// strcpy(Tmp, TransPacketBase->RemoteFile); + strcpy(Tmp, Pos->RemoteFile); +// if(ProcForNonFullpath(Tmp, CurDir, hWndTrans, 1) == FFFTP_FAIL) + if(ProcForNonFullpath(Tmp, CurDir, hWndTrans, (int)TrnSkt + 1) == FFFTP_FAIL) { ClearAll = YES; CwdSts = FTP_ERROR; @@ -674,130 +778,181 @@ static ULONG WINAPI TransferThread(void *Dummy) if(CwdSts == FTP_COMPLETE) { Up = YES; - CommandProcTrn(NULL, "MKD %s", Tmp); +// CommandProcTrn(NULL, "MKD %s", Tmp); + CommandProcTrn(TrnSkt, NULL, "MKD %s", Tmp); /* すでにフォルダがある場合もあるので、 */ /* ここではエラーチェックはしない */ if(FolderAttr) - CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Tmp); +// CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Tmp); + CommandProcTrn(TrnSkt, NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Tmp); } } - else if(strlen(TransPacketBase->LocalFile) > 0) +// else if(strlen(TransPacketBase->LocalFile) > 0) + else if(strlen(Pos->LocalFile) > 0) { Down = YES; - DoLocalMKD(TransPacketBase->LocalFile); +// DoLocalMKD(TransPacketBase->LocalFile); + DoLocalMKD(Pos->LocalFile); } + ReleaseMutex(hListAccMutex); } /* ディレクトリ作成(常にホスト側) */ - else if(strncmp(TransPacketBase->Cmd, "R-MKD", 5) == 0) +// else if(strncmp(TransPacketBase->Cmd, "R-MKD", 5) == 0) + else if(strncmp(Pos->Cmd, "R-MKD", 5) == 0) { - DispTransFileInfo(TransPacketBase, MSGJPN079, FALSE, YES); +// DispTransFileInfo(TransPacketBase, MSGJPN079, FALSE, YES); + DispTransFileInfo(Pos, MSGJPN079, FALSE, YES); /* フルパスを使わないための処理 */ - if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) +// if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) + if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS) { Up = YES; - CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); +// CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); + CommandProcTrn(TrnSkt, NULL, "%s%s", Pos->Cmd+2, Pos->RemoteFile); if(FolderAttr) - CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, TransPacketBase->RemoteFile); +// CommandProcTrn(NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, TransPacketBase->RemoteFile); + CommandProcTrn(TrnSkt, NULL, "%s %03d %s", AskHostChmodCmd(), FolderAttrNum, Pos->RemoteFile); } + ReleaseMutex(hListAccMutex); } /* ディレクトリ削除(常にホスト側) */ - else if(strncmp(TransPacketBase->Cmd, "R-RMD", 5) == 0) +// else if(strncmp(TransPacketBase->Cmd, "R-RMD", 5) == 0) + else if(strncmp(Pos->Cmd, "R-RMD", 5) == 0) { - DispTransFileInfo(TransPacketBase, MSGJPN080, FALSE, YES); +// DispTransFileInfo(TransPacketBase, MSGJPN080, FALSE, YES); + DispTransFileInfo(Pos, MSGJPN080, FALSE, YES); - DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase); +// DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase); + DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, Pos); if((DelNotify == YES) || (DelNotify == YES_ALL)) { /* フルパスを使わないための処理 */ - if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) +// if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) + if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS) { Up = YES; - CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); +// CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); + CommandProcTrn(TrnSkt, NULL, "%s%s", Pos->Cmd+2, Pos->RemoteFile); } } + ReleaseMutex(hListAccMutex); } /* ファイル削除(常にホスト側) */ - else if(strncmp(TransPacketBase->Cmd, "R-DELE", 6) == 0) +// else if(strncmp(TransPacketBase->Cmd, "R-DELE", 6) == 0) + else if(strncmp(Pos->Cmd, "R-DELE", 6) == 0) { - DispTransFileInfo(TransPacketBase, MSGJPN081, FALSE, YES); + ReleaseMutex(hListAccMutex); +// DispTransFileInfo(TransPacketBase, MSGJPN081, FALSE, YES); + DispTransFileInfo(Pos, MSGJPN081, FALSE, YES); - DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase); +// DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, TransPacketBase); + DelNotify = MirrorDelNotify(WIN_REMOTE, DelNotify, Pos); if((DelNotify == YES) || (DelNotify == YES_ALL)) { /* フルパスを使わないための処理 */ - if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) +// if(MakeNonFullPath(TransPacketBase, CurDir, Tmp) == FFFTP_SUCCESS) + if(MakeNonFullPath(Pos, CurDir, Tmp) == FFFTP_SUCCESS) { Up = YES; - CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); +// CommandProcTrn(NULL, "%s%s", TransPacketBase->Cmd+2, TransPacketBase->RemoteFile); + CommandProcTrn(TrnSkt, NULL, "%s%s", Pos->Cmd+2, Pos->RemoteFile); } } } /* ディレクトリ作成(常にローカル側) */ - else if(strncmp(TransPacketBase->Cmd, "L-MKD", 5) == 0) +// else if(strncmp(TransPacketBase->Cmd, "L-MKD", 5) == 0) + else if(strncmp(Pos->Cmd, "L-MKD", 5) == 0) { - DispTransFileInfo(TransPacketBase, MSGJPN082, FALSE, YES); +// DispTransFileInfo(TransPacketBase, MSGJPN082, FALSE, YES); + DispTransFileInfo(Pos, MSGJPN082, FALSE, YES); Down = YES; - DoLocalMKD(TransPacketBase->LocalFile); +// DoLocalMKD(TransPacketBase->LocalFile); + DoLocalMKD(Pos->LocalFile); + ReleaseMutex(hListAccMutex); } /* ディレクトリ削除(常にローカル側) */ - else if(strncmp(TransPacketBase->Cmd, "L-RMD", 5) == 0) +// else if(strncmp(TransPacketBase->Cmd, "L-RMD", 5) == 0) + else if(strncmp(Pos->Cmd, "L-RMD", 5) == 0) { - DispTransFileInfo(TransPacketBase, MSGJPN083, FALSE, YES); +// DispTransFileInfo(TransPacketBase, MSGJPN083, FALSE, YES); + DispTransFileInfo(Pos, MSGJPN083, FALSE, YES); - DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase); +// DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase); + DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, Pos); if((DelNotify == YES) || (DelNotify == YES_ALL)) { Down = YES; - DoLocalRMD(TransPacketBase->LocalFile); +// DoLocalRMD(TransPacketBase->LocalFile); + DoLocalRMD(Pos->LocalFile); } + ReleaseMutex(hListAccMutex); } /* ファイル削除(常にローカル側) */ - else if(strncmp(TransPacketBase->Cmd, "L-DELE", 6) == 0) +// else if(strncmp(TransPacketBase->Cmd, "L-DELE", 6) == 0) + else if(strncmp(Pos->Cmd, "L-DELE", 6) == 0) { - DispTransFileInfo(TransPacketBase, MSGJPN084, FALSE, YES); +// DispTransFileInfo(TransPacketBase, MSGJPN084, FALSE, YES); + DispTransFileInfo(Pos, MSGJPN084, FALSE, YES); - DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase); +// DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, TransPacketBase); + DelNotify = MirrorDelNotify(WIN_LOCAL, DelNotify, Pos); if((DelNotify == YES) || (DelNotify == YES_ALL)) { Down = YES; - DoLocalDELE(TransPacketBase->LocalFile); +// DoLocalDELE(TransPacketBase->LocalFile); + DoLocalDELE(Pos->LocalFile); } + ReleaseMutex(hListAccMutex); } /* カレントディレクトリを設定 */ - else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0) +// else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0) + else if(strcmp(Pos->Cmd, "SETCUR") == 0) { if(AskShareProh() == YES) { - if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) +// if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) + if(strcmp(CurDir, Pos->RemoteFile) != 0) { - if(CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile)/100 != FTP_COMPLETE) +// if(CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile)/100 != FTP_COMPLETE) + if(CommandProcTrn(TrnSkt, NULL, "CWD %s", Pos->RemoteFile)/100 != FTP_COMPLETE) { DispCWDerror(hWndTrans); ClearAll = YES; } } } - strcpy(CurDir, TransPacketBase->RemoteFile); +// strcpy(CurDir, TransPacketBase->RemoteFile); + strcpy(CurDir, Pos->RemoteFile); + ReleaseMutex(hListAccMutex); } /* カレントディレクトリを戻す */ - else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0) +// else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0) + else if(strcmp(Pos->Cmd, "BACKCUR") == 0) { if(AskShareProh() == NO) { - if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) - CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile); - strcpy(CurDir, TransPacketBase->RemoteFile); +// if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) +// CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile); +// strcpy(CurDir, TransPacketBase->RemoteFile); + if(strcmp(CurDir, Pos->RemoteFile) != 0) + CommandProcTrn(TrnSkt, NULL, "CWD %s", Pos->RemoteFile); + strcpy(CurDir, Pos->RemoteFile); } + ReleaseMutex(hListAccMutex); } /* 自動終了のための通知 */ - else if(strcmp(TransPacketBase->Cmd, "GOQUIT") == 0) +// else if(strcmp(TransPacketBase->Cmd, "GOQUIT") == 0) + else if(strcmp(Pos->Cmd, "GOQUIT") == 0) { + ReleaseMutex(hListAccMutex); GoExit = YES; } + else + ReleaseMutex(hListAccMutex); /*===== 1つの処理終わり =====*/ @@ -805,18 +960,27 @@ static ULONG WINAPI TransferThread(void *Dummy) { WaitForSingleObject(hListAccMutex, INFINITE); if(ClearAll == YES) +// EraseTransFileList(); + { + for(i = 0; i < MAX_DATA_CONNECTION; i++) + Canceled[i] = YES; EraseTransFileList(); + } else { - if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) || - (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0)) +// if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) || +// (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0)) + if((strncmp(Pos->Cmd, "RETR", 4) == 0) || + (strncmp(Pos->Cmd, "STOR", 4) == 0)) { - TransFiles--; +// TransFiles--; + if(TransFiles > 0) + TransFiles--; PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0); } - Pos = TransPacketBase; - TransPacketBase = TransPacketBase->Next; - free(Pos); +// Pos = TransPacketBase; +// TransPacketBase = TransPacketBase->Next; +// free(Pos); } ClearAll = NO; ReleaseMutex(hListAccMutex); @@ -828,8 +992,12 @@ static ULONG WINAPI TransferThread(void *Dummy) ReleaseMutex(hListAccMutex); } } + if(hWndTrans != NULL) + SendMessage(hWndTrans, WM_SET_PACKET, 0, 0); + free(Pos); } - else +// else + else if(TransPacketBase == NULL) { DelNotify = NO; @@ -858,6 +1026,7 @@ static ULONG WINAPI TransferThread(void *Dummy) } } BackgrndMessageProc(); + Sleep(1); if(GoExit == YES) { @@ -865,7 +1034,20 @@ static ULONG WINAPI TransferThread(void *Dummy) GoExit = NO; } } + else + { + ReleaseMutex(hListAccMutex); + if(hWndTrans != NULL) + { + DestroyWindow(hWndTrans); + hWndTrans = NULL; + } + BackgrndMessageProc(); + Sleep(1); + } } + if(TrnSkt != INVALID_SOCKET) + DoClose(TrnSkt); return 0; } @@ -886,11 +1068,13 @@ static ULONG WINAPI TransferThread(void *Dummy) * Pkt->RemoteFile にファイル名のみ残す。(パス名は消す) *----------------------------------------------------------------------------*/ +// 同時接続対応 static int MakeNonFullPath(TRANSPACKET *Pkt, char *Cur, char *Tmp) { int Sts; - Sts = ProcForNonFullpath(Pkt->RemoteFile, Cur, Pkt->hWndTrans, 1); +// Sts = ProcForNonFullpath(Pkt->RemoteFile, Cur, Pkt->hWndTrans, 1); + Sts = ProcForNonFullpath(Pkt->RemoteFile, Cur, Pkt->hWndTrans, (int)Pkt->ctrl_skt + 1); if(Sts == FFFTP_FAIL) ClearAll = YES; @@ -937,7 +1121,9 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork) { if(Pkt->hWndTrans != NULL) { - AllTransSizeNow = 0; + // 同時接続対応 +// AllTransSizeNow = 0; + AllTransSizeNow[Pkt->ThreadCount] = 0; if(DirList == NO) DispTransFileInfo(Pkt, MSGJPN086, TRUE, YES); @@ -1017,6 +1203,8 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) if(data_socket != INVALID_SOCKET) { + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため + ReleaseMutex(hListAccMutex); // FTPS対応 // iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork); if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS) @@ -1091,6 +1279,8 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork) iRetCode = command(Pkt->ctrl_skt, Reply, CancelCheckWork, "%s", Buf); if(iRetCode/100 == FTP_PRELIM) { + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため + ReleaseMutex(hListAccMutex); // FTPS対応 // iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork); if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS) @@ -1209,7 +1399,9 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc if(Pkt->hWndTrans != NULL) { - TimeStart = time(NULL); + // 同時接続対応 +// TimeStart = time(NULL); + TimeStart[Pkt->ThreadCount] = time(NULL); SetTimer(Pkt->hWndTrans, TIMER_DISPLAY, DISPLAY_TIMING, NULL); } @@ -1482,7 +1674,9 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc Pkt->ExistSize += iNumBytes; if(Pkt->hWndTrans != NULL) - AllTransSizeNow += iNumBytes; + // 同時接続対応 +// AllTransSizeNow += iNumBytes; + AllTransSizeNow[Pkt->ThreadCount] += iNumBytes; else { /* 転送ダイアログを出さない時の経過表示 */ @@ -1631,7 +1825,9 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc { KillTimer(Pkt->hWndTrans, TIMER_DISPLAY); DispTransferStatus(Pkt->hWndTrans, YES, Pkt); - TimeStart = time(NULL) - TimeStart + 1; + // 同時接続対応 +// TimeStart = time(NULL) - TimeStart + 1; + TimeStart[Pkt->ThreadCount] = time(NULL) - TimeStart[Pkt->ThreadCount] + 1; } else { @@ -1726,14 +1922,19 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) SetTaskMsg(MSGJPN097); strcpy(Fname, MSGJPN098); } - else if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) - SetTaskMsg(MSGJPN099, TimeStart, Pkt->ExistSize/TimeStart); + // 同時接続対応 +// else if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) +// SetTaskMsg(MSGJPN099, TimeStart, Pkt->ExistSize/TimeStart); + else if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0)) + SetTaskMsg(MSGJPN099, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]); else SetTaskMsg(MSGJPN100); if(Pkt->Abort != ABORT_USER) { - if(DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO) + // 全て中止を選択後にダイアログが表示されるバグ対策 +// if(DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO) + if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO) ClearAll = YES; } } @@ -1741,8 +1942,11 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) { if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0)) SetTaskMsg(MSGJPN101, Pkt->ExistSize); - else if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) - SetTaskMsg(MSGJPN102, TimeStart, Pkt->ExistSize/TimeStart); + // 同時接続対応 +// else if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) +// SetTaskMsg(MSGJPN102, TimeStart, Pkt->ExistSize/TimeStart); + else if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0)) + SetTaskMsg(MSGJPN102, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]); else SetTaskMsg(MSGJPN103, Pkt->ExistSize); } @@ -1927,7 +2131,9 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt) if(Pkt->Type == TYPE_I) Pkt->KanjiCode = KANJI_NOCNV; - iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "TYPE %c", Pkt->Type); + // 同時接続対応 +// iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "TYPE %c", Pkt->Type); + iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "TYPE %c", Pkt->Type); if(iRetCode/100 < FTP_RETRY) { if(Pkt->Mode == EXIST_UNIQUE) @@ -1951,7 +2157,9 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt) /* 属性変更 */ if((Pkt->Attr != -1) && ((iRetCode/100) == FTP_COMPLETE)) - command(Pkt->ctrl_skt, Reply, &Canceled, "%s %03X %s", AskHostChmodCmd(), Pkt->Attr, Pkt->RemoteFile); + // 同時接続対応 +// command(Pkt->ctrl_skt, Reply, &Canceled, "%s %03X %s", AskHostChmodCmd(), Pkt->Attr, Pkt->RemoteFile); + command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s %03X %s", AskHostChmodCmd(), Pkt->Attr, Pkt->RemoteFile); } else { @@ -1992,7 +2200,9 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) int Resume; char Reply[ERR_MSG_LEN+7]; - if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, &Canceled)) != INVALID_SOCKET) + // 同時接続対応 +// if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, &Canceled)) != INVALID_SOCKET) + if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount])) != INVALID_SOCKET) { SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); if(Resume == NO) @@ -2000,7 +2210,9 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) else sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); - iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf); + // 同時接続対応 +// iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf); + iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s", Buf); if((iRetCode/100) == FTP_PRELIM) { if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL) @@ -2024,6 +2236,8 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) if(data_socket != INVALID_SOCKET) { + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため + ReleaseMutex(hListAccMutex); // FTPS対応 // iRetCode = UpLoadFile(Pkt, data_socket); if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS) @@ -2077,12 +2291,16 @@ static int UpLoadPassive(TRANSPACKET *Pkt) int Resume; char Reply[ERR_MSG_LEN+7]; - iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV"); + // 同時接続対応 +// iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV"); + iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV"); if(iRetCode/100 == FTP_COMPLETE) { if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) { - if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET) + // 同時接続対応 +// if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET) + if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled[Pkt->ThreadCount])) != INVALID_SOCKET) { // 変数が未初期化のバグ修正 Flg = 1; @@ -2095,9 +2313,13 @@ static int UpLoadPassive(TRANSPACKET *Pkt) else sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); - iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf); + // 同時接続対応 +// iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled, "%s", Buf); + iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s", Buf); if(iRetCode/100 == FTP_PRELIM) { + // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため + ReleaseMutex(hListAccMutex); // FTPS対応 // iRetCode = UpLoadFile(Pkt, data_socket); if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS) @@ -2212,8 +2434,11 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) Low = (DWORD)LOW32(Pkt->ExistSize); SetFilePointer(iFileHandle, Low, &High, FILE_BEGIN); - AllTransSizeNow = 0; - TimeStart = time(NULL); + // 同時接続対応 +// AllTransSizeNow = 0; +// TimeStart = time(NULL); + AllTransSizeNow[Pkt->ThreadCount] = 0; + TimeStart[Pkt->ThreadCount] = time(NULL); SetTimer(Pkt->hWndTrans, TIMER_DISPLAY, DISPLAY_TIMING, NULL); } @@ -2442,7 +2667,7 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) } // if(TermCodeConvAndSend(&tInfo, dSkt, Buf2, cInfo.OutLen, Pkt->Type) == FFFTP_FAIL) - if(TermCodeConvAndSend(&tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL) + if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL) { Pkt->Abort = ABORT_ERROR; break; @@ -2452,13 +2677,17 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) } else { - if(TermCodeConvAndSend(&tInfo, dSkt, Buf, iNumBytes, Pkt->Type) == FFFTP_FAIL) + // 同時接続対応 +// if(TermCodeConvAndSend(&tInfo, dSkt, Buf, iNumBytes, Pkt->Type) == FFFTP_FAIL) + if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf, iNumBytes, Pkt->Type) == FFFTP_FAIL) Pkt->Abort = ABORT_ERROR; } Pkt->ExistSize += iNumBytes; if(Pkt->hWndTrans != NULL) - AllTransSizeNow += iNumBytes; + // 同時接続対応 +// AllTransSizeNow += iNumBytes; + AllTransSizeNow[Pkt->ThreadCount] += iNumBytes; if(BackgrndMessageProc() == YES) ForceAbort = YES; @@ -2594,19 +2823,21 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) } // if(TermCodeConvAndSend(&tInfo, dSkt, Buf2, cInfo.OutLen, Pkt->Type) == FFFTP_FAIL) - if(TermCodeConvAndSend(&tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL) + if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL) Pkt->Abort = ABORT_ERROR; cInfo2.Buf = Buf3; cInfo2.BufSize = (BUFSIZE + 3) * 4; FlushRestData(&cInfo2); - if(TermCodeConvAndSend(&tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL) + if(TermCodeConvAndSend(Pkt->ThreadCount, &tInfo, dSkt, Buf3, cInfo2.OutLen, Pkt->Type) == FFFTP_FAIL) Pkt->Abort = ABORT_ERROR; } tInfo.Buf = Buf2; tInfo.BufSize = BUFSIZE+3; FlushRestTermCodeConvData(&tInfo); - if(SendData(dSkt, Buf2, tInfo.OutLen, 0, &Canceled) == FFFTP_FAIL) + // 同時接続対応 +// if(SendData(dSkt, Buf2, tInfo.OutLen, 0, &Canceled) == FFFTP_FAIL) + if(SendData(dSkt, Buf2, tInfo.OutLen, 0, &Canceled[Pkt->ThreadCount]) == FFFTP_FAIL) Pkt->Abort = ABORT_ERROR; } @@ -2615,7 +2846,9 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) { KillTimer(Pkt->hWndTrans, TIMER_DISPLAY); DispTransferStatus(Pkt->hWndTrans, YES, Pkt); - TimeStart = time(NULL) - TimeStart + 1; + // 同時接続対応 +// TimeStart = time(NULL) - TimeStart + 1; + TimeStart[Pkt->ThreadCount] = time(NULL) - TimeStart[Pkt->ThreadCount] + 1; } CloseHandle(iFileHandle); } @@ -2635,7 +2868,9 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) ; #endif - iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, &Canceled, TmpBuf); + // 同時接続対応 +// iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, &Canceled, TmpBuf); + iRetCode = ReadReplyMessage(Pkt->ctrl_skt, Buf, 1024, &Canceled[Pkt->ThreadCount], TmpBuf); //#pragma aaa //DoPrintf("##UP REPLY : %s", Buf); @@ -2663,7 +2898,9 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) * int 応答コード *----------------------------------------------------------------------------*/ -static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii) +// 同時接続対応 +//static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii) +static int TermCodeConvAndSend(int ThreadCount, TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii) { char Buf3[BUFSIZE*2]; int Continue; @@ -2681,13 +2918,17 @@ static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, do { Continue = ConvTermCodeToCRLF(tInfo); - if((Ret = SendData(Skt, Buf3, tInfo->OutLen, 0, &Canceled)) == FFFTP_FAIL) + // 同時接続対応 +// if((Ret = SendData(Skt, Buf3, tInfo->OutLen, 0, &Canceled)) == FFFTP_FAIL) + if((Ret = SendData(Skt, Buf3, tInfo->OutLen, 0, &Canceled[ThreadCount])) == FFFTP_FAIL) break; } while(Continue == YES); } else - Ret = SendData(Skt, Data, Size, 0, &Canceled); + // 同時接続対応 +// Ret = SendData(Skt, Data, Size, 0, &Canceled); + Ret = SendData(Skt, Data, Size, 0, &Canceled[ThreadCount]); return(Ret); } @@ -2709,21 +2950,29 @@ static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode) { if((iRetCode/100) >= FTP_CONTINUE) { - if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) - SetTaskMsg(MSGJPN113, TimeStart, Pkt->ExistSize/TimeStart); + // 同時接続対応 +// if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) +// SetTaskMsg(MSGJPN113, TimeStart, Pkt->ExistSize/TimeStart); + if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0)) + SetTaskMsg(MSGJPN113, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]); else SetTaskMsg(MSGJPN114); if(Pkt->Abort != ABORT_USER) { - if(DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO) + // 全て中止を選択後にダイアログが表示されるバグ対策 +// if(DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO) + if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO) ClearAll = YES; } } else { - if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) - SetTaskMsg(MSGJPN115, TimeStart, Pkt->ExistSize/TimeStart); + // 同時接続対応 +// if((Pkt->hWndTrans != NULL) && (TimeStart != 0)) +// SetTaskMsg(MSGJPN115, TimeStart, Pkt->ExistSize/TimeStart); + if((Pkt->hWndTrans != NULL) && (TimeStart[Pkt->ThreadCount] != 0)) + SetTaskMsg(MSGJPN115, TimeStart[Pkt->ThreadCount], Pkt->ExistSize/TimeStart[Pkt->ThreadCount]); else SetTaskMsg(MSGJPN116); } @@ -2780,7 +3029,10 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM RECT RectDlg; RECT RectPar; HMENU hMenu; - static TRANSPACKET *Pkt; + // 同時接続対応 +// static TRANSPACKET *Pkt; + TRANSPACKET *Pkt; + int i; switch(Msg) { @@ -2809,11 +3061,16 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM case TRANS_STOP_ALL : ClearAll = YES; + for(i = 0; i < MAX_DATA_CONNECTION; i++) + Canceled[i] = YES; /* ここに break はない */ case IDCANCEL : + if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA))) + break; Pkt->Abort = ABORT_USER; - Canceled = YES; +// Canceled = YES; + Canceled[Pkt->ThreadCount] = YES; break; } break; @@ -2825,13 +3082,18 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM SetForegroundWindow(hDlg); MoveToForeground = NO; KillTimer(hDlg, TIMER_DISPLAY); + if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA))) + break; + if(Canceled[Pkt->ThreadCount] == YES) + Pkt->Abort = ABORT_USER; DispTransferStatus(hDlg, NO, Pkt); SetTimer(hDlg, TIMER_DISPLAY, DISPLAY_TIMING, NULL); } break; case WM_SET_PACKET : - Pkt = (TRANSPACKET *)lParam; +// Pkt = (TRANSPACKET *)lParam; + SetWindowLong(hDlg, GWL_USERDATA, (LONG)lParam); break; } return(FALSE); @@ -2874,11 +3136,15 @@ static void DispTransferStatus(HWND hWnd, int End, TRANSPACKET *Pkt) { if(End == NO) { - TotalLap = time(NULL) - TimeStart + 1; + // 同時接続対応 +// TotalLap = time(NULL) - TimeStart + 1; + TotalLap = time(NULL) - TimeStart[Pkt->ThreadCount] + 1; Bps = 0; if(TotalLap != 0) - Bps = AllTransSizeNow / TotalLap; + // 同時接続対応 +// Bps = AllTransSizeNow / TotalLap; + Bps = AllTransSizeNow[Pkt->ThreadCount] / TotalLap; Transed = Pkt->Size - Pkt->ExistSize; if(Pkt->Size <= 0) diff --git a/history.c b/history.c index 0d69cfe..a2aec84 100644 --- a/history.c +++ b/history.c @@ -227,6 +227,8 @@ static void CopyHostToHistory(HOSTDATA *Host, HISTORYDATA *New) New->UseFTPES = Host->UseFTPES; New->UseFTPIS = Host->UseFTPIS; New->UseSFTP = Host->UseSFTP; + // 同時接続対応 + New->MaxThreadCount = Host->MaxThreadCount; return; } @@ -280,6 +282,8 @@ void CopyHistoryToHost(HISTORYDATA *Hist, HOSTDATA *Host) Host->UseFTPES = Hist->UseFTPES; Host->UseFTPIS = Hist->UseFTPIS; Host->UseSFTP = Hist->UseSFTP; + // 同時接続対応 + Host->MaxThreadCount = Hist->MaxThreadCount; return; } diff --git a/hostman.c b/hostman.c index 8b590b9..ce20c43 100644 --- a/hostman.c +++ b/hostman.c @@ -69,6 +69,8 @@ static BOOL CALLBACK DialupSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, static BOOL CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); // 暗号化通信対応 static BOOL CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 同時接続対応 +static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); /*===== 外部参照 =====*/ @@ -1025,6 +1027,8 @@ int CopyHostFromListInConnect(int Num, HOSTDATA *Set) Set->UseFTPES = Pos->Set.UseFTPES; Set->UseFTPIS = Pos->Set.UseFTPIS; Set->UseSFTP = Pos->Set.UseSFTP; + // 同時接続対応 + Set->MaxThreadCount = Pos->Set.MaxThreadCount; Sts = FFFTP_SUCCESS; } return(Sts); @@ -1303,6 +1307,8 @@ void CopyDefaultHost(HOSTDATA *Set) Set->UseFTPES = YES; Set->UseFTPIS = YES; Set->UseSFTP = YES; + // 同時接続対応 + Set->MaxThreadCount = 1; return; } @@ -1514,9 +1520,10 @@ void ImportFromWSFTP(void) static int DispHostSetDlg(HWND hDlg) { -// SFTP、FTPES、FTPIS対応 + // SFTP、FTPES、FTPIS対応 + // 同時接続対応 // PROPSHEETPAGE psp[5]; - PROPSHEETPAGE psp[6]; + PROPSHEETPAGE psp[7]; PROPSHEETHEADER psh; psp[0].dwSize = sizeof(PROPSHEETPAGE); @@ -1569,7 +1576,7 @@ static int DispHostSetDlg(HWND hDlg) psp[4].lParam = 0; psp[4].pfnCallback = NULL; -// SFTP、FTPES、FTPIS対応 + // SFTP、FTPES、FTPIS対応 psp[5].dwSize = sizeof(PROPSHEETPAGE); psp[5].dwFlags = PSP_USETITLE | PSP_HASHELP; psp[5].hInstance = GetFtpInst(); @@ -1580,6 +1587,17 @@ static int DispHostSetDlg(HWND hDlg) psp[5].lParam = 0; psp[5].pfnCallback = NULL; + // 同時接続対応 + psp[6].dwSize = sizeof(PROPSHEETPAGE); + psp[6].dwFlags = PSP_USETITLE | PSP_HASHELP; + psp[6].hInstance = GetFtpInst(); + psp[6].pszTemplate = MAKEINTRESOURCE(hset_adv3_dlg); + psp[6].pszIcon = NULL; + psp[6].pfnDlgProc = Adv3SettingProc; + psp[6].pszTitle = MSGJPN320; + psp[6].lParam = 0; + psp[6].pfnCallback = NULL; + psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwFlags = PSH_HASHELP | PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE; psh.hwndParent = hDlg; @@ -2159,4 +2177,39 @@ static BOOL CALLBACK CryptSettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, L return(FALSE); } +// 同時接続対応 +static BOOL CALLBACK Adv3SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + NMHDR *pnmhdr; + int Num; + + switch (iMessage) + { + case WM_INITDIALOG : + SendDlgItemMessage(hDlg, HSET_THREAD_COUNT, EM_LIMITTEXT, (WPARAM)1, 0); + SetDecimalText(hDlg, HSET_THREAD_COUNT, TmpHost.MaxThreadCount); + SendDlgItemMessage(hDlg, HSET_THREAD_COUNT_SPN, UDM_SETRANGE, 0, (LPARAM)MAKELONG(MAX_DATA_CONNECTION, 1)); + return(TRUE); + + case WM_NOTIFY: + pnmhdr = (NMHDR FAR *)lParam; + switch(pnmhdr->code) + { + case PSN_APPLY : + TmpHost.MaxThreadCount = GetDecimalText(hDlg, HSET_THREAD_COUNT); + CheckRange2(&TmpHost.MaxThreadCount, MAX_DATA_CONNECTION, 1); + Apply = YES; + break; + + case PSN_RESET : + break; + + case PSN_HELP : +// hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000066); + break; + } + break; + } + return(FALSE); +} diff --git a/main.c b/main.c index 4cae7c0..d7e1244 100644 --- a/main.c +++ b/main.c @@ -208,6 +208,8 @@ int MirUpDelNotify = YES; int MirDownDelNotify = YES; int FolderAttr = NO; int FolderAttrNum = 777; +// 同時接続対応 +int MaxThreadCount = 1; diff --git a/mbswrapper.c b/mbswrapper.c index ef019e4..bd4a9a5 100644 --- a/mbswrapper.c +++ b/mbswrapper.c @@ -1007,12 +1007,15 @@ START_ROUTINE case REG_SZ: case REG_EXPAND_SZ: case REG_MULTI_SZ: - if(lpData && lpcbData) + if(lpcbData) { pw1 = AllocateStringW(*lpcbData / sizeof(char) * 4); wcbData = *lpcbData / sizeof(char) * 4; r = RegQueryValueExW(hKey, pw0, lpReserved, lpType, (LPBYTE)pw1, &wcbData); - *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t)); + if(lpData) + *lpcbData = sizeof(char) * WtoM((char*)lpData, *lpcbData / sizeof(char), pw1, wcbData / sizeof(wchar_t)); + else + *lpcbData = sizeof(char) * WtoM(NULL, 0, pw1, wcbData / sizeof(wchar_t)); } break; default: diff --git a/mbswrapper.h b/mbswrapper.h index 545fc84..ae18d76 100644 --- a/mbswrapper.h +++ b/mbswrapper.h @@ -5,124 +5,188 @@ #ifndef __MBSWRAPPER_H__ #define __MBSWRAPPER_H__ +#include +#include + #ifndef DO_NOT_REPLACE #undef CreateFile #define CreateFile CreateFileM +HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); #undef MessageBox #define MessageBox MessageBoxM +int MessageBoxM(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType); #undef FindFirstFile #define FindFirstFile FindFirstFileM +HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData); #undef FindNextFile #define FindNextFile FindNextFileM +BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData); #undef GetLogicalDriveStrings #define GetLogicalDriveStrings GetLogicalDriveStringsM +DWORD GetLogicalDriveStringsM(DWORD nBufferLength, LPSTR lpBuffer); #undef RegisterClassEx #define RegisterClassEx RegisterClassExM +ATOM RegisterClassExM(CONST WNDCLASSEXA * v0); #undef CreateWindowEx #define CreateWindowEx CreateWindowExM +HWND CreateWindowExM(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); #undef GetWindowLong #define GetWindowLong GetWindowLongM +LONG GetWindowLongM(HWND hWnd, int nIndex); #undef SetWindowLong #define SetWindowLong SetWindowLongM +LONG SetWindowLongM(HWND hWnd, int nIndex, LONG dwNewLong); #undef DefWindowProc #define DefWindowProc DefWindowProcM +LRESULT DefWindowProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); #undef CallWindowProc #define CallWindowProc CallWindowProcM +LRESULT CallWindowProcM(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); #undef SendMessage #define SendMessage SendMessageM +LRESULT SendMessageM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +#undef DefDlgProc +#define DefDlgProc DefDlgProcM +LRESULT DefDlgProcM(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); #undef SendDlgItemMessage #define SendDlgItemMessage SendDlgItemMessageM +LRESULT SendDlgItemMessageM(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam); #undef SetWindowText #define SetWindowText SetWindowTextM +BOOL SetWindowTextM(HWND hWnd, LPCSTR lpString); #undef DragQueryFile #define DragQueryFile DragQueryFileM +UINT DragQueryFileM(HDROP hDrop, UINT iFile, LPSTR lpszFile, UINT cch); #undef GetCurrentDirectory #define GetCurrentDirectory GetCurrentDirectoryM +DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer); #undef SetCurrentDirectory #define SetCurrentDirectory SetCurrentDirectoryM +BOOL SetCurrentDirectoryM(LPCSTR lpPathName); #undef SetDllDirectory #define SetDllDirectory SetDllDirectoryM +BOOL SetDllDirectoryM(LPCSTR lpPathName); #undef GetTempPath #define GetTempPath GetTempPathM +DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer); #undef GetFileAttributes #define GetFileAttributes GetFileAttributesM +DWORD GetFileAttributesM(LPCSTR lpFileName); #undef GetModuleFileName #define GetModuleFileName GetModuleFileNameM +DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize); #undef RegOpenKeyEx #define RegOpenKeyEx RegOpenKeyExM +LSTATUS RegOpenKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult); #undef RegCreateKeyEx #define RegCreateKeyEx RegCreateKeyExM +LSTATUS RegCreateKeyExM(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions, REGSAM samDesired, CONST LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition); #undef RegDeleteValue #define RegDeleteValue RegDeleteValueM +LSTATUS RegDeleteValueM(HKEY hKey, LPCSTR lpValueName); #undef RegQueryValueEx #define RegQueryValueEx RegQueryValueExM +LSTATUS RegQueryValueExM(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData); #undef RegSetValueEx #define RegSetValueEx RegSetValueExM +LSTATUS RegSetValueExM(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE* lpData, DWORD cbData); #undef TextOut #define TextOut TextOutM +BOOL TextOutM(HDC hdc, int x, int y, LPCSTR lpString, int c); #undef GetTextExtentPoint32 #define GetTextExtentPoint32 GetTextExtentPoint32M +BOOL GetTextExtentPoint32M(HDC hdc, LPCSTR lpString, int c, LPSIZE psizl); #undef PropertySheet #define PropertySheet PropertySheetM +INT_PTR PropertySheetM(LPCPROPSHEETHEADERA v0); #undef GetOpenFileName #define GetOpenFileName GetOpenFileNameM +BOOL GetOpenFileNameM(LPOPENFILENAMEA v0); #undef GetSaveFileName #define GetSaveFileName GetSaveFileNameM +BOOL GetSaveFileNameM(LPOPENFILENAMEA v0); #undef HtmlHelp #define HtmlHelp HtmlHelpM +HWND HtmlHelpM(HWND hwndCaller, LPCSTR pszFile, UINT uCommand, DWORD_PTR dwData); #undef CreateProcess #define CreateProcess CreateProcessM +BOOL CreateProcessM(LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation); #undef FindExecutable #define FindExecutable FindExecutableM +HINSTANCE FindExecutableM(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult); #undef ShellExecute #define ShellExecute ShellExecuteM +HINSTANCE ShellExecuteM(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd); #undef SHBrowseForFolder #define SHBrowseForFolder SHBrowseForFolderM +PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi); #undef SHGetPathFromIDList #define SHGetPathFromIDList SHGetPathFromIDListM +BOOL SHGetPathFromIDListM(PCIDLIST_ABSOLUTE pidl, LPSTR pszPath); #undef SHFileOperation #define SHFileOperation SHFileOperationM +int SHFileOperationM(LPSHFILEOPSTRUCTA lpFileOp); #undef AppendMenu #define AppendMenu AppendMenuM +BOOL AppendMenuM(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR lpNewItem); #undef GetMenuItemInfo #define GetMenuItemInfo GetMenuItemInfoM +BOOL GetMenuItemInfoM(HMENU hmenu, UINT item, BOOL fByPosition, LPMENUITEMINFOA lpmii); #undef CreateFontIndirect #define CreateFontIndirect CreateFontIndirectM +HFONT CreateFontIndirectM(CONST LOGFONTA *lplf); #undef ChooseFont #define ChooseFont ChooseFontM +BOOL ChooseFontM(LPCHOOSEFONTA v0); #undef DialogBoxParam #define DialogBoxParam DialogBoxParamM +INT_PTR DialogBoxParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); #undef CreateDialogParam #define CreateDialogParam CreateDialogParamM +HWND CreateDialogParamM(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam); #undef mkdir #define mkdir _mkdirM +int mkdirM(const char * _Path); #undef _mkdir #define _mkdir _mkdirM +int _mkdirM(const char * _Path); #undef rmdir #define rmdir rmdirM +int rmdirM(const char * _Path); #undef _rmdir #define _rmdir _rmdirM +int _rmdirM(const char * _Path); #undef _mbslen #define _mbslen _mbslenM +size_t _mbslenM(const unsigned char * _Str); #undef _mbschr #define _mbschr _mbschrM +unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch); #undef _mbsrchr #define _mbsrchr _mbsrchrM +unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch); #undef _mbsstr #define _mbsstr _mbsstrM +unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr); #undef _mbscmp #define _mbscmp _mbscmpM +int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2); #undef _mbsicmp #define _mbsicmp _mbsicmpM +int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2); #undef _mbsncmp #define _mbsncmp _mbsncmpM +int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount); #undef _mbslwr #define _mbslwr _mbslwrM +unsigned char * _mbslwrM(unsigned char * _String); #undef _mbsupr #define _mbsupr _mbsuprM +unsigned char * _mbsuprM(unsigned char * _String); #undef _mbsninc #define _mbsninc _mbsnincM +unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count); #undef CreateWindow #define CreateWindow(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) CreateWindowEx(0L, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam) diff --git a/mesg-eng.h b/mesg-eng.h index bfa1106..e441fed 100644 --- a/mesg-eng.h +++ b/mesg-eng.h @@ -317,3 +317,4 @@ #define MSGJPN317 "Using SSH FTP (SFTP)." #define MSGJPN318 "OpenSSL is loaded." #define MSGJPN319 "OpenSSL is not installed.\r\nCommunication will not be encrypted." +#define MSGJPN320 "Feature" diff --git a/mesg-eng.old.h b/mesg-eng.old.h index 537fbad..cb35a21 100644 --- a/mesg-eng.old.h +++ b/mesg-eng.old.h @@ -317,3 +317,4 @@ #define MSGJPN317 "Using SSH FTP (SFTP)." #define MSGJPN318 "OpenSSL is loaded." #define MSGJPN319 "OpenSSL is not installed.\r\nCommunication will not be encrypted." +#define MSGJPN320 "Feature" diff --git a/mesg-jpn.h b/mesg-jpn.h index 5ca9fb1..0b1b071 100644 --- a/mesg-jpn.h +++ b/mesg-jpn.h @@ -317,3 +317,4 @@ #define MSGJPN317 "SSH FTP (SFTP)\xE3\x82\x92\xE4\xBD\xBF\xE7\x94\xA8\xE3\x81\x97\xE3\x81\xBE\xE3\x81\x99." #define MSGJPN318 "OpenSSL\xE3\x81\x8C\xE8\xAA\xAD\xE3\x81\xBF\xE8\xBE\xBC\xE3\x81\xBE\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x97\xE3\x81\x9F." #define MSGJPN319 "OpenSSL\xE3\x81\x8C\xE3\x82\xA4\xE3\x83\xB3\xE3\x82\xB9\xE3\x83\x88\xE3\x83\xBC\xE3\x83\xAB\xE3\x81\x95\xE3\x82\x8C\xE3\x81\xA6\xE3\x81\x84\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93.\r\n\xE9\x80\x9A\xE4\xBF\xA1\xE3\x81\xAE\xE6\x9A\x97\xE5\x8F\xB7\xE5\x8C\x96\xE3\x81\xAF\xE8\xA1\x8C\xE3\x82\x8F\xE3\x82\x8C\xE3\x81\xBE\xE3\x81\x9B\xE3\x82\x93." +#define MSGJPN320 "\xE7\x89\xB9\xE6\xAE\x8A\xE6\xA9\x9F\xE8\x83\xBD" diff --git a/mesg-jpn.old.h b/mesg-jpn.old.h index 275e937..3b4b7ef 100644 --- a/mesg-jpn.old.h +++ b/mesg-jpn.old.h @@ -317,3 +317,4 @@ #define MSGJPN317 "SSH FTP (SFTP)‚ðŽg—p‚µ‚Ü‚·." #define MSGJPN318 "OpenSSL‚ª“ǂݍž‚Ü‚ê‚Ü‚µ‚½." #define MSGJPN319 "OpenSSL‚ªƒCƒ“ƒXƒg[ƒ‹‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ.\r\n’ʐM‚̈͆‰»‚͍s‚í‚ê‚Ü‚¹‚ñ." +#define MSGJPN320 "“ÁŽê‹@”\" diff --git a/option.c b/option.c index b43af07..9edd32a 100644 --- a/option.c +++ b/option.c @@ -65,12 +65,19 @@ static BOOL CALLBACK ToolSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPA static BOOL CALLBACK SoundSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); static BOOL CALLBACK MiscSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); static BOOL CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); -static int GetDecimalText(HWND hDlg, int Ctrl); -static void SetDecimalText(HWND hDlg, int Ctrl, int Num); -static void CheckRange2(int *Cur, int Max, int Min); -static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize); -static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text); -static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize); +// hostman.cで使用 +//static int GetDecimalText(HWND hDlg, int Ctrl); +//static void SetDecimalText(HWND hDlg, int Ctrl, int Num); +//static void CheckRange2(int *Cur, int Max, int Min); +//static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize); +//static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text); +//static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize); +int GetDecimalText(HWND hDlg, int Ctrl); +void SetDecimalText(HWND hDlg, int Ctrl, int Num); +void CheckRange2(int *Cur, int Max, int Min); +void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize); +void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text); +void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize); @@ -1647,7 +1654,9 @@ static BOOL CALLBACK SortSettingProc(HWND hDlg, UINT message, WPARAM wParam, LPA * なし *----------------------------------------------------------------------------*/ -static int GetDecimalText(HWND hDlg, int Ctrl) +// hostman.cで使用 +//static int GetDecimalText(HWND hDlg, int Ctrl) +int GetDecimalText(HWND hDlg, int Ctrl) { char Tmp[40]; @@ -1667,7 +1676,9 @@ static int GetDecimalText(HWND hDlg, int Ctrl) * なし *----------------------------------------------------------------------------*/ -static void SetDecimalText(HWND hDlg, int Ctrl, int Num) +// hostman.cで使用 +//static void SetDecimalText(HWND hDlg, int Ctrl, int Num) +void SetDecimalText(HWND hDlg, int Ctrl, int Num) { char Tmp[40]; @@ -1691,7 +1702,9 @@ static void SetDecimalText(HWND hDlg, int Ctrl, int Num) * int *Cur : 設定値 *----------------------------------------------------------------------------*/ -static void CheckRange2(int *Cur, int Max, int Min) +// hostman.cで使用 +//static void CheckRange2(int *Cur, int Max, int Min) +void CheckRange2(int *Cur, int Max, int Min) { if(*Cur < Min) *Cur = Min; @@ -1713,7 +1726,9 @@ static void CheckRange2(int *Cur, int Max, int Min) * なし *----------------------------------------------------------------------------*/ -static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize) +// hostman.cで使用 +//static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize) +void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize) { char Tmp[FMAX_PATH+1]; int Num; @@ -1751,7 +1766,9 @@ static void AddTextToListBox(HWND hDlg, char *Str, int CtrlList, int BufSize) * なし *----------------------------------------------------------------------------*/ -static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text) +// hostman.cで使用 +//static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text) +void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text) { char *Pos; @@ -1777,7 +1794,9 @@ static void SetMultiTextToList(HWND hDlg, int CtrlList, char *Text) * なし *----------------------------------------------------------------------------*/ -static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize) +// hostman.cで使用 +//static void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize) +void GetMultiTextFromList(HWND hDlg, int CtrlList, char *Buf, int BufSize) { char Tmp[FMAX_PATH+1]; int Num; diff --git a/registory.c b/registory.c index fa6461d..578d3ac 100644 --- a/registory.c +++ b/registory.c @@ -466,6 +466,8 @@ void SaveRegistory(void) SaveIntNum(hKey5, "FTPES", Hist.UseFTPES, DefaultHist.UseFTPES); SaveIntNum(hKey5, "FTPIS", Hist.UseFTPIS, DefaultHist.UseFTPIS); SaveIntNum(hKey5, "SFTP", Hist.UseSFTP, DefaultHist.UseSFTP); + // 同時接続対応 + SaveIntNum(hKey5, "ThreadCount", Hist.MaxThreadCount, DefaultHist.MaxThreadCount); CloseSubKey(hKey5); n++; @@ -538,6 +540,8 @@ void SaveRegistory(void) SaveIntNum(hKey5, "FTPES", Host.UseFTPES, DefaultHost.UseFTPES); SaveIntNum(hKey5, "FTPIS", Host.UseFTPIS, DefaultHost.UseFTPIS); SaveIntNum(hKey5, "SFTP", Host.UseSFTP, DefaultHost.UseSFTP); + // 同時接続対応 + SaveIntNum(hKey5, "ThreadCount", Host.MaxThreadCount, DefaultHost.MaxThreadCount); } CloseSubKey(hKey5); } @@ -792,6 +796,8 @@ int LoadRegistory(void) ReadIntValueFromReg(hKey5, "FTPES", &Hist.UseFTPES); ReadIntValueFromReg(hKey5, "FTPIS", &Hist.UseFTPIS); ReadIntValueFromReg(hKey5, "SFTP", &Hist.UseSFTP); + // 同時接続対応 + ReadIntValueFromReg(hKey5, "ThreadCount", &Hist.MaxThreadCount); CloseSubKey(hKey5); AddHistoryToHistory(&Hist); @@ -863,6 +869,8 @@ int LoadRegistory(void) ReadIntValueFromReg(hKey5, "FTPES", &Host.UseFTPES); ReadIntValueFromReg(hKey5, "FTPIS", &Host.UseFTPIS); ReadIntValueFromReg(hKey5, "SFTP", &Host.UseSFTP); + // 同時接続対応 + ReadIntValueFromReg(hKey5, "ThreadCount", &Host.MaxThreadCount); CloseSubKey(hKey5); diff --git a/remote.c b/remote.c index 1b617be..3b8c736 100644 --- a/remote.c +++ b/remote.c @@ -389,12 +389,15 @@ int DoCHMOD(char *Path, char *Mode) * サイズが選られない時は Size = -1 を返す *----------------------------------------------------------------------------*/ -int DoSIZE(char *Path, LONGLONG *Size) +// 同時接続対応 +//int DoSIZE(char *Path, LONGLONG *Size) +int DoSIZE(SOCKET cSkt, char *Path, LONGLONG *Size) { int Sts; char Tmp[1024]; - Sts = CommandProcTrn(Tmp, "SIZE %s", Path); +// Sts = CommandProcTrn(Tmp, "SIZE %s", Path); + Sts = CommandProcTrn(cSkt, Tmp, "SIZE %s", Path); *Size = -1; if((Sts/100 == FTP_COMPLETE) && (strlen(Tmp) > 4) && IsDigit(Tmp[4])) @@ -418,7 +421,9 @@ int DoSIZE(char *Path, LONGLONG *Size) * 日付が選られない時は Time = 0 を返す *----------------------------------------------------------------------------*/ -int DoMDTM(char *Path, FILETIME *Time) +// 同時接続対応 +//int DoMDTM(char *Path, FILETIME *Time) +int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time) { int Sts; char Tmp[1024]; @@ -427,7 +432,8 @@ int DoMDTM(char *Path, FILETIME *Time) Time->dwLowDateTime = 0; Time->dwHighDateTime = 0; - Sts = CommandProcTrn(Tmp, "MDTM %s", Path); +// Sts = CommandProcTrn(Tmp, "MDTM %s", Path); + Sts = CommandProcTrn(cSkt, Tmp, "MDTM %s", Path); if(Sts/100 == FTP_COMPLETE) { sTime.wMilliseconds = 0; @@ -675,7 +681,9 @@ int CommandProcCmd(char *Reply, char *fmt, ...) * 転送コントロールソケットを使う *----------------------------------------------------------------------------*/ -int CommandProcTrn(char *Reply, char *fmt, ...) +// 同時接続対応 +//int CommandProcTrn(char *Reply, char *fmt, ...) +int CommandProcTrn(SOCKET cSkt, char *Reply, char *fmt, ...) { va_list Args; char Cmd[1024]; @@ -691,7 +699,8 @@ int CommandProcTrn(char *Reply, char *fmt, ...) // if((Sts = command(AskTrnCtrlSkt(), Reply, "%s", Cmd)) == 429) // { // if(ReConnectTrnSkt() == FFFTP_SUCCESS) - Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); +// Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd); + Sts = command(cSkt, Reply, &CheckCancelFlg, "%s", Cmd); // } return(Sts); } @@ -1030,7 +1039,7 @@ static int ReadOneLine(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork) // DisconnectSet(); { if(SizeOnce == -1) - ReConnectCmdSkt(); + ReConnectTrnSkt(&cSkt); else DisconnectSet(); } diff --git a/socket.c b/socket.c index b930424..c823465 100644 --- a/socket.c +++ b/socket.c @@ -457,7 +457,9 @@ static int RegistAsyncTable(SOCKET s) { if(Signal[Pos].Socket == s) { - MessageBox(GetMainHwnd(), "Async socket already registerd.", "FFFTP inner error", MB_OK); + // 強制的に閉じられたソケットがあると重複する可能性あり +// MessageBox(GetMainHwnd(), "Async socket already registerd.", "FFFTP inner error", MB_OK); + Signal[Pos].Socket = INVALID_SOCKET; break; } } @@ -521,7 +523,9 @@ static int RegistAsyncTableDbase(HANDLE Async) { if(SignalDbase[Pos].Async == Async) { - MessageBox(GetMainHwnd(), "Async handle already registerd.", "FFFTP inner error", MB_OK); + // 強制的に閉じられたハンドルがあると重複する可能性あり +// MessageBox(GetMainHwnd(), "Async handle already registerd.", "FFFTP inner error", MB_OK); + SignalDbase[Pos].Async = 0; break; } } @@ -714,7 +718,7 @@ int do_closesocket(SOCKET s) if(AskCryptMode() == CRYPT_FTPES || AskCryptMode() == CRYPT_FTPIS) Ret = closesocketS(s); else - Ret = closesocket(s); + Ret = closesocketS(s); if(Ret == SOCKET_ERROR) { Error = 0; diff --git a/socketwrapper.c b/socketwrapper.c index e3d4623..3159e93 100644 --- a/socketwrapper.c +++ b/socketwrapper.c @@ -45,7 +45,7 @@ _SSL_peek pSSL_peek; _SSL_read pSSL_read; _SSL_get_error pSSL_get_error; -#define MAX_SSL_SOCKET 16 +#define MAX_SSL_SOCKET 64 BOOL g_bOpenSSLLoaded; HMODULE g_hOpenSSL;