// 再転送対応\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
extern int FolderAttrNum;\r
// 同時接続対応\r
extern int SendQuit;\r
+// 自動切断対策\r
+extern time_t LastDataConnectionTime;\r
\r
\r
/*----- ファイル転送スレッドを起動する ----------------------------------------\r
(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
}\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
(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
// 同時接続対応\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
RECT WndRect;\r
int i;\r
DWORD LastUsed;\r
+ int LastError;\r
+ int Sts;\r
\r
hWndTrans = NULL;\r
Down = NO;\r
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
}\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
}\r
}\r
CmdSkt = NewCmdSkt;\r
+ LastError = NO;\r
// if(TransPacketBase != NULL)\r
if(TrnSkt != INVALID_SOCKET && NextTransPacketBase != NULL)\r
{\r
// {\r
// if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
// DoDownload(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled);\r
- DoDownload(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]);\r
+ Sts = DoDownload(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]) / 100;\r
+ if(Sts != FTP_COMPLETE)\r
+ LastError = YES;\r
// }\r
}\r
}\r
// {\r
// if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
// DoUpload(AskTrnCtrlSkt(), TransPacketBase);\r
- DoUpload(TrnSkt, Pos);\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
// 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
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
// 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
\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
// 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
{\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
// 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
if(shutdown(dSkt, 1) != 0)\r
ReportWSError("shutdown", WSAGetLastError());\r
\r
+ // 自動切断対策\r
+ LastDataConnectionTime = time(NULL);\r
DoClose(dSkt);\r
\r
if(ForceAbort == NO)\r
{\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
Pkt->Mode = TransferErrorMode;\r
AddTransFileList(Pkt);\r
}\r
+ // タスクバー進捗表示\r
+ TransferErrorDisplay--;\r
}\r
}\r
}\r
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
// 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
\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
// 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
{\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
// 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
Pkt->Abort = ABORT_ERROR;\r
}\r
\r
+ // 自動切断対策\r
+ LastDataConnectionTime = time(NULL);\r
if(shutdown(dSkt, 1) != 0)\r
ReportWSError("shutdown", WSAGetLastError());\r
\r
{\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
Pkt->Mode = TransferErrorMode;\r
AddTransFileList(Pkt);\r
}\r
+ // タスクバー進捗表示\r
+ TransferErrorDisplay--;\r
}\r
}\r
}\r
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
}\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
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