X-Git-Url: http://git.sourceforge.jp/view?p=ffftp%2Fffftp.git;a=blobdiff_plain;f=filelist.c;h=94e02acacf191fbb7c1075c35f750b18891741bf;hp=be492524b0027712a4fc769a931615d3afc36245;hb=698970baae62125ab8fd5d0e71a2835187288c7d;hpb=19f7cced5712c402119825eb556f3dac6aee54f9;ds=sidebyside diff --git a/filelist.c b/filelist.c index be49252..94e02ac 100644 --- a/filelist.c +++ b/filelist.c @@ -786,6 +786,9 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam)); case WM_DROPFILES : + // 同時接続対応 + if(AskUserOpeDisabled() == YES) + break; // ドラッグ中は処理しない。ドラッグ後にWM_LBUTTONDOWNが飛んでくるため、そこで処理する。 if (Dragging == YES) return (FALSE); @@ -818,6 +821,9 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA hCsrDrg = LoadCursor(NULL, IDC_ARROW); SetCursor(hCsrDrg); + // 同時接続対応 + if(AskUserOpeDisabled() == YES) + break; Point.x = (long)(short)LOWORD(lParam); Point.y = (long)(short)HIWORD(lParam); ClientToScreen(hWnd, &Point); @@ -4109,6 +4115,8 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, /* まずクリアしておく */ Ret = NODE_NONE; + // バグ対策 + memset(Fname, NUL, FMAX_PATH+1); *Size = -1; *Attr = 0; *Link = NO; @@ -4844,6 +4852,82 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, break; #endif + // MLSD対応 + // 以下の形式に対応 + // fact1=value1;fact2=value2;fact3=value3; filename\r\n + // 不完全な実装のホストが存在するため以下の形式も許容 + // fact1=value1;fact2=value2;fact3=value3 filename\r\n + // fact1=value1;fact2=value2;fact3=value3;filename\r\n + case LIST_MLSD: + { + int i = 0; + char StrBuf[(FMAX_PATH * 2) + 1]; + char Fact[FMAX_PATH + 1]; + char Name[FMAX_PATH + 1]; + char Value[FMAX_PATH + 1]; + char* pFileName; + strncpy(StrBuf, Str, FMAX_PATH * 2); + StrBuf[FMAX_PATH * 2] = '\0'; + if((pFileName = strstr(StrBuf, "; ")) != NULL) + { + *pFileName = '\0'; + pFileName += 2; + } + else if((pFileName = strchr(StrBuf, ' ')) != NULL) + { + *pFileName = '\0'; + pFileName++; + } + else if((pFileName = strrchr(StrBuf, ';')) != NULL) + { + *pFileName = '\0'; + pFileName++; + } + if(pFileName != NULL) + strcpy(Fname, pFileName); + while(FindField2(StrBuf, Fact, ';', i, NO) == FFFTP_SUCCESS) + { + if(FindField2(Fact, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Fact, Value, '=', 1, NO) == FFFTP_SUCCESS) + { + if(_stricmp(Name, "type") == 0) + { + if(_stricmp(Value, "dir") == 0) + Ret = NODE_DIR; + else if(_stricmp(Value, "file") == 0) + Ret = NODE_FILE; + } + else if(_stricmp(Name, "size") == 0) + { + *Size = _atoi64(Value); + *InfoExist |= FINFO_SIZE; + } + else if(_stricmp(Name, "modify") == 0) + { + sTime.wYear = atoi_n(Value, 4); + sTime.wMonth = atoi_n(Value + 4, 2); + sTime.wDay = atoi_n(Value + 6, 2); + sTime.wHour = atoi_n(Value + 8, 2); + sTime.wMinute = atoi_n(Value + 10, 2); + sTime.wSecond = atoi_n(Value + 12, 2); + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + // 時刻はGMT +// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + *InfoExist |= FINFO_DATE | FINFO_TIME; + } + else if(_stricmp(Name, "UNIX.mode") == 0) + { + *Attr = strtol(Value, NULL, 16); + *InfoExist |= FINFO_ATTR; + } + else if(_stricmp(Name, "UNIX.owner") == 0) + strcpy(Owner, Value); + } + i++; + } + } + break; + case LIST_UNIX_10 : case LIST_UNIX_11 : case LIST_UNIX_12 : @@ -5109,57 +5193,6 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, Ret = NODE_NONE; } break; - - // MLSD対応 - case LIST_MLSD: - { - int i = 0; - char Tmp[FMAX_PATH + 1]; - char Name[FMAX_PATH + 1]; - char Value[FMAX_PATH + 1]; - while(FindField2(Str, Tmp, ';', i, NO) == FFFTP_SUCCESS) - { - if(i >= 1 && strncmp(Tmp, " ", 1) == 0) - strcpy(Fname, strstr(Str, "; ") + 2); - else if(FindField2(Tmp, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Tmp, Value, '=', 1, NO) == FFFTP_SUCCESS) - { - if(_stricmp(Name, "type") == 0) - { - if(_stricmp(Value, "dir") == 0) - Ret = NODE_DIR; - else if(_stricmp(Value, "file") == 0) - Ret = NODE_FILE; - } - else if(_stricmp(Name, "size") == 0) - { - *Size = _atoi64(Value); - *InfoExist |= FINFO_SIZE; - } - else if(_stricmp(Name, "modify") == 0) - { - sTime.wYear = atoi_n(Value, 4); - sTime.wMonth = atoi_n(Value + 4, 2); - sTime.wDay = atoi_n(Value + 6, 2); - sTime.wHour = atoi_n(Value + 8, 2); - sTime.wMinute = atoi_n(Value + 10, 2); - sTime.wSecond = atoi_n(Value + 12, 2); - sTime.wMilliseconds = 0; - SystemTimeToFileTime(&sTime, Time); -// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); - *InfoExist |= FINFO_DATE | FINFO_TIME; - } - else if(_stricmp(Name, "UNIX.mode") == 0) - { - *Attr = strtol(Value, NULL, 16); - *InfoExist |= FINFO_ATTR; - } - else if(_stricmp(Name, "UNIX.owner") == 0) - strcpy(Owner, Value); - } - i++; - } - } - break; } // UTF-8対応