X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=ftpproc.c;h=94ad8a26ef8554851f08ee0f2f37b6ff3e86c9db;hp=09a5263bcb5f189ba83b5f3d5e46cb969d634d1a;hb=2edde15bf5547440d7089c9cf7fd5098a42126b7;hpb=46cb6ad4eea69835e1aab2d29ed9c8117a6d516b diff --git a/ftpproc.c b/ftpproc.c index 09a5263..94ad8a2 100644 --- a/ftpproc.c +++ b/ftpproc.c @@ -28,6 +28,8 @@ /============================================================================*/ #define STRICT +// IPv6対応 +#include #include #include #include @@ -50,24 +52,39 @@ /*===== プロトタイプ =====*/ static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList); -static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static void DispMirrorFiles(FILELIST *Local, FILELIST *Remote); static void MirrorDeleteAllLocalDir(FILELIST *Local, TRANSPACKET *Pkt, TRANSPACKET **Base); static int CheckLocalFile(TRANSPACKET *Pkt); -static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static void RemoveAfterSemicolon(char *Path); static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET **Base); -static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); -static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +//static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static void CountMirrorFiles(HWND hDlg, TRANSPACKET *Pkt); static int AskMirrorNoTrn(char *Fname, int Mode); -static int AskUpLoadFileAttr(char *Fname); -static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static int AskUploadFileAttr(char *Fname); +// 64ビット対応 +//static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +#if defined(HAVE_TANDEM) +static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +#endif static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); -static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); -static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +// 64ビット対応 +//static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +//static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +static INT_PTR CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static void SetAttrToDialog(HWND hWnd, int Attr); static int GetAttrFromDialog(HWND hDlg); static LRESULT CALLBACK SizeNotifyDlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); @@ -91,10 +108,15 @@ extern SIZE MirrorDlgSize; extern int VaxSemicolon; extern int DebugConsole; extern int CancelFlg; +// ディレクトリ自動作成 +extern int MakeAllDir; /*===== ローカルなワーク =====*/ static char TmpString[FMAX_PATH+80]; /* テンポラリ */ +#if defined(HAVE_TANDEM) +static char TmpFileCode[5]; /* テンポラリ */ +#endif static int CurWin; /* ウインドウ番号 */ int UpExistMode = EXIST_OVW; /* アップロードで同じ名前のファイルがある時の扱い方 EXIST_xxx */ @@ -116,19 +138,58 @@ static double FileSize; /* ファイル総容量 */ * なし *----------------------------------------------------------------------------*/ -void DownLoadProc(int ChName, int ForceFile, int All) +// ディレクトリ自動作成 +// ローカル側のパスから必要なフォルダを作成 +int MakeDirFromLocalPath(char* LocalFile, char* Old) +{ + TRANSPACKET Pkt; + char* pDelimiter; + char* pNext; + char* Cat; + int Len; + int Make; + pDelimiter = LocalFile; + Make = NO; + while(pNext = strchr(pDelimiter, '\\')) + { + Len = pNext - LocalFile; + strncpy(Pkt.LocalFile, LocalFile, Len); + Pkt.LocalFile[Len] = '\0'; + if(strncmp(LocalFile, Old, Len + 1) != 0) + { + Cat = Pkt.LocalFile + (pDelimiter - LocalFile); + if(FnameCnv == FNAME_LOWER) + _mbslwr(Cat); + else if(FnameCnv == FNAME_UPPER) + _mbsupr(Cat); + ReplaceAll(Pkt.LocalFile, '/', '\\'); + + strcpy(Pkt.Cmd, "MKD "); + strcpy(Pkt.RemoteFile, ""); + AddTransFileList(&Pkt); + + Make = YES; + } + pDelimiter = pNext + 1; + } + return Make; +} + +void DownloadProc(int ChName, int ForceFile, int All) { FILELIST *FileListBase; FILELIST *Pos; TRANSPACKET Pkt; + // ディレクトリ自動作成 + char Tmp[FMAX_PATH+1]; + + // 同時接続対応 + CancelFlg = NO; if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { DisableUserOpe(); - // 同時接続対応 - SktShareProh(); - ExistNotify = YES; // KeepTransferDialog(YES); @@ -203,6 +264,19 @@ void DownLoadProc(int ChName, int ForceFile, int All) } strcpy(Pkt.Cmd, "RETR "); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM) { + if(AskTransferType() != TYPE_X) { + Pkt.Type = AskTransferType(); + } else { + Pkt.Attr = Pos->Attr; + if (Pkt.Attr == 101) + Pkt.Type = TYPE_A; + else + Pkt.Type = TYPE_I; + } + } else +#endif Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType()); Pkt.Size = Pos->Size; Pkt.Time = Pos->Time; @@ -211,11 +285,19 @@ void DownLoadProc(int ChName, int ForceFile, int All) Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); + // ディレクトリ自動作成 + strcpy(Tmp, Pkt.LocalFile); Pkt.Mode = CheckLocalFile(&Pkt); /* Pkt.ExistSize がセットされる */ if(Pkt.Mode == EXIST_ABORT) break; else if(Pkt.Mode != EXIST_IGNORE) + // ディレクトリ自動作成 +// AddTransFileList(&Pkt); + { + if(MakeAllDir == YES) + MakeDirFromLocalPath(Pkt.LocalFile, Tmp); AddTransFileList(&Pkt); + } } Pos = Pos->Next; } @@ -228,8 +310,12 @@ void DownLoadProc(int ChName, int ForceFile, int All) } DeleteFileList(&FileListBase); - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); + + // バグ対策 + AddNullTransFileList(); GoForwardTransWindow(); // KeepTransferDialog(NO); @@ -249,17 +335,19 @@ void DownLoadProc(int ChName, int ForceFile, int All) * なし *----------------------------------------------------------------------------*/ -void DirectDownLoadProc(char *Fname) +void DirectDownloadProc(char *Fname) { TRANSPACKET Pkt; + // ディレクトリ自動作成 + char Tmp[FMAX_PATH+1]; + + // 同時接続対応 + CancelFlg = NO; if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { DisableUserOpe(); - // 同時接続対応 - SktShareProh(); - ExistNotify = YES; // KeepTransferDialog(YES); @@ -317,9 +405,17 @@ void DirectDownLoadProc(char *Fname) Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); + // ディレクトリ自動作成 + strcpy(Tmp, Pkt.LocalFile); Pkt.Mode = CheckLocalFile(&Pkt); /* Pkt.ExistSize がセットされる */ if((Pkt.Mode != EXIST_ABORT) && (Pkt.Mode != EXIST_IGNORE)) + // ディレクトリ自動作成 +// AddTransFileList(&Pkt); + { + if(MakeAllDir == YES) + MakeDirFromLocalPath(Pkt.LocalFile, Tmp); AddTransFileList(&Pkt); + } } } @@ -330,8 +426,12 @@ void DirectDownLoadProc(char *Fname) AddTransFileList(&Pkt); } - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); + + // バグ対策 + AddNullTransFileList(); GoForwardTransWindow(); // KeepTransferDialog(NO); @@ -351,7 +451,7 @@ void DirectDownLoadProc(char *Fname) * なし *----------------------------------------------------------------------------*/ -void InputDownLoadProc(void) +void InputDownloadProc(void) { char Path[FMAX_PATH+1]; int Tmp; @@ -361,7 +461,7 @@ void InputDownLoadProc(void) strcpy(Path, ""); if(InputDialogBox(downname_dlg, GetMainHwnd(), NULL, Path, FMAX_PATH, &Tmp, IDH_HELP_TOPIC_0000001) == YES) { - DirectDownLoadProc(Path); + DirectDownloadProc(Path); } // EnableUserOpe(); @@ -392,13 +492,13 @@ void MirrorDownloadProc(int Notify) int Level; int Mode; + // 同時接続対応 + CancelFlg = NO; + if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { DisableUserOpe(); - // 同時接続対応 - SktShareProh(); - Base = NULL; if(Notify == YES) @@ -596,12 +696,16 @@ void MirrorDownloadProc(int Notify) AddTransFileList(&Pkt); } - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); } else EraseTmpTransFileList(&Base); + // バグ対策 + AddNullTransFileList(); + DeleteFileList(&LocalListBase); DeleteFileList(&RemoteListBase); @@ -786,7 +890,9 @@ static int CheckLocalFile(TRANSPACKET *Pkt) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { static TRANSPACKET *Pkt; static const RADIOBUTTON DownExistButton[] = { @@ -852,7 +958,70 @@ static BOOL CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wP * なし *----------------------------------------------------------------------------*/ -void UpLoadListProc(int ChName, int All) +// ディレクトリ自動作成 +// リモート側のパスから必要なディレクトリを作成 +int MakeDirFromRemotePath(char* RemoteFile, char* Old, int FirstAdd) +{ + TRANSPACKET Pkt; + TRANSPACKET Pkt1; + char* pDelimiter; + char* pNext; + char* Cat; + int Len; + int Make; + pDelimiter = RemoteFile; + Make = NO; + while(pNext = strchr(pDelimiter, '/')) + { + Len = pNext - RemoteFile; + strncpy(Pkt.RemoteFile, RemoteFile, Len); + Pkt.RemoteFile[Len] = '\0'; + if(strncmp(RemoteFile, Old, Len + 1) != 0) + { + Cat = Pkt.RemoteFile + (pDelimiter - RemoteFile); + if(FnameCnv == FNAME_LOWER) + _mbslwr(Cat); + else if(FnameCnv == FNAME_UPPER) + _mbsupr(Cat); +#if defined(HAVE_TANDEM) + Pkt.FileCode = 0; + Pkt.PriExt = DEF_PRIEXT; + Pkt.SecExt = DEF_SECEXT; + Pkt.MaxExt = DEF_MAXEXT; +#endif + ReplaceAll(Pkt.RemoteFile, '\\', '/'); + + if(AskHostType() == HTYPE_ACOS) + { + strcpy(Pkt.RemoteFile, "'"); + strcat(Pkt.RemoteFile, AskHostLsName()); + strcat(Pkt.RemoteFile, "("); + strcat(Pkt.RemoteFile, Cat); + strcat(Pkt.RemoteFile, ")"); + strcat(Pkt.RemoteFile, "'"); + } + else if(AskHostType() == HTYPE_ACOS_4) + strcpy(Pkt.RemoteFile, Cat); + + if((FirstAdd == YES) && (AskNoFullPathMode() == YES)) + { + strcpy(Pkt1.Cmd, "SETCUR"); + AskRemoteCurDir(Pkt1.RemoteFile, FMAX_PATH); + AddTransFileList(&Pkt1); + } + FirstAdd = NO; + strcpy(Pkt.Cmd, "MKD "); + strcpy(Pkt.LocalFile, ""); + AddTransFileList(&Pkt); + + Make = YES; + } + pDelimiter = pNext + 1; + } + return Make; +} + +void UploadListProc(int ChName, int All) { FILELIST *FileListBase; FILELIST *Pos; @@ -863,13 +1032,13 @@ void UpLoadListProc(int ChName, int All) char Tmp[FMAX_PATH+1]; int FirstAdd; + // 同時接続対応 + CancelFlg = NO; + if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { DisableUserOpe(); - // 同時接続対応 - SktShareProh(); - // ローカル側で選ばれているファイルをFileListBaseに登録 FileListBase = NULL; MakeSelectedFileList(WIN_LOCAL, YES, All, &FileListBase, &CancelFlg); @@ -895,17 +1064,44 @@ void UpLoadListProc(int ChName, int All) _mbslwr(Cat); else if(FnameCnv == FNAME_UPPER) _mbsupr(Cat); +#if defined(HAVE_TANDEM) + Pkt.FileCode = 0; + Pkt.PriExt = DEF_PRIEXT; + Pkt.SecExt = DEF_SECEXT; + Pkt.MaxExt = DEF_MAXEXT; +#endif } else { // 名前を変更する strcpy(TmpString, Pos->File); CurWin = WIN_LOCAL; +#if defined(HAVE_TANDEM) + strcpy(TmpFileCode, "0"); /* ASCII モードの場合は無視される */ + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_with_ext_dlg), GetMainHwnd(), UpDownAsWithExtDialogCallBack) == YES) { + strcat(Pkt.RemoteFile, TmpString); + Pkt.FileCode = atoi(TmpFileCode); + } else { + break; + } + } else +#endif if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES) strcat(Pkt.RemoteFile, TmpString); else break; } + // バグ修正 + AskRemoteCurDir(Tmp, FMAX_PATH); + SetSlashTail(Tmp); + if(strncmp(Pkt.RemoteFile, Tmp, strlen(Tmp)) != 0) + { + if((Cat = strrchr(Pkt.RemoteFile, '/')) != NULL) + Cat++; + else + Cat = Pkt.RemoteFile; + } ReplaceAll(Pkt.RemoteFile, '\\', '/'); if(AskHostType() == HTYPE_ACOS) @@ -964,16 +1160,29 @@ void UpLoadListProc(int ChName, int All) Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType()); Pkt.Size = 0; Pkt.Time = Pos->Time; - Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile); + Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile); Pkt.KanjiCode = AskHostKanjiCode(); // UTF-8対応 Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + CalcExtentSize(&Pkt, Pos->Size); + } +#endif + // ディレクトリ自動作成 + strcpy(Tmp, Pkt.RemoteFile); Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); if(Pkt.Mode == EXIST_ABORT) break; else if(Pkt.Mode != EXIST_IGNORE) { + // ディレクトリ自動作成 + if(MakeAllDir == YES) + { + if(MakeDirFromRemotePath(Pkt.RemoteFile, Tmp, FirstAdd) == YES) + FirstAdd = NO; + } if((FirstAdd == YES) && (AskNoFullPathMode() == YES)) { strcpy(Pkt1.Cmd, "SETCUR"); @@ -999,8 +1208,12 @@ void UpLoadListProc(int ChName, int All) DeleteFileList(&FileListBase); - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); + + // バグ対策 + AddNullTransFileList(); GoForwardTransWindow(); @@ -1019,7 +1232,7 @@ void UpLoadListProc(int ChName, int All) * なし *----------------------------------------------------------------------------*/ -void UpLoadDragProc(WPARAM wParam) +void UploadDragProc(WPARAM wParam) { FILELIST *FileListBase; FILELIST *Pos; @@ -1031,13 +1244,13 @@ void UpLoadDragProc(WPARAM wParam) int FirstAdd; char Cur[FMAX_PATH+1]; + // 同時接続対応 + CancelFlg = NO; + if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { DisableUserOpe(); - // 同時接続対応 - SktShareProh(); - // ローカル側で選ばれているファイルをFileListBaseに登録 FileListBase = NULL; MakeDroppedFileList(wParam, Cur, &FileListBase); @@ -1063,6 +1276,12 @@ void UpLoadDragProc(WPARAM wParam) else if(FnameCnv == FNAME_UPPER) _mbsupr(Cat); ReplaceAll(Pkt.RemoteFile, '\\', '/'); +#if defined(HAVE_TANDEM) + Pkt.FileCode = 0; + Pkt.PriExt = DEF_PRIEXT; + Pkt.SecExt = DEF_SECEXT; + Pkt.MaxExt = DEF_MAXEXT; +#endif if(AskHostType() == HTYPE_ACOS) { @@ -1119,16 +1338,30 @@ void UpLoadDragProc(WPARAM wParam) Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType()); Pkt.Size = 0; Pkt.Time = Pos->Time; - Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile); + Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile); Pkt.KanjiCode = AskHostKanjiCode(); // UTF-8対応 Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + int a = Pos->InfoExist && FINFO_SIZE; + CalcExtentSize(&Pkt, Pos->Size); + } +#endif + // ディレクトリ自動作成 + strcpy(Tmp, Pkt.RemoteFile); Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); if(Pkt.Mode == EXIST_ABORT) break; else if(Pkt.Mode != EXIST_IGNORE) { + // ディレクトリ自動作成 + if(MakeAllDir == YES) + { + if(MakeDirFromRemotePath(Pkt.RemoteFile, Tmp, FirstAdd) == YES) + FirstAdd = NO; + } if((FirstAdd == YES) && (AskNoFullPathMode() == YES)) { strcpy(Pkt1.Cmd, "SETCUR"); @@ -1154,8 +1387,12 @@ void UpLoadDragProc(WPARAM wParam) DeleteFileList(&FileListBase); - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); + + // バグ対策 + AddNullTransFileList(); GoForwardTransWindow(); @@ -1190,13 +1427,13 @@ void MirrorUploadProc(int Notify) FILETIME TmpFtimeL; FILETIME TmpFtimeR; + // 同時接続対応 + CancelFlg = NO; + if(CheckClosedAndReconnect() == FFFTP_SUCCESS) { DisableUserOpe(); - // 同時接続対応 - SktShareProh(); - Base = NULL; if(Notify == YES) @@ -1390,11 +1627,16 @@ void MirrorUploadProc(int Notify) Pkt.Type = AskTransferTypeAssoc(Pkt.LocalFile, AskTransferType()); Pkt.Size = 0; Pkt.Time = LocalPos->Time; - Pkt.Attr = AskUpLoadFileAttr(Pkt.RemoteFile); + Pkt.Attr = AskUploadFileAttr(Pkt.RemoteFile); Pkt.KanjiCode = AskHostKanjiCode(); // UTF-8対応 Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + CalcExtentSize(&Pkt, LocalPos->Size); + } +#endif Pkt.Mode = EXIST_OVW; AddTmpTransFileList(&Pkt, &Base); } @@ -1420,12 +1662,16 @@ void MirrorUploadProc(int Notify) AddTransFileList(&Pkt); } - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); } else EraseTmpTransFileList(&Base); + // バグ対策 + AddNullTransFileList(); + DeleteFileList(&LocalListBase); DeleteFileList(&RemoteListBase); @@ -1487,7 +1733,9 @@ static void MirrorDeleteAllDir(FILELIST *Remote, TRANSPACKET *Pkt, TRANSPACKET * * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { static int Mode; @@ -1536,7 +1784,9 @@ static BOOL CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wPara * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK MirrorDispListCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { static DIALOGSIZE DlgSize = { { MIRROR_DEL, MIRROR_SIZEGRIP, -1 }, @@ -1753,7 +2003,7 @@ static int AskMirrorNoTrn(char *Fname, int Mode) * int 属性 (-1=設定なし) *----------------------------------------------------------------------------*/ -static int AskUpLoadFileAttr(char *Fname) +static int AskUploadFileAttr(char *Fname) { int Ret; int Sts; @@ -1795,13 +2045,26 @@ static int AskUpLoadFileAttr(char *Fname) static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList) { int Ret; +#if defined(HAVE_TANDEM) + int Mode; +#endif FILELIST *Exist; Ret = EXIST_OVW; Pkt->ExistSize = 0; if(SendMode != TRANS_OVW) { +#if defined(HAVE_TANDEM) + /* HP NonStop Server は大文字小文字の区別なし(すべて大文字) */ + if(AskHostType() == HTYPE_TANDEM) + Mode = COMP_IGNORE; + else + Mode = COMP_STRICT; + + if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, Mode)) != NULL) +#else if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, COMP_STRICT)) != NULL) +#endif { Pkt->ExistSize = Exist->Size; @@ -1842,7 +2105,9 @@ static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { static TRANSPACKET *Pkt; static const RADIOBUTTON UpExistButton[] = { @@ -1908,7 +2173,9 @@ static BOOL CALLBACK UpExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wPar * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch (iMessage) { @@ -1941,6 +2208,57 @@ static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wPa } +#if defined(HAVE_TANDEM) +/*----- アップロード/ダウンロードファイル名入力ダイアログのコールバック ------ +* +* Parameter +* HWND hDlg : ウインドウハンドル +* UINT message : メッセージ番号 +* WPARAM wParam : メッセージの WPARAM 引数 +* LPARAM lParam : メッセージの LPARAM 引数 +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + if(CurWin == WIN_LOCAL) + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064); + else + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065); + + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, EM_LIMITTEXT, 4, 0); + SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_SETTEXT, 0, (LPARAM)TmpFileCode); + + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpFileCode); + EndDialog(hDlg, YES); + break; + + case UPDOWNAS_STOP : + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} +#endif + + /*----- ファイル一覧で指定されたファイルを削除する ---------------------------- * * Parameter @@ -1960,6 +2278,9 @@ void DeleteProc(void) char CurDir[FMAX_PATH+1]; char Tmp[FMAX_PATH+1]; + // 同時接続対応 + CancelFlg = NO; + // デッドロック対策 DisableUserOpe(); Sts = YES; @@ -2095,7 +2416,9 @@ static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDi { sprintf(TmpString, "%s", Path); - if(AskHostType() == HTYPE_VMS) + // ローカルのファイルのパスの最後の'\\'が消えるバグ修正 +// if(AskHostType() == HTYPE_VMS) + if(Win == WIN_REMOTE && AskHostType() == HTYPE_VMS) ReformToVMSstylePathName(TmpString); CurWin = Win; @@ -2115,7 +2438,9 @@ static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDi else { /* フルパスを使わない時のための処理 */ - if(ProcForNonFullpath(Path, CurDir, GetMainHwnd(), 0) == FFFTP_FAIL) + // 同時接続対応 +// if(ProcForNonFullpath(Path, CurDir, GetMainHwnd(), 0) == FFFTP_FAIL) + if(ProcForNonFullpath(AskCmdCtrlSkt(), Path, CurDir, GetMainHwnd(), &CancelFlg) == FFFTP_FAIL) *Sw = NO_ALL; if(*Sw != NO_ALL) @@ -2144,7 +2469,9 @@ static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDi * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK DeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch (iMessage) { @@ -2199,6 +2526,9 @@ void RenameProc(void) int RenFlg; int Sts; + // 同時接続対応 + CancelFlg = NO; + Sts = FFFTP_SUCCESS; if(GetFocus() == GetLocalHwnd()) Win = WIN_LOCAL; @@ -2274,6 +2604,9 @@ void MoveRemoteFileProc(int drop_index) int RenFlg; int Sts; + // 同時接続対応 + CancelFlg = NO; + if(MoveMode == MOVE_DISABLE) { return; @@ -2390,7 +2723,9 @@ void MoveRemoteFileProc(int drop_index) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//static BOOL CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK RenameDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch (iMessage) { @@ -2443,6 +2778,9 @@ void MkdirProc(void) char *Title; int Tmp; + // 同時接続対応 + CancelFlg = NO; + if(GetFocus() == GetLocalHwnd()) { Win = WIN_LOCAL; @@ -2495,6 +2833,9 @@ void ChangeDirComboProc(HWND hWnd) char Tmp[FMAX_PATH+1]; int i; + // 同時接続対応 + CancelFlg = NO; + if((i = SendMessage(hWnd, CB_GETCURSEL, 0, 0)) != CB_ERR) { SendMessage(hWnd, CB_GETLBTEXT, i, (LPARAM)Tmp); @@ -2536,6 +2877,9 @@ void ChangeDirBmarkProc(int MarkID) char Remote[FMAX_PATH+1]; int Sts; + // 同時接続対応 + CancelFlg = NO; + Sts = AskBookMarkText(MarkID, Local, Remote, FMAX_PATH+1); if((Sts == BMARK_TYPE_LOCAL) || (Sts == BMARK_TYPE_BOTH)) { @@ -2575,6 +2919,9 @@ void ChangeDirDirectProc(int Win) char *Title; int Tmp; + // 同時接続対応 + CancelFlg = NO; + if(Win == WIN_LOCAL) Title = MSGJPN072; else @@ -2651,6 +2998,9 @@ void ChmodProc(void) char *BufTmp; int BufLen; + // 同時接続対応 + CancelFlg = NO; + if(GetFocus() == GetRemoteHwnd()) { if(CheckClosedAndReconnect() == FFFTP_SUCCESS) @@ -2729,7 +3079,9 @@ void ChmodProc(void) * BOOL TRUE/FALSE *----------------------------------------------------------------------------*/ -BOOL CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +// 64ビット対応 +//BOOL CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +INT_PTR CALLBACK ChmodDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) { char Str[5]; static char *Buf; @@ -2874,6 +3226,9 @@ void SomeCmdProc(void) int Tmp; FILELIST *FileListBase; + // 同時接続対応 + CancelFlg = NO; + if(GetFocus() == GetRemoteHwnd()) { if(CheckClosedAndReconnect() == FFFTP_SUCCESS) @@ -2890,7 +3245,9 @@ void SomeCmdProc(void) if(InputDialogBox(somecmd_dlg, GetMainHwnd(), NULL, Cmd, 81, &Tmp, IDH_HELP_TOPIC_0000023) == YES) { - DoQUOTE(Cmd); + // 同時接続対応 + //DoQUOTE(Cmd); + DoQUOTE(AskCmdCtrlSkt(), Cmd, &CancelFlg); } EnableUserOpe(); } @@ -2918,6 +3275,9 @@ void CalcFileSizeProc(void) int All; int Sts; + // 同時接続対応 + CancelFlg = NO; + if((All = DialogBox(GetFtpInst(), MAKEINTRESOURCE(filesize_notify_dlg), GetMainHwnd(), SizeNotifyDlgWndProc)) != NO_ALL) { Sts = FFFTP_SUCCESS; @@ -3141,7 +3501,9 @@ void CopyURLtoClipBoard(void) * Path にファイル名のみ残す。(パス名は消す) *----------------------------------------------------------------------------*/ -int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type) +// 同時接続対応 +//int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type) +int ProcForNonFullpath(SOCKET cSkt, char *Path, char *CurDir, HWND hWnd, int *CancelCheckWork) { int Sts; int Cmd; @@ -3163,12 +3525,12 @@ int ProcForNonFullpath(char *Path, char *CurDir, HWND hWnd, int Type) if(strcmp(Tmp, CurDir) != 0) { - if(Type == 0) - Cmd = CommandProcCmd(NULL, "CWD %s", Tmp); - else - // 同時接続対応 + // 同時接続対応 +// if(Type == 0) +// Cmd = CommandProcCmd(NULL, "CWD %s", Tmp); +// else // Cmd = CommandProcTrn(NULL, "CWD %s", Tmp); - Cmd = CommandProcTrn((SOCKET)(Type - 1), NULL, "CWD %s", Tmp); + Cmd = CommandProcTrn(cSkt, NULL, CancelCheckWork, "CWD %s", Tmp); if(Cmd/100 != FTP_COMPLETE) { @@ -3323,3 +3685,20 @@ static int RenameUnuseableName(char *Fname) } +// 自動切断対策 +// NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用 +void NoopProc(void) +{ + int CancelCheckWork; + CancelCheckWork = NO; + if(AskConnecting() == YES && AskUserOpeDisabled() == NO) + { + if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO) + { + DisableUserOpe(); + DoDirListCmdSkt("", "", 999, &CancelCheckWork); + EnableUserOpe(); + } + } +} +