X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=getput.c;h=28c2471de5eb3666ea6fab767deb4c5f076ad984;hp=2f0094a88492d4e27ff247c073c7a7b8cd820752;hb=28c3554bd94b9b4f6dcc78175755e8fd24f8e237;hpb=f93da12f0a0b0271fdaf25d02772972a79d86bf2 diff --git a/getput.c b/getput.c index 2f0094a..28c2471 100644 --- a/getput.c +++ b/getput.c @@ -41,7 +41,9 @@ #include #include #include -#include +// IPv6対応 +//#include +#include #include #include #include @@ -86,10 +88,16 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork); static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork); static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *CancelCheckWork); static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode); -static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname); -static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +// 再転送対応 +//static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname); +static int DispUpDownErrDialog(int ResID, HWND hWnd, TRANSPACKET *Pkt); +// 64ビット対応 +//static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); static int SetDownloadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *Mode, int *CancelCheckWork); -static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt); static int UpLoadNonPassive(TRANSPACKET *Pkt); static int UpLoadPassive(TRANSPACKET *Pkt); @@ -102,10 +110,16 @@ static int SetUploadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *M static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam); static void DispTransferStatus(HWND hWnd, int End, TRANSPACKET *Pkt); static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int Info); -static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max); +// IPv6対応 +//static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max); +static int GetAdrsAndPort(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max); +static int GetAdrsAndPortIPv4(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max); +static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max); static int IsSpecialDevice(char *Fname); static int MirrorDelNotify(int Cur, int Notify, TRANSPACKET *Pkt); -static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static void SetErrorMsg(char *fmt, ...); // 同時接続対応 static char* GetErrMsg(); @@ -153,6 +167,9 @@ static HANDLE hErrMsgMutex; // 同時接続対応 static int WaitForMainThread = NO; +// 再転送対応 +static int TransferErrorMode = EXIST_OVW; +static int TransferErrorNotify = NO; /*===== 外部参照 =====*/ @@ -371,6 +388,9 @@ int RemoveTmpTransFileListItem(TRANSPACKET **Base, int Num) void AddTransFileList(TRANSPACKET *Pkt) { + // 同時接続対応 + TRANSPACKET *Pos; + DispTransPacket(Pkt); // 同時接続対応 @@ -382,6 +402,13 @@ void AddTransFileList(TRANSPACKET *Pkt) Sleep(1); } + // 同時接続対応 + Pos = TransPacketBase; + if(Pos != NULL) + { + while(Pos->Next != NULL) + Pos = Pos->Next; + } if(AddTmpTransFileList(Pkt, &TransPacketBase) == FFFTP_SUCCESS) { if((strncmp(Pkt->Cmd, "RETR", 4) == 0) || @@ -393,7 +420,12 @@ void AddTransFileList(TRANSPACKET *Pkt) } // 同時接続対応 if(NextTransPacketBase == NULL) - NextTransPacketBase = TransPacketBase; + { + if(Pos) + NextTransPacketBase = Pos->Next; + else + NextTransPacketBase = TransPacketBase; + } ReleaseMutex(hListAccMutex); // 同時接続対応 WaitForMainThread = NO; @@ -439,7 +471,7 @@ void AppendTransFileList(TRANSPACKET *Pkt) } // 同時接続対応 if(NextTransPacketBase == NULL) - NextTransPacketBase = TransPacketBase; + NextTransPacketBase = Pkt; while(Pkt != NULL) { @@ -543,7 +575,7 @@ static void EraseTransFileList(void) } TransPacketBase = NotDel; // 同時接続対応 - NextTransPacketBase = TransPacketBase; + NextTransPacketBase = NotDel; TransFiles = 0; PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0); ReleaseMutex(hListAccMutex); @@ -665,6 +697,7 @@ static ULONG WINAPI TransferThread(void *Dummy) SOCKET TrnSkt; RECT WndRect; int i; + DWORD LastUsed; hWndTrans = NULL; Down = NO; @@ -711,44 +744,61 @@ static ULONG WINAPI TransferThread(void *Dummy) free(Pos); } NewCmdSkt = AskCmdCtrlSkt(); - if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount()) + if(AskReuseCmdSkt() == YES && ThreadCount == 0) { - if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt) + if(TransPacketBase && ThreadCount < AskMaxThreadCount()) + TrnSkt = AskTrnCtrlSkt(); + } + else + { + if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount()) { - ReleaseMutex(hListAccMutex); - ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]); - // 同時ログイン数制限に引っかかった可能性あり - // 負荷を下げるためにしばらく待機 - if(TrnSkt == INVALID_SOCKET) + if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt) { - i = 10000; - while(NewCmdSkt != CmdSkt && i > 0) + ReleaseMutex(hListAccMutex); + ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]); + // 同時ログイン数制限対策 + if(TrnSkt != INVALID_SOCKET) + LastUsed = timeGetTime(); + else + { + // 同時ログイン数制限に引っかかった可能性あり + // 負荷を下げるために約10秒間待機 + i = 10000; + while(NewCmdSkt != CmdSkt && i > 0) + { + BackgrndMessageProc(); + Sleep(1); + i--; + } + } +// WaitForSingleObject(hListAccMutex, INFINITE); + while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) { BackgrndMessageProc(); Sleep(1); - i--; } } -// WaitForSingleObject(hListAccMutex, INFINITE); - while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) - { - BackgrndMessageProc(); - Sleep(1); - } } - } - else - { - if(TrnSkt != INVALID_SOCKET) + else { - ReleaseMutex(hListAccMutex); - DoClose(TrnSkt); - TrnSkt = INVALID_SOCKET; -// WaitForSingleObject(hListAccMutex, INFINITE); - while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) + if(TrnSkt != INVALID_SOCKET) { - BackgrndMessageProc(); - Sleep(1); + // 同時ログイン数制限対策 + // 10秒間は再利用を許可 + if(timeGetTime() - LastUsed > 10000) + { + ReleaseMutex(hListAccMutex); + SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]); + DoClose(TrnSkt); + TrnSkt = INVALID_SOCKET; +// WaitForSingleObject(hListAccMutex, INFINITE); + while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT) + { + BackgrndMessageProc(); + Sleep(1); + } + } } } } @@ -756,6 +806,13 @@ static ULONG WINAPI TransferThread(void *Dummy) // if(TransPacketBase != NULL) if(TrnSkt != INVALID_SOCKET && NextTransPacketBase != NULL) { + if(strcmp(NextTransPacketBase->Cmd, "GOQUIT") == 0 && NextTransPacketBase != TransPacketBase) + { + ReleaseMutex(hListAccMutex); + BackgrndMessageProc(); + Sleep(1); + continue; + } Pos = NextTransPacketBase; NextTransPacketBase = NextTransPacketBase->Next; // ディレクトリ操作は非同期で行わない @@ -1017,7 +1074,8 @@ static ULONG WINAPI TransferThread(void *Dummy) // else if(strcmp(TransPacketBase->Cmd, "SETCUR") == 0) else if(strcmp(Pos->Cmd, "SETCUR") == 0) { - if(AskShareProh() == YES) +// if(AskShareProh() == YES) + if(AskReuseCmdSkt() == NO || AskShareProh() == YES) { // if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) if(strcmp(CurDir[Pos->ThreadCount], Pos->RemoteFile) != 0) @@ -1038,7 +1096,8 @@ static ULONG WINAPI TransferThread(void *Dummy) // else if(strcmp(TransPacketBase->Cmd, "BACKCUR") == 0) else if(strcmp(Pos->Cmd, "BACKCUR") == 0) { - if(AskShareProh() == NO) +// if(AskShareProh() == NO) + if(AskReuseCmdSkt() == YES && AskShareProh() == NO) { // if(strcmp(CurDir, TransPacketBase->RemoteFile) != 0) // CommandProcTrn(NULL, "CWD %s", TransPacketBase->RemoteFile); @@ -1107,6 +1166,7 @@ static ULONG WINAPI TransferThread(void *Dummy) SendMessage(hWndTrans, WM_SET_PACKET, 0, 0); if(Pos != NULL) strcpy(Pos->Cmd, ""); + LastUsed = timeGetTime(); } // else else if(TransPacketBase == NULL) @@ -1156,6 +1216,10 @@ static ULONG WINAPI TransferThread(void *Dummy) PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_AUTO_EXIT, 0), 0); GoExit = NO; } + + // 再転送対応 + TransferErrorMode = AskTransferErrorMode(); + TransferErrorNotify = AskTransferErrorNotify(); } else { @@ -1172,8 +1236,14 @@ static ULONG WINAPI TransferThread(void *Dummy) Sleep(100); } } - if(TrnSkt != INVALID_SOCKET) - DoClose(TrnSkt); + if(AskReuseCmdSkt() == NO || ThreadCount > 0) + { + if(TrnSkt != INVALID_SOCKET) + { + SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]); + DoClose(TrnSkt); + } + } return 0; } @@ -1257,7 +1327,13 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork) DispTransFileInfo(Pkt, MSGJPN087, FALSE, NO); } - if(BackgrndMessageProc() == NO) + // SFTP対応 +// if(BackgrndMessageProc() == NO) + if(IsSFTPAttached(Pkt->ctrl_skt)) + { + // TODO: + } + else if(BackgrndMessageProc() == NO) { if(AskPasvMode() != YES) iRetCode = DownLoadNonPassive(Pkt, CancelCheckWork); @@ -1297,7 +1373,10 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) SOCKET listen_socket = INVALID_SOCKET; // data listen socket char Buf[1024]; int CreateMode; - struct sockaddr_in saSockAddr1; + // IPv6対応 +// struct sockaddr_in saSockAddr1; + struct sockaddr_in saSockAddrIPv4; + struct sockaddr_in6 saSockAddrIPv6; char Reply[ERR_MSG_LEN+7]; if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, CancelCheckWork)) != INVALID_SOCKET) @@ -1312,8 +1391,20 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) // if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL) if(SocksGet2ndBindReply(listen_socket, &data_socket, CancelCheckWork) == FFFTP_FAIL) { - iLength = sizeof(saSockAddr1); - data_socket = do_accept(listen_socket, (struct sockaddr *)&saSockAddr1, (int *)&iLength); + // IPv6対応 +// iLength = sizeof(saSockAddr1); +// data_socket = do_accept(listen_socket, (struct sockaddr *)&saSockAddr1, (int *)&iLength); + switch(AskCurNetType()) + { + case NTYPE_IPV4: + iLength=sizeof(saSockAddrIPv4); + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv4, (int *)&iLength); + break; + case NTYPE_IPV6: + iLength=sizeof(saSockAddrIPv6); + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv6, (int *)&iLength); + break; + } if(shutdown(listen_socket, 1) != 0) ReportWSError("shutdown listen", WSAGetLastError()); @@ -1326,7 +1417,19 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) iRetCode = 500; } else - DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); + // IPv6対応 +// DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); + { + switch(AskCurNetType()) + { + case NTYPE_IPV4: + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddrIPv4.sin_addr), ntohs(saSockAddrIPv4.sin_port)); + break; + case NTYPE_IPV6: + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet6_ntoa(saSockAddrIPv6.sin6_addr), ntohs(saSockAddrIPv6.sin6_port)); + break; + } + } } if(data_socket != INVALID_SOCKET) @@ -1384,15 +1487,29 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork) SOCKET data_socket = INVALID_SOCKET; // data channel socket char Buf[1024]; int CreateMode; - char Adrs[20]; + // IPv6対応 +// char Adrs[20]; + char Adrs[40]; int Port; int Flg; char Reply[ERR_MSG_LEN+7]; - iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV"); + // IPv6対応 +// iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV"); + switch(AskCurNetType()) + { + case NTYPE_IPV4: + iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV"); + break; + case NTYPE_IPV6: + iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "EPSV"); + break; + } if(iRetCode/100 == FTP_COMPLETE) { - if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) + // IPv6対応 +// if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) + if(GetAdrsAndPort(Pkt->ctrl_skt, Buf, Adrs, &Port, 39) == FFFTP_SUCCESS) { if((data_socket = connectsock(Adrs, Port, MSGJPN091, CancelCheckWork)) != INVALID_SOCKET) { @@ -1605,8 +1722,6 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc // Continue = ConvJIStoSJIS(&cInfo); // else // Continue = ConvEUCtoSJIS(&cInfo); - char Buf3[(BUFSIZE + 3) * 4]; - CODECONVINFO cInfo2; switch(Pkt->KanjiCode) { case KANJI_SJIS: @@ -1635,6 +1750,11 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc cInfo2.OutLen = cInfo.OutLen; break; case KANJI_UTF8N: + Continue = ConvSJIStoUTF8N(&cInfo); + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { memcpy(Buf3, "\xEF\xBB\xBF", 3); @@ -1678,6 +1798,14 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc ConvSJIStoEUC(&cInfo2); break; case KANJI_UTF8N: + Continue = ConvJIStoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { memcpy(Buf3, "\xEF\xBB\xBF", 3); @@ -1724,6 +1852,14 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc ConvSJIStoEUC(&cInfo2); break; case KANJI_UTF8N: + Continue = ConvEUCtoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { memcpy(Buf3, "\xEF\xBB\xBF", 3); @@ -1742,6 +1878,50 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc } break; case KANJI_UTF8N: + switch(Pkt->KanjiCodeDesired) + { + case KANJI_SJIS: + Continue = ConvUTF8NtoSJIS(&cInfo); + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_JIS: + Continue = ConvUTF8NtoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoJIS(&cInfo2); + break; + case KANJI_EUC: + Continue = ConvUTF8NtoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoEUC(&cInfo2); + break; + case KANJI_UTF8N: + memcpy(Buf3, cInfo.Str, cInfo.StrLen); + cInfo2.OutLen = cInfo.StrLen; + Continue = NO; + break; + case KANJI_UTF8BOM: + if(ProcessedBOM == NO) + { + memcpy(Buf3, "\xEF\xBB\xBF", 3); + cInfo2.OutLen = 3; + Continue = YES; + ProcessedBOM = YES; + break; + } + memcpy(Buf3, cInfo.Str, cInfo.StrLen); + cInfo2.OutLen = cInfo.StrLen; + Continue = NO; + break; + } + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { if(memcmp(Buf, "\xEF\xBB\xBF", 3) == 0) @@ -1752,7 +1932,7 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc cInfo2.OutLen = 0; switch(Pkt->KanjiCodeDesired) { - case KANJI_UTF8N: + case KANJI_UTF8BOM: memcpy(Buf3, "\xEF\xBB\xBF", 3); cInfo2.OutLen = 3; break; @@ -1789,6 +1969,11 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc cInfo2.OutLen = cInfo.StrLen; Continue = NO; break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Str, cInfo.StrLen); + cInfo2.OutLen = cInfo.StrLen; + Continue = NO; + break; } break; } @@ -1850,6 +2035,10 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc memcpy(Buf3, cInfo.Buf, cInfo.OutLen); cInfo2.OutLen = cInfo.OutLen; break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; } break; case KANJI_JIS: @@ -1881,6 +2070,13 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc cInfo2.BufSize = (BUFSIZE + 3) * 4; ConvSJIStoUTF8N(&cInfo2); break; + case KANJI_UTF8BOM: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; } break; case KANJI_EUC: @@ -1912,6 +2108,13 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc cInfo2.BufSize = (BUFSIZE + 3) * 4; ConvSJIStoUTF8N(&cInfo2); break; + case KANJI_UTF8BOM: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; } break; case KANJI_UTF8N: @@ -1939,6 +2142,41 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc memcpy(Buf3, cInfo.Buf, cInfo.OutLen); cInfo2.OutLen = cInfo.OutLen; break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + } + break; + case KANJI_UTF8BOM: + switch(Pkt->KanjiCodeDesired) + { + case KANJI_SJIS: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_JIS: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoJIS(&cInfo2); + break; + case KANJI_EUC: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoEUC(&cInfo2); + break; + case KANJI_UTF8N: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; } break; } @@ -2048,6 +2286,12 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) if (AskHostType() == HTYPE_VMS) return; #endif +#if defined(HAVE_TANDEM) + /* HP Nonstop Server の場合、ファイルのない subvol へ移動すると550 File not found + * になるが問題ないのでエラーダイアログやエラーメッセージを出さないため */ + if (AskHostType() == HTYPE_TANDEM) + return; +#endif if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0)) { @@ -2066,8 +2310,22 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) { // 全て中止を選択後にダイアログが表示されるバグ対策 // if(DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO) - if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO) - ClearAll = YES; + // 再転送対応 +// if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO) +// ClearAll = YES; + if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO) + { + if(strncmp(Pkt->Cmd, "RETR", 4) == 0 || strncmp(Pkt->Cmd, "STOR", 4) == 0) + { + if(TransferErrorNotify == YES && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Pkt) == NO) + ClearAll = YES; + else + { + Pkt->Mode = TransferErrorMode; + AddTransFileList(Pkt); + } + } + } } } else @@ -2101,13 +2359,17 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) * int ステータス (YES=中止/NO=全て中止) *----------------------------------------------------------------------------*/ -static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname) +// 再転送対応 +//static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname) +static int DispUpDownErrDialog(int ResID, HWND hWnd, TRANSPACKET *Pkt) { if(hWnd == NULL) hWnd = GetMainHwnd(); SoundPlay(SND_ERROR); - return(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ResID), hWnd, UpDownErrorDialogProc, (LPARAM)Fname)); + // 再転送対応 +// return(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ResID), hWnd, UpDownErrorDialogProc, (LPARAM)Fname)); + return(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ResID), hWnd, UpDownErrorDialogProc, (LPARAM)Pkt)); } @@ -2123,31 +2385,57 @@ static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { + static TRANSPACKET *Pkt; + static const RADIOBUTTON DownExistButton[] = { + { DOWN_EXIST_OVW, EXIST_OVW }, + { DOWN_EXIST_RESUME, EXIST_RESUME }, + { DOWN_EXIST_IGNORE, EXIST_IGNORE } + }; + #define DOWNEXISTBUTTONS (sizeof(DownExistButton)/sizeof(RADIOBUTTON)) + switch (message) { case WM_INITDIALOG : - SendDlgItemMessage(hDlg, UPDOWN_ERR_FNAME, WM_SETTEXT, 0, (LPARAM)lParam); + Pkt = (TRANSPACKET *)lParam; +// SendDlgItemMessage(hDlg, UPDOWN_ERR_FNAME, WM_SETTEXT, 0, (LPARAM)lParam); + SendDlgItemMessage(hDlg, UPDOWN_ERR_FNAME, WM_SETTEXT, 0, (LPARAM)Pkt->RemoteFile); // 同時接続対応 // SendDlgItemMessage(hDlg, UPDOWN_ERR_MSG, WM_SETTEXT, 0, (LPARAM)ErrMsg); SendDlgItemMessage(hDlg, UPDOWN_ERR_MSG, WM_SETTEXT, 0, (LPARAM)GetErrMsg()); + + if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0)) + EnableWindow(GetDlgItem(hDlg, DOWN_EXIST_RESUME), FALSE); + + SetRadioButtonByValue(hDlg, TransferErrorMode, DownExistButton, DOWNEXISTBUTTONS); return(TRUE); case WM_COMMAND : switch(GET_WM_COMMAND_ID(wParam, lParam)) { + case IDOK_ALL : + TransferErrorNotify = NO; + /* ここに break はない */ + case IDOK : + TransferErrorMode = AskRadioButtonValue(hDlg, DownExistButton, DOWNEXISTBUTTONS); EndDialog(hDlg, YES); break; case IDCANCEL : EndDialog(hDlg, NO); break; + + case IDHELP : +// hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000009); + break; } - return(TRUE); + return(TRUE); } - return(FALSE); + return(FALSE); } @@ -2215,7 +2503,9 @@ static int SetDownloadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch (iMessage) { @@ -2279,7 +2569,13 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt) if(Pkt->hWndTrans != NULL) DispTransFileInfo(Pkt, MSGJPN104, TRUE, YES); - if(BackgrndMessageProc() == NO) + // SFTP対応 +// if(BackgrndMessageProc() == NO) + if(IsSFTPAttached(Pkt->ctrl_skt)) + { + // TODO: + } + else if(BackgrndMessageProc() == NO) { if(AskPasvMode() != YES) iRetCode = UpLoadNonPassive(Pkt); @@ -2333,7 +2629,10 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) SOCKET data_socket = INVALID_SOCKET; // data channel socket SOCKET listen_socket = INVALID_SOCKET; // data listen socket char Buf[1024]; - struct sockaddr_in saSockAddr1; + // IPv6対応 +// struct sockaddr_in saSockAddr1; + struct sockaddr_in saSockAddrIPv4; + struct sockaddr_in6 saSockAddrIPv6; int Resume; char Reply[ERR_MSG_LEN+7]; @@ -2343,6 +2642,16 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) { SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); if(Resume == NO) +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) { + if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) { + // EXTENTがデフォルトのときはコードのみ + sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode); + } else { + sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt); + } + } else +#endif sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); else sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); @@ -2356,8 +2665,20 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) // if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL) if(SocksGet2ndBindReply(listen_socket, &data_socket, &Canceled[Pkt->ThreadCount]) == FFFTP_FAIL) { - iLength=sizeof(saSockAddr1); - data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddr1, (int *)&iLength); + // IPv6対応 +// iLength=sizeof(saSockAddr1); +// data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddr1, (int *)&iLength); + switch(AskCurNetType()) + { + case NTYPE_IPV4: + iLength=sizeof(saSockAddrIPv4); + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv4, (int *)&iLength); + break; + case NTYPE_IPV6: + iLength=sizeof(saSockAddrIPv6); + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv6, (int *)&iLength); + break; + } if(shutdown(listen_socket, 1) != 0) ReportWSError("shutdown listen", WSAGetLastError()); @@ -2370,7 +2691,19 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) iRetCode = 500; } else - DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); + // IPv6対応 +// DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); + { + switch(AskCurNetType()) + { + case NTYPE_IPV4: + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddrIPv4.sin_addr), ntohs(saSockAddrIPv4.sin_port)); + break; + case NTYPE_IPV6: + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet6_ntoa(saSockAddrIPv6.sin6_addr), ntohs(saSockAddrIPv6.sin6_port)); + break; + } + } } if(data_socket != INVALID_SOCKET) @@ -2424,7 +2757,9 @@ static int UpLoadPassive(TRANSPACKET *Pkt) int iRetCode; SOCKET data_socket = INVALID_SOCKET; // data channel socket char Buf[1024]; - char Adrs[20]; + // IPv6対応 +// char Adrs[20]; + char Adrs[40]; int Port; int Flg; int Resume; @@ -2432,10 +2767,22 @@ static int UpLoadPassive(TRANSPACKET *Pkt) // 同時接続対応 // iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV"); - iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV"); + // IPv6対応 +// iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV"); + switch(AskCurNetType()) + { + case NTYPE_IPV4: + iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV"); + break; + case NTYPE_IPV6: + iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "EPSV"); + break; + } if(iRetCode/100 == FTP_COMPLETE) { - if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) + // IPv6対応 +// if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) + if(GetAdrsAndPort(Pkt->ctrl_skt, Buf, Adrs, &Port, 39) == FFFTP_SUCCESS) { // 同時接続対応 // if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET) @@ -2448,6 +2795,16 @@ static int UpLoadPassive(TRANSPACKET *Pkt) SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); if(Resume == NO) +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) { + if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) { + // EXTENTがデフォルトのときはコードのみ + sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode); + } else { + sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt); + } + } else +#endif sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); else sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); @@ -2647,6 +3004,11 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) cInfo2.OutLen = cInfo.OutLen; break; case KANJI_UTF8N: + Continue = ConvSJIStoUTF8N(&cInfo); + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { memcpy(Buf3, "\xEF\xBB\xBF", 3); @@ -2690,6 +3052,14 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) ConvSJIStoEUC(&cInfo2); break; case KANJI_UTF8N: + Continue = ConvJIStoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { memcpy(Buf3, "\xEF\xBB\xBF", 3); @@ -2736,6 +3106,14 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) ConvSJIStoEUC(&cInfo2); break; case KANJI_UTF8N: + Continue = ConvEUCtoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { memcpy(Buf3, "\xEF\xBB\xBF", 3); @@ -2754,6 +3132,50 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) } break; case KANJI_UTF8N: + switch(Pkt->KanjiCode) + { + case KANJI_SJIS: + Continue = ConvUTF8NtoSJIS(&cInfo); + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_JIS: + Continue = ConvUTF8NtoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoJIS(&cInfo2); + break; + case KANJI_EUC: + Continue = ConvUTF8NtoSJIS(&cInfo); + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoEUC(&cInfo2); + break; + case KANJI_UTF8N: + memcpy(Buf3, cInfo.Str, cInfo.StrLen); + cInfo2.OutLen = cInfo.StrLen; + Continue = NO; + break; + case KANJI_UTF8BOM: + if(ProcessedBOM == NO) + { + memcpy(Buf3, "\xEF\xBB\xBF", 3); + cInfo2.OutLen = 3; + Continue = YES; + ProcessedBOM = YES; + break; + } + memcpy(Buf3, cInfo.Str, cInfo.StrLen); + cInfo2.OutLen = cInfo.StrLen; + Continue = NO; + break; + } + break; + case KANJI_UTF8BOM: if(ProcessedBOM == NO) { if(memcmp(Buf, "\xEF\xBB\xBF", 3) == 0) @@ -2764,7 +3186,7 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) cInfo2.OutLen = 0; switch(Pkt->KanjiCode) { - case KANJI_UTF8N: + case KANJI_UTF8BOM: memcpy(Buf3, "\xEF\xBB\xBF", 3); cInfo2.OutLen = 3; break; @@ -2801,6 +3223,11 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) cInfo2.OutLen = cInfo.StrLen; Continue = NO; break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Str, cInfo.StrLen); + cInfo2.OutLen = cInfo.StrLen; + Continue = NO; + break; } break; } @@ -2868,6 +3295,10 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) memcpy(Buf3, cInfo.Buf, cInfo.OutLen); cInfo2.OutLen = cInfo.OutLen; break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; } break; case KANJI_JIS: @@ -2899,6 +3330,13 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) cInfo2.BufSize = (BUFSIZE + 3) * 4; ConvSJIStoUTF8N(&cInfo2); break; + case KANJI_UTF8BOM: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; } break; case KANJI_EUC: @@ -2930,6 +3368,13 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) cInfo2.BufSize = (BUFSIZE + 3) * 4; ConvSJIStoUTF8N(&cInfo2); break; + case KANJI_UTF8BOM: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoUTF8N(&cInfo2); + break; } break; case KANJI_UTF8N: @@ -2957,6 +3402,41 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt) memcpy(Buf3, cInfo.Buf, cInfo.OutLen); cInfo2.OutLen = cInfo.OutLen; break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + } + break; + case KANJI_UTF8BOM: + switch(Pkt->KanjiCode) + { + case KANJI_SJIS: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_JIS: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoJIS(&cInfo2); + break; + case KANJI_EUC: + cInfo2.Str = cInfo.Buf; + cInfo2.StrLen = cInfo.OutLen; + cInfo2.Buf = Buf3; + cInfo2.BufSize = (BUFSIZE + 3) * 4; + ConvSJIStoEUC(&cInfo2); + break; + case KANJI_UTF8N: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; + case KANJI_UTF8BOM: + memcpy(Buf3, cInfo.Buf, cInfo.OutLen); + cInfo2.OutLen = cInfo.OutLen; + break; } break; } @@ -3101,8 +3581,22 @@ static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode) { // 全て中止を選択後にダイアログが表示されるバグ対策 // 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; + // 再転送対応 +// if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO) +// ClearAll = YES; + if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO) + { + if(strncmp(Pkt->Cmd, "RETR", 4) == 0 || strncmp(Pkt->Cmd, "STOR", 4) == 0) + { + if(TransferErrorNotify == YES && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt) == NO) + ClearAll = YES; + else + { + Pkt->Mode = TransferErrorMode; + AddTransFileList(Pkt); + } + } + } } } else @@ -3208,7 +3702,9 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM /* ここに break はない */ case IDCANCEL : - if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA))) + // 64ビット対応 +// if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA))) + if(!(Pkt = (TRANSPACKET*)GetWindowLongPtr(hDlg, GWLP_USERDATA))) break; Pkt->Abort = ABORT_USER; // Canceled = YES; @@ -3224,7 +3720,9 @@ 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))) + // 64ビット対応 +// if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA))) + if(!(Pkt = (TRANSPACKET*)GetWindowLongPtr(hDlg, GWLP_USERDATA))) break; if(Canceled[Pkt->ThreadCount] == YES) Pkt->Abort = ABORT_USER; @@ -3235,7 +3733,9 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM case WM_SET_PACKET : // Pkt = (TRANSPACKET *)lParam; - SetWindowLong(hDlg, GWL_USERDATA, (LONG)lParam); + // 64ビット対応 +// SetWindowLong(hDlg, GWL_USERDATA, (LONG)lParam); + SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)lParam); break; } return(FALSE); @@ -3382,6 +3882,8 @@ static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int SendDlgItemMessage(Pkt->hWndTrans, TRANS_KANJI, WM_SETTEXT, 0, (LPARAM)MSGJPN123); else if(Pkt->KanjiCode == KANJI_UTF8N) SendDlgItemMessage(Pkt->hWndTrans, TRANS_KANJI, WM_SETTEXT, 0, (LPARAM)MSGJPN306); + else if(Pkt->KanjiCode == KANJI_UTF8BOM) + SendDlgItemMessage(Pkt->hWndTrans, TRANS_KANJI, WM_SETTEXT, 0, (LPARAM)MSGJPN329); } else { @@ -3408,10 +3910,31 @@ static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int * FFFTP_SUCCESS/FFFTP_FAIL *----------------------------------------------------------------------------*/ -static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) +static int GetAdrsAndPort(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max) +{ + int Result; + Result = FFFTP_FAIL; + switch(AskCurNetType()) + { + case NTYPE_IPV4: + Result = GetAdrsAndPortIPv4(Skt, Str, Adrs, Port, Max); + break; + case NTYPE_IPV6: + Result = GetAdrsAndPortIPv6(Skt, Str, Adrs, Port, Max); + break; + } + return Result; +} + + +// IPv6対応 +//static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) +static int GetAdrsAndPortIPv4(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max) { char *Pos; char *Btm; + // コンマではなくドットを返すホストがあるため + char *OldBtm; int Sts; Sts = FFFTP_FAIL; @@ -3421,18 +3944,36 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) { Pos++; Btm = strchr(Pos, ','); + // コンマではなくドットを返すホストがあるため + if(Btm == NULL) + Btm = strchr(Pos, '.'); if(Btm != NULL) { Btm++; - Btm = strchr(Btm, ','); + // コンマではなくドットを返すホストがあるため +// Btm = strchr(Btm, ','); + OldBtm = Btm; + Btm = strchr(OldBtm, ','); + if(Btm == NULL) + Btm = strchr(OldBtm, '.'); if(Btm != NULL) { Btm++; - Btm = strchr(Btm, ','); + // コンマではなくドットを返すホストがあるため +// Btm = strchr(Btm, ','); + OldBtm = Btm; + Btm = strchr(OldBtm, ','); + if(Btm == NULL) + Btm = strchr(OldBtm, '.'); if(Btm != NULL) { Btm++; - Btm = strchr(Btm, ','); + // コンマではなくドットを返すホストがあるため +// Btm = strchr(Btm, ','); + OldBtm = Btm; + Btm = strchr(OldBtm, ','); + if(Btm == NULL) + Btm = strchr(OldBtm, '.'); if(Btm != NULL) { if((Btm - Pos) <= Max) @@ -3443,6 +3984,9 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) Pos = Btm + 1; Btm = strchr(Pos, ','); + // コンマではなくドットを返すホストがあるため + if(Btm == NULL) + Btm = strchr(Pos, '.'); if(Btm != NULL) { Btm++; @@ -3459,6 +4003,65 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) } +// IPv6対応 +static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max) +{ + char *Pos; + char *Btm; + int Sts; + int i; + struct sockaddr_in6 SockAddr; + + Sts = FFFTP_FAIL; + + Btm = strchr(Str, '('); + if(Btm != NULL) + { + Btm++; + Btm = strchr(Btm, '|'); + if(Btm != NULL) + { + Pos = Btm + 1; + Btm = strchr(Pos, '|'); + if(Btm != NULL) + { + Pos = Btm + 1; + Btm = strchr(Pos, '|'); + if(Btm != NULL) + { + if((Btm - Pos) <= Max) + { + if((Btm - Pos) > 0) + { + strncpy(Adrs, Pos, Btm - Pos); + *(Adrs + (Btm - Pos)) = NUL; + } + else + { + i = sizeof(SockAddr); + if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR) + AddressToStringIPv6(Adrs, &SockAddr.sin6_addr); + } + + Pos = Btm + 1; + Btm = strchr(Pos, '|'); + if(Btm != NULL) + { + Btm++; + *Port = atoi(Pos); + Btm = strchr(Btm, ')'); + if(Btm != NULL) + Sts = FFFTP_SUCCESS; + } + } + } + } + } + } + return(Sts); +} + + /*----- Windowsのスペシャルデバイスかどうかを返す ----------------------------- * * Parameter @@ -3547,7 +4150,9 @@ static int MirrorDelNotify(int Cur, int Notify, TRANSPACKET *Pkt) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { static MIRRORDELETEINFO *DelInfo; switch (iMessage)