OSDN Git Service

Change behavior of drag and drop from local file list view.
[ffftp/ffftp.git] / filelist.c
index 9436ac5..813da3d 100644 (file)
@@ -27,7 +27,8 @@
 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
 /============================================================================*/\r
 \r
-#define _WIN32_WINNT   0x400\r
+// UTF-8対応\r
+//#define _WIN32_WINNT 0x400\r
 \r
 #define        STRICT\r
 #include <windows.h>\r
@@ -97,6 +98,8 @@ static int CheckYYMMDDformat(char *Str, char Sym, int Dig3);
 static int CheckYYYYMMDDformat(char *Str, char Sym);\r
 static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);\r
 static int FindField(char *Str, char *Buf, int Num, int ToLast);\r
+// MLSD対応\r
+static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast);\r
 static void GetMonth(char *Str, WORD *Month, WORD *Day);\r
 static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day);\r
 static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute);\r
@@ -851,7 +854,10 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                                PathDir = LocDir;\r
  \r
                                                FileListBase = NULL;\r
-                                               MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);                    \r
+                                               // ローカル側からアプリケーションにD&Dできないバグ修正\r
+//                                             MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);                    \r
+                                               MakeSelectedFileList(WIN_LOCAL, NO, NO, &FileListBase, &CancelFlg);                     \r
+                                               FileListBaseNoExpand = FileListBase;\r
  \r
                                        } else if (hWndDragStart == hWndListRemote) {\r
                                                GetCursorPos(&Point);\r
@@ -3594,6 +3600,14 @@ static int AnalizeFileInfo(char *Str)
                        }\r
                }\r
 \r
+               // MLSD対応\r
+               if(Ret == LIST_UNKNOWN)\r
+               {\r
+                       if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)\r
+                       {\r
+                               Ret = LIST_MLSD;\r
+                       }\r
+               }\r
        }\r
 \r
 DoPrintf("ListType=%d", Ret);\r
@@ -4760,9 +4774,11 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
 \r
                                                /* 年がない */\r
                                                /* 現在の日付から推定 */\r
-                                               if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))\r
-                                                       sTime.wYear++;\r
-                                               else if(sTimeNow.wMonth+1 == sTime.wMonth)\r
+                                               // 恐らくホストとローカルの時刻が異なる場合の対処のようだがとりあえず無効にする\r
+//                                             if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))\r
+//                                                     sTime.wYear++;\r
+//                                             else if(sTimeNow.wMonth+1 == sTime.wMonth)\r
+                                               if(sTimeNow.wMonth+1 == sTime.wMonth)\r
                                                        /* nothing */;\r
                                                else if(sTimeNow.wMonth < sTime.wMonth)\r
                                                        sTime.wYear--;\r
@@ -4830,6 +4846,56 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                        Ret = NODE_NONE;\r
                        }\r
                        break;\r
+\r
+                       // MLSD対応\r
+               case LIST_MLSD:\r
+                       {\r
+                               int i = 0;\r
+                               char Tmp[FMAX_PATH + 1];\r
+                               char Name[FMAX_PATH + 1];\r
+                               char Value[FMAX_PATH + 1];\r
+                               while(FindField2(Str, Tmp, ';', i, NO) == FFFTP_SUCCESS)\r
+                               {\r
+                                       if(i >= 1 && strncmp(Tmp, " ", 1) == 0)\r
+                                               strcpy(Fname, strstr(Str, "; ") + 2);\r
+                                       else if(FindField2(Tmp, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Tmp, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
+                                       {\r
+                                               if(_stricmp(Name, "type") == 0)\r
+                                               {\r
+                                                       if(_stricmp(Value, "dir") == 0)\r
+                                                               Ret = NODE_DIR;\r
+                                                       else if(_stricmp(Value, "file") == 0)\r
+                                                               Ret = NODE_FILE;\r
+                                               }\r
+                                               else if(_stricmp(Name, "size") == 0)\r
+                                               {\r
+                                                       *Size = _atoi64(Value);\r
+                                                       *InfoExist |= FINFO_SIZE;\r
+                                               }\r
+                                               else if(_stricmp(Name, "modify") == 0)\r
+                                               {\r
+                                                       sTime.wYear = atoi_n(Value, 4);\r
+                                                       sTime.wMonth = atoi_n(Value + 4, 2);\r
+                                                       sTime.wDay = atoi_n(Value + 6, 2);\r
+                                                       sTime.wHour = atoi_n(Value + 8, 2);\r
+                                                       sTime.wMinute = atoi_n(Value + 10, 2);\r
+                                                       sTime.wSecond = atoi_n(Value + 12, 2);\r
+                                                       SystemTimeToFileTime(&sTime, Time);\r
+//                                                     SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+                                                       *InfoExist |= FINFO_DATE | FINFO_TIME;\r
+                                               }\r
+                                               else if(_stricmp(Name, "UNIX.mode") == 0)\r
+                                               {\r
+                                                       *Attr = strtol(Value, NULL, 16);\r
+                                                       *InfoExist |= FINFO_ATTR;\r
+                                               }\r
+                                               else if(_stricmp(Name, "UNIX.owner") == 0)\r
+                                                       strcpy(Owner, Value);\r
+                                       }\r
+                                       i++;\r
+                               }\r
+                       }\r
+                       break;\r
        }\r
 \r
        if((Ret != NODE_NONE) && (strlen(Fname) > 0))\r
@@ -4902,6 +4968,53 @@ static int FindField(char *Str, char *Buf, int Num, int ToLast)
 }\r
 \r
 \r
+// MLSD対応\r
+static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast)\r
+{\r
+       char *Pos;\r
+       int Sts;\r
+\r
+       Sts = FFFTP_FAIL;\r
+       *Buf = NUL;\r
+       if(Num >= 0)\r
+       {\r
+               while(*Str == Separator)\r
+                       Str++;\r
+\r
+               for(; Num > 0; Num--)\r
+               {\r
+                       if((Str = strchr(Str, Separator)) != NULL)\r
+                       {\r
+                               while(*Str == Separator)\r
+                               {\r
+                                       if(*Str == NUL)\r
+                                       {\r
+                                               Str = NULL;\r
+                                               break;\r
+                                       }\r
+                                       Str++;\r
+                               }\r
+                       }\r
+                       else\r
+                               break;\r
+               }\r
+       }\r
+\r
+       if(Str != NULL)\r
+       {\r
+               if((ToLast == YES) || ((Pos = strchr(Str, Separator)) == NULL))\r
+                       strcpy(Buf, Str);\r
+               else\r
+               {\r
+                       strncpy(Buf, Str, Pos - Str);\r
+                       *(Buf + (Pos - Str)) = NUL;\r
+               }\r
+               Sts = FFFTP_SUCCESS;\r
+       }\r
+       return(Sts);\r
+}\r
+\r
+\r
 /*----- 文字列から月を求める --------------------------------------------------\r
 *\r
 *      Parameter\r