OSDN Git Service

Modify copyrights.
[ffftp/ffftp.git] / getput.c
index 888af3c..f2eea10 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -84,9 +84,11 @@ static void DispTransPacket(TRANSPACKET *Pkt);
 static void EraseTransFileList(void);\r
 static ULONG WINAPI TransferThread(void *Dummy);\r
 static int MakeNonFullPath(TRANSPACKET *Pkt, char *CurDir, char *Tmp);\r
-static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork);\r
-static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork);\r
-static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *CancelCheckWork);\r
+// ミラーリング設定追加\r
+static int SetDownloadedFileTime(TRANSPACKET *Pkt);\r
+static int DownloadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork);\r
+static int DownloadPassive(TRANSPACKET *Pkt, int *CancelCheckWork);\r
+static int DownloadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *CancelCheckWork);\r
 static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode);\r
 // 再転送対応\r
 //static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname);\r
@@ -98,10 +100,10 @@ static int SetDownloadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int
 // 64ビット対応\r
 //static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 static INT_PTR CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
-static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt);\r
-static int UpLoadNonPassive(TRANSPACKET *Pkt);\r
-static int UpLoadPassive(TRANSPACKET *Pkt);\r
-static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt);\r
+static int DoUpload(SOCKET cSkt, TRANSPACKET *Pkt);\r
+static int UploadNonPassive(TRANSPACKET *Pkt);\r
+static int UploadPassive(TRANSPACKET *Pkt);\r
+static int UploadFile(TRANSPACKET *Pkt, SOCKET dSkt);\r
 // 同時接続対応\r
 //static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii);\r
 static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data, int Size, int Ascii, int *CancelCheckWork);\r
@@ -170,6 +172,10 @@ static int WaitForMainThread = NO;
 // 再転送対応\r
 static int TransferErrorMode = EXIST_OVW;\r
 static int TransferErrorNotify = NO;\r
+// タスクバー進捗表示\r
+static LONGLONG TransferSizeLeft = 0;\r
+static LONGLONG TransferSizeTotal = 0;\r
+static int TransferErrorDisplay = 0;\r
 \r
 /*===== 外部参照 =====*/\r
 \r
@@ -182,6 +188,10 @@ extern int MirUpDelNotify;
 extern int MirDownDelNotify;\r
 extern int FolderAttr;\r
 extern int FolderAttrNum;\r
+// 同時接続対応\r
+extern int SendQuit;\r
+// 自動切断対策\r
+extern time_t LastDataConnectionTime;\r
 \r
 \r
 /*----- ファイル転送スレッドを起動する ----------------------------------------\r
@@ -415,6 +425,9 @@ void AddTransFileList(TRANSPACKET *Pkt)
                   (strncmp(Pkt->Cmd, "STOR", 4) == 0))\r
                {\r
                        TransFiles++;\r
+                       // タスクバー進捗表示\r
+                       TransferSizeLeft += Pkt->Size;\r
+                       TransferSizeTotal += Pkt->Size;\r
                        PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
                }\r
        }\r
@@ -434,6 +447,15 @@ void AddTransFileList(TRANSPACKET *Pkt)
 }\r
 \r
 \r
+// バグ対策\r
+void AddNullTransFileList()\r
+{\r
+       TRANSPACKET Pkt;\r
+       memset(&Pkt, 0, sizeof(TRANSPACKET));\r
+       strcpy(Pkt.Cmd, "NULL");\r
+       AddTransFileList(&Pkt);\r
+}\r
+\r
 /*----- 転送ファイル情報を転送ファイルリストに追加する ------------------------\r
 *\r
 *      Parameter\r
@@ -481,6 +503,9 @@ void AppendTransFileList(TRANSPACKET *Pkt)
                   (strncmp(Pkt->Cmd, "STOR", 4) == 0))\r
                {\r
                        TransFiles++;\r
+                       // タスクバー進捗表示\r
+                       TransferSizeLeft += Pkt->Size;\r
+                       TransferSizeTotal += Pkt->Size;\r
                        PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
                }\r
                Pkt = Pkt->Next;\r
@@ -537,7 +562,7 @@ static void EraseTransFileList(void)
        TRANSPACKET *New;\r
        TRANSPACKET *Next;\r
        TRANSPACKET *NotDel;\r
-       TRANSPACKET Pkt;\r
+//     TRANSPACKET Pkt;\r
 \r
        NotDel = NULL;\r
 \r
@@ -577,13 +602,17 @@ static void EraseTransFileList(void)
        // 同時接続対応\r
        NextTransPacketBase = NotDel;\r
        TransFiles = 0;\r
+       // タスクバー進捗表示\r
+       TransferSizeLeft = 0;\r
+       TransferSizeTotal = 0;\r
        PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
        ReleaseMutex(hListAccMutex);\r
        // 同時接続対応\r
        WaitForMainThread = NO;\r
 \r
-       strcpy(Pkt.Cmd, "GOQUIT");\r
-       AddTransFileList(&Pkt);\r
+       // 同時接続対応\r
+//     strcpy(Pkt.Cmd, "GOQUIT");\r
+//     AddTransFileList(&Pkt);\r
        return;\r
 }\r
 \r
@@ -698,6 +727,8 @@ static ULONG WINAPI TransferThread(void *Dummy)
        RECT WndRect;\r
        int i;\r
        DWORD LastUsed;\r
+       int LastError;\r
+       int Sts;\r
 \r
        hWndTrans = NULL;\r
        Down = NO;\r
@@ -710,6 +741,7 @@ static ULONG WINAPI TransferThread(void *Dummy)
        CmdSkt = INVALID_SOCKET;\r
        NewCmdSkt = INVALID_SOCKET;\r
        TrnSkt = INVALID_SOCKET;\r
+       LastError = NO;\r
        SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST);\r
 \r
        while((TransPacketBase != NULL) ||\r
@@ -742,6 +774,8 @@ static ULONG WINAPI TransferThread(void *Dummy)
                        Pos = TransPacketBase;\r
                        TransPacketBase = TransPacketBase->Next;\r
                        free(Pos);\r
+                       if(TransPacketBase == NULL)\r
+                               GoExit = YES;\r
                }\r
                NewCmdSkt = AskCmdCtrlSkt();\r
                if(AskReuseCmdSkt() == YES && ThreadCount == 0)\r
@@ -751,6 +785,20 @@ static ULONG WINAPI TransferThread(void *Dummy)
                }\r
                else\r
                {\r
+                       // セッションあたりの転送量制限対策\r
+                       if(AskErrorReconnect() == YES && LastError == YES)\r
+                       {\r
+                               ReleaseMutex(hListAccMutex);\r
+                               DoQUIT(TrnSkt, &Canceled[ThreadCount]);\r
+                               DoClose(TrnSkt);\r
+                               TrnSkt = INVALID_SOCKET;\r
+//                             WaitForSingleObject(hListAccMutex, INFINITE);\r
+                               while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+                               {\r
+                                       BackgrndMessageProc();\r
+                                       Sleep(1);\r
+                               }\r
+                       }\r
                        if(TransPacketBase && NewCmdSkt != INVALID_SOCKET && ThreadCount < AskMaxThreadCount())\r
                        {\r
                                ReleaseMutex(hListAccMutex);\r
@@ -759,9 +807,7 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                else\r
                                        CheckClosedAndReconnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
                                // 同時ログイン数制限対策\r
-                               if(TrnSkt != INVALID_SOCKET)\r
-                                       LastUsed = timeGetTime();\r
-                               else\r
+                               if(TrnSkt == INVALID_SOCKET)\r
                                {\r
                                        // 同時ログイン数制限に引っかかった可能性あり\r
                                        // 負荷を下げるために約10秒間待機\r
@@ -773,6 +819,7 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                                i--;\r
                                        }\r
                                }\r
+                               LastUsed = timeGetTime();\r
 //                             WaitForSingleObject(hListAccMutex, INFINITE);\r
                                while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
                                {\r
@@ -786,10 +833,10 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                {\r
                                        // 同時ログイン数制限対策\r
                                        // 60秒間使用されなければログアウト\r
-                                       if(timeGetTime() - LastUsed > 60000)\r
+                                       if(timeGetTime() - LastUsed > 60000 || NewCmdSkt == INVALID_SOCKET)\r
                                        {\r
                                                ReleaseMutex(hListAccMutex);\r
-                                               SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
+                                               DoQUIT(TrnSkt, &Canceled[ThreadCount]);\r
                                                DoClose(TrnSkt);\r
                                                TrnSkt = INVALID_SOCKET;\r
 //                                             WaitForSingleObject(hListAccMutex, INFINITE);\r
@@ -803,16 +850,10 @@ static ULONG WINAPI TransferThread(void *Dummy)
                        }\r
                }\r
                CmdSkt = NewCmdSkt;\r
+               LastError = NO;\r
 //             if(TransPacketBase != NULL)\r
                if(TrnSkt != INVALID_SOCKET && NextTransPacketBase != NULL)\r
                {\r
-                       if(strcmp(NextTransPacketBase->Cmd, "GOQUIT") == 0 && NextTransPacketBase != TransPacketBase)\r
-                       {\r
-                               ReleaseMutex(hListAccMutex);\r
-                               BackgrndMessageProc();\r
-                               Sleep(1);\r
-                               continue;\r
-                       }\r
                        Pos = NextTransPacketBase;\r
                        NextTransPacketBase = NextTransPacketBase->Next;\r
                        // ディレクトリ操作は非同期で行わない\r
@@ -841,6 +882,7 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                     TransPacketBase->hWndTrans = hWndTrans;\r
                        Pos->hWndTrans = hWndTrans;\r
                        Pos->ctrl_skt = TrnSkt;\r
+                       Pos->Abort = ABORT_NONE;\r
                        Pos->ThreadCount = ThreadCount;\r
 \r
                        if(hWndTrans != NULL)\r
@@ -856,6 +898,9 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                             SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)TransPacketBase);\r
                                SendMessage(hWndTrans, WM_SET_PACKET, 0, (LPARAM)Pos);\r
 \r
+                       // 中断後に受信バッファに応答が残っていると次のコマンドの応答が正しく処理できない\r
+                       RemoveReceivedData(TrnSkt);\r
+\r
                        /* ダウンロード */\r
 //                     if(strncmp(TransPacketBase->Cmd, "RETR", 4) == 0)\r
                        if(strncmp(Pos->Cmd, "RETR", 4) == 0)\r
@@ -883,12 +928,24 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                                }\r
 \r
                                                Down = YES;\r
-//                                             if(DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO) == 429)\r
+//                                             if(DoDownload(AskTrnCtrlSkt(), TransPacketBase, NO) == 429)\r
 //                                             {\r
 //                                                     if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
-//                                                             DoDownLoad(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled);\r
-                                                               DoDownLoad(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]);\r
-//                                             }\r
+//                                                             DoDownload(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled);\r
+                                               // ミラーリング設定追加\r
+                                               if(Pos->NoTransfer == NO)\r
+                                               {\r
+                                                               Sts = DoDownload(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]) / 100;\r
+                                                               if(Sts != FTP_COMPLETE)\r
+                                                                       LastError = YES;\r
+                                               }\r
+\r
+                                               // ミラーリング設定追加\r
+                                               if((SaveTimeStamp == YES) &&\r
+                                                  ((Pos->Time.dwLowDateTime != 0) || (Pos->Time.dwHighDateTime != 0)))\r
+                                               {\r
+                                                       SetDownloadedFileTime(Pos);\r
+                                               }\r
                                        }\r
                                }\r
                                // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
@@ -905,12 +962,25 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                if(MakeNonFullPath(Pos, CurDir[Pos->ThreadCount], Tmp) == FFFTP_SUCCESS)\r
                                {\r
                                        Up = YES;\r
-//                                     if(DoUpLoad(AskTrnCtrlSkt(), TransPacketBase) == 429)\r
+//                                     if(DoUpload(AskTrnCtrlSkt(), TransPacketBase) == 429)\r
 //                                     {\r
 //                                             if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
-//                                                     DoUpLoad(AskTrnCtrlSkt(), TransPacketBase);\r
-                                                       DoUpLoad(TrnSkt, Pos);\r
-//                                     }\r
+//                                                     DoUpload(AskTrnCtrlSkt(), TransPacketBase);\r
+                                       // ミラーリング設定追加\r
+                                       if(Pos->NoTransfer == NO)\r
+                                       {\r
+                                                       Sts = DoUpload(TrnSkt, Pos) / 100;\r
+                                                       if(Sts != FTP_COMPLETE)\r
+                                                               LastError = YES;\r
+                                       }\r
+\r
+                                       // ホスト側の日時設定\r
+                                       /* ファイルのタイムスタンプを合わせる */\r
+                                       if((SaveTimeStamp == YES) &&\r
+                                          ((Pos->Time.dwLowDateTime != 0) || (Pos->Time.dwHighDateTime != 0)))\r
+                                       {\r
+                                               DoMFMT(TrnSkt, Pos->RemoteFile, &Pos->Time, &Canceled[Pos->ThreadCount]);\r
+                                       }\r
                                }\r
                                // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
                                ReleaseMutex(hListAccMutex);\r
@@ -1110,11 +1180,11 @@ static ULONG WINAPI TransferThread(void *Dummy)
                        }\r
                        /* 自動終了のための通知 */\r
 //                     else if(strcmp(TransPacketBase->Cmd, "GOQUIT") == 0)\r
-                       else if(strcmp(Pos->Cmd, "GOQUIT") == 0)\r
-                       {\r
-                               ReleaseMutex(hListAccMutex);\r
-                               GoExit = YES;\r
-                       }\r
+//                     else if(strcmp(Pos->Cmd, "GOQUIT") == 0)\r
+//                     {\r
+//                             ReleaseMutex(hListAccMutex);\r
+//                             GoExit = YES;\r
+//                     }\r
                        else\r
                                ReleaseMutex(hListAccMutex);\r
 \r
@@ -1133,26 +1203,37 @@ static ULONG WINAPI TransferThread(void *Dummy)
                                {\r
                                        for(i = 0; i < MAX_DATA_CONNECTION; i++)\r
                                                Canceled[i] = YES;\r
-                                       EraseTransFileList();\r
+                                       if(Pos != NULL)\r
+                                               strcpy(Pos->Cmd, "");\r
                                        Pos = NULL;\r
+                                       EraseTransFileList();\r
+                                       GoExit = YES;\r
                                }\r
                                else\r
                                {\r
 //                                     if((strncmp(TransPacketBase->Cmd, "RETR", 4) == 0) ||\r
 //                                        (strncmp(TransPacketBase->Cmd, "STOR", 4) == 0))\r
                                        if((strncmp(Pos->Cmd, "RETR", 4) == 0) ||\r
-                                          (strncmp(Pos->Cmd, "STOR", 4) == 0))\r
+                                          (strncmp(Pos->Cmd, "STOR", 4) == 0) ||\r
+                                          (strncmp(Pos->Cmd, "STOU", 4) == 0))\r
                                        {\r
 //                                             TransFiles--;\r
                                                if(TransFiles > 0)\r
                                                        TransFiles--;\r
+                                               // タスクバー進捗表示\r
+                                               if(TransferSizeLeft > 0)\r
+                                                       TransferSizeLeft -= Pos->Size;\r
+                                               if(TransferSizeLeft < 0)\r
+                                                       TransferSizeLeft = 0;\r
+                                               if(TransFiles == 0)\r
+                                                       TransferSizeTotal = 0;\r
                                                PostMessage(GetMainHwnd(), WM_CHANGE_COND, 0, 0);\r
                                        }\r
 //                                     Pos = TransPacketBase;\r
 //                                     TransPacketBase = TransPacketBase->Next;\r
 //                                     free(Pos);\r
                                }\r
-                               ClearAll = NO;\r
+//                             ClearAll = NO;\r
                                ReleaseMutex(hListAccMutex);\r
 \r
                                if(BackgrndMessageProc() == YES)\r
@@ -1171,8 +1252,25 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //             else\r
                else if(TransPacketBase == NULL)\r
                {\r
+                       ClearAll = NO;\r
                        DelNotify = NO;\r
 \r
+                       if(GoExit == YES)\r
+                       {\r
+                               SoundPlay(SND_TRANS);\r
+                               if(AskAutoExit() == NO)\r
+                               {\r
+                                       if(Down == YES)\r
+                                               PostMessage(GetMainHwnd(), WM_REFRESH_LOCAL_FLG, 0, 0);\r
+                                       if(Up == YES)\r
+                                               PostMessage(GetMainHwnd(), WM_REFRESH_REMOTE_FLG, 0, 0);\r
+                               }\r
+                               Down = NO;\r
+                               Up = NO;\r
+                               PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_AUTO_EXIT, 0), 0);\r
+                               GoExit = NO;\r
+                       }\r
+\r
                        ReleaseMutex(hListAccMutex);\r
                        if(KeepDlg == NO)\r
                        {\r
@@ -1201,22 +1299,6 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                     Sleep(1);\r
                        Sleep(100);\r
 \r
-                       if(GoExit == YES)\r
-                       {\r
-                               SoundPlay(SND_TRANS);\r
-                               if(AskAutoExit() == NO)\r
-                               {\r
-                                       if(Down == YES)\r
-                                               PostMessage(GetMainHwnd(), WM_REFRESH_LOCAL_FLG, 0, 0);\r
-                                       if(Up == YES)\r
-                                               PostMessage(GetMainHwnd(), WM_REFRESH_REMOTE_FLG, 0, 0);\r
-                               }\r
-                               Down = NO;\r
-                               Up = NO;\r
-                               PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_AUTO_EXIT, 0), 0);\r
-                               GoExit = NO;\r
-                       }\r
-\r
                        // 再転送対応\r
                        TransferErrorMode = AskTransferErrorMode();\r
                        TransferErrorNotify = AskTransferErrorNotify();\r
@@ -1280,6 +1362,21 @@ static int MakeNonFullPath(TRANSPACKET *Pkt, char *Cur, char *Tmp)
 \r
 \r
 \r
+// ミラーリング設定追加\r
+static int SetDownloadedFileTime(TRANSPACKET *Pkt)\r
+{\r
+       int Sts;\r
+       HANDLE hFile;\r
+       Sts = FFFTP_FAIL;\r
+       if((hFile = CreateFile(Pkt->LocalFile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)\r
+       {\r
+               if(SetFileTime(hFile, &Pkt->Time, &Pkt->Time, &Pkt->Time))\r
+                       Sts = FFFTP_SUCCESS;\r
+               CloseHandle(hFile);\r
+       }\r
+       return Sts;\r
+}\r
+\r
 /*----- ダウンロードを行なう --------------------------------------------------\r
 *\r
 *      Parameter\r
@@ -1295,7 +1392,7 @@ static int MakeNonFullPath(TRANSPACKET *Pkt, char *Cur, char *Tmp)
 *              からも呼ばれる。メインのスレッドから呼ばれる時は Pkt->hWndTrans == NULL。\r
 *----------------------------------------------------------------------------*/\r
 \r
-int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)\r
+int DoDownload(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)\r
 {\r
        int iRetCode;\r
        char Reply[ERR_MSG_LEN+7];\r
@@ -1328,24 +1425,20 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
                                        DispTransFileInfo(Pkt, MSGJPN087, FALSE, NO);\r
                        }\r
 \r
-                       // SFTP対応\r
-//                     if(BackgrndMessageProc() == NO)\r
-                       if(IsSFTPAttached(Pkt->ctrl_skt))\r
-                       {\r
-                               // TODO:\r
-                       }\r
-                       else if(BackgrndMessageProc() == NO)\r
+                       if(BackgrndMessageProc() == NO)\r
                        {\r
                                if(AskPasvMode() != YES)\r
-                                       iRetCode = DownLoadNonPassive(Pkt, CancelCheckWork);\r
+                                       iRetCode = DownloadNonPassive(Pkt, CancelCheckWork);\r
                                else\r
-                                       iRetCode = DownLoadPassive(Pkt, CancelCheckWork);\r
+                                       iRetCode = DownloadPassive(Pkt, CancelCheckWork);\r
                        }\r
                        else\r
                                iRetCode = 500;\r
                }\r
                else\r
                        SetErrorMsg(Reply);\r
+               // エラーによってはダイアログが表示されない場合があるバグ対策\r
+               DispDownloadFinishMsg(Pkt, iRetCode);\r
        }\r
        else\r
        {\r
@@ -1353,8 +1446,6 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
                SetTaskMsg(MSGJPN089, Pkt->RemoteFile);\r
                iRetCode = 200;\r
        }\r
-       // エラーによってはダイアログが表示されない場合があるバグ対策\r
-       DispDownloadFinishMsg(Pkt, iRetCode);\r
        return(iRetCode);\r
 }\r
 \r
@@ -1368,18 +1459,22 @@ int DoDownLoad(SOCKET cSkt, TRANSPACKET *Pkt, int DirList, int *CancelCheckWork)
 *              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)\r
+static int DownloadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)\r
 {\r
        int iRetCode;\r
        int iLength;\r
        SOCKET data_socket = INVALID_SOCKET;   // data channel socket\r
        SOCKET listen_socket = INVALID_SOCKET; // data listen socket\r
-       char Buf[1024];\r
+       // 念のため\r
+//     char Buf[1024];\r
+       char Buf[FMAX_PATH+1024];\r
        int CreateMode;\r
        // IPv6対応\r
 //     struct sockaddr_in saSockAddr1;\r
        struct sockaddr_in saSockAddrIPv4;\r
        struct sockaddr_in6 saSockAddrIPv6;\r
+       // UPnP対応\r
+       int Port;\r
        char Reply[ERR_MSG_LEN+7];\r
 \r
        if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, CancelCheckWork)) != INVALID_SOCKET)\r
@@ -1411,6 +1506,12 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 \r
                                        if(shutdown(listen_socket, 1) != 0)\r
                                                ReportWSError("shutdown listen", WSAGetLastError());\r
+                                       // UPnP対応\r
+                                       if(IsUPnPLoaded() == YES)\r
+                                       {\r
+                                               if(GetAsyncTableDataMapPort(listen_socket, &Port) == YES)\r
+                                                       RemovePortMapping(Port);\r
+                                       }\r
                                        listen_socket = DoClose(listen_socket);\r
 \r
                                        if(data_socket == INVALID_SOCKET)\r
@@ -1440,16 +1541,16 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
                                        // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
                                        ReleaseMutex(hListAccMutex);\r
                                        // FTPS対応\r
-//                                     iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+//                                     iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                        if(IsSSLAttached(Pkt->ctrl_skt))\r
                                        {\r
-                                               if(AttachSSL(data_socket, Pkt->ctrl_skt, CancelCheckWork))\r
-                                                       iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+                                               if(AttachSSL(data_socket, Pkt->ctrl_skt, CancelCheckWork, FALSE))\r
+                                                       iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                                else\r
                                                        iRetCode = 500;\r
                                        }\r
                                        else\r
-                                               iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+                                               iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
 //                                     data_socket = DoClose(data_socket);\r
                                }\r
                        }\r
@@ -1457,12 +1558,29 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
                        {\r
                                SetErrorMsg(Reply);\r
                                SetTaskMsg(MSGJPN090);\r
+                               // UPnP対応\r
+                               if(IsUPnPLoaded() == YES)\r
+                               {\r
+                                       if(GetAsyncTableDataMapPort(listen_socket, &Port) == YES)\r
+                                               RemovePortMapping(Port);\r
+                               }\r
                                listen_socket = DoClose(listen_socket);\r
                                iRetCode = 500;\r
                        }\r
                }\r
                else\r
+               // バグ修正\r
+//                     iRetCode = 500;\r
+               {\r
+                       // UPnP対応\r
+                       if(IsUPnPLoaded() == YES)\r
+                       {\r
+                               if(GetAsyncTableDataMapPort(listen_socket, &Port) == YES)\r
+                                       RemovePortMapping(Port);\r
+                       }\r
+                       listen_socket = DoClose(listen_socket);\r
                        iRetCode = 500;\r
+               }\r
        }\r
        else\r
        {\r
@@ -1485,11 +1603,13 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 *              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)\r
+static int DownloadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)\r
 {\r
        int iRetCode;\r
        SOCKET data_socket = INVALID_SOCKET;   // data channel socket\r
-       char Buf[1024];\r
+       // 念のため\r
+//     char Buf[1024];\r
+       char Buf[FMAX_PATH+1024];\r
        int CreateMode;\r
        // IPv6対応\r
 //     char Adrs[20];\r
@@ -1531,16 +1651,16 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
                                                // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
                                                ReleaseMutex(hListAccMutex);\r
                                                // FTPS対応\r
-//                                             iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+//                                             iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                                if(IsSSLAttached(Pkt->ctrl_skt))\r
                                                {\r
-                                                       if(AttachSSL(data_socket, Pkt->ctrl_skt, CancelCheckWork))\r
-                                                               iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+                                                       if(AttachSSL(data_socket, Pkt->ctrl_skt, CancelCheckWork, FALSE))\r
+                                                               iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                                        else\r
                                                                iRetCode = 500;\r
                                                }\r
                                                else\r
-                                                       iRetCode = DownLoadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
+                                                       iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
 //                                             data_socket = DoClose(data_socket);\r
                                        }\r
                                        else\r
@@ -1590,7 +1710,7 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 *                      ダイアログを出さない場合、このルーチンからDispDownloadSize()を呼ぶ\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *CancelCheckWork)\r
+static int DownloadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *CancelCheckWork)\r
 {\r
        int iNumBytes;\r
        char Buf[BUFSIZE];\r
@@ -2211,11 +2331,12 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc
                }\r
 \r
                /* ファイルのタイムスタンプを合わせる */\r
-               if((SaveTimeStamp == YES) &&\r
-                  ((Pkt->Time.dwLowDateTime != 0) || (Pkt->Time.dwHighDateTime != 0)))\r
-               {\r
-                       SetFileTime(iFileHandle, &Pkt->Time, &Pkt->Time, &Pkt->Time);\r
-               }\r
+               // ミラーリング設定追加\r
+//             if((SaveTimeStamp == YES) &&\r
+//                ((Pkt->Time.dwLowDateTime != 0) || (Pkt->Time.dwHighDateTime != 0)))\r
+//             {\r
+//                     SetFileTime(iFileHandle, &Pkt->Time, &Pkt->Time, &Pkt->Time);\r
+//             }\r
 \r
                CloseHandle(iFileHandle);\r
 \r
@@ -2233,6 +2354,8 @@ static int DownLoadFile(TRANSPACKET *Pkt, SOCKET dSkt, int CreateMode, int *Canc
        if(shutdown(dSkt, 1) != 0)\r
                ReportWSError("shutdown", WSAGetLastError());\r
 \r
+       // 自動切断対策\r
+       LastDataConnectionTime = time(NULL);\r
        DoClose(dSkt);\r
 \r
        if(ForceAbort == NO)\r
@@ -2281,6 +2404,8 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
 {\r
        char Fname[FMAX_PATH+1];\r
 \r
+       // 同時接続対応\r
+       ReleaseMutex(hListAccMutex);\r
        if(ForceAbort == NO)\r
        {\r
                if((iRetCode/100) >= FTP_CONTINUE)\r
@@ -2300,7 +2425,9 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                return;\r
 #endif\r
 \r
-                       if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0))\r
+                       // MLSD対応\r
+//                     if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0))\r
+                       if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0) || (strncmp(Pkt->Cmd, "MLSD", 4) == 0))\r
                        {\r
                                SetTaskMsg(MSGJPN097);\r
                                strcpy(Fname, MSGJPN098);\r
@@ -2324,6 +2451,8 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                {\r
                                        if(strncmp(Pkt->Cmd, "RETR", 4) == 0 || strncmp(Pkt->Cmd, "STOR", 4) == 0)\r
                                        {\r
+                                               // タスクバー進捗表示\r
+                                               TransferErrorDisplay++;\r
                                                if(TransferErrorNotify == YES && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Pkt) == NO)\r
                                                        ClearAll = YES;\r
                                                else\r
@@ -2331,13 +2460,17 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                                        Pkt->Mode = TransferErrorMode;\r
                                                        AddTransFileList(Pkt);\r
                                                }\r
+                                               // タスクバー進捗表示\r
+                                               TransferErrorDisplay--;\r
                                        }\r
                                }\r
                        }\r
                }\r
                else\r
                {\r
-                       if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0))\r
+                       // MLSD対応\r
+//                     if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0))\r
+                       if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0) || (strncmp(Pkt->Cmd, "MLSD", 4) == 0))\r
                                SetTaskMsg(MSGJPN101, Pkt->ExistSize);\r
                        // 同時接続対応\r
 //                     else if((Pkt->hWndTrans != NULL) && (TimeStart != 0))\r
@@ -2551,7 +2684,7 @@ static INT_PTR CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam,
 *              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)\r
+static int DoUpload(SOCKET cSkt, TRANSPACKET *Pkt)\r
 {\r
        int iRetCode;\r
        char Reply[ERR_MSG_LEN+7];\r
@@ -2576,18 +2709,12 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                                if(Pkt->hWndTrans != NULL)\r
                                        DispTransFileInfo(Pkt, MSGJPN104, TRUE, YES);\r
 \r
-                               // SFTP対応\r
-//                             if(BackgrndMessageProc() == NO)\r
-                               if(IsSFTPAttached(Pkt->ctrl_skt))\r
-                               {\r
-                                       // TODO:\r
-                               }\r
-                               else if(BackgrndMessageProc() == NO)\r
+                               if(BackgrndMessageProc() == NO)\r
                                {\r
                                        if(AskPasvMode() != YES)\r
-                                               iRetCode = UpLoadNonPassive(Pkt);\r
+                                               iRetCode = UploadNonPassive(Pkt);\r
                                        else\r
-                                               iRetCode = UpLoadPassive(Pkt);\r
+                                               iRetCode = UploadPassive(Pkt);\r
                                }\r
                                else\r
                                        iRetCode = 500;\r
@@ -2610,6 +2737,8 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                        // エラーによってはダイアログが表示されない場合があるバグ対策\r
 //                     DispUploadFinishMsg(Pkt, iRetCode);\r
                }\r
+               // エラーによってはダイアログが表示されない場合があるバグ対策\r
+               DispUploadFinishMsg(Pkt, iRetCode);\r
        }\r
        else\r
        {\r
@@ -2617,8 +2746,6 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
                SetTaskMsg(MSGJPN107, Pkt->LocalFile);\r
                iRetCode = 200;\r
        }\r
-       // エラーによってはダイアログが表示されない場合があるバグ対策\r
-       DispUploadFinishMsg(Pkt, iRetCode);\r
        return(iRetCode);\r
 }\r
 \r
@@ -2632,17 +2759,21 @@ static int DoUpLoad(SOCKET cSkt, TRANSPACKET *Pkt)
 *              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int UpLoadNonPassive(TRANSPACKET *Pkt)\r
+static int UploadNonPassive(TRANSPACKET *Pkt)\r
 {\r
        int iRetCode;\r
        int iLength;\r
        SOCKET data_socket = INVALID_SOCKET;   // data channel socket\r
        SOCKET listen_socket = INVALID_SOCKET; // data listen socket\r
-       char Buf[1024];\r
+       // 念のため\r
+//     char Buf[1024];\r
+       char Buf[FMAX_PATH+1024];\r
        // IPv6対応\r
 //     struct sockaddr_in saSockAddr1;\r
        struct sockaddr_in saSockAddrIPv4;\r
        struct sockaddr_in6 saSockAddrIPv6;\r
+       // UPnP対応\r
+       int Port;\r
        int Resume;\r
        char Reply[ERR_MSG_LEN+7];\r
 \r
@@ -2671,6 +2802,10 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
                iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s", Buf);\r
                if((iRetCode/100) == FTP_PRELIM)\r
                {\r
+                       // STOUの応答を処理\r
+                       // 応答の形式に規格が無くファイル名を取得できないため属性変更を無効化\r
+                       if(Pkt->Mode == EXIST_UNIQUE)\r
+                               Pkt->Attr = -1;\r
                        // 同時接続対応\r
 //                     if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL)\r
                        if(SocksGet2ndBindReply(listen_socket, &data_socket, &Canceled[Pkt->ThreadCount]) == FFFTP_FAIL)\r
@@ -2692,6 +2827,12 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
 \r
                                if(shutdown(listen_socket, 1) != 0)\r
                                        ReportWSError("shutdown listen", WSAGetLastError());\r
+                               // UPnP対応\r
+                               if(IsUPnPLoaded() == YES)\r
+                               {\r
+                                       if(GetAsyncTableDataMapPort(listen_socket, &Port) == YES)\r
+                                               RemovePortMapping(Port);\r
+                               }\r
                                listen_socket = DoClose(listen_socket);\r
 \r
                                if(data_socket == INVALID_SOCKET)\r
@@ -2721,16 +2862,16 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
                                // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
                                ReleaseMutex(hListAccMutex);\r
                                // FTPS対応\r
-//                             iRetCode = UpLoadFile(Pkt, data_socket);\r
+//                             iRetCode = UploadFile(Pkt, data_socket);\r
                                if(IsSSLAttached(Pkt->ctrl_skt))\r
                                {\r
-                                       if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount]))\r
-                                               iRetCode = UpLoadFile(Pkt, data_socket);\r
+                                       if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount], FALSE))\r
+                                               iRetCode = UploadFile(Pkt, data_socket);\r
                                        else\r
                                                iRetCode = 500;\r
                                }\r
                                else\r
-                                       iRetCode = UpLoadFile(Pkt, data_socket);\r
+                                       iRetCode = UploadFile(Pkt, data_socket);\r
                                data_socket = DoClose(data_socket);\r
                        }\r
                }\r
@@ -2738,6 +2879,12 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
                {\r
                        SetErrorMsg(Reply);\r
                        SetTaskMsg(MSGJPN108);\r
+                       // UPnP対応\r
+                       if(IsUPnPLoaded() == YES)\r
+                       {\r
+                               if(GetAsyncTableDataMapPort(listen_socket, &Port) == YES)\r
+                                       RemovePortMapping(Port);\r
+                       }\r
                        listen_socket = DoClose(listen_socket);\r
                        iRetCode = 500;\r
                }\r
@@ -2763,11 +2910,13 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
 *              int 応答コード\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int UpLoadPassive(TRANSPACKET *Pkt)\r
+static int UploadPassive(TRANSPACKET *Pkt)\r
 {\r
        int iRetCode;\r
        SOCKET data_socket = INVALID_SOCKET;   // data channel socket\r
-       char Buf[1024];\r
+       // 念のため\r
+//     char Buf[1024];\r
+       char Buf[FMAX_PATH+1024];\r
        // IPv6対応\r
 //     char Adrs[20];\r
        char Adrs[40];\r
@@ -2825,19 +2974,23 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
                                iRetCode = command(Pkt->ctrl_skt, Reply, &Canceled[Pkt->ThreadCount], "%s", Buf);\r
                                if(iRetCode/100 == FTP_PRELIM)\r
                                {\r
+                                       // STOUの応答を処理\r
+                                       // 応答の形式に規格が無くファイル名を取得できないため属性変更を無効化\r
+                                       if(Pkt->Mode == EXIST_UNIQUE)\r
+                                               Pkt->Attr = -1;\r
                                        // 一部TYPE、STOR(RETR)、PORT(PASV)を並列に処理できないホストがあるため\r
                                        ReleaseMutex(hListAccMutex);\r
                                        // FTPS対応\r
-//                                     iRetCode = UpLoadFile(Pkt, data_socket);\r
+//                                     iRetCode = UploadFile(Pkt, data_socket);\r
                                        if(IsSSLAttached(Pkt->ctrl_skt))\r
                                        {\r
-                                               if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount]))\r
-                                                       iRetCode = UpLoadFile(Pkt, data_socket);\r
+                                               if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount], FALSE))\r
+                                                       iRetCode = UploadFile(Pkt, data_socket);\r
                                                else\r
                                                        iRetCode = 500;\r
                                        }\r
                                        else\r
-                                               iRetCode = UpLoadFile(Pkt, data_socket);\r
+                                               iRetCode = UploadFile(Pkt, data_socket);\r
 \r
                                        data_socket = DoClose(data_socket);\r
                                }\r
@@ -2886,7 +3039,7 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
 *              転送ダイアログを出さないでアップロードすることはない\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)\r
+static int UploadFile(TRANSPACKET *Pkt, SOCKET dSkt)\r
 {\r
        DWORD iNumBytes;\r
        HANDLE iFileHandle;\r
@@ -3490,6 +3643,8 @@ static int UpLoadFile(TRANSPACKET *Pkt, SOCKET dSkt)
                Pkt->Abort = ABORT_ERROR;\r
        }\r
 \r
+       // 自動切断対策\r
+       LastDataConnectionTime = time(NULL);\r
        if(shutdown(dSkt, 1) != 0)\r
                ReportWSError("shutdown", WSAGetLastError());\r
 \r
@@ -3579,6 +3734,8 @@ static int TermCodeConvAndSend(TERMCODECONVINFO *tInfo, SOCKET Skt, char *Data,
 \r
 static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode)\r
 {\r
+       // 同時接続対応\r
+       ReleaseMutex(hListAccMutex);\r
        if(ForceAbort == NO)\r
        {\r
                if((iRetCode/100) >= FTP_CONTINUE)\r
@@ -3602,6 +3759,8 @@ static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                {\r
                                        if(strncmp(Pkt->Cmd, "RETR", 4) == 0 || strncmp(Pkt->Cmd, "STOR", 4) == 0)\r
                                        {\r
+                                               // タスクバー進捗表示\r
+                                               TransferErrorDisplay++;\r
                                                if(TransferErrorNotify == YES && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt) == NO)\r
                                                        ClearAll = YES;\r
                                                else\r
@@ -3609,6 +3768,8 @@ static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                                        Pkt->Mode = TransferErrorMode;\r
                                                        AddTransFileList(Pkt);\r
                                                }\r
+                                               // タスクバー進捗表示\r
+                                               TransferErrorDisplay--;\r
                                        }\r
                                }\r
                        }\r
@@ -3738,8 +3899,6 @@ static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM
 //                             if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA)))\r
                                if(!(Pkt = (TRANSPACKET*)GetWindowLongPtr(hDlg, GWLP_USERDATA)))\r
                                        break;\r
-                               if(Canceled[Pkt->ThreadCount] == YES)\r
-                                       Pkt->Abort = ABORT_USER;\r
                                DispTransferStatus(hDlg, NO, Pkt);\r
                                SetTimer(hDlg, TIMER_DISPLAY, DISPLAY_TIMING, NULL);\r
                        }\r
@@ -4023,7 +4182,7 @@ static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int
        char *Pos;\r
        char *Btm;\r
        int Sts;\r
-       int i;\r
+//     int i;\r
        struct sockaddr_in6 SockAddr;\r
 \r
        Sts = FFFTP_FAIL;\r
@@ -4052,8 +4211,9 @@ static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int
                                                }\r
                                                else\r
                                                {\r
-                                                       i = sizeof(SockAddr);\r
-                                                       if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR)\r
+//                                                     i = sizeof(SockAddr);\r
+//                                                     if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR)\r
+                                                       if(GetAsyncTableDataIPv6(Skt, &SockAddr, NULL) == YES)\r
                                                                AddressToStringIPv6(Adrs, &SockAddr.sin6_addr);\r
                                                }\r
 \r
@@ -4304,3 +4464,20 @@ static char* GetErrMsg()
        ReleaseMutex(hErrMsgMutex);\r
        return r;\r
 }\r
+\r
+// タスクバー進捗表示\r
+LONGLONG AskTransferSizeLeft(void)\r
+{\r
+       return(TransferSizeLeft);\r
+}\r
+\r
+LONGLONG AskTransferSizeTotal(void)\r
+{\r
+       return(TransferSizeTotal);\r
+}\r
+\r
+int AskTransferErrorDisplay(void)\r
+{\r
+       return(TransferErrorDisplay);\r
+}\r
+\r