X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=ftpproc.c;h=01f2303d3e26b7a8d0c06ca5fda73e9b14765046;hb=refs%2Fheads%2F1.98e;hp=3e76a491f9fd56e1753a69889fbc2cc7b240791a;hpb=b0819c6bb0f6e5d74c98be2d978481effaa970f7;p=ffftp%2Fffftp.git diff --git a/ftpproc.c b/ftpproc.c index 3e76a49..01f2303 100644 --- a/ftpproc.c +++ b/ftpproc.c @@ -71,10 +71,13 @@ static INT_PTR CALLBACK MirrorNotifyCallBack(HWND hDlg, UINT iMessage, WPARAM wP 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 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); // 64ビット対応 @@ -105,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 */ @@ -130,11 +138,50 @@ 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; @@ -217,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; @@ -225,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; } @@ -242,8 +310,9 @@ void DownLoadProc(int ChName, int ForceFile, int All) } DeleteFileList(&FileListBase); - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); GoForwardTransWindow(); // KeepTransferDialog(NO); @@ -263,9 +332,11 @@ 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; @@ -331,9 +402,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); + } } } @@ -344,8 +423,9 @@ void DirectDownLoadProc(char *Fname) AddTransFileList(&Pkt); } - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); GoForwardTransWindow(); // KeepTransferDialog(NO); @@ -365,7 +445,7 @@ void DirectDownLoadProc(char *Fname) * なし *----------------------------------------------------------------------------*/ -void InputDownLoadProc(void) +void InputDownloadProc(void) { char Path[FMAX_PATH+1]; int Tmp; @@ -375,7 +455,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(); @@ -610,8 +690,9 @@ void MirrorDownloadProc(int Notify) AddTransFileList(&Pkt); } - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); } else EraseTmpTransFileList(&Base); @@ -868,7 +949,70 @@ static INT_PTR CALLBACK DownExistDialogCallBack(HWND hDlg, UINT iMessage, WPARAM * なし *----------------------------------------------------------------------------*/ -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; @@ -911,17 +1055,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) @@ -980,16 +1151,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"); @@ -1015,8 +1199,9 @@ void UpLoadListProc(int ChName, int All) DeleteFileList(&FileListBase); - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); GoForwardTransWindow(); @@ -1035,7 +1220,7 @@ void UpLoadListProc(int ChName, int All) * なし *----------------------------------------------------------------------------*/ -void UpLoadDragProc(WPARAM wParam) +void UploadDragProc(WPARAM wParam) { FILELIST *FileListBase; FILELIST *Pos; @@ -1079,6 +1264,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) { @@ -1135,16 +1326,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"); @@ -1170,8 +1375,9 @@ void UpLoadDragProc(WPARAM wParam) DeleteFileList(&FileListBase); - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); GoForwardTransWindow(); @@ -1406,11 +1612,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); } @@ -1436,8 +1647,9 @@ void MirrorUploadProc(int Notify) AddTransFileList(&Pkt); } - strcpy(Pkt.Cmd, "GOQUIT"); - AddTransFileList(&Pkt); + // 同時接続対応 +// strcpy(Pkt.Cmd, "GOQUIT"); +// AddTransFileList(&Pkt); } else EraseTmpTransFileList(&Base); @@ -1773,7 +1985,7 @@ static int AskMirrorNoTrn(char *Fname, int Mode) * int 属性 (-1=設定なし) *----------------------------------------------------------------------------*/ -static int AskUpLoadFileAttr(char *Fname) +static int AskUploadFileAttr(char *Fname) { int Ret; int Sts; @@ -1815,13 +2027,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; @@ -1965,6 +2190,57 @@ static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM } +#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 @@ -2951,7 +3227,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(); }