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
+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
-static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname);\r
-static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+// 再転送対応\r
+//static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname);\r
+static int DispUpDownErrDialog(int ResID, HWND hWnd, TRANSPACKET *Pkt);\r
+// 64ビット対応\r
+//static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
static int SetDownloadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *Mode, int *CancelCheckWork);\r
-static BOOL 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
+// 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
// 同時接続対応\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
static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max);\r
static int IsSpecialDevice(char *Fname);\r
static int MirrorDelNotify(int Cur, int Notify, TRANSPACKET *Pkt);\r
-static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
static void SetErrorMsg(char *fmt, ...);\r
// 同時接続対応\r
static char* GetErrMsg();\r
\r
// 同時接続対応\r
static int WaitForMainThread = NO;\r
+// 再転送対応\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 MirDownDelNotify;\r
extern int FolderAttr;\r
extern int FolderAttrNum;\r
+// 同時接続対応\r
+extern int SendQuit;\r
+// 自動切断対策\r
+extern time_t LastDataConnectionTime;\r
\r
\r
/*----- ファイル転送スレッドを起動する ----------------------------------------\r
\r
void AddTransFileList(TRANSPACKET *Pkt)\r
{\r
+ // 同時接続対応\r
+ TRANSPACKET *Pos;\r
+\r
DispTransPacket(Pkt);\r
\r
// 同時接続対応\r
Sleep(1);\r
}\r
\r
+ // 同時接続対応\r
+ Pos = TransPacketBase;\r
+ if(Pos != NULL)\r
+ {\r
+ while(Pos->Next != NULL)\r
+ Pos = Pos->Next;\r
+ }\r
if(AddTmpTransFileList(Pkt, &TransPacketBase) == FFFTP_SUCCESS)\r
{\r
if((strncmp(Pkt->Cmd, "RETR", 4) == 0) ||\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
if(NextTransPacketBase == NULL)\r
- NextTransPacketBase = TransPacketBase;\r
+ {\r
+ if(Pos)\r
+ NextTransPacketBase = Pos->Next;\r
+ else\r
+ NextTransPacketBase = TransPacketBase;\r
+ }\r
ReleaseMutex(hListAccMutex);\r
// 同時接続対応\r
WaitForMainThread = NO;\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
}\r
// 同時接続対応\r
if(NextTransPacketBase == NULL)\r
- NextTransPacketBase = TransPacketBase;\r
+ NextTransPacketBase = Pkt;\r
\r
while(Pkt != NULL)\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
Pkt = Pkt->Next;\r
TRANSPACKET *New;\r
TRANSPACKET *Next;\r
TRANSPACKET *NotDel;\r
- TRANSPACKET Pkt;\r
+// TRANSPACKET Pkt;\r
\r
NotDel = NULL;\r
\r
}\r
TransPacketBase = NotDel;\r
// 同時接続対応\r
- NextTransPacketBase = TransPacketBase;\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
SOCKET TrnSkt;\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
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
}\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
if(TrnSkt == INVALID_SOCKET || NewCmdSkt != CmdSkt)\r
- {\r
- ReleaseMutex(hListAccMutex);\r
ReConnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
+ else\r
+ CheckClosedAndReconnectTrnSkt(&TrnSkt, &Canceled[ThreadCount]);\r
+ // 同時ログイン数制限対策\r
+ if(TrnSkt == INVALID_SOCKET)\r
+ {\r
// 同時ログイン数制限に引っかかった可能性あり\r
- // 負荷を下げるためにしばらく待機\r
- if(TrnSkt == INVALID_SOCKET)\r
- {\r
- i = 10000;\r
- while(NewCmdSkt != CmdSkt && i > 0)\r
- {\r
- BackgrndMessageProc();\r
- Sleep(1);\r
- i--;\r
- }\r
- }\r
-// WaitForSingleObject(hListAccMutex, INFINITE);\r
- while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+ // 負荷を下げるために約10秒間待機\r
+ i = 10000;\r
+ while(NewCmdSkt != CmdSkt && i > 0)\r
{\r
BackgrndMessageProc();\r
Sleep(1);\r
+ i--;\r
}\r
}\r
+ LastUsed = timeGetTime();\r
+// WaitForSingleObject(hListAccMutex, INFINITE);\r
+ while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+ {\r
+ BackgrndMessageProc();\r
+ Sleep(1);\r
+ }\r
}\r
else\r
{\r
if(TrnSkt != INVALID_SOCKET)\r
{\r
- ReleaseMutex(hListAccMutex);\r
- SendData(TrnSkt, "QUIT\r\n", 6, 0, &Canceled[ThreadCount]);\r
- DoClose(TrnSkt);\r
- TrnSkt = INVALID_SOCKET;\r
-// WaitForSingleObject(hListAccMutex, INFINITE);\r
- while(WaitForSingleObject(hListAccMutex, 0) == WAIT_TIMEOUT)\r
+ // 同時ログイン数制限対策\r
+ // 60秒間使用されなければログアウト\r
+ if(timeGetTime() - LastUsed > 60000 || NewCmdSkt == INVALID_SOCKET)\r
{\r
- BackgrndMessageProc();\r
- Sleep(1);\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
}\r
}\r
}\r
CmdSkt = NewCmdSkt;\r
+ LastError = NO;\r
// if(TransPacketBase != NULL)\r
if(TrnSkt != INVALID_SOCKET && NextTransPacketBase != NULL)\r
{\r
// 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
// 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
}\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
+// DoDownload(AskTrnCtrlSkt(), TransPacketBase, NO, &Canceled);\r
+ Sts = DoDownload(TrnSkt, Pos, NO, &Canceled[Pos->ThreadCount]) / 100;\r
+ if(Sts != FTP_COMPLETE)\r
+ LastError = YES;\r
// }\r
}\r
}\r
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
+// DoUpload(AskTrnCtrlSkt(), TransPacketBase);\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
}\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
{\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
SendMessage(hWndTrans, WM_SET_PACKET, 0, 0);\r
if(Pos != NULL)\r
strcpy(Pos->Cmd, "");\r
+ LastUsed = timeGetTime();\r
}\r
// 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
// 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
+ TransferErrorMode = AskTransferErrorMode();\r
+ TransferErrorNotify = AskTransferErrorNotify();\r
}\r
else\r
{\r
* からも呼ばれる。メインのスレッドから呼ばれる時は 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
{\r
iRetCode = 500;\r
SetTaskMsg(MSGJPN085, GetFileName(Pkt->LocalFile));\r
- DispDownloadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispDownloadFinishMsg(Pkt, iRetCode);\r
}\r
else if(Pkt->Mode != EXIST_IGNORE)\r
{\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
* 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
\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
// 一部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
{\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 = 500;\r
SetErrorMsg(MSGJPN279);\r
}\r
- DispDownloadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispDownloadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
* 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
// 一部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
else\r
SetErrorMsg(Buf);\r
\r
- DispDownloadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispDownloadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
* ダイアログを出さない場合、このルーチンから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
// Continue = ConvJIStoSJIS(&cInfo);\r
// else\r
// Continue = ConvEUCtoSJIS(&cInfo);\r
- char Buf3[(BUFSIZE + 3) * 4];\r
- CODECONVINFO cInfo2;\r
switch(Pkt->KanjiCode)\r
{\r
case KANJI_SJIS:\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
SetErrorMsg(MSGJPN096);\r
SetTaskMsg(MSGJPN096);\r
}\r
- if(iRetCode >= FTP_RETRY)\r
+ // バグ修正\r
+// if(iRetCode >= FTP_RETRY)\r
+ if((iRetCode/100) >= FTP_RETRY)\r
SetErrorMsg(Buf);\r
if(Pkt->Abort != ABORT_NONE)\r
iRetCode = 500;\r
{\r
char Fname[FMAX_PATH+1];\r
\r
+ // 同時接続対応\r
+ ReleaseMutex(hListAccMutex);\r
if(ForceAbort == NO)\r
{\r
if((iRetCode/100) >= FTP_CONTINUE)\r
if (AskHostType() == HTYPE_VMS)\r
return;\r
#endif\r
+#if defined(HAVE_TANDEM)\r
+ /* HP Nonstop Server の場合、ファイルのない subvol へ移動すると550 File not found\r
+ * になるが問題ないのでエラーダイアログやエラーメッセージを出さないため */\r
+ if (AskHostType() == HTYPE_TANDEM)\r
+ 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
{\r
// 全て中止を選択後にダイアログが表示されるバグ対策\r
// if(DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO)\r
- if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO)\r
- ClearAll = YES;\r
+ // 再転送対応\r
+// if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(downerr_dlg, Pkt->hWndTrans, Fname) == NO)\r
+// ClearAll = YES;\r
+ if(Canceled[Pkt->ThreadCount] == NO && ClearAll == 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
+ {\r
+ 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
* int ステータス (YES=中止/NO=全て中止)\r
*----------------------------------------------------------------------------*/\r
\r
-static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname)\r
+// 再転送対応\r
+//static int DispUpDownErrDialog(int ResID, HWND hWnd, char *Fname)\r
+static int DispUpDownErrDialog(int ResID, HWND hWnd, TRANSPACKET *Pkt)\r
{\r
if(hWnd == NULL)\r
hWnd = GetMainHwnd();\r
\r
SoundPlay(SND_ERROR);\r
- return(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ResID), hWnd, UpDownErrorDialogProc, (LPARAM)Fname));\r
+ // 再転送対応\r
+// return(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ResID), hWnd, UpDownErrorDialogProc, (LPARAM)Fname));\r
+ return(DialogBoxParam(GetFtpInst(), MAKEINTRESOURCE(ResID), hWnd, UpDownErrorDialogProc, (LPARAM)Pkt));\r
}\r
\r
\r
* BOOL TRUE/FALSE\r
*----------------------------------------------------------------------------*/\r
\r
-static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK UpDownErrorDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
+ static TRANSPACKET *Pkt;\r
+ static const RADIOBUTTON DownExistButton[] = {\r
+ { DOWN_EXIST_OVW, EXIST_OVW },\r
+ { DOWN_EXIST_RESUME, EXIST_RESUME },\r
+ { DOWN_EXIST_IGNORE, EXIST_IGNORE }\r
+ };\r
+ #define DOWNEXISTBUTTONS (sizeof(DownExistButton)/sizeof(RADIOBUTTON))\r
+\r
switch (message)\r
{\r
case WM_INITDIALOG :\r
- SendDlgItemMessage(hDlg, UPDOWN_ERR_FNAME, WM_SETTEXT, 0, (LPARAM)lParam);\r
+ Pkt = (TRANSPACKET *)lParam;\r
+// SendDlgItemMessage(hDlg, UPDOWN_ERR_FNAME, WM_SETTEXT, 0, (LPARAM)lParam);\r
+ SendDlgItemMessage(hDlg, UPDOWN_ERR_FNAME, WM_SETTEXT, 0, (LPARAM)Pkt->RemoteFile);\r
// 同時接続対応\r
// SendDlgItemMessage(hDlg, UPDOWN_ERR_MSG, WM_SETTEXT, 0, (LPARAM)ErrMsg);\r
SendDlgItemMessage(hDlg, UPDOWN_ERR_MSG, WM_SETTEXT, 0, (LPARAM)GetErrMsg());\r
+\r
+ if((Pkt->Type == TYPE_A) || (Pkt->ExistSize <= 0))\r
+ EnableWindow(GetDlgItem(hDlg, DOWN_EXIST_RESUME), FALSE);\r
+\r
+ SetRadioButtonByValue(hDlg, TransferErrorMode, DownExistButton, DOWNEXISTBUTTONS);\r
return(TRUE);\r
\r
case WM_COMMAND :\r
switch(GET_WM_COMMAND_ID(wParam, lParam))\r
{\r
+ case IDOK_ALL :\r
+ TransferErrorNotify = NO;\r
+ /* ここに break はない */\r
+\r
case IDOK :\r
+ TransferErrorMode = AskRadioButtonValue(hDlg, DownExistButton, DOWNEXISTBUTTONS);\r
EndDialog(hDlg, YES);\r
break;\r
\r
case IDCANCEL :\r
EndDialog(hDlg, NO);\r
break;\r
+\r
+ case IDHELP :\r
+// hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000009);\r
+ break;\r
}\r
- return(TRUE);\r
+ return(TRUE);\r
}\r
- return(FALSE);\r
+ return(FALSE);\r
}\r
\r
\r
* BOOL TRUE/FALSE\r
*----------------------------------------------------------------------------*/\r
\r
-static BOOL CALLBACK NoResumeWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 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
{\r
switch (iMessage)\r
{\r
* 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
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
SetTaskMsg(MSGJPN105, Pkt->LocalFile);\r
iRetCode = 500;\r
Pkt->Abort = ABORT_ERROR;\r
- DispUploadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispUploadFinishMsg(Pkt, iRetCode);\r
}\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+ DispUploadFinishMsg(Pkt, iRetCode);\r
}\r
else\r
{\r
* 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
{\r
SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume);\r
if(Resume == NO)\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) {\r
+ if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) {\r
+ // EXTENTがデフォルトのときはコードのみ\r
+ sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode);\r
+ } else {\r
+ sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt);\r
+ }\r
+ } else\r
+#endif\r
sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile);\r
else\r
sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);\r
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
\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
// 一部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
{\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
SetErrorMsg(MSGJPN279);\r
iRetCode = 500;\r
}\r
- DispUploadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispUploadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
* 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
\r
SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume);\r
if(Resume == NO)\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) {\r
+ if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) {\r
+ // EXTENTがデフォルトのときはコードのみ\r
+ sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode);\r
+ } else {\r
+ sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt);\r
+ }\r
+ } else\r
+#endif\r
sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile);\r
else\r
sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile);\r
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
else\r
SetErrorMsg(Buf);\r
\r
- DispUploadFinishMsg(Pkt, iRetCode);\r
+ // エラーによってはダイアログが表示されない場合があるバグ対策\r
+// DispUploadFinishMsg(Pkt, iRetCode);\r
\r
return(iRetCode);\r
}\r
* 転送ダイアログを出さないでアップロードすることはない\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
Pkt->Abort = ABORT_ERROR;\r
}\r
\r
+ // 自動切断対策\r
+ LastDataConnectionTime = time(NULL);\r
if(shutdown(dSkt, 1) != 0)\r
ReportWSError("shutdown", WSAGetLastError());\r
\r
//#pragma aaa\r
//DoPrintf("##UP REPLY : %s", Buf);\r
\r
- if(iRetCode >= FTP_RETRY)\r
+ // バグ修正\r
+// if(iRetCode >= FTP_RETRY)\r
+ if((iRetCode/100) >= FTP_RETRY)\r
SetErrorMsg(Buf);\r
\r
if(Pkt->Abort != ABORT_NONE)\r
\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
{\r
// 全て中止を選択後にダイアログが表示されるバグ対策\r
// if(DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO)\r
- if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO)\r
- ClearAll = YES;\r
+ // 再転送対応\r
+// if(Canceled[Pkt->ThreadCount] == NO && ClearAll == NO && DispUpDownErrDialog(uperr_dlg, Pkt->hWndTrans, Pkt->LocalFile) == NO)\r
+// ClearAll = YES;\r
+ if(Canceled[Pkt->ThreadCount] == NO && ClearAll == 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(uperr_dlg, Pkt->hWndTrans, Pkt) == NO)\r
+ ClearAll = YES;\r
+ else\r
+ {\r
+ Pkt->Mode = TransferErrorMode;\r
+ AddTransFileList(Pkt);\r
+ }\r
+ // タスクバー進捗表示\r
+ TransferErrorDisplay--;\r
+ }\r
+ }\r
}\r
}\r
else\r
/* ここに break はない */\r
\r
case IDCANCEL :\r
- if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA)))\r
+ // 64ビット対応\r
+// if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA)))\r
+ if(!(Pkt = (TRANSPACKET*)GetWindowLongPtr(hDlg, GWLP_USERDATA)))\r
break;\r
Pkt->Abort = ABORT_USER;\r
// Canceled = YES;\r
SetForegroundWindow(hDlg);\r
MoveToForeground = NO;\r
KillTimer(hDlg, TIMER_DISPLAY);\r
- if(!(Pkt = (TRANSPACKET*)GetWindowLong(hDlg, GWL_USERDATA)))\r
+ // 64ビット対応\r
+// 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
\r
case WM_SET_PACKET :\r
// Pkt = (TRANSPACKET *)lParam;\r
- SetWindowLong(hDlg, GWL_USERDATA, (LONG)lParam);\r
+ // 64ビット対応\r
+// SetWindowLong(hDlg, GWL_USERDATA, (LONG)lParam);\r
+ SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)lParam);\r
break;\r
}\r
return(FALSE);\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
* BOOL TRUE/FALSE\r
*----------------------------------------------------------------------------*/\r
\r
-static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
{\r
static MIRRORDELETEINFO *DelInfo;\r
switch (iMessage)\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