OSDN Git Service

Modify copyrights.
[ffftp/ffftp.git] / getput.c
index 5cf007a..f2eea10 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -84,6 +84,8 @@ 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
+// ミラーリング設定追加\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
@@ -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
@@ -184,6 +190,8 @@ extern int FolderAttr;
 extern int FolderAttrNum;\r
 // 同時接続対応\r
 extern int SendQuit;\r
+// 自動切断対策\r
+extern time_t LastDataConnectionTime;\r
 \r
 \r
 /*----- ファイル転送スレッドを起動する ----------------------------------------\r
@@ -417,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
@@ -436,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
@@ -483,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
@@ -579,6 +602,9 @@ 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
@@ -701,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
@@ -713,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
@@ -756,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
@@ -807,6 +850,7 @@ 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
@@ -888,8 +932,20 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                                             {\r
 //                                                     if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
 //                                                             DoDownload(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled);\r
-                                                               DoDownload(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]);\r
-//                                             }\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
@@ -910,8 +966,13 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                                     {\r
 //                                             if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
 //                                                     DoUpload(AskTrnCtrlSkt(), TransPacketBase);\r
-                                                       DoUpload(TrnSkt, Pos);\r
-//                                     }\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
@@ -1159,6 +1220,13 @@ static ULONG WINAPI TransferThread(void *Dummy)
 //                                             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
@@ -1294,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
@@ -1342,13 +1425,7 @@ 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
@@ -1396,6 +1473,8 @@ static int DownloadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 //     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
@@ -1427,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
@@ -1459,7 +1544,7 @@ static int DownloadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 //                                     iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                        if(IsSSLAttached(Pkt->ctrl_skt))\r
                                        {\r
-                                               if(AttachSSL(data_socket, Pkt->ctrl_skt, 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
@@ -1473,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
@@ -1552,7 +1654,7 @@ static int DownloadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 //                                             iRetCode = DownloadFile(Pkt, data_socket, CreateMode, CancelCheckWork);\r
                                                if(IsSSLAttached(Pkt->ctrl_skt))\r
                                                {\r
-                                                       if(AttachSSL(data_socket, Pkt->ctrl_skt, 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
@@ -2229,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
@@ -2251,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
@@ -2346,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
@@ -2353,6 +2460,8 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                                        Pkt->Mode = TransferErrorMode;\r
                                                        AddTransFileList(Pkt);\r
                                                }\r
+                                               // タスクバー進捗表示\r
+                                               TransferErrorDisplay--;\r
                                        }\r
                                }\r
                        }\r
@@ -2600,13 +2709,7 @@ 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
@@ -2669,6 +2772,8 @@ static int UploadNonPassive(TRANSPACKET *Pkt)
 //     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
@@ -2722,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
@@ -2754,7 +2865,7 @@ static int UploadNonPassive(TRANSPACKET *Pkt)
 //                             iRetCode = UploadFile(Pkt, data_socket);\r
                                if(IsSSLAttached(Pkt->ctrl_skt))\r
                                {\r
-                                       if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount]))\r
+                                       if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount], FALSE))\r
                                                iRetCode = UploadFile(Pkt, data_socket);\r
                                        else\r
                                                iRetCode = 500;\r
@@ -2768,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
@@ -2867,7 +2984,7 @@ static int UploadPassive(TRANSPACKET *Pkt)
 //                                     iRetCode = UploadFile(Pkt, data_socket);\r
                                        if(IsSSLAttached(Pkt->ctrl_skt))\r
                                        {\r
-                                               if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount]))\r
+                                               if(AttachSSL(data_socket, Pkt->ctrl_skt, &Canceled[Pkt->ThreadCount], FALSE))\r
                                                        iRetCode = UploadFile(Pkt, data_socket);\r
                                                else\r
                                                        iRetCode = 500;\r
@@ -3526,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
@@ -3640,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
@@ -3647,6 +3768,8 @@ static void DispUploadFinishMsg(TRANSPACKET *Pkt, int iRetCode)
                                                        Pkt->Mode = TransferErrorMode;\r
                                                        AddTransFileList(Pkt);\r
                                                }\r
+                                               // タスクバー進捗表示\r
+                                               TransferErrorDisplay--;\r
                                        }\r
                                }\r
                        }\r
@@ -4341,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