Loweynet
Revision | ffd9ce66d16fb452725a6bb1b5d1ef848fcd2628 (tree) |
---|---|
Time | 2011-12-03 22:33:21 |
Author | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Fix bugs of simultaneous connection.
Fix bugs of parsing MLSD response.
@@ -954,6 +954,7 @@ typedef struct { | ||
954 | 954 | // 同時接続対応 |
955 | 955 | int MaxThreadCount; /* 同時接続数 */ |
956 | 956 | int ReuseCmdSkt; /* メインウィンドウのソケットを再利用する (YES/NO) */ |
957 | + int NoDisplayUI; /* UIを表示しない (YES/NO) */ | |
957 | 958 | // FEAT対応 |
958 | 959 | int Feature; /* 利用可能な機能のフラグ (FEATURE_xxx) */ |
959 | 960 | // MLSD対応 |
@@ -1088,6 +1088,8 @@ int ReConnectTrnSkt(SOCKET *Skt, int *CancelCheckWork) | ||
1088 | 1088 | HostData.CurNameKanjiCode = HostData.NameKanjiCode; |
1089 | 1089 | // IPv6対応 |
1090 | 1090 | HostData.CurNetType = HostData.NetType; |
1091 | + // 同時接続対応 | |
1092 | + HostData.NoDisplayUI = YES; | |
1091 | 1093 | // 暗号化通信対応 |
1092 | 1094 | // 同時接続対応 |
1093 | 1095 | // if((*Skt = DoConnect(CurHost.HostAdrs, CurHost.UserName, CurHost.PassWord, CurHost.Account, CurHost.Port, CurHost.FireWall, NO, CurHost.Security)) != INVALID_SOCKET) |
@@ -1500,8 +1502,11 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char | ||
1500 | 1502 | else |
1501 | 1503 | { |
1502 | 1504 | Anony = NO; |
1505 | + // 同時接続対応 | |
1506 | +// if((strlen(User) != 0) || | |
1507 | +// (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) | |
1503 | 1508 | if((strlen(User) != 0) || |
1504 | - (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) | |
1509 | + ((HostData->NoDisplayUI == NO) && (InputDialogBox(username_dlg, GetMainHwnd(), NULL, User, USER_NAME_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))) | |
1505 | 1510 | { |
1506 | 1511 | if(Anony == YES) |
1507 | 1512 | { |
@@ -1567,8 +1572,11 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char | ||
1567 | 1572 | // if((Sts = command(ContSock, Reply, &CancelFlg, "USER %s", Buf) / 100) == FTP_CONTINUE) |
1568 | 1573 | if((Sts = command(ContSock, Reply, CancelCheckWork, "USER %s", Buf) / 100) == FTP_CONTINUE) |
1569 | 1574 | { |
1575 | + // 同時接続対応 | |
1576 | +// if((strlen(Pass) != 0) || | |
1577 | +// (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) | |
1570 | 1578 | if((strlen(Pass) != 0) || |
1571 | - (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) | |
1579 | + ((HostData->NoDisplayUI == NO) && (InputDialogBox(passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))) | |
1572 | 1580 | { |
1573 | 1581 | CheckOneTimePassword(Pass, Reply, Security); |
1574 | 1582 |
@@ -1582,7 +1590,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char | ||
1582 | 1590 | if(Sts == FTP_ERROR) |
1583 | 1591 | { |
1584 | 1592 | strcpy(Pass, ""); |
1585 | - if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) | |
1593 | + // 同時接続対応 | |
1594 | +// if(InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) | |
1595 | + if(HostData->NoDisplayUI == NO && InputDialogBox(re_passwd_dlg, GetMainHwnd(), NULL, Pass, PASSWORD_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES) | |
1586 | 1596 | Continue = YES; |
1587 | 1597 | else |
1588 | 1598 | DoPrintf("No password specified."); |
@@ -1590,8 +1600,11 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char | ||
1590 | 1600 | } |
1591 | 1601 | else if(Sts == FTP_CONTINUE) |
1592 | 1602 | { |
1603 | + // 同時接続対応 | |
1604 | +// if((strlen(Acct) != 0) || | |
1605 | +// (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) | |
1593 | 1606 | if((strlen(Acct) != 0) || |
1594 | - (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES)) | |
1607 | + ((HostData->NoDisplayUI == NO) && (InputDialogBox(account_dlg, GetMainHwnd(), NULL, Acct, ACCOUNT_LEN+1, &Anony, IDH_HELP_TOPIC_0000001) == YES))) | |
1595 | 1608 | { |
1596 | 1609 | // 同時接続対応 |
1597 | 1610 | // Sts = command(ContSock, NULL, &CancelFlg, "ACCT %s", Acct) / 100; |
@@ -1624,7 +1637,9 @@ static SOCKET DoConnectCrypt(int CryptMode, HOSTDATA* HostData, char *Host, char | ||
1624 | 1637 | } |
1625 | 1638 | else if((SavePass == YES) && (ReInPass == YES)) |
1626 | 1639 | { |
1627 | - if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) | |
1640 | + // 同時接続対応 | |
1641 | +// if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) | |
1642 | + if(HostData->NoDisplayUI == NO && DialogBox(GetFtpInst(), MAKEINTRESOURCE(savepass_dlg), GetMainHwnd(), ExeEscDialogProc) == YES) | |
1628 | 1643 | SetHostPassword(AskCurrentHost(), Pass); |
1629 | 1644 | } |
1630 | 1645 | } |
@@ -4911,6 +4911,7 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, | ||
4911 | 4911 | sTime.wHour = atoi_n(Value + 8, 2); |
4912 | 4912 | sTime.wMinute = atoi_n(Value + 10, 2); |
4913 | 4913 | sTime.wSecond = atoi_n(Value + 12, 2); |
4914 | + sTime.wMilliseconds = 0; | |
4914 | 4915 | SystemTimeToFileTime(&sTime, Time); |
4915 | 4916 | // SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); |
4916 | 4917 | *InfoExist |= FINFO_DATE | FINFO_TIME; |
@@ -697,6 +697,7 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
697 | 697 | SOCKET TrnSkt; |
698 | 698 | RECT WndRect; |
699 | 699 | int i; |
700 | + DWORD LastUsed; | |
700 | 701 | |
701 | 702 | hWndTrans = NULL; |
702 | 703 | Down = NO; |
@@ -756,10 +757,13 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
756 | 757 | { |
757 | 758 | ReleaseMutex(hListAccMutex); |
758 | 759 | ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]); |
759 | - // 同時ログイン数制限に引っかかった可能性あり | |
760 | - // 負荷を下げるためにしばらく待機 | |
761 | - if(TrnSkt == INVALID_SOCKET) | |
760 | + // 同時ログイン数制限対策 | |
761 | + if(TrnSkt != INVALID_SOCKET) | |
762 | + LastUsed = timeGetTime(); | |
763 | + else | |
762 | 764 | { |
765 | + // 同時ログイン数制限に引っかかった可能性あり | |
766 | + // 負荷を下げるために約10秒間待機 | |
763 | 767 | i = 10000; |
764 | 768 | while(NewCmdSkt != CmdSkt && i > 0) |
765 | 769 | { |
@@ -780,15 +784,20 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
780 | 784 | { |
781 | 785 | if(TrnSkt != INVALID_SOCKET) |
782 | 786 | { |
783 | - ReleaseMutex(hListAccMutex); | |
784 | - SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]); | |
785 | - DoClose(TrnSkt); | |
786 | - TrnSkt = INVALID_SOCKET; | |
787 | -// WaitForSingleObject(hListAccMutex, INFINITE); | |
788 | - while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
787 | + // 同時ログイン数制限対策 | |
788 | + // 10秒間は再利用を許可 | |
789 | + if(timeGetTime() - LastUsed > 10000) | |
789 | 790 | { |
790 | - BackgrndMessageProc(); | |
791 | - Sleep(1); | |
791 | + ReleaseMutex(hListAccMutex); | |
792 | + SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]); | |
793 | + DoClose(TrnSkt); | |
794 | + TrnSkt = INVALID_SOCKET; | |
795 | +// WaitForSingleObject(hListAccMutex, INFINITE); | |
796 | + while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) | |
797 | + { | |
798 | + BackgrndMessageProc(); | |
799 | + Sleep(1); | |
800 | + } | |
792 | 801 | } |
793 | 802 | } |
794 | 803 | } |
@@ -1150,6 +1159,7 @@ static ULONG WINAPI TransferThread(void *Dummy) | ||
1150 | 1159 | SendMessage(hWndTrans, WM_SET_PACKET, 0, 0); |
1151 | 1160 | if(Pos != NULL) |
1152 | 1161 | strcpy(Pos->Cmd, ""); |
1162 | + LastUsed = timeGetTime(); | |
1153 | 1163 | } |
1154 | 1164 | // else |
1155 | 1165 | else if(TransPacketBase == NULL) |
@@ -1345,6 +1345,7 @@ void CopyDefaultHost(HOSTDATA *Set) | ||
1345 | 1345 | // 同時接続対応 |
1346 | 1346 | Set->MaxThreadCount = 1; |
1347 | 1347 | Set->ReuseCmdSkt = NO; |
1348 | + Set->NoDisplayUI = NO; | |
1348 | 1349 | // MLSD対応 |
1349 | 1350 | Set->Feature = 0; |
1350 | 1351 | Set->UseMLSD = YES; |