OSDN Git Service

96448686add8cf453d5c6af8816e00db2e25b02d
[ffftp/ffftp.git] / filelist.c
1 /*=============================================================================\r
2 *\r
3 *                                                               \83t\83@\83C\83\8b\88ê\97\97\r
4 *\r
5 ===============================================================================\r
6 / Copyright (C) 1997-2007 Sota. All rights reserved.\r
7 /\r
8 / Redistribution and use in source and binary forms, with or without \r
9 / modification, are permitted provided that the following conditions \r
10 / are met:\r
11 /\r
12 /  1. Redistributions of source code must retain the above copyright \r
13 /     notice, this list of conditions and the following disclaimer.\r
14 /  2. Redistributions in binary form must reproduce the above copyright \r
15 /     notice, this list of conditions and the following disclaimer in the \r
16 /     documentation and/or other materials provided with the distribution.\r
17 /\r
18 / THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR \r
19 / IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES \r
20 / OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \r
21 / IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, \r
22 / INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \r
23 / BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF \r
24 / USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON \r
25 / ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
26 / (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF \r
27 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 /============================================================================*/\r
29 \r
30 #define _WIN32_WINNT    0x400\r
31 \r
32 #define STRICT\r
33 #include <windows.h>\r
34 #include <stdio.h>\r
35 #include <stdlib.h>\r
36 #include <string.h>\r
37 #include <ctype.h>\r
38 #include <time.h>\r
39 #include <mbstring.h>\r
40 #include <malloc.h>\r
41 #include <windowsx.h>\r
42 #include <commctrl.h>\r
43 #include <sys/types.h>\r
44 #include <sys/stat.h>\r
45 #include <direct.h>\r
46 \r
47 #include "common.h"\r
48 #include "resource.h"\r
49 \r
50 #include <htmlhelp.h>\r
51 #include "helpid.h"\r
52 \r
53 #include <shlobj.h>\r
54 #include "OleDragDrop.h"\r
55 #include "common.h"\r
56 \r
57 #define BUF_SIZE                256\r
58 #define CF_CNT 2\r
59 #define WM_DRAGDROP             (WM_APP + 100)\r
60 #define WM_GETDATA              (WM_APP + 101)\r
61 #define WM_DRAGOVER             (WM_APP + 102)\r
62 \r
63 \r
64 /*===== \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\83\8a\83X\83g\97p\83X\83g\83\89\83N\83`\83\83 =====*/\r
65 \r
66 typedef struct {\r
67         FILELIST *Top;                  /* \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª */\r
68         int Files;                              /* \83t\83@\83C\83\8b\82Ì\90\94 */\r
69 } FLISTANCHOR;\r
70 \r
71 /*===== \83v\83\8d\83g\83^\83C\83v =====*/\r
72 \r
73 static LRESULT CALLBACK LocalWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
74 static LRESULT CALLBACK RemoteWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
75 static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);\r
76 static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win);\r
77 static void EraseDispFileList(FLISTANCHOR *Anchor);\r
78 static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor);\r
79 static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist);\r
80 static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
81 static void DispListList(FILELIST *Pos, char *Title);\r
82 static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
83 static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
84 static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List);\r
85 static int GetListOneLine(char *Buf, int Max, FILE *Fd);\r
86 static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir);\r
87 static void MakeLocalTree(char *Path, FILELIST **Base);\r
88 static void AddFileList(FILELIST *Pkt, FILELIST **Base);\r
89 static int AnalizeFileInfo(char *Str);\r
90 static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day);\r
91 static int CheckHHMMformat(char *Str);\r
92 static int CheckYYMMDDformat(char *Str, char Sym, int Dig3);\r
93 static int CheckYYYYMMDDformat(char *Str, char Sym);\r
94 static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);\r
95 static int FindField(char *Str, char *Buf, int Num, int ToLast);\r
96 static void GetMonth(char *Str, WORD *Month, WORD *Day);\r
97 static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day);\r
98 static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute);\r
99 static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day);\r
100 static int CheckSpecialDirName(char *Fname);\r
101 static int AskFilterStr(char *Fname, int Type);\r
102 static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
103 static int atoi_n(const char *Str, int Len);\r
104 \r
105 /*===== \8aO\95\94\8eQ\8fÆ =====*/\r
106 \r
107 extern int SepaWidth;\r
108 extern int RemoteWidth;\r
109 extern int ListHeight;\r
110 extern char FilterStr[FILTER_EXT_LEN+1];\r
111 extern HWND hHelpWin;\r
112 \r
113 /* \90Ý\92è\92l */\r
114 extern int LocalWidth;\r
115 extern int LocalTabWidth[4];\r
116 extern int RemoteTabWidth[6];\r
117 extern char UserMailAdrs[USER_MAIL_LEN+1];\r
118 extern HFONT ListFont;\r
119 extern int ListType;\r
120 extern int FindMode;\r
121 extern int DotFile;\r
122 extern int DispIgnoreHide;\r
123 extern int DispDrives;\r
124 extern int MoveMode;\r
125 \r
126 /*===== \83\8d\81[\83J\83\8b\82È\83\8f\81[\83N =====*/\r
127 \r
128 static HWND hWndListLocal = NULL;\r
129 static HWND hWndListRemote = NULL;\r
130 \r
131 static WNDPROC LocalProcPtr;\r
132 static WNDPROC RemoteProcPtr;\r
133 \r
134 static HIMAGELIST ListImg = NULL;\r
135 \r
136 static char FindStr[40+1] = { "*" };            /* \8c\9f\8dõ\95\8e\9a\97ñ */\r
137 static int IgnoreNew = NO;\r
138 static int IgnoreOld = NO;\r
139 static int IgnoreExist = NO;\r
140 \r
141 static int Dragging = NO;\r
142 \r
143 static int StratusMode;                 /* 0=\83t\83@\83C\83\8b, 1=\83f\83B\83\8c\83N\83g\83\8a, 2=\83\8a\83\93\83N */\r
144 \r
145 \r
146 // \83\8a\83\82\81[\83g\83t\83@\83C\83\8b\83\8a\83X\83g (2007.9.3 yutaka)\r
147 static FILELIST *remoteFileListBase;\r
148 static FILELIST *remoteFileListBaseNoExpand;\r
149 static char remoteFileDir[FMAX_PATH + 1];\r
150 \r
151 \r
152 /*----- \83t\83@\83C\83\8b\83\8a\83X\83g\83E\83C\83\93\83h\83E\82ð\8dì\90¬\82·\82é ------------------------------------\r
153 *\r
154 *       Parameter\r
155 *               HWND hWnd : \90e\83E\83C\83\93\83h\83E\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
156 *               HINSTANCE hInst : \83C\83\93\83X\83^\83\93\83X\83n\83\93\83h\83\8b\r
157 *\r
158 *       Return Value\r
159 *               int \83X\83e\81[\83^\83X\r
160 *                       SUCCESS/FAIL\r
161 *----------------------------------------------------------------------------*/\r
162 \r
163 int MakeListWin(HWND hWnd, HINSTANCE hInst)\r
164 {\r
165         int Sts;\r
166         LV_COLUMN LvCol;\r
167         long Tmp;\r
168 \r
169         /*===== \83\8d\81[\83J\83\8b\91¤\82Ì\83\8a\83X\83g\83r\83\85\81[ =====*/\r
170 \r
171         hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
172                         WC_LISTVIEWA, NULL,\r
173                         WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,\r
174                         0, TOOLWIN_HEIGHT*2, LocalWidth, ListHeight,\r
175                         GetMainHwnd(), (HMENU)1500, hInst, NULL);\r
176 \r
177         if(hWndListLocal != NULL)\r
178         {\r
179                 LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc);\r
180 \r
181             Tmp = SendMessage(hWndListLocal, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
182             Tmp |= LVS_EX_FULLROWSELECT;\r
183             SendMessage(hWndListLocal, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)Tmp);\r
184 \r
185                 if(ListFont != NULL)\r
186                         SendMessage(hWndListLocal, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
187 \r
188                 ListImg = ImageList_LoadBitmap(hInst, MAKEINTRESOURCE(dirattr_bmp), 16, 9, RGB(255,0,0));\r
189                 SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);\r
190                 ShowWindow(hWndListLocal, SW_SHOW);\r
191 \r
192                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
193                 LvCol.cx = LocalTabWidth[0];\r
194                 LvCol.pszText = MSGJPN038;\r
195                 LvCol.iSubItem = 0;\r
196                 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 0, (LPARAM)&LvCol);\r
197 \r
198                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
199                 LvCol.cx = LocalTabWidth[1];\r
200                 LvCol.pszText = MSGJPN039;\r
201                 LvCol.iSubItem = 1;\r
202                 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 1, (LPARAM)&LvCol);\r
203 \r
204                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT;\r
205                 LvCol.fmt = LVCFMT_RIGHT;\r
206                 LvCol.cx = LocalTabWidth[2];\r
207                 LvCol.pszText = MSGJPN040;\r
208                 LvCol.iSubItem = 2;\r
209                 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 2, (LPARAM)&LvCol);\r
210 \r
211                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
212                 LvCol.cx = LocalTabWidth[3];\r
213                 LvCol.pszText = MSGJPN041;\r
214                 LvCol.iSubItem = 3;\r
215                 SendMessage(hWndListLocal, LVM_INSERTCOLUMN, 3, (LPARAM)&LvCol);\r
216         }\r
217 \r
218         /*===== \83z\83X\83g\91¤\82Ì\83\8a\83X\83g\83r\83\85\81[ =====*/\r
219 \r
220         hWndListRemote = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
221                         WC_LISTVIEWA, NULL,\r
222                         WS_CHILD | /*WS_BORDER | */LVS_REPORT | LVS_SHOWSELALWAYS,\r
223                         LocalWidth + SepaWidth, TOOLWIN_HEIGHT*2, RemoteWidth, ListHeight,\r
224                         GetMainHwnd(), (HMENU)1500, hInst, NULL);\r
225 \r
226         if(hWndListRemote != NULL)\r
227         {\r
228                 RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc);\r
229 \r
230             Tmp = SendMessage(hWndListRemote, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
231             Tmp |= LVS_EX_FULLROWSELECT;\r
232             SendMessage(hWndListRemote, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)Tmp);\r
233 \r
234                 if(ListFont != NULL)\r
235                         SendMessage(hWndListRemote, WM_SETFONT, (WPARAM)ListFont, MAKELPARAM(TRUE, 0));\r
236 \r
237                 SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);\r
238                 ShowWindow(hWndListRemote, SW_SHOW);\r
239 \r
240                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
241                 LvCol.cx = RemoteTabWidth[0];\r
242                 LvCol.pszText = MSGJPN042;\r
243                 LvCol.iSubItem = 0;\r
244                 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 0, (LPARAM)&LvCol);\r
245 \r
246                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
247                 LvCol.cx = RemoteTabWidth[1];\r
248                 LvCol.pszText = MSGJPN043;\r
249                 LvCol.iSubItem = 1;\r
250                 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 1, (LPARAM)&LvCol);\r
251 \r
252                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT;\r
253                 LvCol.fmt = LVCFMT_RIGHT;\r
254                 LvCol.cx = RemoteTabWidth[2];\r
255                 LvCol.pszText = MSGJPN044;\r
256                 LvCol.iSubItem = 2;\r
257                 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 2, (LPARAM)&LvCol);\r
258 \r
259                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
260                 LvCol.cx = RemoteTabWidth[3];\r
261                 LvCol.pszText = MSGJPN045;\r
262                 LvCol.iSubItem = 3;\r
263                 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 3, (LPARAM)&LvCol);\r
264 \r
265                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
266                 LvCol.cx = RemoteTabWidth[4];\r
267                 LvCol.pszText = MSGJPN046;\r
268                 LvCol.iSubItem = 4;\r
269                 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 4, (LPARAM)&LvCol);\r
270 \r
271                 LvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;\r
272                 LvCol.cx = RemoteTabWidth[5];\r
273                 LvCol.pszText = MSGJPN047;\r
274                 LvCol.iSubItem = 5;\r
275                 SendMessage(hWndListRemote, LVM_INSERTCOLUMN, 5, (LPARAM)&LvCol);\r
276         }\r
277 \r
278         Sts = SUCCESS;\r
279         if((hWndListLocal == NULL) ||\r
280            (hWndListRemote == NULL))\r
281         {\r
282                 Sts = FAIL;\r
283         }\r
284         return(Sts);\r
285 }\r
286 \r
287 \r
288 /*----- \83t\83@\83C\83\8b\83\8a\83X\83g\83E\83C\83\93\83h\83E\82ð\8dí\8f\9c ----------------------------------------\r
289 *\r
290 *       Parameter\r
291 *               \82È\82µ\r
292 *\r
293 *       Return Value\r
294 *               \82È\82µ\r
295 *----------------------------------------------------------------------------*/\r
296 \r
297 void DeleteListWin(void)\r
298 {\r
299 //      if(ListImg != NULL)\r
300 //              ImageList_Destroy(ListImg);\r
301         if(hWndListLocal != NULL)\r
302                 DestroyWindow(hWndListLocal);\r
303         if(hWndListRemote != NULL)\r
304                 DestroyWindow(hWndListRemote);\r
305         return;\r
306 }\r
307 \r
308 \r
309 /*----- \83\8d\81[\83J\83\8b\91¤\82Ì\83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\82ð\95Ô\82· ------------------\r
310 *\r
311 *       Parameter\r
312 *               \82È\82µ\r
313 *\r
314 *       Return Value\r
315 *               HWND \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
316 *----------------------------------------------------------------------------*/\r
317 \r
318 HWND GetLocalHwnd(void)\r
319 {\r
320         return(hWndListLocal);\r
321 }\r
322 \r
323 \r
324 /*----- \83z\83X\83g\91¤\82Ì\83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\82ð\95Ô\82· --------------------\r
325 *\r
326 *       Parameter\r
327 *               \82È\82µ\r
328 *\r
329 *       Return Value\r
330 *               HWND \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
331 *----------------------------------------------------------------------------*/\r
332 \r
333 HWND GetRemoteHwnd(void)\r
334 {\r
335         return(hWndListRemote);\r
336 }\r
337 \r
338 \r
339 /*----- \83\8d\81[\83J\83\8b\91¤\82Ì\83t\83@\83C\83\8b\83\8a\83X\83g\83E\83C\83\93\83h\83E\82Ì\83\81\83b\83Z\81[\83W\8f\88\97\9d ------------------\r
340 *\r
341 *       Parameter\r
342 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
343 *               UINT message  : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
344 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
345 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
346 *\r
347 *       Return Value\r
348 *               \83\81\83b\83Z\81[\83W\82É\91Î\89\9e\82·\82é\96ß\82è\92l\r
349 *----------------------------------------------------------------------------*/\r
350 \r
351 static LRESULT CALLBACK LocalWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
352 {\r
353         return(FileListCommonWndProc(hWnd, message, wParam, lParam));\r
354 }\r
355 \r
356 \r
357 /*----- \83z\83X\83g\91¤\82Ì\83t\83@\83C\83\8b\83\8a\83X\83g\83E\83C\83\93\83h\83E\82Ì\83\81\83b\83Z\81[\83W\8f\88\97\9d --------------------\r
358 *\r
359 *       Parameter\r
360 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
361 *               UINT message  : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
362 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
363 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
364 *\r
365 *       Return Value\r
366 *               \83\81\83b\83Z\81[\83W\82É\91Î\89\9e\82·\82é\96ß\82è\92l\r
367 *----------------------------------------------------------------------------*/\r
368 \r
369 static LRESULT CALLBACK RemoteWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
370 {\r
371         return(FileListCommonWndProc(hWnd, message, wParam, lParam));\r
372 }\r
373 \r
374 \r
375 // \83_\83C\83A\83\8d\83O\83v\83\8d\83V\81[\83W\83\83\r
376 static BOOL CALLBACK doOleDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)\r
377 {\r
378 #define TIMER_ID     (100)      // \8dì\90¬\82·\82é\83^\83C\83}\82Ì\8e¯\95ÊID\r
379 #define TIMER_ELAPSE (100)       // WM_TIMER\82Ì\94­\90\8aÔ\8au\r
380         MSG message;\r
381 \r
382         switch( msg ){\r
383         case WM_INITDIALOG:  // \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82ª\8dì\90¬\82³\82ê\82½\82Æ\82«\r
384                 SetTimer( hDlg, TIMER_ID, 0, NULL);\r
385                 return TRUE;\r
386 \r
387         case WM_TIMER:\r
388                 ShowWindow(hDlg, SW_HIDE);  // \83_\83C\83A\83\8d\83O\82Í\89B\82·\r
389 \r
390                 if (wp != TIMER_ID)\r
391                         break;\r
392 \r
393                 if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) {\r
394                                 TranslateMessage(&message);\r
395                                 DispatchMessage(&message);\r
396 \r
397                 } else {\r
398                         if (AskTransferNow() == NO) {\r
399                                 EndDialog( hDlg, 0 );\r
400                                 return TRUE;\r
401                         }\r
402                 }\r
403 \r
404                 SetTimer( hDlg, TIMER_ID, TIMER_ELAPSE, NULL );\r
405                 return TRUE;\r
406 \r
407         case WM_COMMAND:     // \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\93à\82Ì\89½\82©\82ª\91I\91ð\82³\82ê\82½\82Æ\82«\r
408                 switch( LOWORD( wp ) ){\r
409 //              case IDOK:       // \81uOK\81v\83{\83^\83\93\82ª\91I\91ð\82³\82ê\82½\r
410                 case IDCANCEL:   // \81u\83L\83\83\83\93\83Z\83\8b\81v\83{\83^\83\93\82ª\91I\91ð\82³\82ê\82½\r
411                         // \83_\83C\83A\83\8d\83O\83{\83b\83N\83X\82ð\8fÁ\82·\r
412                         EndDialog( hDlg, 0 );\r
413                         break;\r
414                 }\r
415                 return TRUE;\r
416         }\r
417 \r
418         return FALSE;  // DefWindowProc()\82Å\82Í\82È\82­\81AFALSE\82ð\95Ô\82·\82±\82Æ\81I\r
419 #undef TIMER_ID     \r
420 #undef TIMER_ELAPSE \r
421 }\r
422 \r
423 \r
424 static void doTransferRemoteFile(void)\r
425 {\r
426         FILELIST *FileListBase, *FileListBaseNoExpand, *pf;\r
427         int CancelFlg = NO;\r
428         char LocDir[FMAX_PATH+1];\r
429         char TmpDir[FMAX_PATH+1];\r
430         char buf[32];\r
431         int i;\r
432         DWORD pid;\r
433 \r
434         // \82·\82Å\82É\83\8a\83\82\81[\83g\82©\82ç\93]\91\97\8dÏ\82Ý\82È\82ç\89½\82à\82µ\82È\82¢\81B(2007.9.3 yutaka)\r
435         if (remoteFileListBase != NULL)\r
436                 return;\r
437 \r
438         FileListBase = NULL;\r
439         MakeSelectedFileList(WIN_REMOTE, YES, NO, &FileListBase, &CancelFlg);\r
440         FileListBaseNoExpand = NULL;\r
441         MakeSelectedFileList(WIN_REMOTE, NO, NO, &FileListBaseNoExpand, &CancelFlg);\r
442 \r
443         // set temporary folder\r
444         AskLocalCurDir(LocDir, FMAX_PATH);\r
445 \r
446         // \83A\83v\83\8a\82ð\91½\8fd\8bN\93®\82µ\82Ä\82à\83R\83\93\83t\83\8a\83N\83g\82µ\82È\82¢\82æ\82¤\82É\81A\83e\83\93\83|\83\89\83\8a\83t\83H\83\8b\83_\96¼\82É\83v\83\8d\83Z\83XID\r
447         // \82ð\95t\89Á\82·\82é\81B(2007.9.13 yutaka)\r
448         GetTempPath(sizeof(TmpDir), TmpDir);\r
449         pid = GetCurrentProcessId();\r
450         _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid);\r
451         strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE);\r
452         _mkdir(TmpDir);\r
453 #if 0\r
454         if (TmpDir[strlen(TmpDir) - 1] == '\\') {\r
455                 TmpDir[strlen(TmpDir) - 1] = '\0';\r
456         }\r
457 #endif\r
458 \r
459         // \8aù\91\82Ì\83t\83@\83C\83\8b\82ð\8dí\8f\9c\82·\82é\r
460         for (pf = FileListBase ; pf ; pf = pf->Next) {\r
461                 char fn[FMAX_PATH+1];\r
462 \r
463                 strncpy_s(fn, sizeof(fn), TmpDir, _TRUNCATE);\r
464                 strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);\r
465                 strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);\r
466 \r
467                 remove(fn);\r
468         }\r
469 \r
470         // \83_\83E\83\93\83\8d\81[\83h\90æ\82ð\83e\83\93\83|\83\89\83\8a\82É\90Ý\92è\r
471         SetLocalDirHist(TmpDir);\r
472 \r
473         // FFFTP\82É\83_\83E\83\93\83\8d\81[\83h\97v\8b\81\82ð\8fo\82µ\81A\83_\83E\83\93\83\8d\81[\83h\82Ì\8a®\97¹\82ð\91Ò\82Â\81B\r
474         PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);\r
475 \r
476         for (i = 0 ; i < 10 ; i++) {\r
477                 MSG msg;\r
478 \r
479                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {\r
480                         TranslateMessage(&msg);\r
481                         DispatchMessage(&msg);\r
482 \r
483                 } else {\r
484                         // \93]\91\97\83X\83\8c\83b\83h\82ª\93®\82«\8fo\82µ\82½\82ç\94²\82¯\82é\81B\r
485                         if (AskTransferNow() == YES)\r
486                                 break;\r
487                 }\r
488 \r
489                 Sleep(10);\r
490         }\r
491 \r
492         // OLE D&D\92\86\82É\83\81\83C\83\93\83E\83B\83\93\83h\83E\82ð\83\86\81[\83U\82É\91\80\8dì\82³\82¹\82é\82Æ\81A\82¨\82©\82µ\82­\82È\82é\82Ì\82Å\81A\r
493         // \89B\82µ\83\82\81[\83_\83\8b\83_\83C\83A\83\8d\83O\82ð\8dì\82é\81B\r
494         // (2007.9.11 yutaka)\r
495         DialogBox(GetFtpInst(), MAKEINTRESOURCE(IDD_OLEDRAG), GetMainHwnd(), (DLGPROC)doOleDlgProc);\r
496 \r
497         // \83_\83E\83\93\83\8d\81[\83h\90æ\82ð\8c³\82É\96ß\82·\r
498         SetLocalDirHist(LocDir);\r
499         SetCurrentDirAsDirHist();\r
500 \r
501         remoteFileListBase = FileListBase;  // \82 \82Æ\82Å\83t\83\8a\81[\82·\82é\82±\82Æ\r
502         remoteFileListBaseNoExpand = FileListBaseNoExpand;  // \82 \82Æ\82Å\83t\83\8a\81[\82·\82é\82±\82Æ\r
503         strncpy_s(remoteFileDir, sizeof(remoteFileDir), TmpDir, _TRUNCATE);\r
504 \r
505 #if 0\r
506         // add temporary list\r
507         if (remoteFileListBase != NULL) {\r
508                 FILELIST *pf = remoteFileListBase;\r
509                 char fn[FMAX_PATH + 1];\r
510                 while (pf) {\r
511                         strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE);\r
512                         strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);\r
513                         strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);\r
514                         AddTempFileList(fn);\r
515                         pf = pf->Next;\r
516                 }\r
517         }\r
518 #endif\r
519 }\r
520 \r
521 \r
522 int isDirectory(char *fn)\r
523 {\r
524         struct _stat buf;\r
525 \r
526         if (_stat(fn, &buf) == 0) {\r
527                 if (buf.st_mode & _S_IFDIR) { // is directory\r
528                         return 1;\r
529                 }\r
530         }\r
531         return 0;\r
532 }\r
533 \r
534 // \83e\83\93\83|\83\89\83\8a\82Ì\83t\83@\83C\83\8b\82¨\82æ\82Ñ\83t\83H\83\8b\83_\82ð\8dí\8f\9c\82·\82é\81B\r
535 void doDeleteRemoteFile(void)\r
536 {\r
537         if (remoteFileListBase != NULL) {\r
538 #if 0\r
539                 int dirs = 0;\r
540                 int i, count;\r
541                 FILELIST *pf = remoteFileListBase;\r
542                 char fn[FMAX_PATH + 1];\r
543                 while (pf) {\r
544                         strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE);\r
545                         strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);\r
546                         strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);\r
547                         if (isDirectory(fn)) {\r
548                                 dirs++;\r
549                         } else {\r
550                                 remove(fn);\r
551                         }\r
552                         pf = pf->Next;\r
553                 }\r
554 \r
555                 count = 0;\r
556                 for (i = 0 ; i < 1000 ; i++) {\r
557                         pf = remoteFileListBase;\r
558                         while (pf) {\r
559                                 strncpy_s(fn, sizeof(fn), remoteFileDir, _TRUNCATE);\r
560                                 strncat_s(fn, sizeof(fn), "\\", _TRUNCATE);\r
561                                 strncat_s(fn, sizeof(fn), pf->File, _TRUNCATE);\r
562                                 if (isDirectory(fn)) {\r
563                                         if (_rmdir(fn) == 0) { // \83f\83B\83\8c\83N\83g\83\8a\82ð\8fÁ\82¹\82½\82ç\83J\83E\83\93\83g\83A\83b\83v\r
564                                                 count++;\r
565                                                 if (count >= dirs)  // \82·\82×\82Ä\8fÁ\82¹\82½\82ç\8fI\82í\82è\r
566                                                         goto skip;\r
567                                         }\r
568                                 }\r
569                                 pf = pf->Next;\r
570                         }\r
571                 }\r
572 skip:\r
573                 _rmdir(remoteFileDir);  // \8e©\95ª\82Å\8dì\82Á\82½\83f\83B\83\8c\83N\83g\83\8a\82à\8fÁ\82·\r
574 #else\r
575                 SHFILEOPSTRUCT FileOp = { NULL, FO_DELETE, remoteFileDir, NULL, \r
576                         FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI, \r
577                         FALSE, NULL, NULL };    \r
578                 SHFileOperation(&FileOp);\r
579 #endif\r
580 \r
581                 DeleteFileList(&remoteFileListBase);\r
582                 remoteFileListBase = NULL;\r
583         }\r
584 \r
585         if (remoteFileListBaseNoExpand != NULL) {\r
586                 DeleteFileList(&remoteFileListBaseNoExpand);\r
587                 remoteFileListBaseNoExpand = NULL;\r
588         }\r
589 }\r
590 \r
591 \r
592 // yutaka\r
593 // cf. http://www.nakka.com/lib/\r
594 /* \83h\83\8d\83b\83v\83t\83@\83C\83\8b\82Ì\8dì\90¬ */\r
595 static HDROP APIPRIVATE CreateDropFileMem(char **FileName,int cnt,BOOL fWide)\r
596 {\r
597         HDROP hDrop;\r
598         LPDROPFILES lpDropFile;\r
599         wchar_t wbuf[BUF_SIZE];\r
600         int flen = 0;\r
601         int i;\r
602         \r
603         if(fWide == TRUE){\r
604                 /* \83\8f\83C\83h\83L\83\83\83\89 */\r
605                 for(i = 0;i < cnt;i++){\r
606                         MultiByteToWideChar(CP_ACP,0,FileName[i],-1,wbuf,BUF_SIZE);\r
607                         flen += (wcslen(wbuf) + 1) * sizeof(wchar_t);\r
608                 }\r
609                 flen++;\r
610         }else{\r
611                 /* \83}\83\8b\83`\83o\83C\83g */\r
612                 for(i = 0;i < cnt;i++){\r
613                         flen += lstrlen(FileName[i]) + 1;\r
614                 }\r
615         }\r
616 \r
617         hDrop = (HDROP)GlobalAlloc(GHND,sizeof(DROPFILES) + flen + 1);\r
618         if (hDrop == NULL){\r
619                 return NULL;\r
620         }\r
621 \r
622         lpDropFile = (LPDROPFILES) GlobalLock(hDrop);\r
623         lpDropFile->pFiles = sizeof(DROPFILES);         /* \83t\83@\83C\83\8b\96¼\82Ì\83\8a\83X\83g\82Ü\82Å\82Ì\83I\83t\83Z\83b\83g */\r
624         lpDropFile->pt.x = 0;\r
625         lpDropFile->pt.y = 0;\r
626         lpDropFile->fNC = FALSE;\r
627         lpDropFile->fWide = fWide;                                      /* \83\8f\83C\83h\83L\83\83\83\89\82Ì\8fê\8d\87\82Í TRUE */\r
628 \r
629         /* \8d\\91¢\91Ì\82Ì\8cã\82ë\82É\83t\83@\83C\83\8b\96¼\82Ì\83\8a\83X\83g\82ð\83R\83s\81[\82·\82é\81B(\83t\83@\83C\83\8b\96¼\0\83t\83@\83C\83\8b\96¼\0\83t\83@\83C\83\8b\96¼\0\0) */\r
630         if(fWide == TRUE){\r
631                 /* \83\8f\83C\83h\83L\83\83\83\89 */\r
632                 wchar_t *buf;\r
633 \r
634                 buf = (wchar_t *)(&lpDropFile[1]);\r
635                 for(i = 0;i < cnt;i++){\r
636                         MultiByteToWideChar(CP_ACP,0,FileName[i],-1,wbuf,BUF_SIZE);\r
637                         wcscpy(buf,wbuf);\r
638                         buf += wcslen(wbuf) + 1;\r
639                 }\r
640         }else{\r
641                 /* \83}\83\8b\83`\83o\83C\83g */\r
642                 char *buf;\r
643 \r
644                 buf = (char *)(&lpDropFile[1]);\r
645                 for(i = 0;i < cnt;i++){\r
646                         lstrcpy(buf,FileName[i]);\r
647                         buf += lstrlen(FileName[i]) + 1;\r
648                 }\r
649         }\r
650 \r
651         GlobalUnlock(hDrop);\r
652         return(hDrop);\r
653 }\r
654 \r
655 \r
656 // OLE D&D\82ð\8aJ\8en\82·\82é \r
657 // (2007.8.30 yutaka)\r
658 static void doDragDrop(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
659 {\r
660         UINT cf[CF_CNT];\r
661         POINT pt;\r
662         int ret;\r
663 \r
664         // \83e\83\93\83|\83\89\83\8a\82ð\82«\82ê\82¢\82É\82·\82é (2007.9.3 yutaka)\r
665         doDeleteRemoteFile();\r
666 \r
667         /* \83h\83\89\83b\83O&\83h\83\8d\83b\83v\82Ì\8aJ\8en */\r
668         cf[0] = CF_HDROP;\r
669         cf[1] = CF_HDROP;       /* \83t\83@\83C\83\8b */\r
670         if((ret = OLE_IDropSource_Start(hWnd,WM_GETDATA, WM_DRAGOVER, cf,1,DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK)) == DROPEFFECT_MOVE){\r
671         }\r
672 \r
673         // \83h\83\8d\83b\83v\90æ\82Ì\83A\83v\83\8a\82É WM_LBUTTONUP \82ð\94ò\82Î\82·\81B\r
674         GetCursorPos(&pt);\r
675         ScreenToClient(hWnd, &pt);\r
676         PostMessage(hWnd,WM_LBUTTONUP,0,MAKELPARAM(pt.x,pt.y));\r
677 }\r
678 \r
679 \r
680 \r
681 /*----- \83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\82Ì\8b¤\92Ê\83\81\83b\83Z\81[\83W\8f\88\97\9d ----------------------------\r
682 *\r
683 *       Parameter\r
684 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
685 *               UINT message  : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
686 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
687 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
688 *\r
689 *       Return Value\r
690 *               \83\81\83b\83Z\81[\83W\82É\91Î\89\9e\82·\82é\96ß\82è\92l\r
691 *----------------------------------------------------------------------------*/\r
692 \r
693 static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
694 {\r
695         POINT Point;\r
696         HWND hWndPnt;\r
697         HWND hWndParent;\r
698         static HCURSOR hCsrDrg;\r
699         static HCURSOR hCsrNoDrg;\r
700         static POINT DragPoint;\r
701         static HWND hWndDragStart;\r
702         static int RemoteDropFileIndex = -1;\r
703         int Win;\r
704         HWND hWndDst;\r
705         WNDPROC ProcPtr;\r
706         HWND hWndHistEdit;\r
707 \r
708         Win = WIN_LOCAL;\r
709         hWndDst = hWndListRemote;\r
710         ProcPtr = LocalProcPtr;\r
711         hWndHistEdit = GetLocalHistEditHwnd();\r
712         if(hWnd == hWndListRemote)\r
713         {\r
714                 Win = WIN_REMOTE;\r
715                 hWndDst = hWndListLocal;\r
716                 ProcPtr = RemoteProcPtr;\r
717                 hWndHistEdit = GetRemoteHistEditHwnd();\r
718         }\r
719 \r
720         switch (message)\r
721         {\r
722         case WM_SYSKEYDOWN:\r
723                         if (wParam == 'D') {    // Alt+D\r
724                                 SetFocus(hWndHistEdit);\r
725                                 break;\r
726                         }\r
727                         EraseListViewTips();\r
728                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
729 \r
730         case WM_KEYDOWN:\r
731                         if(wParam == 0x09)\r
732                         {\r
733                                 SetFocus(hWndDst);\r
734                                 break;\r
735                         }\r
736                         EraseListViewTips();\r
737                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
738 \r
739                 case WM_SETFOCUS :\r
740                         SetFocusHwnd(hWnd);\r
741                         MakeButtonsFocus();\r
742                         DispCurrentWindow(Win);\r
743                         DispSelectedSpace();\r
744                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
745 \r
746                 case WM_KILLFOCUS :\r
747                         EraseListViewTips();\r
748                         MakeButtonsFocus();\r
749                         DispCurrentWindow(-1);\r
750                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
751 \r
752                 case WM_DROPFILES :\r
753                         // \83h\83\89\83b\83O\92\86\82Í\8f\88\97\9d\82µ\82È\82¢\81B\83h\83\89\83b\83O\8cã\82ÉWM_LBUTTONDOWN\82ª\94ò\82ñ\82Å\82­\82é\82½\82ß\81A\82»\82±\82Å\8f\88\97\9d\82·\82é\81B\r
754                         if (Dragging == YES) \r
755                                 return (FALSE);\r
756 \r
757                         if(hWnd == hWndListRemote)\r
758                         {\r
759                                 if(AskConnecting() == YES)\r
760                                         UpLoadDragProc(wParam);\r
761                         }\r
762                         else if(hWnd == hWndListLocal)\r
763                         {\r
764                                 ChangeDirDropFileProc(wParam);\r
765                         }\r
766                         break;\r
767 \r
768                 case WM_LBUTTONDOWN :\r
769                         EraseListViewTips();\r
770                         SetFocus(hWnd);\r
771                         DragPoint.x = LOWORD(lParam);\r
772                         DragPoint.y = HIWORD(lParam);\r
773                         hWndDragStart = hWnd;\r
774                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
775                         break;\r
776 \r
777                 case WM_LBUTTONUP :\r
778                         if(Dragging == YES)\r
779                         {\r
780                                 Dragging = NO;\r
781                                 ReleaseCapture();\r
782                                 hCsrDrg = LoadCursor(NULL, IDC_ARROW);\r
783                                 SetCursor(hCsrDrg);\r
784 \r
785                                 Point.x = (long)(short)LOWORD(lParam);\r
786                                 Point.y = (long)(short)HIWORD(lParam);\r
787                                 ClientToScreen(hWnd, &Point);\r
788                                 hWndPnt = WindowFromPoint(Point);\r
789                                 if(hWndPnt == hWndDst)  // local <-> remote \r
790                                 {\r
791                                         if(hWndPnt == hWndListRemote) {\r
792                                                 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_UPLOAD, 0), 0);\r
793                                         } else if(hWndPnt == hWndListLocal) {\r
794                                                 PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(MENU_DOWNLOAD, 0), 0);\r
795                                         }\r
796                                 } else { // \93¯\88ê\83E\83B\83\93\83h\83E\93à\82Ì\8fê\8d\87 (yutaka)\r
797                                         if (hWndDragStart == hWndListRemote && hWndPnt == hWndListRemote) {\r
798                                                 // remote <-> remote\82Ì\8fê\8d\87\82Í\81A\83T\81[\83o\82Å\82Ì\83t\83@\83C\83\8b\82Ì\88Ú\93®\82ð\8ds\82¤\81B(2007.9.5 yutaka)\r
799                                                 if (RemoteDropFileIndex != -1) {\r
800                                                         ListView_SetItemState(hWnd, RemoteDropFileIndex, 0, LVIS_DROPHILITED);\r
801                                                         MoveRemoteFileProc(RemoteDropFileIndex);\r
802                                                 }\r
803 \r
804                                         }\r
805 \r
806                                 }\r
807                         }\r
808                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
809 \r
810                 case WM_DRAGDROP:  \r
811                         // OLE D&D\82ð\8aJ\8en\82·\82é (yutaka)\r
812                         doDragDrop(hWnd, message, wParam, lParam);\r
813                         return (TRUE);\r
814                         break;\r
815  \r
816                 case WM_GETDATA:  // \83t\83@\83C\83\8b\82Ì\83p\83X\82ðD&D\90æ\82Ì\83A\83v\83\8a\82Ö\95Ô\82· (yutaka)\r
817                         switch(wParam)\r
818                         {\r
819                         case CF_HDROP:          /* \83t\83@\83C\83\8b */\r
820                                 {\r
821                                         OSVERSIONINFO os_info;\r
822                                         BOOL NTFlag = FALSE;\r
823                                         char **FileNameList;\r
824                                         int filelen;\r
825                                         int i, j, filenum = 0;\r
826  \r
827                                         FILELIST *FileListBase, *FileListBaseNoExpand, *pf;\r
828                                         int CancelFlg = NO;\r
829                                         char LocDir[FMAX_PATH+1];\r
830                                         char *PathDir;\r
831  \r
832                                         // \83\8d\81[\83J\83\8b\91¤\82Å\91I\82Î\82ê\82Ä\82¢\82é\83t\83@\83C\83\8b\82ðFileListBase\82É\93o\98^\r
833                                         if (hWndDragStart == hWndListLocal) {\r
834                                                 AskLocalCurDir(LocDir, FMAX_PATH);\r
835                                                 PathDir = LocDir;\r
836  \r
837                                                 FileListBase = NULL;\r
838                                                 MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);                    \r
839  \r
840                                         } else if (hWndDragStart == hWndListRemote) {\r
841                                                 GetCursorPos(&Point);\r
842                                                 hWndPnt = WindowFromPoint(Point);\r
843                                                 hWndParent = GetParent(hWndPnt);\r
844                                                 if (hWndPnt == hWndListRemote || hWndPnt == hWndListLocal ||\r
845                                                         hWndParent == hWndListRemote || hWndParent == hWndListLocal) {\r
846                                                         FileListBase = NULL;\r
847  \r
848                                                 } else {\r
849                                                         // \91I\91ð\82³\82ê\82Ä\82¢\82é\83\8a\83\82\81[\83g\83t\83@\83C\83\8b\82Ì\83\8a\83X\83g\83A\83b\83v\r
850                                                         // \82±\82Ì\83^\83C\83~\83\93\83O\82Å\83\8a\83\82\81[\83g\82©\82ç\83\8d\81[\83J\83\8b\82Ì\88ê\8e\9e\83t\83H\83\8b\83_\82Ö\83_\83E\83\93\83\8d\81[\83h\82·\82é\r
851                                                         // (2007.8.31 yutaka)\r
852                                                         doTransferRemoteFile();\r
853                                                         PathDir = remoteFileDir;\r
854                                                         FileListBase = remoteFileListBase;\r
855                                                         FileListBaseNoExpand = remoteFileListBaseNoExpand;\r
856                                                 }\r
857  \r
858                                         } \r
859  \r
860                                         pf = FileListBaseNoExpand;\r
861                                         for (filenum = 0; pf ; filenum++) {\r
862                                                 pf = pf->Next;\r
863                                         }\r
864                                         // \83t\83@\83C\83\8b\82ª\96¢\91I\91ð\82Ì\8fê\8d\87\82Í\89½\82à\82µ\82È\82¢\81B(yutaka)\r
865                                         if (filenum <= 0) {\r
866                                                 *((HANDLE *)lParam) = NULL;\r
867                                                 return (FALSE);\r
868                                         }\r
869                                         \r
870                                         /* \83t\83@\83C\83\8b\96¼\82Ì\94z\97ñ\82ð\8dì\90¬\82·\82é */\r
871                                         FileNameList = (char **)GlobalAlloc(GPTR,sizeof(char *) * filenum);\r
872                                         if(FileNameList == NULL){\r
873                                                 abort();\r
874                                         }\r
875                                         pf = FileListBaseNoExpand;\r
876                                         for (j = 0; pf ; j++) {\r
877                                                 filelen = strlen(PathDir) + 1 + strlen(pf->File) + 1;\r
878                                                 FileNameList[j] = (char *)GlobalAlloc(GPTR, filelen);\r
879                                                 strncpy_s(FileNameList[j], filelen, PathDir, _TRUNCATE);\r
880                                                 strncat_s(FileNameList[j], filelen, "\\", _TRUNCATE);\r
881                                                 strncat_s(FileNameList[j], filelen, pf->File, _TRUNCATE);\r
882                                                 pf = pf->Next;\r
883 #if 0\r
884                                                 if (FileListBase->Node == NODE_DIR) { \r
885                                                         // \83t\83H\83\8b\83_\82ð\92Í\82ñ\82¾\8fê\8d\87\82Í\82»\82ê\88È\8d~\93W\8aJ\82µ\82È\82¢\r
886                                                         filenum = 1;\r
887                                                         break;\r
888                                                 }\r
889 #endif\r
890                                         }\r
891                                         \r
892                                         os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r
893                                         GetVersionEx(&os_info);\r
894                                         if(os_info.dwPlatformId == VER_PLATFORM_WIN32_NT){\r
895                                                 NTFlag = TRUE;\r
896                                         }\r
897  \r
898                                         /* \83h\83\8d\83b\83v\83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\8dì\90¬ */\r
899                                         /* NT\82Ì\8fê\8d\87\82ÍUNICODE\82É\82È\82é\82æ\82¤\82É\82·\82é */\r
900                                         *((HANDLE *)lParam) = CreateDropFileMem(FileNameList, filenum, NTFlag);\r
901  \r
902                                         /* \83t\83@\83C\83\8b\96¼\82Ì\94z\97ñ\82ð\89ð\95ú\82·\82é */\r
903                                         for (i = 0; i < filenum ; i++) {\r
904                                                 GlobalFree(FileNameList[i]);\r
905                                         }\r
906                                         GlobalFree(FileNameList);\r
907  \r
908                                         if (hWndDragStart == hWndListLocal) {\r
909                                                 DeleteFileList(&FileListBase);\r
910                                         } else {\r
911                                                 // \82 \82Æ\82Å\83t\83@\83C\83\8b\8dí\8f\9c\82µ\82Ä\83t\83\8a\81[\82·\82é\r
912                                         }\r
913  \r
914                                         return (TRUE);\r
915                                 }\r
916                                 break;\r
917  \r
918                         default:\r
919                                 *((HANDLE *)lParam) = NULL;\r
920                                 break;\r
921                         }\r
922  \r
923                         break;\r
924 \r
925                 case WM_DRAGOVER:\r
926                         {\r
927                                 LVHITTESTINFO hi;\r
928                                 int Node, index;\r
929                                 static int prev_index = -1;\r
930 \r
931                                 // \93¯\88ê\83E\83B\83\93\83h\83E\93à\82Å\82ÌD&D\82Í\83\8a\83\82\81[\83g\91¤\82Ì\82Ý\r
932                                 if (Win != WIN_REMOTE)\r
933                                         break;\r
934 \r
935                                 if(MoveMode == MOVE_DISABLE)\r
936                                         break;\r
937 \r
938                                 memset(&hi, 0, sizeof(hi));\r
939 \r
940                                 GetCursorPos(&Point);\r
941                                 hWndPnt = WindowFromPoint(Point);\r
942                                 ScreenToClient(hWnd, &Point);\r
943 \r
944                                 hi.pt = Point;\r
945 \r
946                                 // \88È\91O\82Ì\91I\91ð\82ð\8fÁ\82·\r
947                                 ListView_SetItemState(hWnd, prev_index, 0, LVIS_DROPHILITED);\r
948                                 RemoteDropFileIndex = -1;\r
949 \r
950                                 if ((hWndPnt == hWndListRemote) && (ListView_HitTest(hWnd, &hi) != -1)) {\r
951                                         if (hi.flags == LVHT_ONITEMLABEL) { // The position is over a list-view item's text.\r
952                                         \r
953                                                 index = hi.iItem;\r
954                                                 prev_index = index;\r
955                                                 Node = GetNodeType(Win, index);\r
956                                                 if (Node == NODE_DIR) {\r
957                                                         ListView_SetItemState(hWnd, index, LVIS_DROPHILITED, LVIS_DROPHILITED);\r
958                                                         RemoteDropFileIndex = index;\r
959                                                 }\r
960                                         }\r
961                                 } \r
962 \r
963                         }\r
964                         break;\r
965 \r
966                 case WM_RBUTTONDOWN :\r
967                         /* \82±\82±\82Å\83t\83@\83C\83\8b\82ð\91I\82Ô */\r
968                         CallWindowProc(ProcPtr, hWnd, message, wParam, lParam);\r
969 \r
970                         EraseListViewTips();\r
971                         SetFocus(hWnd);\r
972                         if(hWnd == hWndListRemote)\r
973                                 RemoteRbuttonMenu(0);\r
974                         else if(hWnd == hWndListLocal)\r
975                                 LocalRbuttonMenu(0);\r
976                         break;\r
977 \r
978                 case WM_LBUTTONDBLCLK :\r
979                         DoubleClickProc(Win, NO, -1);\r
980                         break;\r
981 \r
982                 case WM_MOUSEMOVE :\r
983                         if(wParam == MK_LBUTTON)\r
984                         {\r
985                                 if((Dragging == NO) && \r
986                                    (hWnd == hWndDragStart) &&\r
987                                    (AskConnecting() == YES) &&\r
988                                    (SendMessage(hWnd, LVM_GETSELECTEDCOUNT, 0, 0) > 0) &&\r
989                                    ((abs((short)LOWORD(lParam) - DragPoint.x) > 5) ||\r
990                                         (abs((short)HIWORD(lParam) - DragPoint.y) > 5)))\r
991                                 {\r
992                                         SetCapture(hWnd);\r
993                                         Dragging = YES;\r
994                                         hCsrDrg = LoadCursor(GetFtpInst(), MAKEINTRESOURCE(drag_csr));\r
995                                         hCsrNoDrg = LoadCursor(GetFtpInst(), MAKEINTRESOURCE(nodrop_csr));\r
996                                         SetCursor(hCsrDrg);\r
997                                 }\r
998                                 else if(Dragging == YES)\r
999                                 {\r
1000                                         Point.x = (long)(short)LOWORD(lParam);\r
1001                                         Point.y = (long)(short)HIWORD(lParam);\r
1002                                         ClientToScreen(hWnd, &Point);\r
1003                                         hWndPnt = WindowFromPoint(Point);\r
1004                                         if((hWndPnt == hWndListRemote) || (hWndPnt == hWndListLocal))\r
1005                                                 SetCursor(hCsrDrg);\r
1006                                         else {\r
1007                                                 // \83}\83E\83X\83|\83C\83\93\83^\82Ì\81~\95\\8e¦\82ð\82â\82ß\82é (yutaka)\r
1008 #if 0\r
1009                                                 SetCursor(hCsrNoDrg);\r
1010 #endif\r
1011                                         }\r
1012 \r
1013                                         // OLE D&D\82Ì\8aJ\8en\82ð\8ew\8e¦\82·\82é\r
1014                                         PostMessage(hWnd, WM_DRAGDROP, MAKEWPARAM(wParam, lParam), 0);\r
1015 \r
1016                                 }\r
1017                                 else\r
1018                                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
1019                         }\r
1020                         else\r
1021                         {\r
1022                                 CheckTipsDisplay(hWnd, lParam);\r
1023                                 return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
1024                         }\r
1025                         break;\r
1026 \r
1027                 case WM_MOUSEWHEEL :\r
1028                         if(Dragging == NO)\r
1029                         {\r
1030                 short zDelta = (short)HIWORD(wParam);\r
1031 \r
1032                                 EraseListViewTips();\r
1033                                 Point.x = (short)LOWORD(lParam);\r
1034                                 Point.y = (short)HIWORD(lParam);\r
1035                                 hWndPnt = WindowFromPoint(Point);\r
1036 \r
1037                                 if((wParam & MAKEWPARAM(MK_SHIFT, 0)) && \r
1038                                    ((hWndPnt == hWndListRemote) ||\r
1039                                         (hWndPnt == hWndListLocal) || \r
1040                                         (hWndPnt == GetTaskWnd())))\r
1041                                 {\r
1042                                         PostMessage(hWndPnt, WM_VSCROLL, zDelta > 0 ? MAKEWPARAM(SB_PAGEUP, 0) : MAKEWPARAM(SB_PAGEDOWN, 0), 0);\r
1043 //                                      PostMessage(hWndPnt, WM_VSCROLL, MAKEWPARAM(SB_ENDSCROLL, 0), 0);\r
1044                                 }\r
1045                                 else if(hWndPnt == hWnd)\r
1046                                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
1047                                 else if((hWndPnt == hWndDst) || (hWndPnt == GetTaskWnd()))\r
1048                                         PostMessage(hWndPnt, message, wParam, lParam);\r
1049                         }\r
1050                         break;\r
1051 \r
1052                 default :\r
1053                         return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
1054         }\r
1055     return(0L);\r
1056 }\r
1057 \r
1058 \r
1059 /*----- \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\83^\83u\95\9d\82ð\8eæ\93¾\82·\82é --------------------------------------\r
1060 *\r
1061 *       Parameter\r
1062 *               \82È\82µ\r
1063 *\r
1064 *       Return Value\r
1065 *               \82È\82µ\r
1066 *----------------------------------------------------------------------------*/\r
1067 \r
1068 void GetListTabWidth(void)\r
1069 {\r
1070         LV_COLUMN LvCol;\r
1071         int i;\r
1072 \r
1073         for(i = 0; i <= 3; i++)\r
1074         {\r
1075                 LvCol.mask = LVCF_WIDTH;\r
1076                 if(SendMessage(hWndListLocal, LVM_GETCOLUMN, i, (LPARAM)&LvCol) == TRUE)\r
1077                         LocalTabWidth[i] = LvCol.cx;\r
1078         }\r
1079 \r
1080         for(i = 0; i <= 5; i++)\r
1081         {\r
1082                 LvCol.mask = LVCF_WIDTH;\r
1083                 if(SendMessage(hWndListRemote, LVM_GETCOLUMN, i, (LPARAM)&LvCol) == TRUE)\r
1084                         RemoteTabWidth[i] = LvCol.cx;\r
1085         }\r
1086         return;\r
1087 }\r
1088 \r
1089 \r
1090 /*----- \83t\83@\83C\83\8b\88ê\97\97\95û\96@\82É\82µ\82½\82ª\82Á\82Ä\83\8a\83X\83g\83r\83\85\81[\82ð\90Ý\92è\82·\82é --------------------\r
1091 *\r
1092 *       Parameter\r
1093 *               \82È\82µ\r
1094 *\r
1095 *       Return Value\r
1096 *               \82È\82µ\r
1097 *----------------------------------------------------------------------------*/\r
1098 \r
1099 void SetListViewType(void)\r
1100 {\r
1101         long lStyle;\r
1102 \r
1103         switch(ListType)\r
1104         {\r
1105                 case LVS_LIST :\r
1106                         lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
1107                         lStyle &= ~(LVS_REPORT | LVS_LIST);\r
1108                         lStyle |= LVS_LIST;\r
1109                         SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
1110 \r
1111                         lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
1112                         lStyle &= ~(LVS_REPORT | LVS_LIST);\r
1113                         lStyle |= LVS_LIST;\r
1114                         SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
1115                         break;\r
1116 \r
1117                 default :\r
1118                         lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
1119                         lStyle &= ~(LVS_REPORT | LVS_LIST);\r
1120                         lStyle |= LVS_REPORT;\r
1121                         SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
1122 \r
1123                         lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
1124                         lStyle &= ~(LVS_REPORT | LVS_LIST);\r
1125                         lStyle |= LVS_REPORT;\r
1126                         SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
1127                         break;\r
1128         }\r
1129         return;\r
1130 }\r
1131 \r
1132 \r
1133 /*----- \83z\83X\83g\91¤\82Ì\83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\82É\83t\83@\83C\83\8b\96¼\82ð\83Z\83b\83g ------------------\r
1134 *\r
1135 *       Parameter\r
1136 *               int Mode : \83L\83\83\83b\83V\83\85\83\82\81[\83h (CACHE_xxx)\r
1137 *\r
1138 *       Return Value\r
1139 *               \82È\82µ\r
1140 *----------------------------------------------------------------------------*/\r
1141 \r
1142 void GetRemoteDirForWnd(int Mode, int *CancelCheckWork)\r
1143 {\r
1144         FILE *fd;\r
1145         LONGLONG Size;\r
1146         char Str[FMAX_PATH+1];\r
1147         char Buf[FMAX_PATH+1];\r
1148         FILETIME Time;\r
1149         int Attr;\r
1150         int Type;\r
1151         int ListType;\r
1152         int Num;\r
1153         FLISTANCHOR Anchor;\r
1154         char Owner[OWNER_NAME_LEN+1];\r
1155         int Link;\r
1156         int InfoExist;\r
1157 \r
1158 //#pragma aaa\r
1159 //DoPrintf("===== GetRemoteDirForWnd");\r
1160 \r
1161         Anchor.Top = NULL;\r
1162         Anchor.Files = 0;\r
1163 \r
1164         if(AskConnecting() == YES)\r
1165         {\r
1166 //              SetCursor(LoadCursor(NULL, IDC_WAIT));\r
1167                 DisableUserOpe();\r
1168 \r
1169                 AskRemoteCurDir(Buf, FMAX_PATH);\r
1170                 SetRemoteDirHist(Buf);\r
1171 \r
1172                 Type = FTP_COMPLETE;\r
1173                 if(Mode != CACHE_LASTREAD)\r
1174                 {\r
1175 \r
1176                         if((Num = AskCached(Buf)) == -1)\r
1177                         {\r
1178                                 Num = AskFreeCache();\r
1179                                 Mode = CACHE_REFRESH;\r
1180                         }\r
1181 \r
1182                         if(Mode == CACHE_REFRESH)\r
1183                         {\r
1184                                 if((Type = DoDirListCmdSkt("", "", Num, CancelCheckWork)) == FTP_COMPLETE)\r
1185                                         SetCache(Num, Buf);\r
1186                                 else\r
1187                                         ClearCache(Num);\r
1188                         }\r
1189                 }\r
1190                 else\r
1191                         Num = AskCurrentFileListNum();\r
1192 \r
1193                 if(Type == FTP_COMPLETE)\r
1194                 {\r
1195                         SetCurrentFileListNum(Num);\r
1196                         MakeCacheFileName(Num, Buf);\r
1197                         if((fd = fopen(Buf, "rb"))!=NULL)\r
1198                         {\r
1199                                 ListType = LIST_UNKNOWN;\r
1200 \r
1201                                 while(GetListOneLine(Str, FMAX_PATH, fd) == SUCCESS)\r
1202                                 {\r
1203                                         if((ListType = AnalizeFileInfo(Str)) != LIST_UNKNOWN)\r
1204                                         {\r
1205                                                 if((Type = ResolvFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE)\r
1206                                                 {\r
1207                                                         if(AskFilterStr(Buf, Type) == YES)\r
1208                                                         {\r
1209                                                                 if((DotFile == YES) || (Buf[0] != '.'))\r
1210                                                                 {\r
1211                                                                         AddDispFileList(&Anchor, Buf, &Time, Size, Attr, Type, Link, Owner, InfoExist, WIN_REMOTE);\r
1212                                                                 }\r
1213                                                         }\r
1214                                                 }\r
1215                                         }\r
1216                                 }\r
1217                                 fclose(fd);\r
1218 \r
1219                                 DispFileList2View(GetRemoteHwnd(), &Anchor);\r
1220                                 EraseDispFileList(&Anchor);\r
1221 \r
1222                                 // \90æ\93ª\82Ì\83A\83C\83e\83\80\82ð\91I\91ð\r
1223                                 ListView_SetItemState(GetRemoteHwnd(), 0, LVIS_FOCUSED, LVIS_FOCUSED);\r
1224                         }\r
1225                         else\r
1226                         {\r
1227                                 SetTaskMsg(MSGJPN048);\r
1228                                 SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0);\r
1229                         }\r
1230                 }\r
1231                 else\r
1232                 {\r
1233 #if defined(HAVE_OPENVMS)\r
1234                         /* OpenVMS\82Ì\8fê\8d\87\8bó\83f\83B\83\8c\83N\83g\83\8a\88Ú\93®\82Ì\8e\9e\82É\8fo\82é\82Ì\82Å\81A\83\81\83b\83Z\81[\83W\82¾\82¯\8fo\82³\82È\82¢\r
1235                          * \82æ\82¤\82É\82·\82é(VIEW\82Í\83N\83\8a\83A\82µ\82Ä\97Ç\82¢) */\r
1236                         if (AskHostType() != HTYPE_VMS)\r
1237 #endif\r
1238                         SetTaskMsg(MSGJPN049);\r
1239                         SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0);\r
1240                 }\r
1241 \r
1242 //              SetCursor(LoadCursor(NULL, IDC_ARROW));\r
1243                 EnableUserOpe();\r
1244 \r
1245         }\r
1246 \r
1247 //#pragma aaa\r
1248 //DoPrintf("===== GetRemoteDirForWnd Done");\r
1249 \r
1250         return;\r
1251 }\r
1252 \r
1253 \r
1254 /*----- \83\8d\81[\83J\83\8b\91¤\82Ì\83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\82É\83t\83@\83C\83\8b\96¼\82ð\83Z\83b\83g ----------------\r
1255 *\r
1256 *       Parameter\r
1257 *               \82È\82µ\r
1258 *\r
1259 *       Return Value\r
1260 *               \82È\82µ\r
1261 *----------------------------------------------------------------------------*/\r
1262 \r
1263 void GetLocalDirForWnd(void)\r
1264 {\r
1265         HANDLE fHnd;\r
1266         WIN32_FIND_DATA Find;\r
1267         char Scan[FMAX_PATH+1];\r
1268         char *Pos;\r
1269         char Buf[10];\r
1270         FILETIME Time;\r
1271         FLISTANCHOR Anchor;\r
1272         DWORD NoDrives;\r
1273         int Tmp;\r
1274 \r
1275         Anchor.Top = NULL;\r
1276         Anchor.Files = 0;\r
1277 \r
1278         DoLocalPWD(Scan);\r
1279         SetLocalDirHist(Scan);\r
1280         DispLocalFreeSpace(Scan);\r
1281 \r
1282         /* \83f\83B\83\8c\83N\83g\83\8a\81^\83t\83@\83C\83\8b */\r
1283 \r
1284         SetYenTail(Scan);\r
1285         strcat(Scan, "*");\r
1286         if((fHnd = FindFirstFileAttr(Scan, &Find, DispIgnoreHide)) != INVALID_HANDLE_VALUE)\r
1287         {\r
1288                 do\r
1289                 {\r
1290                         if((strcmp(Find.cFileName, ".") != 0) &&\r
1291                            (strcmp(Find.cFileName, "..") != 0))\r
1292                         {\r
1293                                 if((DotFile == YES) || (Find.cFileName[0] != '.'))\r
1294                                 {\r
1295                                         if(Find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\r
1296                                                 AddDispFileList(&Anchor, Find.cFileName, &Find.ftLastWriteTime, MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow), 0, NODE_DIR, NO, "", FINFO_ALL, WIN_LOCAL);\r
1297                                         else\r
1298                                         {\r
1299                                                 if(AskFilterStr(Find.cFileName, NODE_FILE) == YES)\r
1300                                                 {\r
1301                                                         AddDispFileList(&Anchor, Find.cFileName, &Find.ftLastWriteTime, MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow), 0, NODE_FILE, NO, "", FINFO_ALL, WIN_LOCAL);\r
1302                                                 }\r
1303                                         }\r
1304                                 }\r
1305                         }\r
1306                 }\r
1307                 while(FindNextFileAttr(fHnd, &Find, DispIgnoreHide) == TRUE);\r
1308                 FindClose(fHnd);\r
1309         }\r
1310 \r
1311         /* \83h\83\89\83C\83u */\r
1312         if(DispDrives)\r
1313         {\r
1314                 GetLogicalDriveStrings(FMAX_PATH, Scan);\r
1315                 NoDrives = LoadHideDriveListRegistory();\r
1316 \r
1317                 Pos = Scan;\r
1318                 while(*Pos != NUL)\r
1319                 {\r
1320                         Tmp = toupper(*Pos) - 'A';\r
1321                         if((NoDrives & (0x00000001 << Tmp)) == 0)\r
1322                         {\r
1323                                 sprintf(Buf, "%s", Pos);\r
1324                                 memset(&Time, 0, sizeof(FILETIME));\r
1325                                 AddDispFileList(&Anchor, Buf, &Time, 0, 0, NODE_DRIVE, NO, "", FINFO_ALL, WIN_LOCAL);\r
1326                         }\r
1327                         Pos = strchr(Pos, NUL) + 1;\r
1328                 }\r
1329         }\r
1330 \r
1331         DispFileList2View(GetLocalHwnd(), &Anchor);\r
1332         EraseDispFileList(&Anchor);\r
1333 \r
1334         // \90æ\93ª\82Ì\83A\83C\83e\83\80\82ð\91I\91ð\r
1335         ListView_SetItemState(GetLocalHwnd(), 0, LVIS_FOCUSED, LVIS_FOCUSED);\r
1336 \r
1337         return;\r
1338 }\r
1339 \r
1340 \r
1341 /*----- \83t\83@\83C\83\8b\8fî\95ñ\82ð\83t\83@\83C\83\8b\88ê\97\97\97p\83\8a\83X\83g\82É\93o\98^\82·\82é --------------------------\r
1342 *\r
1343 *       Parameter\r
1344 *               FLISTANCHOR *Anchor : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
1345 *               char *Name : \83t\83@\83C\83\8b\96¼\r
1346 *               FILETIME *Time : \93ú\95t\r
1347 *               LONGLONG Size : \83T\83C\83Y\r
1348 *               int Attr : \91®\90«\r
1349 *               int Type : \83^\83C\83v (NODE_xxxx)\r
1350 *               int Link : \83\8a\83\93\83N\82©\82Ç\82¤\82© (YES/NO)\r
1351 *               char *Owner : \83I\81[\83i\96¼\r
1352 *               int InfoExist : \8fî\95ñ\82ª\82 \82é\82©\82Ç\82¤\82© (FINFO_xxx)\r
1353 *               int Win : \83E\83B\83\93\83h\83E\94Ô\8d\86 (WIN_xxxx)\r
1354 *\r
1355 *       Return Value\r
1356 *               \82È\82µ\r
1357 *----------------------------------------------------------------------------*/\r
1358 \r
1359 static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win)\r
1360 {\r
1361         int i;\r
1362         FILELIST *Pos;\r
1363         FILELIST *Prev;\r
1364         FILELIST *New;\r
1365         int FileSort;\r
1366         int DirSort;\r
1367         int Sort;\r
1368         LONGLONG Cmp;\r
1369 \r
1370         FileSort = AskSortType(ITEM_LFILE);\r
1371         DirSort = AskSortType(ITEM_LDIR);\r
1372         if(Win == WIN_REMOTE)\r
1373         {\r
1374                 FileSort = AskSortType(ITEM_RFILE);\r
1375                 DirSort = AskSortType(ITEM_RDIR);\r
1376         }\r
1377 \r
1378         Pos = Anchor->Top;\r
1379         for(i = 0; i < Anchor->Files; i++)\r
1380         {\r
1381                 if((Type == NODE_DIR) && (Pos->Node == NODE_FILE))\r
1382                         break;\r
1383                 if((Type == NODE_FILE) && (Pos->Node == NODE_DRIVE))\r
1384                         break;\r
1385 \r
1386                 if(Type == Pos->Node)\r
1387                 {\r
1388                         if(Type == NODE_DIR)\r
1389                                 Sort = DirSort;\r
1390                         else\r
1391                                 Sort = FileSort;\r
1392 \r
1393                         if((Sort & SORT_GET_ORD) == SORT_ASCENT)\r
1394                         {\r
1395                                 if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
1396                                         ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||\r
1397                                    (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
1398                                         ((Cmp = Size - Pos->Size) < 0)) ||\r
1399                                    (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
1400                                         ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0)))\r
1401                                 {\r
1402                                         break;\r
1403                                 }\r
1404 \r
1405                                 if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))\r
1406                                 {\r
1407                                         if(_mbsicmp(Name, Pos->File) < 0)\r
1408                                                 break;\r
1409                                 }\r
1410                         }\r
1411                         else\r
1412                         {\r
1413                                 if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
1414                                         ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
1415                                    (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
1416                                         ((Cmp = Size - Pos->Size) > 0)) ||\r
1417                                    (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
1418                                         ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))\r
1419                                 {\r
1420                                         break;\r
1421                                 }\r
1422 \r
1423                                 if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))\r
1424                                 {\r
1425                                         if(_mbsicmp(Name, Pos->File) > 0)\r
1426                                                 break;\r
1427                                 }\r
1428                         }\r
1429                 }\r
1430                 Prev = Pos;\r
1431                 Pos = Pos->Next;\r
1432         }\r
1433 \r
1434         if((New = malloc(sizeof(FILELIST))) != NULL)\r
1435         {\r
1436                 strcpy(New->File, Name);\r
1437                 New->Node = Type;\r
1438                 New->Link = Link;\r
1439                 New->Size = Size;\r
1440                 New->Attr = Attr;\r
1441                 New->Time = *Time;\r
1442                 strcpy(New->Owner, Owner);\r
1443                 New->InfoExist = InfoExist;\r
1444 \r
1445                 if(Pos == Anchor->Top)\r
1446                 {\r
1447                         New->Next = Anchor->Top;\r
1448                         Anchor->Top = New;\r
1449                 }\r
1450                 else\r
1451                 {\r
1452                         New->Next = Prev->Next;\r
1453                         Prev->Next = New;\r
1454                 }\r
1455                 Anchor->Files += 1;\r
1456         }\r
1457         return;\r
1458 }\r
1459 \r
1460 \r
1461 /*----- \83t\83@\83C\83\8b\88ê\97\97\97p\83\8a\83X\83g\82ð\83N\83\8a\83A\82·\82é --------------------------------------\r
1462 *\r
1463 *       Parameter\r
1464 *               FLISTANCHOR *Anchor : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
1465 *\r
1466 *       Return Value\r
1467 *               \82È\82µ\r
1468 *----------------------------------------------------------------------------*/\r
1469 \r
1470 static void EraseDispFileList(FLISTANCHOR *Anchor)\r
1471 {\r
1472         FILELIST *Pos;\r
1473         FILELIST *Next;\r
1474         int i;\r
1475 \r
1476         Pos = Anchor->Top;\r
1477         for(i = 0; i < Anchor->Files; i++)\r
1478         {\r
1479                 Next = Pos->Next;\r
1480                 free(Pos);\r
1481                 Pos = Next;\r
1482         }\r
1483         Anchor->Files = 0;\r
1484         Anchor->Top = NULL;\r
1485         return;\r
1486 }\r
1487 \r
1488 \r
1489 /*----- \83t\83@\83C\83\8b\88ê\97\97\97p\83\8a\83X\83g\82Ì\93à\97e\82ð\83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\82É\83Z\83b\83g ------------\r
1490 *\r
1491 *       Parameter\r
1492 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1493 *               FLISTANCHOR *Anchor : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
1494 *\r
1495 *       Return Value\r
1496 *               \82È\82µ\r
1497 *----------------------------------------------------------------------------*/\r
1498 \r
1499 static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor)\r
1500 {\r
1501         int i;\r
1502         FILELIST *Pos;\r
1503 \r
1504         SendMessage(hWnd, WM_SETREDRAW, (WPARAM)FALSE, 0);\r
1505         SendMessage(hWnd, LVM_DELETEALLITEMS, 0, 0);\r
1506 \r
1507         Pos = Anchor->Top;\r
1508         for(i = 0; i < Anchor->Files; i++)\r
1509         {\r
1510                 AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist);\r
1511                 Pos = Pos->Next;\r
1512         }\r
1513 \r
1514         SendMessage(hWnd, WM_SETREDRAW, (WPARAM)TRUE, 0);\r
1515         UpdateWindow(hWnd);\r
1516 \r
1517         DispSelectedSpace();\r
1518         return;\r
1519 }\r
1520 \r
1521 \r
1522 /*----- \83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\81i\83\8a\83X\83g\83r\83\85\81[\81j\82É\92Ç\89Á --------------------------\r
1523 *\r
1524 *       Parameter\r
1525 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1526 *               int Pos : \91}\93ü\88Ê\92u\r
1527 *               char *Name : \96¼\91O\r
1528 *               int Type : \83^\83C\83v (NIDE_xxxx)\r
1529 *               LONGLONG Size : \83T\83C\83Y\r
1530 *               FILETIME *Time : \93ú\95t\r
1531 *               int Attr : \91®\90«\r
1532 *               char Owner : \83I\81[\83i\96¼\r
1533 *               int Link : \83\8a\83\93\83N\82©\82Ç\82¤\82©\r
1534 *               int InfoExist : \8fî\95ñ\82ª\82 \82é\82©\82Ç\82¤\82© (FINFO_xxx)\r
1535 *\r
1536 *       Return Value\r
1537 *               \82È\82µ\r
1538 *----------------------------------------------------------------------------*/\r
1539 \r
1540 static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist)\r
1541 {\r
1542         LV_ITEM LvItem;\r
1543         char Tmp[20];\r
1544 \r
1545         if(Pos == -1)\r
1546                 Pos = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0);\r
1547 \r
1548         /* \83A\83C\83R\83\93/\83t\83@\83C\83\8b\96¼ */\r
1549         LvItem.mask = LVIF_TEXT | LVIF_IMAGE;\r
1550         LvItem.iItem = Pos;\r
1551         LvItem.iSubItem = 0;\r
1552         LvItem.pszText = Name;\r
1553         if((Type == NODE_FILE) && (AskTransferTypeAssoc(Name, TYPE_X) == TYPE_I))\r
1554                 Type = 3;\r
1555         if(Link == NO)\r
1556                 LvItem.iImage = Type;\r
1557         else\r
1558                 LvItem.iImage = 4;\r
1559         LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem);\r
1560 \r
1561         /* \93ú\95t/\8e\9e\8d\8f */\r
1562         FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist);\r
1563         LvItem.mask = LVIF_TEXT;\r
1564         LvItem.iItem = Pos;\r
1565         LvItem.iSubItem = 1;\r
1566         LvItem.pszText = Tmp;\r
1567         LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
1568 \r
1569         /* \83T\83C\83Y */\r
1570         if(Type == NODE_DIR)\r
1571                 strcpy(Tmp, "<DIR>");\r
1572         else if(Type == NODE_DRIVE)\r
1573                 strcpy(Tmp, "<DRIVE>");\r
1574         else if(Size >= 0)\r
1575                 MakeNumString(Size, Tmp, TRUE);\r
1576         else\r
1577                 strcpy(Tmp, "");\r
1578         LvItem.mask = LVIF_TEXT;\r
1579         LvItem.iItem = Pos;\r
1580         LvItem.iSubItem = 2;\r
1581         LvItem.pszText = Tmp;\r
1582         LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
1583 \r
1584         /* \8ag\92£\8eq */\r
1585         LvItem.mask = LVIF_TEXT;\r
1586         LvItem.iItem = Pos;\r
1587         LvItem.iSubItem = 3;\r
1588         LvItem.pszText = GetFileExt(Name);\r
1589         LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
1590 \r
1591         if(hWnd == GetRemoteHwnd())\r
1592         {\r
1593                 /* \91®\90« */\r
1594                 strcpy(Tmp, "");\r
1595                 if(InfoExist & FINFO_ATTR)\r
1596                         AttrValue2String(Attr, Tmp);\r
1597                 LvItem.mask = LVIF_TEXT;\r
1598                 LvItem.iItem = Pos;\r
1599                 LvItem.iSubItem = 4;\r
1600                 LvItem.pszText = Tmp;\r
1601                 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
1602 \r
1603                 /* \83I\81[\83i\96¼ */\r
1604                 LvItem.mask = LVIF_TEXT;\r
1605                 LvItem.iItem = Pos;\r
1606                 LvItem.iSubItem = 5;\r
1607                 LvItem.pszText = Owner;\r
1608                 LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
1609         }\r
1610         return;\r
1611 }\r
1612 \r
1613 \r
1614 /*----- \83t\83@\83C\83\8b\96¼\88ê\97\97\83E\83C\83\93\83h\83E\82ð\83\\81[\83g\82µ\92¼\82· --------------------------------\r
1615 *\r
1616 *       Parameter\r
1617 *               int Win : \83E\83B\83\93\83h\83E\94Ô\8d\86 (WIN_xxxx)\r
1618 *\r
1619 *       Return Value\r
1620 *               \82È\82µ\r
1621 *----------------------------------------------------------------------------*/\r
1622 \r
1623 void ReSortDispList(int Win, int *CancelCheckWork)\r
1624 {\r
1625         if(Win == WIN_REMOTE)\r
1626                 GetRemoteDirForWnd(CACHE_LASTREAD, CancelCheckWork);\r
1627         else\r
1628                 GetLocalDirForWnd();\r
1629         return;\r
1630 }\r
1631 \r
1632 \r
1633 /*----- \83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\82Ì\83t\83@\83C\83\8b\82ð\91I\91ð\82·\82é ----------------------------\r
1634 *\r
1635 *       Parameter\r
1636 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1637 *               int Type : \91I\91ð\95û\96@ (SELECT_xxx)\r
1638 *\r
1639 *       Return Value\r
1640 *               \82È\82µ\r
1641 *----------------------------------------------------------------------------*/\r
1642 \r
1643 void SelectFileInList(HWND hWnd, int Type)\r
1644 {\r
1645         int Win;\r
1646         int WinDst;\r
1647         int i;\r
1648         int Num;\r
1649         char RegExp[FMAX_PATH+1];\r
1650         char Name[FMAX_PATH+1];\r
1651         LV_ITEM LvItem;\r
1652         int CsrPos;\r
1653         FILETIME Time1;\r
1654         FILETIME Time2;\r
1655         int Find;\r
1656 \r
1657         Win = WIN_LOCAL;\r
1658         WinDst = WIN_REMOTE;\r
1659         if(hWnd == GetRemoteHwnd())\r
1660         {\r
1661                 Win = WIN_REMOTE;\r
1662                 WinDst = WIN_LOCAL;\r
1663         }\r
1664 \r
1665         Num = GetItemCount(Win);\r
1666         switch(Type)\r
1667         {\r
1668                 case SELECT_ALL :\r
1669                         LvItem.state = 0;\r
1670                         if(GetSelectedCount(Win) <= 1)\r
1671                                 LvItem.state = LVIS_SELECTED;\r
1672                         for(i = 0; i < Num; i++)\r
1673                         {\r
1674                                 if(GetNodeType(Win, i) != NODE_DRIVE)\r
1675                                 {\r
1676                                         LvItem.mask = LVIF_STATE;\r
1677                                         LvItem.iItem = i;\r
1678                                         LvItem.stateMask = LVIS_SELECTED;\r
1679                                         LvItem.iSubItem = 0;\r
1680                                         SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
1681                                 }\r
1682                         }\r
1683                         break;\r
1684 \r
1685                 case SELECT_REGEXP :\r
1686                         if(((Win == WIN_LOCAL) &&\r
1687                                 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(sel_local_dlg), hWnd, SelectDialogCallBack) == YES)) ||\r
1688                            ((Win == WIN_REMOTE) &&\r
1689                                 (DialogBox(GetFtpInst(), MAKEINTRESOURCE(sel_remote_dlg), hWnd, SelectDialogCallBack) == YES)))\r
1690                         {\r
1691                                 strcpy(RegExp, FindStr);\r
1692 //                              if(FindMode == 0)\r
1693 //                                      WildCard2RegExp(RegExp);\r
1694 \r
1695                                 _mbslwr(RegExp);\r
1696                                 if((FindMode == 0) || (JreCompileStr(RegExp) == TRUE))\r
1697                                 {\r
1698                                         CsrPos = -1;\r
1699                                         for(i = 0; i < Num; i++)\r
1700                                         {\r
1701                                                 GetNodeName(Win, i, Name, FMAX_PATH);\r
1702                                                 Find = FindNameNode(WinDst, Name);\r
1703 \r
1704                                                 _mbslwr(Name);\r
1705                                                 LvItem.state = 0;\r
1706                                                 if(GetNodeType(Win, i) != NODE_DRIVE)\r
1707                                                 {\r
1708                                                         if(((FindMode == 0) && (CheckFname(Name, RegExp) == SUCCESS)) ||\r
1709                                                            ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL)))\r
1710                                                         {\r
1711                                                                 LvItem.state = LVIS_SELECTED;\r
1712 \r
1713                                                                 if(Find >= 0)\r
1714                                                                 {\r
1715                                                                         if(IgnoreExist == YES)\r
1716                                                                                 LvItem.state = 0;\r
1717 \r
1718                                                                         if((LvItem.state != 0) && (IgnoreNew == YES))\r
1719                                                                         {\r
1720                                                                                 GetNodeTime(Win, i, &Time1);\r
1721                                                                                 GetNodeTime(WinDst, Find, &Time2);\r
1722                                                                                 if(CompareFileTime(&Time1, &Time2) > 0)\r
1723                                                                                         LvItem.state = 0;\r
1724                                                                         }\r
1725 \r
1726                                                                         if((LvItem.state != 0) && (IgnoreOld == YES))\r
1727                                                                         {\r
1728                                                                                 GetNodeTime(Win, i, &Time1);\r
1729                                                                                 GetNodeTime(WinDst, Find, &Time2);\r
1730                                                                                 if(CompareFileTime(&Time1, &Time2) < 0)\r
1731                                                                                         LvItem.state = 0;\r
1732                                                                         }\r
1733                                                                 }\r
1734                                                         }\r
1735                                                 }\r
1736 \r
1737                                                 if((LvItem.state != 0) && (CsrPos == -1))\r
1738                                                         CsrPos = i;\r
1739 \r
1740                                                 LvItem.mask = LVIF_STATE;\r
1741                                                 LvItem.iItem = i;\r
1742                                                 LvItem.stateMask = LVIS_SELECTED;\r
1743                                                 LvItem.iSubItem = 0;\r
1744                                                 SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
1745                                         }\r
1746                                         if(CsrPos != -1)\r
1747                                         {\r
1748                                                 LvItem.mask = LVIF_STATE;\r
1749                                                 LvItem.iItem = CsrPos;\r
1750                                                 LvItem.state = LVIS_FOCUSED;\r
1751                                                 LvItem.stateMask = LVIS_FOCUSED;\r
1752                                                 LvItem.iSubItem = 0;\r
1753                                                 SendMessage(hWnd, LVM_SETITEMSTATE, CsrPos, (LPARAM)&LvItem);\r
1754                                                 SendMessage(hWnd, LVM_ENSUREVISIBLE, CsrPos, (LPARAM)TRUE);\r
1755                                         }\r
1756                                 }\r
1757                         }\r
1758                         break;\r
1759         }\r
1760         return;\r
1761 }\r
1762 \r
1763 \r
1764 /*----- \91I\91ð\83_\83C\83A\83\8d\83O\82Ì\83R\81[\83\8b\83o\83b\83N ------------------------------------------\r
1765 *\r
1766 *       Parameter\r
1767 *               HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1768 *               UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
1769 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
1770 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
1771 *\r
1772 *       Return Value\r
1773 *               BOOL TRUE/FALSE\r
1774 *----------------------------------------------------------------------------*/\r
1775 \r
1776 static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
1777 {\r
1778         switch (iMessage)\r
1779         {\r
1780                 case WM_INITDIALOG :\r
1781                         SendDlgItemMessage(hDlg, SEL_FNAME, EM_LIMITTEXT, 40, 0);\r
1782                         SendDlgItemMessage(hDlg, SEL_FNAME, WM_SETTEXT, 0, (LPARAM)FindStr);\r
1783                         SendDlgItemMessage(hDlg, SEL_REGEXP, BM_SETCHECK, FindMode, 0);\r
1784                         SendDlgItemMessage(hDlg, SEL_NOOLD, BM_SETCHECK, IgnoreOld, 0);\r
1785                         SendDlgItemMessage(hDlg, SEL_NONEW, BM_SETCHECK, IgnoreNew, 0);\r
1786                         SendDlgItemMessage(hDlg, SEL_NOEXIST, BM_SETCHECK, IgnoreExist, 0);\r
1787                         return(TRUE);\r
1788 \r
1789                 case WM_COMMAND :\r
1790                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
1791                         {\r
1792                                 case IDOK :\r
1793                                         SendDlgItemMessage(hDlg, SEL_FNAME, WM_GETTEXT, 40+1, (LPARAM)FindStr);\r
1794                                         FindMode = SendDlgItemMessage(hDlg, SEL_REGEXP, BM_GETCHECK, 0, 0);\r
1795                                         IgnoreOld = SendDlgItemMessage(hDlg, SEL_NOOLD, BM_GETCHECK, 0, 0);\r
1796                                         IgnoreNew = SendDlgItemMessage(hDlg, SEL_NONEW, BM_GETCHECK, 0, 0);\r
1797                                         IgnoreExist = SendDlgItemMessage(hDlg, SEL_NOEXIST, BM_GETCHECK, 0, 0);\r
1798                                         EndDialog(hDlg, YES);\r
1799                                         break;\r
1800 \r
1801                                 case IDCANCEL :\r
1802                                         EndDialog(hDlg, NO);\r
1803                                         break;\r
1804 \r
1805                                 case IDHELP :\r
1806                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000061);\r
1807                                         break;\r
1808                         }\r
1809             return(TRUE);\r
1810         }\r
1811         return(FALSE);\r
1812 }\r
1813 \r
1814 \r
1815 /*----- \83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\82Ì\83t\83@\83C\83\8b\82ð\8c\9f\8dõ\82·\82é ----------------------------\r
1816 *\r
1817 *       Parameter\r
1818 *               HWND hWnd : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
1819 *               int Type : \8c\9f\8dõ\95û\96@ (FIND_xxx)\r
1820 *\r
1821 *       Return Value\r
1822 *               \82È\82µ\r
1823 *----------------------------------------------------------------------------*/\r
1824 \r
1825 void FindFileInList(HWND hWnd, int Type)\r
1826 {\r
1827         int Win;\r
1828         int i;\r
1829         int Num;\r
1830         static char RegExp[FMAX_PATH+1] = { "" };\r
1831         char Name[FMAX_PATH+1];\r
1832         LV_ITEM LvItem;\r
1833         char *Title;\r
1834 \r
1835         Win = WIN_LOCAL;\r
1836         Title = MSGJPN050;\r
1837         if(hWnd == GetRemoteHwnd())\r
1838         {\r
1839                 Win = WIN_REMOTE;\r
1840                 Title = MSGJPN051;\r
1841         }\r
1842 \r
1843         Num = GetItemCount(Win);\r
1844         switch(Type)\r
1845         {\r
1846                 case FIND_FIRST :\r
1847                         if(InputDialogBox(find_dlg, hWnd, Title, FindStr, 40+1, &FindMode, IDH_HELP_TOPIC_0000001) == YES)\r
1848                         {\r
1849                                 strcpy(RegExp, FindStr);\r
1850 //                              if(FindMode == 0)\r
1851 //                                      WildCard2RegExp(RegExp);\r
1852 \r
1853                                 _mbslwr(RegExp);\r
1854                                 if((FindMode == 0) || (JreCompileStr(RegExp) == TRUE))\r
1855                                 {\r
1856                                         for(i = GetCurrentItem(Win)+1; i < Num; i++)\r
1857                                         {\r
1858                                                 GetNodeName(Win, i, Name, FMAX_PATH);\r
1859                                                 _mbslwr(Name);\r
1860 \r
1861                                                 LvItem.state = 0;\r
1862                                                 if(((FindMode == 0) && (CheckFname(Name, RegExp) == SUCCESS)) ||\r
1863                                                    ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL)))\r
1864                                                 {\r
1865                                                         LvItem.mask = LVIF_STATE;\r
1866                                                         LvItem.iItem = i;\r
1867                                                         LvItem.state = LVIS_FOCUSED;\r
1868                                                         LvItem.stateMask = LVIS_FOCUSED;\r
1869                                                         LvItem.iSubItem = 0;\r
1870                                                         SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
1871                                                         SendMessage(hWnd, LVM_ENSUREVISIBLE, i, (LPARAM)TRUE);\r
1872                                                         break;\r
1873                                                 }\r
1874                                         }\r
1875                                 }\r
1876                         }\r
1877                         break;\r
1878 \r
1879                 case FIND_NEXT :\r
1880                         for(i = GetCurrentItem(Win)+1; i < Num; i++)\r
1881                         {\r
1882                                 GetNodeName(Win, i, Name, FMAX_PATH);\r
1883                                 _mbslwr(Name);\r
1884 \r
1885                                 LvItem.state = 0;\r
1886                                 if(((FindMode == 0) && (CheckFname(Name, RegExp) == SUCCESS)) ||\r
1887                                    ((FindMode != 0) && (JreGetStrMatchInfo(Name, 0) != NULL)))\r
1888                                 {\r
1889                                         LvItem.mask = LVIF_STATE;\r
1890                                         LvItem.iItem = i;\r
1891                                         LvItem.state = LVIS_FOCUSED;\r
1892                                         LvItem.stateMask = LVIS_FOCUSED;\r
1893                                         LvItem.iSubItem = 0;\r
1894                                         SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
1895                                         SendMessage(hWnd, LVM_ENSUREVISIBLE, i, (LPARAM)TRUE);\r
1896                                         break;\r
1897                                 }\r
1898                         }\r
1899                         break;\r
1900         }\r
1901         return;\r
1902 }\r
1903 \r
1904 \r
1905 #if 0\r
1906 /*----- \83\8f\83C\83\8b\83h\83J\81[\83h\82ð\90³\8bK\95\\8c»\82É\95Ï\8a·\82·\82é ------------------------------------\r
1907 *\r
1908 *       Parameter\r
1909 *               char *Str : \95\8e\9a\97ñ\r
1910 *\r
1911 *       Return Value\r
1912 *               \82È\82µ\r
1913 *----------------------------------------------------------------------------*/\r
1914 \r
1915 void WildCard2RegExp(char *Str)\r
1916 {\r
1917         char Tmp[FMAX_PATH+1];\r
1918         char *Org;\r
1919         char *Pos;\r
1920         UINT Ch;\r
1921 \r
1922         Org = Str;\r
1923         Pos = Tmp;\r
1924 \r
1925         *Pos++ = '^';\r
1926         *Pos++ = '(';\r
1927         while(*Str != NUL)\r
1928         {\r
1929                 if(Pos >= Tmp + FMAX_PATH - 3)\r
1930                         break;\r
1931 \r
1932                 Ch = _mbsnextc(Str);\r
1933                 Str = _mbsinc(Str);\r
1934 \r
1935                 if(Ch <= 0x7F)\r
1936                 {\r
1937                         if(strchr("[]()^$.+", Ch) != NULL)\r
1938                         {\r
1939                                 *Pos++ = '\\';\r
1940                                 *Pos++ = Ch;\r
1941                         }\r
1942                         else if(Ch == '*')\r
1943                         {\r
1944                                 *Pos++ = '.';\r
1945                                 *Pos++ = '*';\r
1946                         }\r
1947                         else if(Ch == '?')\r
1948                                 *Pos++ = '.';\r
1949                         else if(Ch == '|')\r
1950                         {\r
1951                                 *Pos++ = '|';\r
1952                         }\r
1953                         else\r
1954                                 *Pos++ = Ch;\r
1955                 }\r
1956                 else\r
1957                 {\r
1958                         _mbsnset(Pos, Ch, 1);\r
1959                         Pos = _mbsinc(Pos);\r
1960                 }\r
1961         }\r
1962         *Pos++ = ')';\r
1963         *Pos++ = '$';\r
1964         *Pos = NUL;\r
1965         strcpy(Org, Tmp);\r
1966 \r
1967         return;\r
1968 }\r
1969 #endif\r
1970 \r
1971 \r
1972 /*----- \83J\81[\83\\83\8b\88Ê\92u\82Ì\83A\83C\83e\83\80\94Ô\8d\86\82ð\95Ô\82· --------------------------------------\r
1973 *\r
1974 *       Parameter\r
1975 *               int Win : \83E\83B\83\93\83h\83E\94Ô\8d\86 (WIN_xxxx)\r
1976 *\r
1977 *       Return Value\r
1978 *               int \83A\83C\83e\83\80\94Ô\8d\86\r
1979 *----------------------------------------------------------------------------*/\r
1980 \r
1981 int GetCurrentItem(int Win)\r
1982 {\r
1983         HWND hWnd;\r
1984         int Ret;\r
1985 \r
1986         hWnd = GetLocalHwnd();\r
1987         if(Win == WIN_REMOTE)\r
1988                 hWnd = GetRemoteHwnd();\r
1989 \r
1990         if((Ret = SendMessage(hWnd, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_ALL | LVNI_FOCUSED, 0))) == -1)\r
1991                 Ret = 0;\r
1992 \r
1993         return(Ret);\r
1994 }\r
1995 \r
1996 \r
1997 /*----- \83A\83C\83e\83\80\90\94\82ð\95Ô\82· ------------------------------------------------------\r
1998 *\r
1999 *       Parameter\r
2000 *               int Win : \83E\83B\83\93\83h\83E\94Ô\8d\86 (WIN_xxxx)\r
2001 *\r
2002 *       Return Value\r
2003 *               int \83A\83C\83e\83\80\90\94\r
2004 *----------------------------------------------------------------------------*/\r
2005 \r
2006 int GetItemCount(int Win)\r
2007 {\r
2008         HWND hWnd;\r
2009 \r
2010         hWnd = GetLocalHwnd();\r
2011         if(Win == WIN_REMOTE)\r
2012                 hWnd = GetRemoteHwnd();\r
2013 \r
2014         return(SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0));\r
2015 }\r
2016 \r
2017 \r
2018 /*----- \91I\91ð\82³\82ê\82Ä\82¢\82é\83A\83C\83e\83\80\90\94\82ð\95Ô\82· ----------------------------------------\r
2019 *\r
2020 *       Parameter\r
2021 *               int Win : \83E\83B\83\93\83h\83E\94Ô\8d\86 (WIN_xxxx)\r
2022 *\r
2023 *       Return Value\r
2024 *               int \91I\91ð\82³\82ê\82Ä\82¢\82é\83A\83C\83e\83\80\90\94\r
2025 *----------------------------------------------------------------------------*/\r
2026 \r
2027 int GetSelectedCount(int Win)\r
2028 {\r
2029         HWND hWnd;\r
2030 \r
2031         hWnd = GetLocalHwnd();\r
2032         if(Win == WIN_REMOTE)\r
2033                 hWnd = GetRemoteHwnd();\r
2034 \r
2035         return(SendMessage(hWnd, LVM_GETSELECTEDCOUNT, 0, 0));\r
2036 }\r
2037 \r
2038 \r
2039 /*----- \91I\91ð\82³\82ê\82Ä\82¢\82é\8dÅ\8f\89\82Ì\83A\83C\83e\83\80\94Ô\8d\86\82ð\95Ô\82· --------------------------------\r
2040 *\r
2041 *       Parameter\r
2042 *               int Win : \83E\83B\83\93\83h\83E\94Ô\8d\86 (WIN_xxxx)\r
2043 *               int All : \91I\82Î\82ê\82Ä\82¢\82È\82¢\82à\82Ì\82ð\8aÜ\82ß\82é\r
2044 *\r
2045 *       Return Value\r
2046 *               int \83A\83C\83e\83\80\94Ô\8d\86\r
2047 *                       -1 = \91I\91ð\82³\82ê\82Ä\82¢\82È\82¢\r
2048 *----------------------------------------------------------------------------*/\r
2049 \r
2050 int GetFirstSelected(int Win, int All)\r
2051 {\r
2052         HWND hWnd;\r
2053         int Ope;\r
2054 \r
2055         hWnd = GetLocalHwnd();\r
2056         if(Win == WIN_REMOTE)\r
2057                 hWnd = GetRemoteHwnd();\r
2058 \r
2059         Ope = LVNI_SELECTED;\r
2060         if(All == YES)\r
2061                 Ope = LVNI_ALL;\r
2062 \r
2063         return(SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)MAKELPARAM(Ope, 0)));\r
2064 }\r
2065 \r
2066 \r
2067 /*----- \91I\91ð\82³\82ê\82Ä\82¢\82é\8e\9f\82Ì\83A\83C\83e\83\80\94Ô\8d\86\82ð\95Ô\82· ----------------------------------\r
2068 *\r
2069 *       Parameter\r
2070 *               int Win : \83E\83B\83\93\83h\83E\94Ô\8d\86 (WIN_xxxx)\r
2071 *               int Pos : \8d¡\82Ì\83A\83C\83e\83\80\94Ô\8d\86\r
2072 *               int All : \91I\82Î\82ê\82Ä\82¢\82È\82¢\82à\82Ì\82à\8aÜ\82ß\82é\r
2073 *\r
2074 *       Return Value\r
2075 *               int \83A\83C\83e\83\80\94Ô\8d\86\r
2076 *                       -1 = \91I\91ð\82³\82ê\82Ä\82¢\82È\82¢\r
2077 *----------------------------------------------------------------------------*/\r
2078 \r
2079 int GetNextSelected(int Win, int Pos, int All)\r
2080 {\r
2081         HWND hWnd;\r
2082         int Ope;\r
2083 \r
2084         hWnd = GetLocalHwnd();\r
2085         if(Win == WIN_REMOTE)\r
2086                 hWnd = GetRemoteHwnd();\r
2087 \r
2088         Ope = LVNI_SELECTED;\r
2089         if(All == YES)\r
2090                 Ope = LVNI_ALL;\r
2091 \r
2092         return(SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)Pos, (LPARAM)MAKELPARAM(Ope, 0)));\r
2093 }\r
2094 \r
2095 \r
2096 /*----- \8ew\92è\82³\82ê\82½\96¼\91O\82Ì\83A\83C\83e\83\80\82ð\92T\82· ----------------------------------------\r
2097 *\r
2098 *       Parameter\r
2099 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2100 *               char *Name : \96¼\91O\r
2101 *\r
2102 *       Return Value\r
2103 *               int \83A\83C\83e\83\80\94Ô\8d\86\r
2104 *                       -1=\8c©\82Â\82©\82ç\82È\82©\82Á\82½\r
2105 *----------------------------------------------------------------------------*/\r
2106 \r
2107 int FindNameNode(int Win, char *Name)\r
2108 {\r
2109         LV_FINDINFO FindInfo;\r
2110         HWND hWnd;\r
2111 \r
2112         hWnd = GetLocalHwnd();\r
2113         if(Win == WIN_REMOTE)\r
2114                 hWnd = GetRemoteHwnd();\r
2115 \r
2116         FindInfo.flags = LVFI_STRING;\r
2117         FindInfo.psz = Name;\r
2118         return(SendMessage(hWnd, LVM_FINDITEM, -1, (LPARAM)&FindInfo));\r
2119 }\r
2120 \r
2121 \r
2122 /*----- \8ew\92è\88Ê\92u\82Ì\83A\83C\83e\83\80\82Ì\96¼\91O\82ð\95Ô\82· ----------------------------------------\r
2123 *\r
2124 *       Parameter\r
2125 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2126 *               int Pos : \88Ê\92u\r
2127 *               char *Buf : \96¼\91O\82ð\95Ô\82·\83o\83b\83t\83@\r
2128 *               int Max : \83o\83b\83t\83@\82Ì\83T\83C\83Y\r
2129 *\r
2130 *       Return Value\r
2131 *               \82È\82µ\r
2132 *----------------------------------------------------------------------------*/\r
2133 \r
2134 void GetNodeName(int Win, int Pos, char *Buf, int Max)\r
2135 {\r
2136         HWND hWnd;\r
2137         LV_ITEM LvItem;\r
2138 \r
2139         hWnd = GetLocalHwnd();\r
2140         if(Win == WIN_REMOTE)\r
2141                 hWnd = GetRemoteHwnd();\r
2142 \r
2143         LvItem.mask = LVIF_TEXT;\r
2144         LvItem.iItem = Pos;\r
2145         LvItem.iSubItem = 0;\r
2146         LvItem.pszText = Buf;\r
2147         LvItem.cchTextMax = Max;\r
2148         SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
2149         return;\r
2150 }\r
2151 \r
2152 \r
2153 /*----- \8ew\92è\88Ê\92u\82Ì\83A\83C\83e\83\80\82Ì\93ú\95t\82ð\95Ô\82· ----------------------------------------\r
2154 *\r
2155 *       Parameter\r
2156 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2157 *               int Pos : \88Ê\92u\r
2158 *               FILETIME *Buf : \93ú\95t\82ð\95Ô\82·\83o\83b\83t\83@\r
2159 *\r
2160 *       Return Value\r
2161 *               int \83X\83e\81[\83^\83X\r
2162 *                       YES/NO=\93ú\95t\8fî\95ñ\82ª\82È\82©\82Á\82½\r
2163 *----------------------------------------------------------------------------*/\r
2164 \r
2165 int GetNodeTime(int Win, int Pos, FILETIME *Buf)\r
2166 {\r
2167         HWND hWnd;\r
2168         LV_ITEM LvItem;\r
2169         char Tmp[20];\r
2170         int Ret;\r
2171 \r
2172         hWnd = GetLocalHwnd();\r
2173         if(Win == WIN_REMOTE)\r
2174                 hWnd = GetRemoteHwnd();\r
2175 \r
2176         LvItem.mask = LVIF_TEXT;\r
2177         LvItem.iItem = Pos;\r
2178         LvItem.iSubItem = 1;\r
2179         LvItem.pszText = Tmp;\r
2180         LvItem.cchTextMax = 20;\r
2181         SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
2182         Ret = TimeString2FileTime(Tmp, Buf);\r
2183         return(Ret);\r
2184 }\r
2185 \r
2186 \r
2187 /*----- \8ew\92è\88Ê\92u\82Ì\83A\83C\83e\83\80\82Ì\83T\83C\83Y\82ð\95Ô\82· --------------------------------------\r
2188 *\r
2189 *       Parameter\r
2190 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2191 *               int Pos : \88Ê\92u\r
2192 *               int *Buf : \83T\83C\83Y\82ð\95Ô\82·\83\8f\81[\83N\r
2193 *\r
2194 *       Return Value\r
2195 *               int \83X\83e\81[\83^\83X\r
2196 *                       YES/NO=\83T\83C\83Y\8fî\95ñ\82ª\82È\82©\82Á\82½\r
2197 *----------------------------------------------------------------------------*/\r
2198 \r
2199 int GetNodeSize(int Win, int Pos, LONGLONG *Buf)\r
2200 {\r
2201         HWND hWnd;\r
2202         LV_ITEM LvItem;\r
2203         char Tmp[40];\r
2204         int Ret;\r
2205 \r
2206         hWnd = GetLocalHwnd();\r
2207         if(Win == WIN_REMOTE)\r
2208                 hWnd = GetRemoteHwnd();\r
2209 \r
2210         LvItem.mask = LVIF_TEXT;\r
2211         LvItem.iItem = Pos;\r
2212         LvItem.iSubItem = 2;\r
2213         LvItem.pszText = Tmp;\r
2214         LvItem.cchTextMax = 20;\r
2215         SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
2216         *Buf = -1;\r
2217         Ret = NO;\r
2218         if(strlen(Tmp) > 0)\r
2219         {\r
2220                 RemoveComma(Tmp);\r
2221                 *Buf = _atoi64(Tmp);\r
2222                 Ret = YES;\r
2223         }\r
2224         return(Ret);\r
2225 }\r
2226 \r
2227 \r
2228 /*----- \8ew\92è\88Ê\92u\82Ì\83A\83C\83e\83\80\82Ì\91®\90«\82ð\95Ô\82· ----------------------------------------\r
2229 *\r
2230 *       Parameter\r
2231 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2232 *               int Pos : \88Ê\92u\r
2233 *               int *Buf : \91®\90«\82ð\95Ô\82·\83\8f\81[\83N\r
2234 *\r
2235 *       Return Value\r
2236 *               int \83X\83e\81[\83^\83X\r
2237 *                       YES/NO=\83T\83C\83Y\8fî\95ñ\82ª\82È\82©\82Á\82½\r
2238 *----------------------------------------------------------------------------*/\r
2239 \r
2240 int GetNodeAttr(int Win, int Pos, int *Buf)\r
2241 {\r
2242         LV_ITEM LvItem;\r
2243         char Tmp[20];\r
2244         int Ret;\r
2245 \r
2246         *Buf = 0;\r
2247         Ret = NO;\r
2248         if(Win == WIN_REMOTE)\r
2249         {\r
2250                 LvItem.mask = LVIF_TEXT;\r
2251                 LvItem.iItem = Pos;\r
2252                 LvItem.iSubItem = 4;\r
2253                 LvItem.pszText = Tmp;\r
2254                 LvItem.cchTextMax = 20;\r
2255                 SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);\r
2256                 if(strlen(Tmp) > 0)\r
2257                 {\r
2258                         *Buf = AttrString2Value(Tmp);\r
2259                         Ret = YES;\r
2260                 }\r
2261         }\r
2262         return(Ret);\r
2263 }\r
2264 \r
2265 \r
2266 /*----- \8ew\92è\88Ê\92u\82Ì\83A\83C\83e\83\80\82Ì\83^\83C\83v\82ð\95Ô\82· --------------------------------------\r
2267 *\r
2268 *       Parameter\r
2269 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2270 *               int Pos : \88Ê\92u\r
2271 *\r
2272 *       Return Value\r
2273 *               int \83^\83C\83v (NODE_xxx)\r
2274 *----------------------------------------------------------------------------*/\r
2275 \r
2276 int GetNodeType(int Win, int Pos)\r
2277 {\r
2278         char Tmp[20];\r
2279         LV_ITEM LvItem;\r
2280         int Ret;\r
2281         HWND hWnd;\r
2282 \r
2283         hWnd = GetLocalHwnd();\r
2284         if(Win == WIN_REMOTE)\r
2285                 hWnd = GetRemoteHwnd();\r
2286 \r
2287         LvItem.mask = LVIF_TEXT;\r
2288         LvItem.iItem = Pos;\r
2289         LvItem.iSubItem = 2;\r
2290         LvItem.pszText = Tmp;\r
2291         LvItem.cchTextMax = 20;\r
2292         SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
2293 \r
2294         if(strcmp(Tmp, "<DIR>") == 0)\r
2295                 Ret = NODE_DIR;\r
2296         else if(strcmp(Tmp, "<DRIVE>") == 0)\r
2297                 Ret = NODE_DRIVE;\r
2298         else\r
2299                 Ret = NODE_FILE;\r
2300 \r
2301         return(Ret);\r
2302 }\r
2303 \r
2304 \r
2305 /*----- \8ew\92è\88Ê\92u\82Ì\83A\83C\83e\83\80\82Ì\83I\81[\83i\96¼\82ð\95Ô\82· ------------------------------------\r
2306 *\r
2307 *       Parameter\r
2308 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2309 *               int Pos : \88Ê\92u\r
2310 *               char *Buf : \83I\81[\83i\96¼\82ð\95Ô\82·\83o\83b\83t\83@\r
2311 *               int Max : \83o\83b\83t\83@\82Ì\83T\83C\83Y\r
2312 *\r
2313 *       Return Value\r
2314 *               \82È\82µ\r
2315 *----------------------------------------------------------------------------*/\r
2316 \r
2317 void GetNodeOwner(int Win, int Pos, char *Buf, int Max)\r
2318 {\r
2319         LV_ITEM LvItem;\r
2320 \r
2321         strcpy(Buf, "");\r
2322         if(Win == WIN_REMOTE)\r
2323         {\r
2324                 LvItem.mask = LVIF_TEXT;\r
2325                 LvItem.iItem = Pos;\r
2326                 LvItem.iSubItem = 5;\r
2327                 LvItem.pszText = Buf;\r
2328                 LvItem.cchTextMax = Max;\r
2329                 SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);\r
2330         }\r
2331         return;\r
2332 }\r
2333 \r
2334 \r
2335 /*----- \83z\83X\83g\91¤\82Ì\83t\83@\83C\83\8b\88ê\97\97\83E\83C\83\93\83h\83E\82ð\83N\83\8a\83A ------------------------------\r
2336 *\r
2337 *       Parameter\r
2338 *               \82È\82µ\r
2339 *\r
2340 *       Return Value\r
2341 *               \82È\82µ\r
2342 *----------------------------------------------------------------------------*/\r
2343 \r
2344 void EraseRemoteDirForWnd(void)\r
2345 {\r
2346         SendMessage(GetRemoteHwnd(), LVM_DELETEALLITEMS, 0, 0);\r
2347         SendMessage(GetRemoteHistHwnd(), CB_RESETCONTENT, 0, 0);\r
2348         return;\r
2349 }\r
2350 \r
2351 \r
2352 /*----- \91I\91ð\82³\82ê\82Ä\82¢\82é\83t\83@\83C\83\8b\82Ì\91\8d\83T\83C\83Y\82ð\95Ô\82· --------------------------------\r
2353 *\r
2354 *       Parameter\r
2355 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2356 *\r
2357 *       Return Value\r
2358 *               double \83T\83C\83Y\r
2359 *----------------------------------------------------------------------------*/\r
2360 \r
2361 double GetSelectedTotalSize(int Win)\r
2362 {\r
2363         double Ret;\r
2364         LONGLONG Size;\r
2365         int Pos;\r
2366 \r
2367         Ret = 0;\r
2368         if(GetSelectedCount(Win) > 0)\r
2369         {\r
2370                 Pos = GetFirstSelected(Win, NO);\r
2371                 while(Pos != -1)\r
2372                 {\r
2373                         GetNodeSize(Win, Pos, &Size);\r
2374                         if(Size >= 0)\r
2375                                 Ret += Size;\r
2376                         Pos = GetNextSelected(Win, Pos, NO);\r
2377                 }\r
2378         }\r
2379         return(Ret);\r
2380 }\r
2381 \r
2382 \r
2383 \r
2384 /*===================================================================\r
2385 \r
2386 ===================================================================*/\r
2387 \r
2388 \r
2389 \r
2390 /*----- \83t\83@\83C\83\8b\88ê\97\97\82Å\91I\82Î\82ê\82Ä\82¢\82é\83t\83@\83C\83\8b\82ð\83\8a\83X\83g\82É\93o\98^\82·\82é ------------------\r
2391 *\r
2392 *       Parameter\r
2393 *               int Win : \83E\83C\83\93\83h\83E\94Ô\8d\86 (WIN_xxx)\r
2394 *               int Expand : \83T\83u\83f\83B\83\8c\83N\83g\83\8a\82ð\93W\8aJ\82·\82é (YES/NO)\r
2395 *               int All : \91I\82Î\82ê\82Ä\82¢\82È\82¢\82à\82Ì\82à\82·\82×\82Ä\93o\98^\82·\82é (YES/NO)\r
2396 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
2397 *\r
2398 *       Return Value\r
2399 *               \82È\82µ\r
2400 *----------------------------------------------------------------------------*/\r
2401 \r
2402 void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *CancelCheckWork)\r
2403 {\r
2404         int Pos;\r
2405         char Name[FMAX_PATH+1];\r
2406         char Cur[FMAX_PATH+1];\r
2407         FILELIST Pkt;\r
2408         int Node;\r
2409         DWORD Attr;\r
2410         int Ignore;\r
2411 \r
2412         if((All == YES) || (GetSelectedCount(Win) > 0))\r
2413         {\r
2414                 /*===== \83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\82Ì\83t\83@\83C\83\8b =====*/\r
2415 \r
2416                 Pos = GetFirstSelected(Win, All);\r
2417                 while(Pos != -1)\r
2418                 {\r
2419                         Node = GetNodeType(Win, Pos);\r
2420                         if((Node == NODE_FILE) ||\r
2421                            ((Expand == NO) && (Node == NODE_DIR)))\r
2422                         {\r
2423                                 Pkt.InfoExist = 0;\r
2424                                 GetNodeName(Win, Pos, Pkt.File, FMAX_PATH);\r
2425                                 if(GetNodeSize(Win, Pos, &Pkt.Size) == YES)\r
2426                                         Pkt.InfoExist |= FINFO_SIZE;\r
2427                                 if(GetNodeAttr(Win, Pos, &Pkt.Attr) == YES)\r
2428                                         Pkt.InfoExist |= FINFO_ATTR;\r
2429                                 if(GetNodeTime(Win, Pos, &Pkt.Time) == YES)\r
2430                                         Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE);\r
2431                                 Pkt.Node = Node;\r
2432 \r
2433                                 Ignore = NO;\r
2434                                 if((DispIgnoreHide == YES) && (Win == WIN_LOCAL))\r
2435                                 {\r
2436                                         AskLocalCurDir(Cur, FMAX_PATH);\r
2437                                         SetYenTail(Cur);\r
2438                                         strcat(Cur, Pkt.File);\r
2439                                         Attr = GetFileAttributes(Cur);\r
2440                                         if((Attr != 0xFFFFFFFF) && (Attr & FILE_ATTRIBUTE_HIDDEN))\r
2441                                                 Ignore = YES;\r
2442                                 }\r
2443 \r
2444                                 if(Ignore == NO)\r
2445                                         AddFileList(&Pkt, Base);\r
2446                         }\r
2447                         Pos = GetNextSelected(Win, Pos, All);\r
2448                 }\r
2449 \r
2450                 if(Expand == YES)\r
2451                 {\r
2452                         /*===== \83f\83B\83\8c\83N\83g\83\8a\83c\83\8a\81[ =====*/\r
2453 \r
2454                         Pos = GetFirstSelected(Win, All);\r
2455                         while(Pos != -1)\r
2456                         {\r
2457                                 if(GetNodeType(Win, Pos) == NODE_DIR)\r
2458                                 {\r
2459                                         GetNodeName(Win, Pos, Name, FMAX_PATH);\r
2460                                         strcpy(Pkt.File, Name);\r
2461                                         ReplaceAll(Pkt.File, '\\', '/');\r
2462 //8/26\r
2463 \r
2464                                         Ignore = NO;\r
2465                                         if((DispIgnoreHide == YES) && (Win == WIN_LOCAL))\r
2466                                         {\r
2467                                                 AskLocalCurDir(Cur, FMAX_PATH);\r
2468                                                 SetYenTail(Cur);\r
2469                                                 strcat(Cur, Pkt.File);\r
2470                                                 ReplaceAll(Cur, '/', '\\');\r
2471                                                 Attr = GetFileAttributes(Cur);\r
2472                                                 if((Attr != 0xFFFFFFFF) && (Attr & FILE_ATTRIBUTE_HIDDEN))\r
2473                                                         Ignore = YES;\r
2474                                         }\r
2475 \r
2476                                         if(Ignore == NO)\r
2477                                         {\r
2478                                                 Pkt.Node = NODE_DIR;\r
2479                                                 Pkt.Attr = 0;\r
2480                                                 Pkt.Size = 0;\r
2481                                                 memset(&Pkt.Time, 0, sizeof(FILETIME));\r
2482                                                 AddFileList(&Pkt, Base);\r
2483 \r
2484                                                 if(Win == WIN_LOCAL)\r
2485                                                         MakeLocalTree(Name, Base);\r
2486                                                 else\r
2487                                                 {\r
2488                                                         AskRemoteCurDir(Cur, FMAX_PATH);\r
2489 \r
2490                                                         if((AskListCmdMode() == NO) &&\r
2491                                                            (AskUseNLST_R() == YES))\r
2492                                                                 MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);\r
2493                                                         else\r
2494                                                                 MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\r
2495 \r
2496 //DispListList(*Base, "LIST");\r
2497 \r
2498                                                 }\r
2499                                         }\r
2500                                 }\r
2501                                 Pos = GetNextSelected(Win, Pos, All);\r
2502                         }\r
2503                 }\r
2504         }\r
2505         return;\r
2506 }\r
2507 \r
2508 \r
2509 /* \83f\83o\83b\83O\97p */\r
2510 /* \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\93à\97e\82ð\95\\8e¦ */\r
2511 static void DispListList(FILELIST *Pos, char *Title)\r
2512 {\r
2513         DoPrintf("############ %s ############", Title);\r
2514         while(Pos != NULL)\r
2515         {\r
2516                 DoPrintf("%d %s", Pos->Node, Pos->File);\r
2517                 Pos = Pos->Next;\r
2518         }\r
2519         DoPrintf("############ END ############");\r
2520         return;\r
2521 }\r
2522 \r
2523 \r
2524 /*----- Drag&Drop\82³\82ê\82½\83t\83@\83C\83\8b\82ð\83\8a\83X\83g\82É\93o\98^\82·\82é -----------------------------\r
2525 *\r
2526 *       Parameter\r
2527 *               WPARAM wParam : \83h\83\8d\83b\83v\82³\82ê\82½\83t\83@\83C\83\8b\82Ì\8fî\95ñ\r
2528 *               char *Cur : \83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\82ð\95Ô\82·\83o\83b\83t\83@\r
2529 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
2530 *\r
2531 *       Return Value\r
2532 *               \82È\82µ\r
2533 *----------------------------------------------------------------------------*/\r
2534 \r
2535 void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base)\r
2536 {\r
2537         int Max;\r
2538         int i;\r
2539         char Name[FMAX_PATH+1];\r
2540         char Tmp[FMAX_PATH+1];\r
2541         FILELIST Pkt;\r
2542         HANDLE fHnd;\r
2543         WIN32_FIND_DATA Find;\r
2544 \r
2545         Max = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);\r
2546 \r
2547         DragQueryFile((HDROP)wParam, 0, Cur, FMAX_PATH);\r
2548         GetUpperDir(Cur);\r
2549 \r
2550         for(i = 0; i < Max; i++)\r
2551         {\r
2552                 DragQueryFile((HDROP)wParam, i, Name, FMAX_PATH);\r
2553 \r
2554                 if((GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) == 0)\r
2555                 {\r
2556                         Pkt.Node = NODE_FILE;\r
2557                         strcpy(Pkt.File, GetFileName(Name));\r
2558 \r
2559                         memset(&Pkt.Time, 0, sizeof(FILETIME));\r
2560                         if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE)\r
2561                         {\r
2562                                 FindClose(fHnd);\r
2563                                 Pkt.Time = Find.ftLastWriteTime;\r
2564                         }\r
2565                         AddFileList(&Pkt, Base);\r
2566                 }\r
2567         }\r
2568 \r
2569         GetCurrentDirectory(FMAX_PATH, Tmp);\r
2570         SetCurrentDirectory(Cur);\r
2571         for(i = 0; i < Max; i++)\r
2572         {\r
2573                 DragQueryFile((HDROP)wParam, i, Name, FMAX_PATH);\r
2574 \r
2575                 if(GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY)\r
2576                 {\r
2577                         Pkt.Node = NODE_DIR;\r
2578                         strcpy(Pkt.File, GetFileName(Name));\r
2579                         AddFileList(&Pkt, Base);\r
2580 \r
2581                         MakeLocalTree(Pkt.File, Base);\r
2582                 }\r
2583         }\r
2584         SetCurrentDirectory(Tmp);\r
2585 \r
2586         DragFinish((HDROP)wParam);\r
2587 \r
2588         return;\r
2589 }\r
2590 \r
2591 \r
2592 /*----- Drag&Drop\82³\82ê\82½\83t\83@\83C\83\8b\82ª\82 \82é\83t\83H\83\8b\83_\82ð\8eæ\93¾\82·\82é -----------------------\r
2593 *\r
2594 *       Parameter\r
2595 *               WPARAM wParam : \83h\83\8d\83b\83v\82³\82ê\82½\83t\83@\83C\83\8b\82Ì\8fî\95ñ\r
2596 *               char *Cur : \83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\82ð\95Ô\82·\83o\83b\83t\83@\r
2597 *\r
2598 *       Return Value\r
2599 *               \82È\82µ\r
2600 *----------------------------------------------------------------------------*/\r
2601 \r
2602 void MakeDroppedDir(WPARAM wParam, char *Cur)\r
2603 {\r
2604         int Max;\r
2605 \r
2606         Max = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);\r
2607         DragQueryFile((HDROP)wParam, 0, Cur, FMAX_PATH);\r
2608         GetUpperDir(Cur);\r
2609         DragFinish((HDROP)wParam);\r
2610 \r
2611         return;\r
2612 }\r
2613 \r
2614 \r
2615 /*----- \83z\83X\83g\91¤\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a\88È\89º\82Ì\83t\83@\83C\83\8b\82ð\83\8a\83X\83g\82É\93o\98^\82·\82é\81i\82P\81j-------\r
2616 *\r
2617 *       Parameter\r
2618 *               char *Path : \83p\83X\96¼\r
2619 *               char *Cur : \83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\r
2620 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
2621 *\r
2622 *       Return Value\r
2623 *               \82È\82µ\r
2624 *\r
2625 *       Note\r
2626 *               NLST -alLR \82ð\8eg\82¤\r
2627 *----------------------------------------------------------------------------*/\r
2628 \r
2629 static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
2630 {\r
2631         int Sts;\r
2632 \r
2633         if(DoCWD(Path, NO, NO, NO) == FTP_COMPLETE)\r
2634         {\r
2635                 /* \83T\83u\83t\83H\83\8b\83_\82à\8aÜ\82ß\82½\83\8a\83X\83g\82ð\8eæ\93¾ */\r
2636                 Sts = DoDirListCmdSkt("R", "", 999, CancelCheckWork);   /* NLST -alLR*/\r
2637                 DoCWD(Cur, NO, NO, NO);\r
2638 \r
2639                 if(Sts == FTP_COMPLETE)\r
2640                         AddRemoteTreeToFileList(999, Path, RDIR_NLST, Base);\r
2641         }\r
2642         return;\r
2643 }\r
2644 \r
2645 \r
2646 /*----- \83z\83X\83g\91¤\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a\88È\89º\82Ì\83t\83@\83C\83\8b\82ð\83\8a\83X\83g\82É\93o\98^\82·\82é\81i\82Q\81j-------\r
2647 *\r
2648 *       Parameter\r
2649 *               char *Path : \83p\83X\96¼\r
2650 *               char *Cur : \83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\r
2651 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
2652 *\r
2653 *       Return Value\r
2654 *               \82È\82µ\r
2655 *\r
2656 *       Note\r
2657 *               \8ae\83t\83H\83\8b\83_\82É\88Ú\93®\82µ\82Ä\83\8a\83X\83g\82ð\8eæ\93¾\r
2658 *----------------------------------------------------------------------------*/\r
2659 \r
2660 static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork)\r
2661 {\r
2662         int Sts;\r
2663         FILELIST *CurList;\r
2664         FILELIST *Pos;\r
2665         FILELIST Pkt;\r
2666 \r
2667         /* VAX VMS \82Í CWD xxx/yyy \82Æ\82¢\82¤\8ew\92è\82ª\82Å\82«\82È\82¢\82Ì\82Å      */\r
2668         /* CWD xxx, Cwd yyy \82Æ\95¡\90\94\82É\95ª\82¯\82é                                      */\r
2669         if(AskHostType() != HTYPE_VMS)\r
2670                 Sts = DoCWD(Path, NO, NO, NO);\r
2671         else\r
2672         {\r
2673 #if defined(HAVE_OPENVMS)\r
2674                 /* OpenVMS\82Ì\8fê\8d\87\81A\83f\83B\83\8c\83N\83g\83\8a\88Ú\93®\8e\9e\82Í"HOGE.DIR;1"\82ð"HOGE"\82É\82·\82é */\r
2675                 ReformVMSDirName(Path, TRUE);\r
2676 #endif\r
2677                 Sts = DoCWDStepByStep(Path, Cur);\r
2678         }\r
2679 \r
2680         if(Sts == FTP_COMPLETE)\r
2681         {\r
2682                 Sts = DoDirListCmdSkt("", "", 999, CancelCheckWork);            /* NLST -alL*/\r
2683                 DoCWD(Cur, NO, NO, NO);\r
2684 \r
2685                 if(Sts == FTP_COMPLETE)\r
2686                 {\r
2687                         CurList = NULL;\r
2688                         AddRemoteTreeToFileList(999, Path, RDIR_CWD, &CurList);\r
2689                         CopyTmpListToFileList(Base, CurList);\r
2690 \r
2691                         Pos = CurList;\r
2692                         while(Pos != NULL)\r
2693                         {\r
2694                                 if(Pos->Node == NODE_DIR)\r
2695                                 {\r
2696                                         /* \82Ü\82¸\83f\83B\83\8c\83N\83g\83\8a\96¼\82ð\83Z\83b\83g */\r
2697                                         strcpy(Pkt.File, Pos->File);\r
2698                                         Pkt.Node = NODE_DIR;\r
2699                                         Pkt.Size = 0;\r
2700                                         Pkt.Attr = 0;\r
2701                                         memset(&Pkt.Time, 0, sizeof(FILETIME));\r
2702                                         AddFileList(&Pkt, Base);\r
2703 \r
2704                                         /* \82»\82Ì\83f\83B\83\8c\83N\83g\83\8a\82Ì\92\86\82ð\8c\9f\8dõ */\r
2705                                         MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
2706                                 }\r
2707                                 Pos = Pos->Next;\r
2708                         }\r
2709                         DeleteFileList(&CurList);\r
2710                 }\r
2711         }\r
2712         return;\r
2713 }\r
2714 \r
2715 \r
2716 /*----- \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\93à\97e\82ð\95Ê\82Ì\83t\83@\83C\83\8b\83\8a\83X\83g\82É\83R\83s\81[ ----------------------\r
2717 *\r
2718 *       Parameter\r
2719 *               FILELIST **Base : \83R\83s\81[\90æ\r
2720 *               FILELIST *List : \83R\83s\81[\8c³\r
2721 *\r
2722 *       Return Value\r
2723 *               \82È\82µ\r
2724 *\r
2725 *       Note\r
2726 *               \83R\83s\81[\82·\82é\82Ì\82Í\83t\83@\83C\83\8b\82Ì\8fî\95ñ\82¾\82¯\r
2727 *               \83f\83B\83\8c\83N\83g\83\8a\82Ì\8fî\95ñ\82Í\83R\83s\81[\82µ\82È\82¢\r
2728 *----------------------------------------------------------------------------*/\r
2729 \r
2730 static void CopyTmpListToFileList(FILELIST **Base, FILELIST *List)\r
2731 {\r
2732         while(List != NULL)\r
2733         {\r
2734                 if(List->Node == NODE_FILE)\r
2735                         AddFileList(List, Base);\r
2736 \r
2737                 List = List->Next;\r
2738         }\r
2739         return;\r
2740 }\r
2741 \r
2742 \r
2743 /*----- \83z\83X\83g\91¤\82Ì\83t\83@\83C\83\8b\8fî\95ñ\82ð\83t\83@\83C\83\8b\83\8a\83X\83g\82É\93o\98^ --------------------------\r
2744 *\r
2745 *       Parameter\r
2746 *               int Num : \83e\83\93\83|\83\89\83\8a\83t\83@\83C\83\8b\82Ì\83t\83@\83C\83\8b\96¼\94Ô\8d\86 (_ffftp.???)\r
2747 *               char *Path : \83p\83X\96¼\r
2748 *               int IncDir : \8dÄ\8bA\8c\9f\8dõ\82Ì\95û\96@ (RDIR_xxx)\r
2749 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
2750 *\r
2751 *       Return Value\r
2752 *               \82È\82µ\r
2753 *----------------------------------------------------------------------------*/\r
2754 \r
2755 void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base)\r
2756 {\r
2757         char Str[FMAX_PATH+1];\r
2758         char Dir[FMAX_PATH+1];\r
2759         char Name[FMAX_PATH+1];\r
2760         LONGLONG Size;\r
2761         FILETIME Time;\r
2762         int Attr;\r
2763         FILELIST Pkt;\r
2764         FILE *fd;\r
2765         int Node;\r
2766         int ListType;\r
2767         char Owner[OWNER_NAME_LEN+1];\r
2768         int Link;\r
2769         int InfoExist;\r
2770 \r
2771         MakeCacheFileName(Num, Str);\r
2772         if((fd = fopen(Str, "rb")) != NULL)\r
2773         {\r
2774                 strcpy(Dir, Path);\r
2775 \r
2776                 ListType = LIST_UNKNOWN;\r
2777 \r
2778                 while(GetListOneLine(Str, FMAX_PATH, fd) == SUCCESS)\r
2779                 {\r
2780                         if((ListType = AnalizeFileInfo(Str)) == LIST_UNKNOWN)\r
2781                         {\r
2782                                 if(MakeDirPath(Str, ListType, Path, Dir) == SUCCESS)\r
2783                                 {\r
2784                                         if(IncDir == RDIR_NLST)\r
2785                                         {\r
2786                                                 strcpy(Pkt.File, Dir);\r
2787                                                 Pkt.Node = NODE_DIR;\r
2788                                                 Pkt.Size = 0;\r
2789                                                 Pkt.Attr = 0;\r
2790                                                 memset(&Pkt.Time, 0, sizeof(FILETIME));\r
2791                                                 AddFileList(&Pkt, Base);\r
2792                                         }\r
2793                                 }\r
2794                         }\r
2795                         else\r
2796                         {\r
2797                                 Node = ResolvFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
2798 \r
2799                                 if(AskFilterStr(Name, Node) == YES)\r
2800                                 {\r
2801                                         if((Node == NODE_FILE) ||\r
2802                                            ((IncDir == RDIR_CWD) && (Node == NODE_DIR)))\r
2803                                         {\r
2804                                                 strcpy(Pkt.File, Dir);\r
2805                                                 if(strlen(Pkt.File) > 0)\r
2806                                                         SetSlashTail(Pkt.File);\r
2807                                                 strcat(Pkt.File, Name);\r
2808                                                 Pkt.Node = Node;\r
2809                                                 Pkt.Link = Link;\r
2810                                                 Pkt.Size = Size;\r
2811                                                 Pkt.Attr = Attr;\r
2812                                                 Pkt.Time = Time;\r
2813                                                 Pkt.InfoExist = InfoExist;\r
2814                                                 AddFileList(&Pkt, Base);\r
2815                                         }\r
2816                                 }\r
2817                         }\r
2818                 }\r
2819                 fclose(fd);\r
2820         }\r
2821         return;\r
2822 }\r
2823 \r
2824 \r
2825 /*----- \83t\83@\83C\83\8b\88ê\97\97\8fî\95ñ\82Ì\82P\8ds\82ð\8eæ\93¾ ------------------------------------------\r
2826 *\r
2827 *       Parameter\r
2828 *               char *Buf : \82P\8ds\82Ì\8fî\95ñ\82ð\83Z\83b\83g\82·\82é\83o\83b\83t\83@\r
2829 *               int Max : \8dÅ\91å\95\8e\9a\90\94\r
2830 *               FILE *Fd : \83X\83g\83\8a\81[\83\80\r
2831 *\r
2832 *       Return Value\r
2833 *               int \83X\83e\81[\83^\83X (SUCCESS/FAIL)\r
2834 *\r
2835 *       Note\r
2836 *               VAX VMS\88È\8aO\82Ì\8e\9e\82Í fgets(Buf, Max, Fd) \82Æ\93¯\82\r
2837 *               Vax VMS\82Ì\8e\9e\82Í\81A\95¡\90\94\8ds\82Ì\83t\83@\83C\83\8b\8fî\95ñ\82ð\82P\8ds\82É\82Ü\82Æ\82ß\82é\r
2838 *----------------------------------------------------------------------------*/\r
2839 \r
2840 static int GetListOneLine(char *Buf, int Max, FILE *Fd)\r
2841 {\r
2842         char Tmp[FMAX_PATH+1];\r
2843         int Sts;\r
2844 \r
2845         Sts = FAIL;\r
2846         while((Sts == FAIL) && (fgets(Buf, Max, Fd) != NULL))\r
2847         {\r
2848                 Sts = SUCCESS;\r
2849                 RemoveReturnCode(Buf);\r
2850                 ReplaceAll(Buf, '\x08', ' ');\r
2851 \r
2852                 /* VAX VMS\82Å\82Í\83t\83@\83C\83\8b\8fî\95ñ\82ª\95¡\90\94\8ds\82É\82í\82©\82ê\82Ä\82¢\82é        */\r
2853                 /* \82»\82ê\82ð\82P\8ds\82É\82Ü\82Æ\82ß\82é                                                         */\r
2854                 if(AskHostType() == HTYPE_VMS)\r
2855                 {\r
2856                         if(strchr(Buf, ';') == NULL)    /* \83t\83@\83C\83\8b\96¼\88È\8aO\82Ì\8ds */\r
2857                                 Sts = FAIL;\r
2858                         else\r
2859                         {\r
2860                                 Max -= strlen(Buf);\r
2861                                 while(strchr(Buf, ')') == NULL)\r
2862                                 {\r
2863                                         if(fgets(Tmp, FMAX_PATH, Fd) != NULL)\r
2864                                         {\r
2865                                                 RemoveReturnCode(Tmp);\r
2866                                                 ReplaceAll(Buf, '\x08', ' ');\r
2867                                                 if((int)strlen(Tmp) > Max)\r
2868                                                         Tmp[Max] = NUL;\r
2869                                                 Max -= strlen(Tmp);\r
2870                                                 strcat(Buf, Tmp);\r
2871                                         }\r
2872                                         else\r
2873                                                 break;\r
2874                                 }\r
2875                         }\r
2876                 }\r
2877         }\r
2878 \r
2879 //      DoPrintf("List : %s", Buf);\r
2880 \r
2881         return(Sts);\r
2882 }\r
2883 \r
2884 \r
2885 /*----- \83T\83u\83f\83B\83\8c\83N\83g\83\8a\8fî\95ñ\82Ì\89ð\90Í --------------------------------------------\r
2886 *\r
2887 *       Parameter\r
2888 *               char *Str : \83t\83@\83C\83\8b\8fî\95ñ\81i\82P\8ds\81j\r
2889 *               int ListType : \83\8a\83X\83g\82Ì\83^\83C\83v\r
2890 *               char *Path : \90æ\93ª\82©\82ç\82Ì\83p\83X\96¼\r
2891 *               char *Dir : \83f\83B\83\8c\83N\83g\83\8a\96¼\r
2892 *\r
2893 *       Return Value\r
2894 *               int \83X\83e\81[\83^\83X\r
2895 *                       SUCCESS/FAIL=\83f\83B\83\8c\83N\83g\83\8a\8fî\95ñ\82Å\82È\82¢\r
2896 *----------------------------------------------------------------------------*/\r
2897 \r
2898 static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir)\r
2899 {\r
2900         int Sts;\r
2901 \r
2902         Sts = FAIL;\r
2903         switch(ListType)\r
2904         {\r
2905                 case LIST_ACOS :\r
2906                 case LIST_ACOS_4 :\r
2907                         break;\r
2908 \r
2909                 default:\r
2910                         if(*(Str + strlen(Str) - 1) == ':')             /* \8dÅ\8cã\82ª : \82È\82ç\83T\83u\83f\83B\83\8c\83N\83g\83\8a */\r
2911                         {\r
2912                                 if(strcmp(Str, ".:") != 0)\r
2913                                 {\r
2914                                         if((strncmp(Str, "./", 2) == 0) ||\r
2915                                            (strncmp(Str, ".\\", 2) == 0))\r
2916                                         {\r
2917                                                 Str += 2;\r
2918                                         }\r
2919 \r
2920                                         if(strlen(Str) > 1)\r
2921                                         {\r
2922                                                 strcpy(Dir, Path);\r
2923                                                 SetSlashTail(Dir);\r
2924                                                 strcat(Dir, Str);\r
2925                                                 *(Dir + strlen(Dir) - 1) = NUL;\r
2926 \r
2927                                                 ChangeFnameRemote2Local(Dir, FMAX_PATH);\r
2928 \r
2929                                                 ReplaceAll(Dir, '\\', '/');\r
2930                                         }\r
2931                                 }\r
2932                                 Sts = SUCCESS;\r
2933                         }\r
2934                         break;\r
2935         }\r
2936         return(Sts);\r
2937 }\r
2938 \r
2939 \r
2940 /*----- \83\8d\81[\83J\83\8b\91¤\82Ì\83T\83u\83f\83B\83\8c\83N\83g\83\8a\88È\89º\82Ì\83t\83@\83C\83\8b\82ð\83\8a\83X\83g\82É\93o\98^\82·\82é ----------\r
2941 *\r
2942 *       Parameter\r
2943 *               char *Path : \83p\83X\96¼\r
2944 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
2945 *\r
2946 *       Return Value\r
2947 *               \82È\82µ\r
2948 *----------------------------------------------------------------------------*/\r
2949 \r
2950 static void MakeLocalTree(char *Path, FILELIST **Base)\r
2951 {\r
2952         char Src[FMAX_PATH+1];\r
2953         HANDLE fHnd;\r
2954         WIN32_FIND_DATA FindBuf;\r
2955         FILELIST Pkt;\r
2956         SYSTEMTIME TmpStime;\r
2957 \r
2958         strcpy(Src, Path);\r
2959         SetYenTail(Src);\r
2960         strcat(Src, "*");\r
2961         ReplaceAll(Src, '/', '\\');\r
2962 \r
2963         if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE)\r
2964         {\r
2965                 do\r
2966                 {\r
2967                         if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)\r
2968                         {\r
2969                                 if(AskFilterStr(FindBuf.cFileName, NODE_FILE) == YES)\r
2970                                 {\r
2971                                         strcpy(Pkt.File, Path);\r
2972                                         SetSlashTail(Pkt.File);\r
2973                                         strcat(Pkt.File, FindBuf.cFileName);\r
2974                                         ReplaceAll(Pkt.File, '\\', '/');\r
2975                                         Pkt.Node = NODE_FILE;\r
2976                                         Pkt.Size = MakeLongLong(FindBuf.nFileSizeHigh, FindBuf.nFileSizeLow);\r
2977                                         Pkt.Attr = 0;\r
2978                                         Pkt.Time = FindBuf.ftLastWriteTime;\r
2979                                         FileTimeToSystemTime(&Pkt.Time, &TmpStime);\r
2980                                         TmpStime.wSecond = 0;\r
2981                                         TmpStime.wMilliseconds = 0;\r
2982                                         SystemTimeToFileTime(&TmpStime, &Pkt.Time);\r
2983                                         AddFileList(&Pkt, Base);\r
2984                                 }\r
2985                         }\r
2986                 }\r
2987                 while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE);\r
2988                 FindClose(fHnd);\r
2989         }\r
2990 \r
2991         if((fHnd = FindFirstFileAttr(Src, &FindBuf, DispIgnoreHide)) != INVALID_HANDLE_VALUE)\r
2992         {\r
2993                 do\r
2994                 {\r
2995                         if((FindBuf.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&\r
2996                            (strcmp(FindBuf.cFileName, ".") != 0) &&\r
2997                            (strcmp(FindBuf.cFileName, "..") != 0))\r
2998                         {\r
2999                                 strcpy(Src, Path);\r
3000                                 SetYenTail(Src);\r
3001                                 strcat(Src, FindBuf.cFileName);\r
3002                                 strcpy(Pkt.File, Src);\r
3003                                 ReplaceAll(Pkt.File, '\\', '/');\r
3004                                 Pkt.Node = NODE_DIR;\r
3005                                 Pkt.Size = 0;\r
3006                                 Pkt.Attr = 0;\r
3007                                 memset(&Pkt.Time, 0, sizeof(FILETIME));\r
3008                                 AddFileList(&Pkt, Base);\r
3009 \r
3010                                 MakeLocalTree(Src, Base);\r
3011                         }\r
3012                 }\r
3013                 while(FindNextFileAttr(fHnd, &FindBuf, DispIgnoreHide) == TRUE);\r
3014                 FindClose(fHnd);\r
3015         }\r
3016         return;\r
3017 }\r
3018 \r
3019 \r
3020 /*----- \83t\83@\83C\83\8b\83\8a\83X\83g\82É\8fî\95ñ\82ð\93o\98^\82·\82é ----------------------------------------\r
3021 *\r
3022 *       Parameter\r
3023 *               FILELIST *Pkt : \93o\98^\82·\82é\83t\83@\83C\83\8b\8fî\95ñ\r
3024 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
3025 *\r
3026 *       Return Value\r
3027 *               \82È\82µ\r
3028 *----------------------------------------------------------------------------*/\r
3029 \r
3030 static void AddFileList(FILELIST *Pkt, FILELIST **Base)\r
3031 {\r
3032         FILELIST *Pos;\r
3033         FILELIST *Prev;\r
3034 \r
3035         DoPrintf("FileList : NODE=%d : %s", Pkt->Node, Pkt->File);\r
3036 \r
3037         /* \83\8a\83X\83g\82Ì\8fd\95¡\82ð\8eæ\82è\8f\9c\82­ */\r
3038         Pos = *Base;\r
3039         while(Pos != NULL)\r
3040         {\r
3041                 if(strcmp(Pkt->File, Pos->File) == 0)\r
3042                 {\r
3043                         DoPrintf(" --> Duplicate!!");\r
3044                         break;\r
3045                 }\r
3046                 Prev = Pos;\r
3047                 Pos = Pos->Next;\r
3048         }\r
3049 \r
3050         if(Pos == NULL)         /* \8fd\95¡\82µ\82Ä\82¢\82È\82¢\82Ì\82Å\93o\98^\82·\82é */\r
3051         {\r
3052                 if((Pos = malloc(sizeof(FILELIST))) != NULL)\r
3053                 {\r
3054                         memcpy(Pos, Pkt, sizeof(FILELIST));\r
3055                         Pos->Next = NULL;\r
3056 \r
3057                         if(*Base == NULL)\r
3058                                 *Base = Pos;\r
3059                         else\r
3060                                 Prev->Next = Pos;\r
3061                 }\r
3062         }\r
3063         return;\r
3064 }\r
3065 \r
3066 \r
3067 /*----- \83t\83@\83C\83\8b\83\8a\83X\83g\82ð\83N\83\8a\83A\82·\82é --------------------------------------------\r
3068 *\r
3069 *       Parameter\r
3070 *               FILELIST **Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
3071 *\r
3072 *       Return Value\r
3073 *               \82È\82µ\r
3074 *----------------------------------------------------------------------------*/\r
3075 \r
3076 void DeleteFileList(FILELIST **Base)\r
3077 {\r
3078         FILELIST *New;\r
3079         FILELIST *Next;\r
3080 \r
3081         New = *Base;\r
3082         while(New != NULL)\r
3083         {\r
3084                 Next = New->Next;\r
3085                 free(New);\r
3086                 New = Next;\r
3087         }\r
3088         *Base = NULL;\r
3089         return;\r
3090 }\r
3091 \r
3092 \r
3093 /*----- \83t\83@\83C\83\8b\83\8a\83X\83g\82É\8ew\92è\82Ì\83t\83@\83C\83\8b\82ª\82 \82é\82©\83`\83F\83b\83N ------------------------\r
3094 *\r
3095 *       Parameter\r
3096 *               char *Fname : \83t\83@\83C\83\8b\96¼\r
3097 *               FILELIST *Base : \83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\90æ\93ª\r
3098 *               int Caps : \91å\95\8e\9a/\8f¬\95\8e\9a\82Ì\8bæ\95Ê\83\82\81[\83h (COMP_xxx)\r
3099 *\r
3100 *       Return Value\r
3101 *               FILELIST *\8c©\82Â\82©\82Á\82½\83t\83@\83C\83\8b\83\8a\83X\83g\82Ì\83f\81[\83^\r
3102 *                       NULL=\8c©\82Â\82©\82ç\82È\82¢\r
3103 *----------------------------------------------------------------------------*/\r
3104 \r
3105 FILELIST *SearchFileList(char *Fname, FILELIST *Base, int Caps)\r
3106 {\r
3107         char Tmp[FMAX_PATH+1];\r
3108 \r
3109         while(Base != NULL)\r
3110         {\r
3111                 if(Caps == COMP_STRICT)\r
3112                 {\r
3113                         if(_mbscmp(Fname, Base->File) == 0)\r
3114                                 break;\r
3115                 }\r
3116                 else\r
3117                 {\r
3118                         if(_mbsicmp(Fname, Base->File) == 0)\r
3119                         {\r
3120                                 if(Caps == COMP_IGNORE)\r
3121                                         break;\r
3122                                 else\r
3123                                 {\r
3124                                         strcpy(Tmp, Base->File);\r
3125                                         _mbslwr(Tmp);\r
3126                                         if(_mbscmp(Tmp, Base->File) == 0)\r
3127                                                 break;\r
3128                                 }\r
3129                         }\r
3130                 }\r
3131                 Base = Base->Next;\r
3132         }\r
3133         return(Base);\r
3134 }\r
3135 \r
3136 \r
3137 /*----- \83t\83@\83C\83\8b\8fî\95ñ\82©\82ç\83\8a\83X\83g\83^\83C\83v\82ð\8b\81\82ß\82é ----------------------------------\r
3138 *\r
3139 *       Parameter\r
3140 *               char *Str : \83t\83@\83C\83\8b\8fî\95ñ\81i\82P\8ds\81j\r
3141 *\r
3142 *       Return Value\r
3143 *               int \83\8a\83X\83g\83^\83C\83v (LIST_xxx)\r
3144 *----------------------------------------------------------------------------*/\r
3145 \r
3146 static int AnalizeFileInfo(char *Str)\r
3147 {\r
3148         int Ret;\r
3149         char Tmp[FMAX_PATH+1];\r
3150         int Add1;\r
3151         int TmpInt;\r
3152         int Flag1;\r
3153         WORD Month;\r
3154         WORD Day;\r
3155 \r
3156 //DoPrintf("LIST : %s", Str);\r
3157 \r
3158         Ret = LIST_UNKNOWN;\r
3159         Flag1 = AskHostType();\r
3160         if(Flag1 == HTYPE_ACOS)\r
3161                 Ret = LIST_ACOS;\r
3162         else if(Flag1 == HTYPE_ACOS_4)\r
3163                 Ret = LIST_ACOS_4;\r
3164         else if(Flag1 == HTYPE_VMS)\r
3165                 Ret = LIST_VMS;\r
3166         else if(Flag1 == HTYPE_IRMX)\r
3167                 Ret = LIST_IRMX;\r
3168         else if(Flag1 == HTYPE_STRATUS)\r
3169                 Ret = LIST_STRATUS;\r
3170         else if(Flag1 == HTYPE_AGILENT)\r
3171                 Ret = LIST_AGILENT;\r
3172         else if(Flag1 == HTYPE_SHIBASOKU)\r
3173                 Ret = LIST_SHIBASOKU;\r
3174         else\r
3175         {\r
3176                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3177                 /* LIST_UNIX_10, LIST_UNIX_20, LIST_UNIX_12, LIST_UNIX_22, LIST_UNIX_50, LIST_UNIX_60 */\r
3178                 /* MELCOM80 */\r
3179 \r
3180                 if(FindField(Str, Tmp, 0, NO) == SUCCESS)\r
3181                 {\r
3182                         /* MELCOM80\82Í "d rwxrwxrwx" \82Ì\82æ\82¤\82É\83X\83y\81[\83X\82ª\8bó\82¢\82Ä\82¢\82é */\r
3183                         Flag1 = NO;\r
3184                         if((strlen(Tmp) == 1) && (strchr("-dDlL", Tmp[0]) != NULL))\r
3185                         {\r
3186                                 if(FindField(Str, Tmp, 1, NO) == SUCCESS)\r
3187                                 {\r
3188                                         if((strlen(Tmp) == 9) ||\r
3189                                            ((strlen(Tmp) > 9) && (IsDigit(Tmp[9]) != 0)))\r
3190                                         {\r
3191                                                 memmove(Str+1, Str+2, strlen(Str+2)+1);\r
3192                                                 FindField(Str, Tmp, 0, NO);\r
3193                                                 Flag1 = YES;\r
3194                                         }\r
3195                                 }\r
3196                         }\r
3197 \r
3198                         if(strlen(Tmp) >= 10)\r
3199                         {\r
3200                                 Add1 = 0;\r
3201                                 if((strlen(Tmp) > 10) && (IsDigit(Tmp[10]) != 0))\r
3202                                 {\r
3203                                         /* \82±\82¤\82¢\82¤\8e\9e */\r
3204                                         /*   drwxr-xr-x1234  owner group  1024  Nov 6 14:21 Linux/    */\r
3205                                         Add1 = -1;\r
3206                                 }\r
3207 \r
3208 ////////////\r
3209 // LIST_UNIX_60 support\r
3210                                 if(FindField(Str, Tmp, 7+Add1, NO) == SUCCESS)\r
3211                                 {\r
3212                                         GetMonth(Tmp, &Month, &Day);\r
3213                                         if(Month != 0)\r
3214                                         {\r
3215                                                 Ret = CheckUnixType(Str, Tmp, Add1, 2, Day);\r
3216                                         }\r
3217                                 }\r
3218 ///////////\r
3219 \r
3220 ////////////\r
3221 // LIST_UNIX_12 support\r
3222                                 if((Ret == LIST_UNKNOWN) &&\r
3223                                    (FindField(Str, Tmp, 6+Add1, NO) == SUCCESS))\r
3224                                 {\r
3225                                         GetMonth(Tmp, &Month, &Day);\r
3226                                         if(Month != 0)\r
3227                                         {\r
3228                                                 Ret = CheckUnixType(Str, Tmp, Add1, 0, Day);\r
3229                                         }\r
3230                                 }\r
3231 //////////////////\r
3232 \r
3233 ////////////\r
3234 // LIST_UNIX_70 support\r
3235                                 if((Ret == LIST_UNKNOWN) &&\r
3236                                    (FindField(Str, Tmp, 6+Add1, NO) == SUCCESS))\r
3237                                 {\r
3238                                         GetMonth(Tmp, &Month, &Day);\r
3239                                         if(Month != 0)\r
3240                                         {\r
3241                                                 Ret = CheckUnixType(Str, Tmp, Add1, 1, Day);\r
3242                                         }\r
3243                                 }\r
3244 ///////////\r
3245 \r
3246                                 if((Ret == LIST_UNKNOWN) &&\r
3247                                    (FindField(Str, Tmp, 5+Add1, NO) == SUCCESS))\r
3248                                 {\r
3249                                         GetMonth(Tmp, &Month, &Day);\r
3250                                         if(Month != 0)\r
3251                                         {\r
3252                                                 Ret = CheckUnixType(Str, Tmp, Add1, 0, Day);\r
3253                                         }\r
3254                                 }\r
3255 \r
3256                                 if((Ret == LIST_UNKNOWN) &&\r
3257                                    (FindField(Str, Tmp, 4+Add1, NO) == SUCCESS))\r
3258                                 {\r
3259                                         GetMonth(Tmp, &Month, &Day);\r
3260                                         if(Month != 0)\r
3261                                         {\r
3262                                                 Ret = CheckUnixType(Str, Tmp, Add1, -1, Day);\r
3263                                         }\r
3264                                 }\r
3265 \r
3266                                 if((Ret == LIST_UNKNOWN) &&\r
3267                                    (FindField(Str, Tmp, 3+Add1, NO) == SUCCESS))\r
3268                                 {\r
3269                                         GetMonth(Tmp, &Month, &Day);\r
3270                                         if(Month != 0)\r
3271                                         {\r
3272                                                 Ret = CheckUnixType(Str, Tmp, Add1, -2, Day);\r
3273                                         }\r
3274                                 }\r
3275 \r
3276                                 if((Ret != LIST_UNKNOWN) && (Flag1 == YES))\r
3277                                         Ret |= LIST_MELCOM;\r
3278                         }\r
3279                 }\r
3280 \r
3281                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3282                 /* LIST_AS400 */\r
3283 \r
3284                 if(Ret == LIST_UNKNOWN)\r
3285                 {\r
3286                         if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3287                            (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3288                         {\r
3289                                 if((FindField(Str, Tmp, 3, NO) == SUCCESS) &&\r
3290                                    (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3291                                 {\r
3292                                         if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3293                                            (IsDigit(Tmp[0]) != 0))\r
3294                                         {\r
3295                                                 if(FindField(Str, Tmp, 5, NO) == SUCCESS)\r
3296                                                 {\r
3297                                                         Ret = LIST_AS400;\r
3298                                                 }\r
3299                                         }\r
3300                                 }\r
3301                         }\r
3302                 }\r
3303 \r
3304                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3305                 /* LIST_M1800 */\r
3306 \r
3307                 if(Ret == LIST_UNKNOWN)\r
3308                 {\r
3309                         if((FindField(Str, Tmp, 5, NO) == SUCCESS) &&\r
3310                            (CheckYYMMDDformat(Tmp, '*', NO) != 0))\r
3311                         {\r
3312                                 if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3313                                    ((IsDigit(Tmp[0]) != 0) || (StrAllSameChar(Tmp, '*') == YES)))\r
3314                                 {\r
3315                                         if((FindField(Str, Tmp, 3, NO) == SUCCESS) &&\r
3316                                            ((IsDigit(Tmp[0]) != 0) || (StrAllSameChar(Tmp, '*') == YES)))\r
3317                                         {\r
3318                                                 if((FindField(Str, Tmp, 0, NO) == SUCCESS) &&\r
3319                                                    (strlen(Tmp) == 4))\r
3320                                                 {\r
3321                                                         if(FindField(Str, Tmp, 6, NO) == SUCCESS)\r
3322                                                         {\r
3323                                                                 Ret = LIST_M1800;\r
3324                                                         }\r
3325                                                 }\r
3326                                         }\r
3327                                 }\r
3328                         }\r
3329                 }\r
3330 \r
3331                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3332                 /* LIST_GP6000 */\r
3333 \r
3334                 if(Ret == LIST_UNKNOWN)\r
3335                 {\r
3336                         if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3337                            (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3338                         {\r
3339                                 if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3340                                    (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3341                                 {\r
3342                                         if((FindField(Str, Tmp, 5, NO) == SUCCESS) &&\r
3343                                            (IsDigit(Tmp[0]) != 0))\r
3344                                         {\r
3345                                                 if(FindField(Str, Tmp, 6, NO) == SUCCESS)\r
3346                                                 {\r
3347                                                         Ret = LIST_GP6000;\r
3348                                                 }\r
3349                                         }\r
3350                                 }\r
3351                         }\r
3352                 }\r
3353 \r
3354                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3355                 /* LIST_DOS_1, LIST_DOS_2 */\r
3356 \r
3357                 if(Ret == LIST_UNKNOWN)\r
3358                 {\r
3359                         if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3360                            (CheckHHMMformat(Tmp) == YES))\r
3361                         {\r
3362                                 if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3363                                    ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))\r
3364                                 {\r
3365                                         if(FindField(Str, Tmp, 3, NO) == SUCCESS)\r
3366                                         {\r
3367                                                 if((FindField(Str, Tmp, 0, NO) == SUCCESS) &&\r
3368                                                    (CheckYYMMDDformat(Tmp, NUL, YES) != 0))\r
3369                                                 {\r
3370                                                         TmpInt = atoi(Tmp);\r
3371                                                         if((TmpInt >= 1) && (TmpInt <= 12))\r
3372                                                                 Ret = LIST_DOS_2;\r
3373                                                         else\r
3374                                                                 Ret = LIST_DOS_1;\r
3375                                                 }\r
3376                                         }\r
3377                                 }\r
3378                         }\r
3379                 }\r
3380 \r
3381                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3382                 /* LIST_DOS_3 */\r
3383 \r
3384                 if(Ret == LIST_UNKNOWN)\r
3385                 {\r
3386                         if((FindField(Str, Tmp, 3, NO) == SUCCESS) &&\r
3387                            (CheckHHMMformat(Tmp) == YES))\r
3388                         {\r
3389                                 if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3390                                    ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))\r
3391                                 {\r
3392                                         if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3393                                            (CheckYYMMDDformat(Tmp, NUL, YES) != 0))\r
3394                                         {\r
3395                                                 Ret = LIST_DOS_3;\r
3396                                         }\r
3397                                 }\r
3398                         }\r
3399                 }\r
3400 \r
3401                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3402                 /* LIST_DOS_4 */\r
3403 \r
3404                 if(Ret == LIST_UNKNOWN)\r
3405                 {\r
3406                         if((FindField(Str, Tmp, 0, NO) == SUCCESS) &&\r
3407                            (CheckYYYYMMDDformat(Tmp, NUL) == YES))\r
3408                         {\r
3409                                 if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3410                                    (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3411                                 {\r
3412                                         if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3413                                            ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))\r
3414                                         {\r
3415                                                 if(FindField(Str, Tmp, 3, NO) == SUCCESS)\r
3416                                                 {\r
3417                                                         Ret = LIST_DOS_4;\r
3418                                                 }\r
3419                                         }\r
3420                                 }\r
3421                         }\r
3422                 }\r
3423 \r
3424                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3425                 /* LIST_CHAMELEON */\r
3426 \r
3427                 if(Ret == LIST_UNKNOWN)\r
3428                 {\r
3429                         if(FindField(Str, Tmp, 2, NO) == SUCCESS)\r
3430                         {\r
3431                                 GetMonth(Tmp, &Month, &Day);\r
3432                                 if((Month != 0) && (Day == 0))\r
3433                                 {\r
3434                                         if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3435                                            ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))\r
3436                                         {\r
3437                                                 if((FindField(Str, Tmp, 5, NO) == SUCCESS) &&\r
3438                                                    (CheckHHMMformat(Tmp) == YES))\r
3439                                                 {\r
3440                                                         Ret = LIST_CHAMELEON;\r
3441                                                 }\r
3442                                         }\r
3443                                 }\r
3444                         }\r
3445                 }\r
3446 \r
3447                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3448                 /* LIST_OS2 */\r
3449 \r
3450                 if(Ret == LIST_UNKNOWN)\r
3451                 {\r
3452                         if((FindField(Str, Tmp, 3, NO) == SUCCESS) &&\r
3453                            (CheckHHMMformat(Tmp) == YES))\r
3454                         {\r
3455                                 if((FindField(Str, Tmp, 0, NO) == SUCCESS) &&\r
3456                                    (IsDigit(Tmp[0]) != 0))\r
3457                                 {\r
3458                                         if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3459                                            (CheckYYMMDDformat(Tmp, NUL, YES) != 0))\r
3460                                         {\r
3461                                                 if(FindField(Str, Tmp, 4, NO) == SUCCESS)\r
3462                                                 {\r
3463                                                         Ret = LIST_OS2;\r
3464                                                 }\r
3465                                         }\r
3466                                 }\r
3467                         }\r
3468                 }\r
3469 \r
3470                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3471                 /* LIST_OS7 */\r
3472 \r
3473                 if(Ret == LIST_UNKNOWN)\r
3474                 {\r
3475                         if((FindField(Str, Tmp, 0, NO) == SUCCESS) &&\r
3476                            (strlen(Tmp) == 10))\r
3477                         {\r
3478                                 if((FindField(Str, Tmp, 3, NO) == SUCCESS) &&\r
3479                                    (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3480                                 {\r
3481                                         if((FindField(Str, Tmp, 4, NO) == SUCCESS) &&\r
3482                                            (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3483                                         {\r
3484                                                 if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3485                                                    (IsDigit(Tmp[0]) != 0))\r
3486                                                 {\r
3487                                                         if(FindField(Str, Tmp, 5, NO) == SUCCESS)\r
3488                                                         {\r
3489                                                                 Ret = LIST_OS7_2;\r
3490                                                         }\r
3491                                                 }\r
3492                                         }\r
3493                                 }\r
3494                                 else if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3495                                                 (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3496                                 {\r
3497                                         if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3498                                            (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3499                                         {\r
3500                                                 if(FindField(Str, Tmp, 3, NO) == SUCCESS)\r
3501                                                 {\r
3502                                                         Ret = LIST_OS7_1;\r
3503                                                 }\r
3504                                         }\r
3505                                 }\r
3506                         }\r
3507                 }\r
3508 \r
3509                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3510                 /* LIST_ALLIED */\r
3511 \r
3512                 if(Ret == LIST_UNKNOWN)\r
3513                 {\r
3514                         if((FindField(Str, Tmp, 0, NO) == SUCCESS) &&\r
3515                            ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))\r
3516                         {\r
3517                                 if((FindField(Str, Tmp, 5, NO) == SUCCESS) &&\r
3518                                    (CheckHHMMformat(Tmp) == YES))\r
3519                                 {\r
3520                                         if(FindField(Str, Tmp, 3, NO) == SUCCESS)\r
3521                                         {\r
3522                                                 GetMonth(Tmp, &Month, &Day);\r
3523                                                 if(Month != 0)\r
3524                                                 {\r
3525                                                         if((FindField(Str, Tmp, 6, NO) == SUCCESS) &&\r
3526                                                            (IsDigit(Tmp[0]) != 0))\r
3527                                                         {\r
3528                                                                 Ret = LIST_ALLIED;\r
3529                                                         }\r
3530                                                 }\r
3531                                         }\r
3532                                 }\r
3533                         }\r
3534                 }\r
3535 \r
3536                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3537                 /* LIST_OS9 */\r
3538 \r
3539                 if(Ret == LIST_UNKNOWN)\r
3540                 {\r
3541                         if((FindField(Str, Tmp, 1, NO) == SUCCESS) &&\r
3542                            (CheckYYMMDDformat(Tmp, NUL, NO) != 0))\r
3543                         {\r
3544                                 if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3545                                    (IsDigit(Tmp[0]) != 0) && (strlen(Tmp) == 4))\r
3546                                 {\r
3547                                         if((FindField(Str, Tmp, 5, NO) == SUCCESS) &&\r
3548                                            (IsDigit(Tmp[0]) != 0))\r
3549                                         {\r
3550                                                 if(FindField(Str, Tmp, 6, NO) == SUCCESS)\r
3551                                                 {\r
3552                                                         Ret = LIST_OS9;\r
3553                                                 }\r
3554                                         }\r
3555                                 }\r
3556                         }\r
3557                 }\r
3558 \r
3559                 /* \88È\89º\82Ì\83t\83H\81[\83}\83b\83g\82ð\83`\83F\83b\83N */\r
3560                 /* LIST_IBM */\r
3561 \r
3562                 if(Ret == LIST_UNKNOWN)\r
3563                 {\r
3564                         if((FindField(Str, Tmp, 2, NO) == SUCCESS) &&\r
3565                            (CheckYYYYMMDDformat(Tmp, NUL) == YES))\r
3566                         {\r
3567                                 if((FindField(Str, Tmp, 1, NO) == SUCCESS) && IsDigit(Tmp[0]))\r
3568                                 {\r
3569                                         if((FindField(Str, Tmp, 7, NO) == SUCCESS) && IsDigit(Tmp[0]))\r
3570                                         {\r
3571                                                 if(FindField(Str, Tmp, 9, NO) == SUCCESS)\r
3572                                                 {\r
3573                                                         Ret = LIST_IBM;\r
3574                                                 }\r
3575                                         }\r
3576                                 }\r
3577                         }\r
3578                 }\r
3579 \r
3580         }\r
3581 \r
3582 DoPrintf("ListType=%d", Ret);\r
3583 \r
3584         return(Ret);\r
3585 }\r
3586 \r
3587 \r
3588 /*----- UNIX\8cn\83\8a\83X\83g\83^\83C\83v\82Ì\83`\83F\83b\83N\82ð\8ds\82È\82¤ ----------------------------------\r
3589 *\r
3590 *       Parameter\r
3591 *               char *Str : \83t\83@\83C\83\8b\8fî\95ñ\81i\82P\8ds\81j\r
3592 *               char *Tmp : \88ê\8e\9e\83\8f\81[\83N\r
3593 *               int Add1 : \89Á\8eZ\83p\83\89\83\81\81[\83^1\r
3594 *               int Add2 : \89Á\8eZ\83p\83\89\83\81\81[\83^2\r
3595 *               int Day : \93ú (0=\82±\82±\82Å\8eæ\93¾\82·\82é)\r
3596 *\r
3597 *       Return Value\r
3598 *               int \83\8a\83X\83g\83^\83C\83v (LIST_xxx)\r
3599 *----------------------------------------------------------------------------*/\r
3600 \r
3601 static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day)\r
3602 {\r
3603         int Ret;\r
3604         int Add3;\r
3605         WORD Hour;\r
3606         WORD Minute;\r
3607         int Flag;\r
3608 \r
3609         Flag = 0;\r
3610         Ret = LIST_UNKNOWN;\r
3611 \r
3612 //Day\82É\82æ\82Á\82ÄAdd3\82ð\95Ï\82¦\82é\r
3613 \r
3614         Add3 = 0;\r
3615         if(Day != 0)\r
3616                 Add3 = -1;\r
3617 \r
3618         // unix\8cn\83`\83F\83b\83N\r
3619         if((Day != 0) ||\r
3620            ((FindField(Str, Tmp, 6+Add1+Add2+Add3, NO) == SUCCESS) &&\r
3621                 ((atoi(Tmp) >= 1) && (atoi(Tmp) <= 31))))\r
3622         {\r
3623                 if((FindField(Str, Tmp, 7+Add1+Add2+Add3, NO) == SUCCESS) &&\r
3624                    ((atoi(Tmp) >= 1900) || (GetHourAndMinute(Tmp, &Hour, &Minute) == SUCCESS)))\r
3625                 {\r
3626                         if(FindField(Str, Tmp, 8+Add1+Add2+Add3, NO) == SUCCESS)\r
3627                         {\r
3628                                 Flag = 1;\r
3629                         }\r
3630                 }\r
3631         }\r
3632 \r
3633         // \92\86\8d\91\8cêSolaris\90ê\97p\r
3634         if(Flag == 0)\r
3635         {\r
3636            if((FindField(Str, Tmp, 7+Add1+Add2+Add3, NO) == SUCCESS) &&\r
3637                   ((atoi(Tmp) >= 1) && (atoi(Tmp) <= 31)))\r
3638                 {\r
3639                         if((FindField(Str, Tmp, 5+Add1+Add2+Add3, NO) == SUCCESS) &&\r
3640                            (atoi(Tmp) >= 1900))\r
3641                         {\r
3642                                 if((FindField(Str, Tmp, 6+Add1+Add2+Add3, NO) == SUCCESS) &&\r
3643                                    (((atoi(Tmp) >= 1) && (atoi(Tmp) <= 9) && \r
3644                                          ((unsigned char)Tmp[1] == 0xD4) &&\r
3645                                          ((unsigned char)Tmp[2] == 0xC2)) ||\r
3646                                     ((atoi(Tmp) >= 10) && (atoi(Tmp) <= 12) && \r
3647                                          ((unsigned char)Tmp[2] == 0xD4) && \r
3648                                          ((unsigned char)Tmp[3] == 0xC2))))\r
3649                                 {\r
3650                                         if(FindField(Str, Tmp, 8+Add1+Add2+Add3, NO) == SUCCESS)\r
3651                                         {\r
3652                                                 Flag = 2;\r
3653                                         }\r
3654                                 }\r
3655                         }\r
3656                 }\r
3657         }\r
3658 \r
3659         if(Flag != 0)\r
3660         {\r
3661                 if(Add2 == 2)\r
3662                 {\r
3663                         Ret = LIST_UNIX_60;\r
3664                         if(Flag == 2)\r
3665                                 Ret = LIST_UNIX_64;\r
3666                         if(Day != 0)\r
3667                                 Ret = LIST_UNIX_61;\r
3668 \r
3669                         if(Add1 == -1)\r
3670                         {\r
3671                                 Ret = LIST_UNIX_62;\r
3672                                 if(Flag == 2)\r
3673                                         Ret = LIST_UNIX_65;\r
3674                                 if(Day != 0)\r
3675                                         Ret = LIST_UNIX_63;\r
3676                         }\r
3677                 }\r
3678                 else if(Add2 == 1)\r
3679                 {\r
3680                         Ret = LIST_UNIX_70;\r
3681                         if(Flag == 2)\r
3682                                 Ret = LIST_UNIX_74;\r
3683                         if(Day != 0)\r
3684                                 Ret = LIST_UNIX_71;\r
3685 \r
3686                         if(Add1 == -1)\r
3687                         {\r
3688                                 Ret = LIST_UNIX_72;\r
3689                                 if(Flag == 2)\r
3690                                         Ret = LIST_UNIX_75;\r
3691                                 if(Day != 0)\r
3692                                         Ret = LIST_UNIX_73;\r
3693                         }\r
3694                 }\r
3695                 else if(Add2 == 0)\r
3696                 {\r
3697                         Ret = LIST_UNIX_10;\r
3698                         if(Flag == 2)\r
3699                                 Ret = LIST_UNIX_14;\r
3700                         if(Day != 0)\r
3701                                 Ret = LIST_UNIX_11;\r
3702 \r
3703                         if(Add1 == -1)\r
3704                         {\r
3705                                 Ret = LIST_UNIX_12;\r
3706                                 if(Flag == 2)\r
3707                                         Ret = LIST_UNIX_15;\r
3708                                 if(Day != 0)\r
3709                                         Ret = LIST_UNIX_13;\r
3710                         }\r
3711                 }\r
3712                 else if(Add2 == -1)\r
3713                 {\r
3714                         Ret = LIST_UNIX_20;\r
3715                         if(Flag == 2)\r
3716                                 Ret = LIST_UNIX_24;\r
3717                         if(Day != 0)\r
3718                                 Ret = LIST_UNIX_21;\r
3719 \r
3720                         if(Add1 == -1)\r
3721                         {\r
3722                                 Ret = LIST_UNIX_22;\r
3723                                 if(Flag == 2)\r
3724                                         Ret = LIST_UNIX_25;\r
3725                                 if(Day != 0)\r
3726                                         Ret = LIST_UNIX_23;\r
3727                         }\r
3728                 }\r
3729                 else\r
3730                 {\r
3731                         Ret = LIST_UNIX_50;\r
3732                         if(Flag == 2)\r
3733                                 Ret = LIST_UNIX_54;\r
3734                         if(Day != 0)\r
3735                                 Ret = LIST_UNIX_51;\r
3736                 }\r
3737         }\r
3738         return(Ret);\r
3739 }\r
3740 \r
3741 \r
3742 /*----- HH:MM \8c`\8e®\82Ì\95\8e\9a\97ñ\82©\82Ç\82¤\82©\82ð\83`\83F\83b\83N ----------------------------------\r
3743 *\r
3744 *       Parameter\r
3745 *               char *Str : \95\8e\9a\97ñ\r
3746 *\r
3747 *       Return Value\r
3748 *               int \83X\83e\81[\83^\83X (YES/NO)\r
3749 *\r
3750 *       Note\r
3751 *               \8bæ\90Ø\82è\95\8e\9a\82Í\89½\82Å\82à\82æ\82¢\r
3752 *               \8e\9e\95ª\82Å\82È\82­\82Ä\82à\82æ\82¢\r
3753 *               \8cã\82ë\82É\97]\95ª\82È\95\8e\9a\82ª\95t\82¢\82Ä\82¢\82Ä\82à\82æ\82¢\r
3754 *----------------------------------------------------------------------------*/\r
3755 \r
3756 static int CheckHHMMformat(char *Str)\r
3757 {\r
3758         int Ret;\r
3759 \r
3760         Ret = NO;\r
3761         if((strlen(Str) >= 3) &&\r
3762            (IsDigit(Str[0]) != 0))\r
3763         {\r
3764                 if((Str = strchr(Str, ':')) != NULL)\r
3765                 {\r
3766                         if(IsDigit(*(Str+1)) != 0)\r
3767                                 Ret = YES;\r
3768                 }\r
3769         }\r
3770         return(Ret);\r
3771 }\r
3772 \r
3773 \r
3774 /*----- YY/MM/DD \8c`\8e®\82Ì\95\8e\9a\97ñ\82©\82Ç\82¤\82©\82ð\83`\83F\83b\83N -------------------------------\r
3775 *\r
3776 *       Parameter\r
3777 *               char *Str : \95\8e\9a\97ñ\r
3778 *               char Sym : \90\94\8e\9a\82Ì\91ã\82í\82è\82É\8eg\82¦\82é\8bL\8d\86 (NUL=\90\94\8e\9a\88È\8aO\8eg\82¦\82È\82¢)\r
3779 *               int Dig3 : 3\8c\85\82Ì\94N\82ð\8b\96\89Â\r
3780 *\r
3781 *       Return Value\r
3782 *               int \83X\83e\81[\83^\83X\r
3783 *                       0 = \8aY\93\96\82µ\82È\82¢\r
3784 *                       1 = ??/??/??, ??/??/???\r
3785 *                       2 = ???/??/??\r
3786 *\r
3787 *       Note\r
3788 *               \8bæ\90Ø\82è\95\8e\9a\82Í\89½\82Å\82à\82æ\82¢\r
3789 *               \94N\8c\8e\93ú\82Å\82È\82­\82Ä\82à\82æ\82¢\r
3790 *----------------------------------------------------------------------------*/\r
3791 \r
3792 static int CheckYYMMDDformat(char *Str, char Sym, int Dig3)\r
3793 {\r
3794         int Ret;\r
3795 \r
3796         Ret = 0;\r
3797         if((strlen(Str) == 8) &&\r
3798            (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&\r
3799            (IsDigit(Str[2]) == 0) &&\r
3800            (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) &&\r
3801            (IsDigit(Str[5]) == 0) &&\r
3802            (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0))\r
3803         {\r
3804                 Ret = 1; \r
3805         }\r
3806         if(Dig3 == YES)\r
3807         {\r
3808                 if((strlen(Str) == 9) &&\r
3809                    (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) && (IsDigitSym(Str[2], Sym) != 0) &&\r
3810                    (IsDigit(Str[3]) == 0) &&\r
3811                    (IsDigitSym(Str[4], Sym) != 0) && (IsDigitSym(Str[5], Sym) != 0) &&\r
3812                    (IsDigit(Str[6]) == 0) &&\r
3813                    (IsDigitSym(Str[7], Sym) != 0) && (IsDigitSym(Str[8], Sym) != 0))\r
3814                 {\r
3815                         Ret = 2; \r
3816                 }\r
3817                 else if((strlen(Str) == 9) &&\r
3818                                 (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&\r
3819                                 (IsDigit(Str[2]) == 0) &&\r
3820                                 (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) &&\r
3821                                 (IsDigit(Str[5]) == 0) &&\r
3822                                 (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0) && (IsDigitSym(Str[8], Sym) != 0))\r
3823                 {\r
3824                         Ret = 1; \r
3825                 }\r
3826         }\r
3827         return(Ret);\r
3828 }\r
3829 \r
3830 \r
3831 /*----- YYYY/MM/DD \8c`\8e®\82Ì\95\8e\9a\97ñ\82©\82Ç\82¤\82©\82ð\83`\83F\83b\83N -----------------------------\r
3832 *\r
3833 *       Parameter\r
3834 *               char *Str : \95\8e\9a\97ñ\r
3835 *               char Sym : \90\94\8e\9a\82Ì\91ã\82í\82è\82É\8eg\82¦\82é\8bL\8d\86 (NUL=\90\94\8e\9a\88È\8aO\8eg\82¦\82È\82¢)\r
3836 *\r
3837 *       Return Value\r
3838 *               int \83X\83e\81[\83^\83X (YES/NO)\r
3839 *\r
3840 *       Note\r
3841 *               \8bæ\90Ø\82è\95\8e\9a\82Í\89½\82Å\82à\82æ\82¢\r
3842 *               \94N\8c\8e\93ú\82Å\82È\82­\82Ä\82à\82æ\82¢\r
3843 *----------------------------------------------------------------------------*/\r
3844 \r
3845 static int CheckYYYYMMDDformat(char *Str, char Sym)\r
3846 {\r
3847         int Ret;\r
3848 \r
3849         Ret = NO;\r
3850         if((strlen(Str) == 10) &&\r
3851            (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&\r
3852            (IsDigitSym(Str[2], Sym) != 0) && (IsDigitSym(Str[3], Sym) != 0) &&\r
3853            (IsDigit(Str[4]) == 0) &&\r
3854            (IsDigitSym(Str[5], Sym) != 0) && (IsDigitSym(Str[6], Sym) != 0) &&\r
3855            (IsDigit(Str[7]) == 0) &&\r
3856            (IsDigitSym(Str[8], Sym) != 0) && (IsDigitSym(Str[9], Sym) != 0))\r
3857         {\r
3858                 Ret = YES; \r
3859         }\r
3860         return(Ret);\r
3861 }\r
3862 \r
3863 \r
3864 /*----- \83t\83@\83C\83\8b\8fî\95ñ\82©\82ç\83t\83@\83C\83\8b\96¼\81A\83T\83C\83Y\82È\82Ç\82ð\8eæ\82è\8fo\82· ----------------------\r
3865 *\r
3866 *       Parameter\r
3867 *               char *Str : \83t\83@\83C\83\8b\8fî\95ñ\81i\82P\8ds\81j\r
3868 *               int ListType : \83\8a\83X\83g\82Ì\83^\83C\83v\r
3869 *               char *Name : \83t\83@\83C\83\8b\96¼\82Ì\83R\83s\81[\90æ\r
3870 *               LONGLONG *Size : \83T\83C\83Y\82Ì\83R\83s\81[\90æ\r
3871 *               FILETIME *Time : \93ú\95t\82Ì\83R\83s\81[\90æ\r
3872 *               int *Attr : \91®\90«\82Ì\83R\83s\81[\90æ\r
3873 *               char *Owner : \83I\81[\83i\96¼\r
3874 *               int *Link : \83\8a\83\93\83N\82©\82Ç\82¤\82© (YES/NO)\r
3875 *               int *InfoExist : \8e\9e\8d\8f\82Ì\8fî\95ñ\82ª\82 \82Á\82½\82©\82Ç\82¤\82© (YES/NO)\r
3876 *\r
3877 *       Return Value\r
3878 *               int \8eí\97Þ (NODE_xxxx)\r
3879 *----------------------------------------------------------------------------*/\r
3880 \r
3881 static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist)\r
3882 {\r
3883         SYSTEMTIME sTime;\r
3884         SYSTEMTIME sTimeNow;\r
3885         char Buf[FMAX_PATH+1];\r
3886         char *Pos;\r
3887         char Flag;\r
3888         int Ret;\r
3889         int offs;\r
3890         int offs2;\r
3891         int offs3;\r
3892         int OrgListType;\r
3893         int err;\r
3894         int Flag2;\r
3895 \r
3896         static const int DosPos[3][4] = { { 1, 0, 2, 3 }, { 1, 0, 2, 3 }, { 3, 2, 1, 0 } };\r
3897         static const int DosDate[3][3][2] = { { {0, 0}, {3, 4}, {6, 7} }, { {6, 7}, {0, 0}, {3, 4} }, { {6, 7}, {0, 0}, {3, 4} } };\r
3898         static const int DosLongFname[3] = { YES, YES, NO };\r
3899 \r
3900         /* \82Ü\82¸\83N\83\8a\83A\82µ\82Ä\82¨\82­ */\r
3901         Ret = NODE_NONE;\r
3902         *Size = -1;\r
3903         *Attr = 0;\r
3904         *Link = NO;\r
3905         memset(Owner, NUL, OWNER_NAME_LEN+1);\r
3906         Time->dwLowDateTime = 0;\r
3907         Time->dwHighDateTime = 0;\r
3908         *InfoExist = 0;\r
3909         offs = 0;\r
3910         offs2 = 0;\r
3911         offs3 = 0;\r
3912 \r
3913         OrgListType = ListType;\r
3914         ListType &= LIST_MASKFLG;\r
3915         switch(ListType)\r
3916         {\r
3917                 case LIST_DOS_1 :\r
3918                 case LIST_DOS_2 :\r
3919                 case LIST_DOS_3 :\r
3920                         if(ListType == LIST_DOS_1)\r
3921                                 offs = 0;\r
3922                         else if(ListType == LIST_DOS_2)\r
3923                                 offs = 1;\r
3924                         else\r
3925                                 offs = 2;\r
3926 \r
3927                         *InfoExist |= (FINFO_DATE | FINFO_SIZE);\r
3928 \r
3929                         /* \8e\9e\8d\8f */\r
3930                         FindField(Str, Buf, DosPos[offs][0], NO);\r
3931                         if((Pos = strchr(Buf, ':')) != NULL)\r
3932                         {\r
3933                                 *InfoExist |= FINFO_TIME;\r
3934                                 sTime.wHour = atoi(Buf);\r
3935                                 sTime.wMinute = atoi(Pos+1);\r
3936                                 sTime.wSecond = 0;\r
3937                                 sTime.wMilliseconds = 0;\r
3938 \r
3939                                 if(strlen(Pos) >= 4)\r
3940                                 {\r
3941                                         if(tolower(Pos[3]) == 'a')\r
3942                                         {\r
3943                                                 if(sTime.wHour == 12)\r
3944                                                         sTime.wHour = 0;\r
3945                                         }\r
3946                                         else if(tolower(Pos[3]) == 'p')\r
3947                                         {\r
3948                                                 if(sTime.wHour != 12)\r
3949                                                         sTime.wHour += 12;\r
3950                                         }\r
3951                                 }\r
3952                         }\r
3953 \r
3954                         /* \93ú\95t */\r
3955                         FindField(Str, Buf, DosPos[offs][1], NO);\r
3956                         if((offs2 = CheckYYMMDDformat(Buf, NUL, YES)) == 0)\r
3957                                 break;\r
3958                         offs2--;\r
3959                         sTime.wYear = Assume1900or2000(atoi(Buf + DosDate[offs][0][offs2]));\r
3960                         sTime.wMonth = atoi(Buf + DosDate[offs][1][offs2]);\r
3961                         sTime.wDay = atoi(Buf + DosDate[offs][2][offs2]);\r
3962                         SystemTimeToFileTime(&sTime, Time);\r
3963                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
3964 \r
3965                         /* \83T\83C\83Y */\r
3966                         FindField(Str, Buf, DosPos[offs][2], NO);\r
3967                         *Size = _atoi64(Buf);\r
3968 \r
3969                         /* \96¼\91O */\r
3970                         if(FindField(Str, Fname, DosPos[offs][3], DosLongFname[offs]) == SUCCESS)\r
3971                         {\r
3972                                 Ret = NODE_FILE;\r
3973                                 if(Buf[0] == '<')\r
3974                                         Ret = NODE_DIR;\r
3975                         }\r
3976                         break;\r
3977 \r
3978                 case LIST_DOS_4 :\r
3979                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
3980 \r
3981                         /* \93ú\95t */\r
3982                         FindField(Str, Buf, 0, NO);\r
3983                         sTime.wYear = atoi(Buf);\r
3984                         sTime.wMonth = atoi(Buf+5);\r
3985                         sTime.wDay = atoi(Buf+8);\r
3986 \r
3987                         /* \8e\9e\8d\8f */\r
3988                         *InfoExist |= FINFO_TIME;\r
3989                         FindField(Str, Buf, 1, NO);\r
3990                         sTime.wHour = atoi(Buf);\r
3991                         sTime.wMinute = atoi(Buf+3);\r
3992                         sTime.wSecond = 0;                              // atoi(Buf+6);\r
3993                         sTime.wMilliseconds = 0;\r
3994                         SystemTimeToFileTime(&sTime, Time);\r
3995                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
3996 \r
3997                         /* \83T\83C\83Y */\r
3998                         FindField(Str, Buf, 2, NO);\r
3999                         *Size = _atoi64(Buf);\r
4000 \r
4001                         /* \96¼\91O */\r
4002                         if(FindField(Str, Fname, 3, YES) == SUCCESS)\r
4003                         {\r
4004                                 Ret = NODE_FILE;\r
4005                                 if(Buf[0] == '<')\r
4006                                         Ret = NODE_DIR;\r
4007                         }\r
4008                         break;\r
4009 \r
4010                 case LIST_OS2 :\r
4011                         *InfoExist |= (FINFO_DATE | FINFO_SIZE);\r
4012 \r
4013                         /* \8e\9e\8d\8f */\r
4014                         FindField(Str, Buf, 3, NO);\r
4015                         if((Pos = strchr(Buf, ':')) != NULL)\r
4016                         {\r
4017                                 *InfoExist |= FINFO_TIME;\r
4018                                 sTime.wHour = atoi(Buf);\r
4019                                 sTime.wMinute = atoi(Pos+1);\r
4020                                 sTime.wSecond = 0;\r
4021                                 sTime.wMilliseconds = 0;\r
4022                         }\r
4023 \r
4024                         /* \93ú\95t */\r
4025                         FindField(Str, Buf, 2, NO);\r
4026                         sTime.wYear = Assume1900or2000(atoi(Buf+6));\r
4027                         sTime.wMonth = atoi(Buf+0);\r
4028                         sTime.wDay = atoi(Buf+3);\r
4029                         SystemTimeToFileTime(&sTime, Time);\r
4030                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4031 \r
4032                         /* \83T\83C\83Y */\r
4033                         FindField(Str, Buf, 0, NO);\r
4034                         *Size = _atoi64(Buf);\r
4035 \r
4036                         /* \96¼\91O */\r
4037                         if(FindField(Str, Fname, 4, YES) == SUCCESS)\r
4038                         {\r
4039                                 FindField(Str, Buf, 1, NO);\r
4040                                 Ret = NODE_FILE;\r
4041                                 if(strstr(Buf, "DIR") != NULL)\r
4042                                         Ret = NODE_DIR;\r
4043                         }\r
4044                         break;\r
4045 \r
4046                 case LIST_CHAMELEON :\r
4047                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
4048 \r
4049                         /* \91®\90« */\r
4050                         FindField(Str, Buf, 6, NO);\r
4051                         strcat(Buf, "------");\r
4052                         *Attr = AttrString2Value(Buf+1);\r
4053 \r
4054                         /* \93ú\95t */\r
4055                         FindField(Str, Buf, 2, NO);\r
4056                         GetMonth(Buf, &sTime.wMonth, &sTime.wDay);      /* wDay\82Í\8fí\82É0 */\r
4057                         FindField(Str, Buf, 3, NO);\r
4058                         sTime.wDay = atoi(Buf);\r
4059                         FindField(Str, Buf, 4, NO);\r
4060                         sTime.wYear = atoi(Buf);\r
4061 \r
4062                         /* \8e\9e\8d\8f */\r
4063                         FindField(Str, Buf, 5, NO);\r
4064                         sTime.wHour = atoi(Buf);\r
4065                         sTime.wMinute = atoi(Buf+3);\r
4066                         sTime.wSecond = 0;\r
4067                         sTime.wMilliseconds = 0;\r
4068                         SystemTimeToFileTime(&sTime, Time);\r
4069                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4070 \r
4071                         /* \83T\83C\83Y */\r
4072                         FindField(Str, Buf, 1, NO);\r
4073                         *Size = _atoi64(Buf);\r
4074 \r
4075                         /* \96¼\91O */\r
4076                         if(FindField(Str, Fname, 0, NO) == SUCCESS)\r
4077                         {\r
4078                                 Ret = NODE_FILE;\r
4079                                 if(Buf[0] == '<')\r
4080                                         Ret = NODE_DIR;\r
4081                         }\r
4082                         break;\r
4083 \r
4084                 case LIST_AS400 :\r
4085                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
4086 \r
4087                         /* \83I\81[\83i\96¼ */\r
4088                         FindField(Str, Buf, 0, NO);\r
4089                         strncpy(Owner, Buf, OWNER_NAME_LEN);\r
4090 \r
4091                         /* \8e\9e\8d\8f */\r
4092                         FindField(Str, Buf, 3, NO);\r
4093                         sTime.wHour = atoi(Buf);\r
4094                         sTime.wMinute = atoi(Buf+3);\r
4095                         sTime.wSecond = 0;\r
4096                         sTime.wMilliseconds = 0;\r
4097 \r
4098                         /* \93ú\95t */\r
4099                         FindField(Str, Buf, 2, NO);\r
4100                         sTime.wYear = Assume1900or2000(atoi(Buf));\r
4101                         sTime.wMonth = atoi(Buf + 3);\r
4102                         sTime.wDay = atoi(Buf + 6);\r
4103                         SystemTimeToFileTime(&sTime, Time);\r
4104                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4105 \r
4106                         /* \83T\83C\83Y */\r
4107                         FindField(Str, Buf, 1, NO);\r
4108                         *Size = _atoi64(Buf);\r
4109 \r
4110                         /* \96¼\91O */\r
4111                         if(FindField(Str, Fname, 5, YES) == SUCCESS)\r
4112                         {\r
4113                                 Ret = NODE_FILE;\r
4114                                 if((Pos = strchr(Fname, '/')) != NULL)\r
4115                                 {\r
4116                                         Ret = NODE_DIR;\r
4117                                         *Pos = NUL;\r
4118                                 }\r
4119                         }\r
4120                         break;\r
4121 \r
4122                 case LIST_M1800 :\r
4123                         *InfoExist |= FINFO_ATTR;\r
4124 \r
4125                         /* \91®\90« */\r
4126                         FindField(Str, Buf, 0, NO);\r
4127                         strcat(Buf, "------");\r
4128                         *Attr = AttrString2Value(Buf+1);\r
4129 \r
4130                         /* \93ú\95t */\r
4131                         Time->dwLowDateTime = 0;\r
4132                         Time->dwHighDateTime = 0;\r
4133                         FindField(Str, Buf, 5, NO);\r
4134                         if(Buf[0] != '*')\r
4135                         {\r
4136                                 *InfoExist |= FINFO_DATE;\r
4137                                 sTime.wHour = 0;\r
4138                                 sTime.wMinute = 0;\r
4139                                 sTime.wSecond = 0;\r
4140                                 sTime.wMilliseconds = 0;\r
4141 \r
4142                                 sTime.wYear = Assume1900or2000(atoi(Buf));\r
4143                                 sTime.wMonth = atoi(Buf + 3);\r
4144                                 sTime.wDay = atoi(Buf + 6);\r
4145                                 SystemTimeToFileTime(&sTime, Time);\r
4146                                 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4147                         }\r
4148 \r
4149                         /* \96¼\91O */\r
4150                         if(FindField(Str, Fname, 6, YES) == SUCCESS)\r
4151                         {\r
4152                                 RemoveTailingSpaces(Fname);\r
4153                                 Ret = NODE_FILE;\r
4154                                 if((Pos = strchr(Fname, '/')) != NULL)\r
4155                                 {\r
4156                                         Ret = NODE_DIR;\r
4157                                         *Pos = NUL;\r
4158                                 }\r
4159                         }\r
4160                         break;\r
4161 \r
4162                 case LIST_GP6000 :\r
4163                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
4164 \r
4165                         /* \83I\81[\83i\96¼ */\r
4166                         FindField(Str, Buf, 3, NO);\r
4167                         strncpy(Owner, Buf, OWNER_NAME_LEN);\r
4168 \r
4169                         /* \8e\9e\8d\8f */\r
4170                         FindField(Str, Buf, 2, NO);\r
4171                         sTime.wHour = atoi(Buf);\r
4172                         sTime.wMinute = atoi(Buf+3);\r
4173                         sTime.wSecond = 0;\r
4174                         sTime.wMilliseconds = 0;\r
4175 \r
4176                         /* \93ú\95t */\r
4177                         FindField(Str, Buf, 1, NO);\r
4178                         sTime.wYear = Assume1900or2000(atoi(Buf));\r
4179                         sTime.wMonth = atoi(Buf + 3);\r
4180                         sTime.wDay = atoi(Buf + 6);\r
4181                         SystemTimeToFileTime(&sTime, Time);\r
4182                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4183 \r
4184                         /* \83T\83C\83Y */\r
4185                         FindField(Str, Buf, 5, NO);\r
4186                         *Size = _atoi64(Buf);\r
4187 \r
4188                         /* \91®\90« */\r
4189                         FindField(Str, Buf, 0, NO);\r
4190                         *Attr = AttrString2Value(Buf+1);\r
4191 \r
4192                         /* \96¼\91O */\r
4193                         if(FindField(Str, Fname, 6, YES) == SUCCESS)\r
4194                         {\r
4195                                 Ret = NODE_FILE;\r
4196                                 if(strchr("dl", Buf[0]) != NULL)\r
4197                                         Ret = NODE_DIR;\r
4198                         }\r
4199                         break;\r
4200 \r
4201                 case LIST_ACOS :\r
4202                 case LIST_ACOS_4 :\r
4203                         /* \96¼\91O */\r
4204                         FindField(Str, Fname, 0, NO);\r
4205                         Ret = NODE_FILE;\r
4206                         break;\r
4207 \r
4208                 case LIST_VMS :\r
4209                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
4210 \r
4211                         /* \83T\83C\83Y */\r
4212                         FindField(Str, Buf, 1, NO);\r
4213                         *Size = _atoi64(Buf) * BLOCK_SIZE;\r
4214 \r
4215                         /* \8e\9e\8d\8f\81^\93ú\95t */\r
4216                         FindField(Str, Buf, 2, NO);\r
4217                         GetVMSdate(Buf, &sTime.wYear, &sTime.wMonth, &sTime.wDay);\r
4218 \r
4219                         FindField(Str, Buf, 3, NO);\r
4220                         GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute);\r
4221 \r
4222                         sTime.wSecond = 0;\r
4223                         sTime.wMilliseconds = 0;\r
4224                         SystemTimeToFileTime(&sTime, Time);\r
4225                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4226 \r
4227                         /* \96¼\91O */\r
4228                         FindField(Str, Fname, 0, NO);\r
4229 \r
4230                         Ret = NODE_FILE;\r
4231                         if((Pos = strchr(Fname, '.')) != NULL)\r
4232                         {\r
4233                                 if(_strnicmp(Pos, ".DIR;", 5) == 0)\r
4234                                 {\r
4235                                         /* OpenVMS\82Ì\8fê\8d\87\81A\83t\83@\83C\83\8b/\83f\83B\83\8c\83N\83g\83\8a\8dí\8f\9c\8e\9e\82É\82Í".DIR;?"\82Ü\82Å\82È\82¢\82Æ\r
4236                                          * \8dí\8f\9c\82Å\82«\82È\82¢\82Ì\82Å\81A\82±\82±\82Å\82Í\82Â\82Ô\82³\82È\82¢ */\r
4237 #if !defined(HAVE_OPENVMS)\r
4238                                         *Pos = NUL;\r
4239 #endif\r
4240                                         Ret = NODE_DIR;\r
4241                                 }\r
4242                         }\r
4243                         break;\r
4244 \r
4245                 case LIST_OS7_2 :\r
4246                         *InfoExist |= FINFO_SIZE;\r
4247                         offs = 2;\r
4248 \r
4249                         /* \83T\83C\83Y */\r
4250                         FindField(Str, Buf, 2, NO);\r
4251                         *Size = _atoi64(Buf);\r
4252                         /* \82±\82±\82Ébreak\82Í\82È\82¢ */\r
4253 \r
4254                 case LIST_OS7_1 :\r
4255                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_ATTR);\r
4256 \r
4257                         /* \93ú\95t */\r
4258                         FindField(Str, Buf, 1+offs, NO);\r
4259                         sTime.wYear = Assume1900or2000(atoi(Buf));\r
4260                         sTime.wMonth = atoi(Buf + 3);\r
4261                         sTime.wDay = atoi(Buf + 6);\r
4262 \r
4263                         /* \8e\9e\8d\8f */\r
4264                         FindField(Str, Buf, 2+offs, NO);\r
4265                         sTime.wHour = atoi(Buf);\r
4266                         sTime.wMinute = atoi(Buf+3);\r
4267                         sTime.wSecond = 0;\r
4268                         sTime.wMilliseconds = 0;\r
4269                         SystemTimeToFileTime(&sTime, Time);\r
4270                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4271 \r
4272                         /* \91®\90« */\r
4273                         FindField(Str, Buf, 0, NO);\r
4274                         *Attr = AttrString2Value(Buf+1);\r
4275 \r
4276                         /* \96¼\91O */\r
4277                         if(FindField(Str, Fname, 3+offs, YES) == SUCCESS)\r
4278                         {\r
4279                                 RemoveTailingSpaces(Fname);\r
4280                                 Ret = NODE_FILE;\r
4281                                 if(strchr("dl", Buf[0]) != NULL)\r
4282                                         Ret = NODE_DIR;\r
4283                         }\r
4284                         break;\r
4285 \r
4286                 case LIST_STRATUS :\r
4287                         if(FindField(Str, Buf, 0, NO) != SUCCESS)\r
4288                                 break;\r
4289                         if(_strnicmp(Buf, "Files:", 6) == 0)\r
4290                                 StratusMode = 0;\r
4291                         else if(_strnicmp(Buf, "Dirs:", 5) == 0)\r
4292                                 StratusMode = 1;\r
4293                         else if(_strnicmp(Buf, "Links:", 6) == 0)\r
4294                                 StratusMode = 2;\r
4295                         else\r
4296                         {\r
4297                                 if(StratusMode == 0)\r
4298                                         offs = 1;\r
4299                                 else if(StratusMode == 1)\r
4300                                         offs = 0;\r
4301                                 else\r
4302                                         break;\r
4303 \r
4304                                 *InfoExist |= (FINFO_TIME | FINFO_DATE);\r
4305 \r
4306                                 /* \93ú\95t */\r
4307                                 if(FindField(Str, Buf, 2+offs, NO) != SUCCESS)\r
4308                                         break;\r
4309                                 sTime.wYear = Assume1900or2000(atoi(Buf));\r
4310                                 sTime.wMonth = atoi(Buf + 3);\r
4311                                 sTime.wDay = atoi(Buf + 6);\r
4312 \r
4313                                 /* \8e\9e\8d\8f */\r
4314                                 if(FindField(Str, Buf, 3+offs, NO) != SUCCESS)\r
4315                                         break;\r
4316                                 sTime.wHour = atoi(Buf);\r
4317                                 sTime.wMinute = atoi(Buf+3);\r
4318                                 sTime.wSecond = 0;\r
4319                                 sTime.wMilliseconds = 0;\r
4320                                 SystemTimeToFileTime(&sTime, Time);\r
4321                                 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4322 \r
4323                                 /* \96¼\91O */\r
4324                                 if(FindField(Str, Fname, 4+offs, YES) != SUCCESS)\r
4325                                         break;\r
4326 \r
4327                                 if(StratusMode == 0)\r
4328                                 {\r
4329                                         *InfoExist |= FINFO_SIZE;\r
4330 \r
4331                                         /* \83T\83C\83Y */\r
4332                                         if(FindField(Str, Buf, 1, NO) != SUCCESS)\r
4333                                                 break;\r
4334                                         *Size = _atoi64(Buf) * 4096;\r
4335 \r
4336                                         /* \8eí\97Þ\81i\83I\81[\83i\96¼\82Ì\83t\83B\81[\83\8b\83h\82É\82¢\82ê\82é\81j */\r
4337                                         if(FindField(Str, Buf, 2, NO) != SUCCESS)\r
4338                                                 break;\r
4339                                         strncpy(Owner, Buf, OWNER_NAME_LEN);\r
4340 \r
4341                                         Ret = NODE_FILE;\r
4342                                 }\r
4343                                 else\r
4344                                         Ret = NODE_DIR;\r
4345                         }\r
4346                         break;\r
4347 \r
4348                 case LIST_IRMX :\r
4349                         *InfoExist |= (FINFO_DATE | FINFO_SIZE);\r
4350 \r
4351                         /* \93ú\95t */\r
4352                         for(offs = 11; offs > 7; offs--)\r
4353                         {\r
4354                                 if((err = FindField(Str, Buf, offs, NO)) == SUCCESS)\r
4355                                         break;\r
4356                         }\r
4357                         if(err != SUCCESS)\r
4358                                 break;\r
4359                         if(IsDigit(*Buf) == 0)\r
4360                                 break;\r
4361                         sTime.wYear = Assume1900or2000(atoi(Buf));\r
4362                         if(FindField(Str, Buf, --offs, NO) != SUCCESS)\r
4363                                 break;\r
4364                         GetMonth(Buf, &sTime.wMonth, &sTime.wDay);\r
4365                         if(FindField(Str, Buf, --offs, NO) != SUCCESS)\r
4366                                 break;\r
4367                         if(IsDigit(*Buf) == 0)\r
4368                                 break;\r
4369                         sTime.wDay = atoi(Buf);\r
4370                         sTime.wHour = 0;\r
4371                         sTime.wMinute = 0;\r
4372                         sTime.wSecond = 0;\r
4373                         sTime.wMilliseconds = 0;\r
4374                         SystemTimeToFileTime(&sTime, Time);\r
4375                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4376 \r
4377                         /* \83I\81[\83i\96¼ */\r
4378                         if(FindField(Str, Buf, --offs, NO) != SUCCESS)\r
4379                                 break;\r
4380                         strncpy(Owner, Buf, OWNER_NAME_LEN);\r
4381 \r
4382                         /* \83T\83C\83Y */\r
4383                         do\r
4384                         {\r
4385                                 if((err = FindField(Str, Buf, --offs, NO)) != SUCCESS)\r
4386                                         break;\r
4387                         }\r
4388                         while(IsDigit(*Buf) == 0);\r
4389                         --offs;\r
4390                         if((err = FindField(Str, Buf, --offs, NO)) != SUCCESS)\r
4391                                 break;\r
4392                         RemoveComma(Buf);\r
4393                         *Size = _atoi64(Buf);\r
4394                         if((err = FindField(Str, Buf, --offs, NO)) != SUCCESS)\r
4395                                 break;\r
4396                         if(IsDigit(*Buf) == 0)\r
4397                                 break;\r
4398                         /* \96¼\91O */\r
4399                         if(FindField(Str, Fname, 0, NO) != SUCCESS)\r
4400                                 break;\r
4401                         /* \8eí\97Þ */\r
4402                         if(offs == 0)\r
4403                                 Ret = NODE_FILE;\r
4404                         else\r
4405                         {\r
4406                                 if((FindField(Str, Buf, 1, NO) == SUCCESS) &&\r
4407                                    (strcmp(Buf, "DR") == 0))\r
4408                                         Ret = NODE_DIR;\r
4409                                 else\r
4410                                         Ret = NODE_FILE;\r
4411                         }\r
4412                         break;\r
4413 \r
4414                 case LIST_ALLIED :\r
4415                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
4416 \r
4417                         /* \93ú\95t */\r
4418                         FindField(Str, Buf, 3, NO);\r
4419                         GetMonth(Buf, &sTime.wMonth, &sTime.wDay);      /* wDay\82Í\8fí\82É0 */\r
4420                         FindField(Str, Buf, 4, NO);\r
4421                         sTime.wDay = atoi(Buf);\r
4422                         FindField(Str, Buf, 6, NO);\r
4423                         sTime.wYear = atoi(Buf);\r
4424 \r
4425                         /* \8e\9e\8d\8f */\r
4426                         FindField(Str, Buf, 5, NO);\r
4427                         sTime.wHour = atoi(Buf);\r
4428                         sTime.wMinute = atoi(Buf+3);\r
4429                         sTime.wSecond = 0;\r
4430                         sTime.wMilliseconds = 0;\r
4431                         SystemTimeToFileTime(&sTime, Time);\r
4432                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4433 \r
4434                         /* \83T\83C\83Y */\r
4435                         FindField(Str, Buf, 0, NO);\r
4436                         *Size = _atoi64(Buf);\r
4437 \r
4438                         /* \96¼\91O */\r
4439                         if(FindField(Str, Fname, 1, NO) == SUCCESS)\r
4440                         {\r
4441                                 Ret = NODE_FILE;\r
4442                                 if(Buf[0] == '<')\r
4443                                         Ret = NODE_DIR;\r
4444                         }\r
4445                         break;\r
4446 \r
4447                 case LIST_OS9 :\r
4448                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
4449 \r
4450                         /* \93ú\95t */\r
4451                         FindField(Str, Buf, 1, NO);\r
4452                         sTime.wYear = Assume1900or2000(atoi(Buf));\r
4453                         sTime.wMonth = atoi(Buf + 3);\r
4454                         sTime.wDay = atoi(Buf + 6);\r
4455                         SystemTimeToFileTime(&sTime, Time);\r
4456                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4457 \r
4458                         /* \8e\9e\8d\8f */\r
4459                         FindField(Str, Buf, 2, NO);\r
4460                         sTime.wHour = atoi_n(Buf, 2);\r
4461                         sTime.wMinute = atoi(Buf+2);\r
4462                         sTime.wSecond = 0;\r
4463                         sTime.wMilliseconds = 0;\r
4464                         SystemTimeToFileTime(&sTime, Time);\r
4465                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4466 \r
4467                         /* \83T\83C\83Y */\r
4468                         FindField(Str, Buf, 5, NO);\r
4469                         *Size = _atoi64(Buf);\r
4470 \r
4471                         /* \83I\81[\83i\96¼ */\r
4472                         FindField(Str, Buf, 0, NO);\r
4473                         strncpy(Owner, Buf, OWNER_NAME_LEN);\r
4474 \r
4475                         /* \83I\81[\83i\96¼ */\r
4476                         FindField(Str, Buf, 3, NO);\r
4477 \r
4478                         /* \96¼\91O */\r
4479                         if(FindField(Str, Fname, 6, NO) == SUCCESS)\r
4480                         {\r
4481                                 if((Buf[0] == 'd') || (Buf[0] == 'D'))\r
4482                                         Ret = NODE_DIR;\r
4483                                 else\r
4484                                         Ret = NODE_FILE;\r
4485                         }\r
4486                         break;\r
4487 \r
4488                 case LIST_IBM :\r
4489                         *InfoExist |= FINFO_DATE;\r
4490 \r
4491 \r
4492                         /* \93ú\95t */\r
4493                         FindField(Str, Buf, 2, NO);\r
4494                         sTime.wYear = atoi(Buf);\r
4495                         sTime.wMonth = atoi(Buf + 5);\r
4496                         sTime.wDay = atoi(Buf + 8);\r
4497                         sTime.wHour = 0;\r
4498                         sTime.wMinute = 0;\r
4499                         sTime.wSecond = 0;\r
4500                         sTime.wMilliseconds = 0;\r
4501                         SystemTimeToFileTime(&sTime, Time);\r
4502                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4503 \r
4504                         /* \96¼\91O */\r
4505                         FindField(Str, Buf, 8, NO);\r
4506                         if(FindField(Str, Fname, 9, NO) == SUCCESS)\r
4507                         {\r
4508                                 if(strcmp(Buf, "PO") == 0)\r
4509                                         Ret = NODE_DIR;\r
4510                                 else if(strcmp(Buf, "PS") == 0)\r
4511                                         Ret = NODE_FILE;\r
4512                         }\r
4513                         break;\r
4514 \r
4515                 case LIST_AGILENT :\r
4516                         *InfoExist |= (FINFO_SIZE | FINFO_ATTR);\r
4517 \r
4518                         /* \83I\81[\83i\96¼ */\r
4519                         FindField(Str, Buf, 2, NO);\r
4520                         strncpy(Owner, Buf, OWNER_NAME_LEN);\r
4521 \r
4522                         /* \83T\83C\83Y */\r
4523                         FindField(Str, Buf, 4, NO);\r
4524                         *Size = _atoi64(Buf);\r
4525 \r
4526                         /* \91®\90« */\r
4527                         FindField(Str, Buf, 0, NO);\r
4528                         *Attr = AttrString2Value(Buf+1);\r
4529 \r
4530                         /* \96¼\91O */\r
4531                         if(FindField(Str, Fname, 5, YES) == SUCCESS)\r
4532                         {\r
4533                                 Ret = NODE_FILE;\r
4534                                 if(strchr("dl", Buf[0]) != NULL)\r
4535                                         Ret = NODE_DIR;\r
4536                         }\r
4537                         break;\r
4538 \r
4539                 case LIST_SHIBASOKU :\r
4540                         *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
4541 \r
4542                         /* \83T\83C\83Y */\r
4543                         FindField(Str, Buf, 0, NO);\r
4544                         if(IsDigit(Buf[0]))\r
4545                         {\r
4546                                 *Size = _atoi64(Buf);\r
4547 \r
4548                                 /* \93ú\95t */\r
4549                                 FindField(Str, Buf, 1, NO);\r
4550                                 Buf[3] = '\0';\r
4551                                 GetMonth(Buf, &sTime.wMonth, &sTime.wDay);\r
4552                                 sTime.wDay = atoi(Buf+4);\r
4553                                 sTime.wYear = atoi(Buf+7);\r
4554 \r
4555                                 /* \8e\9e\8d\8f */\r
4556                                 FindField(Str, Buf, 2, NO);\r
4557                                 sTime.wHour = atoi(Buf);\r
4558                                 sTime.wMinute = atoi(Buf+3);\r
4559                                 sTime.wSecond = 0;\r
4560                                 sTime.wMilliseconds = 0;\r
4561                                 SystemTimeToFileTime(&sTime, Time);\r
4562                                 SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4563 \r
4564                                 /* \96¼\91O */\r
4565                                 FindField(Str, Fname, 3, NO);\r
4566 \r
4567                                 /* \8eí\97Þ */\r
4568                                 Ret = NODE_FILE;\r
4569                                 if(FindField(Str, Buf, 4, NO) == SUCCESS)\r
4570                                 {\r
4571                                         if(strcmp(Buf, "<DIR>") == 0)\r
4572                                                 Ret = NODE_DIR;\r
4573                                 }\r
4574                         }\r
4575                         break;\r
4576 \r
4577                 case LIST_UNIX_10 :\r
4578                 case LIST_UNIX_11 :\r
4579                 case LIST_UNIX_12 :\r
4580                 case LIST_UNIX_13 :\r
4581                 case LIST_UNIX_14 :\r
4582                 case LIST_UNIX_15 :\r
4583                 case LIST_UNIX_20 :\r
4584                 case LIST_UNIX_21 :\r
4585                 case LIST_UNIX_22 :\r
4586                 case LIST_UNIX_23 :\r
4587                 case LIST_UNIX_24 :\r
4588                 case LIST_UNIX_25 :\r
4589                 case LIST_UNIX_50 :\r
4590                 case LIST_UNIX_51 :\r
4591                 case LIST_UNIX_54 :\r
4592                 case LIST_UNIX_60 :\r
4593                 case LIST_UNIX_61 :\r
4594                 case LIST_UNIX_62 :\r
4595                 case LIST_UNIX_63 :\r
4596                 case LIST_UNIX_64 :\r
4597                 case LIST_UNIX_65 :\r
4598                 case LIST_UNIX_70 :\r
4599                 case LIST_UNIX_71 :\r
4600                 case LIST_UNIX_72 :\r
4601                 case LIST_UNIX_73 :\r
4602                 case LIST_UNIX_74 :\r
4603                 case LIST_UNIX_75 :\r
4604 // MELCOM\82Í\83r\83b\83g\83t\83\89\83O\82É\82È\82Á\82Ä\82¢\82é\r
4605 //              case LIST_MELCOM :\r
4606                 default:\r
4607                         /* offs\82Í\83T\83C\83Y\82Ì\88Ê\92u, offs=0\82Í\83J\83\89\83\804 */\r
4608                         offs = 0;\r
4609                         if((ListType == LIST_UNIX_12) ||\r
4610                            (ListType == LIST_UNIX_13) ||\r
4611                            (ListType == LIST_UNIX_15) ||\r
4612                            (ListType == LIST_UNIX_20) ||\r
4613                            (ListType == LIST_UNIX_21) ||\r
4614                            (ListType == LIST_UNIX_24))\r
4615                                 offs = -1;\r
4616 \r
4617                         if((ListType == LIST_UNIX_22) ||\r
4618                            (ListType == LIST_UNIX_23) ||\r
4619                            (ListType == LIST_UNIX_25) ||\r
4620                            (ListType == LIST_UNIX_50) ||\r
4621                            (ListType == LIST_UNIX_51) ||\r
4622                            (ListType == LIST_UNIX_54))\r
4623                                 offs = -2;\r
4624 \r
4625                         if((ListType == LIST_UNIX_60) ||\r
4626                            (ListType == LIST_UNIX_61) ||\r
4627                            (ListType == LIST_UNIX_64))\r
4628                                 offs = 2;\r
4629 \r
4630                         if((ListType == LIST_UNIX_62) ||\r
4631                            (ListType == LIST_UNIX_63) ||\r
4632                            (ListType == LIST_UNIX_65) ||\r
4633                            (ListType == LIST_UNIX_70) ||\r
4634                            (ListType == LIST_UNIX_71) ||\r
4635                            (ListType == LIST_UNIX_74))\r
4636                                 offs = 1;\r
4637 \r
4638                         /* offs2\82Í\8e\9e\8aÔ(\82à\82µ\82­\82Í\94N)\82Ì\88Ê\92u */\r
4639                         offs2 = 0;\r
4640                         if((ListType == LIST_UNIX_11) ||\r
4641                            (ListType == LIST_UNIX_13) ||\r
4642                            (ListType == LIST_UNIX_21) ||\r
4643                            (ListType == LIST_UNIX_23) ||\r
4644                            (ListType == LIST_UNIX_51) ||\r
4645                            (ListType == LIST_UNIX_61) ||\r
4646                            (ListType == LIST_UNIX_63) ||\r
4647                            (ListType == LIST_UNIX_71) ||\r
4648                            (ListType == LIST_UNIX_73))\r
4649                                 offs2 = -1;\r
4650 \r
4651                         /* offs3\82Í\83I\81[\83i\96¼\82Ì\88Ê\92u */\r
4652                         offs3 = 0;\r
4653                         if((ListType == LIST_UNIX_12) ||\r
4654                            (ListType == LIST_UNIX_13) ||\r
4655                            (ListType == LIST_UNIX_15) ||\r
4656                            (ListType == LIST_UNIX_22) ||\r
4657                            (ListType == LIST_UNIX_23) ||\r
4658                            (ListType == LIST_UNIX_25) ||\r
4659                            (ListType == LIST_UNIX_50) ||\r
4660                            (ListType == LIST_UNIX_51) ||\r
4661                            (ListType == LIST_UNIX_62) ||\r
4662                            (ListType == LIST_UNIX_63) ||\r
4663                            (ListType == LIST_UNIX_65) ||\r
4664                            (ListType == LIST_UNIX_72) ||\r
4665                            (ListType == LIST_UNIX_73) ||\r
4666                            (ListType == LIST_UNIX_75))\r
4667                                 offs3 = -1;\r
4668 \r
4669                         Flag2 = 0;\r
4670                         if((ListType == LIST_UNIX_14) ||\r
4671                            (ListType == LIST_UNIX_15) ||\r
4672                            (ListType == LIST_UNIX_24) ||\r
4673                            (ListType == LIST_UNIX_25) ||\r
4674                            (ListType == LIST_UNIX_54) ||\r
4675                            (ListType == LIST_UNIX_64) ||\r
4676                            (ListType == LIST_UNIX_65) ||\r
4677                            (ListType == LIST_UNIX_74) ||\r
4678                            (ListType == LIST_UNIX_75))\r
4679                                 Flag2 = 1;\r
4680 \r
4681                         *InfoExist |= (FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
4682 \r
4683                         /* \91®\90« */\r
4684                         FindField(Str, Buf, 0, NO);\r
4685                         *Attr = AttrString2Value(Buf+1);\r
4686 \r
4687                         /* \83I\81[\83i\96¼ */\r
4688                         FindField(Str, Buf, 2+offs3, NO);\r
4689                         strncpy(Owner, Buf, OWNER_NAME_LEN);\r
4690 \r
4691                         /* \83T\83C\83Y */\r
4692                         FindField(Str, Buf, 4+offs, NO);\r
4693                         Pos = Buf;\r
4694                         if((*Pos != NUL) && (IsDigit(*Pos) == 0))\r
4695                         {\r
4696                                 Pos = strchr(Pos, NUL) - 1;\r
4697                                 for(; Pos > Buf; Pos--)\r
4698                                 {\r
4699                                         if(IsDigit(*Pos) == 0)\r
4700                                         {\r
4701                                                 Pos++;\r
4702                                                 break;\r
4703                                         }\r
4704                                 }\r
4705                         }\r
4706                         *Size = _atoi64(Pos);\r
4707 \r
4708                         if(Flag2 == 0)\r
4709                         {\r
4710                                 /* \8e\9e\8d\8f\81^\93ú\95t */\r
4711                                 GetLocalTime(&sTime);\r
4712                                 memcpy(&sTimeNow, &sTime, sizeof(SYSTEMTIME));\r
4713                                 sTime.wSecond = 0;\r
4714                                 sTime.wMilliseconds = 0;\r
4715 \r
4716                                 FindField(Str, Buf, 5+offs, NO);\r
4717                                 /* \93ú\95t\82ª yy/mm/dd \82Ì\8fê\8d\87\82É\91Î\89\9e */\r
4718                                 if(GetYearMonthDay(Buf, &sTime.wYear, &sTime.wMonth, &sTime.wDay) == SUCCESS)\r
4719                                 {\r
4720                                         sTime.wYear = Assume1900or2000(sTime.wYear);\r
4721 \r
4722                                         FindField(Str, Buf, 7+offs+offs2, NO);\r
4723                                         if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == SUCCESS)\r
4724                                                 *InfoExist |= FINFO_TIME;\r
4725                                 }\r
4726                                 else\r
4727                                 {\r
4728                                         GetMonth(Buf, &sTime.wMonth, &sTime.wDay);\r
4729                                         if(offs2 == 0)\r
4730                                         {\r
4731                                                 FindField(Str, Buf, 6+offs, NO);\r
4732                                                 sTime.wDay = atoi(Buf);\r
4733                                         }\r
4734 \r
4735                                         FindField(Str, Buf, 7+offs+offs2, NO);\r
4736                                         if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FAIL)\r
4737                                         {\r
4738                                                 sTime.wYear = atoi(Buf);\r
4739                                         }\r
4740                                         else\r
4741                                         {\r
4742                                                 *InfoExist |= FINFO_TIME;\r
4743 \r
4744                                                 /* \94N\82ª\82È\82¢ */\r
4745                                                 /* \8c»\8dÝ\82Ì\93ú\95t\82©\82ç\90\84\92è */\r
4746                                                 if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))\r
4747                                                         sTime.wYear++;\r
4748                                                 else if(sTimeNow.wMonth+1 == sTime.wMonth)\r
4749                                                         /* nothing */;\r
4750                                                 else if(sTimeNow.wMonth < sTime.wMonth)\r
4751                                                         sTime.wYear--;\r
4752 \r
4753 \r
4754 //#################\r
4755                                                 /* \8d¡\94N\82Ì\8d¡\93ú\88È\8d~\82Ì\83t\83@\83C\83\8b\82Í\81A\8eÀ\82Í\8b\8e\94N\82Ì\83t\83@\83C\83\8b */\r
4756                                                 if((sTime.wYear == sTimeNow.wYear) &&\r
4757                                                    ((sTime.wMonth > sTimeNow.wMonth) ||\r
4758                                                         ((sTime.wMonth == sTimeNow.wMonth) && (sTime.wDay > sTimeNow.wDay))))\r
4759                                                 {\r
4760                                                         sTime.wYear--;\r
4761                                                 }\r
4762                                         }\r
4763                                 }\r
4764                         }\r
4765                         else\r
4766                         {\r
4767                                 /* LIST_UNIX_?4, LIST_UNIX_?5 \82Ì\8e\9e */\r
4768                                 FindField(Str, Buf, 5+offs, NO);\r
4769                                 sTime.wYear = atoi(Buf);\r
4770                                 FindField(Str, Buf, 6+offs, NO);\r
4771                                 sTime.wMonth = atoi(Buf);\r
4772                                 FindField(Str, Buf, 7+offs, NO);\r
4773                                 sTime.wDay = atoi(Buf);\r
4774                                 sTime.wHour = 0;\r
4775                                 sTime.wMinute = 0;\r
4776                                 sTime.wSecond = 0;\r
4777                                 sTime.wMilliseconds = 0;\r
4778                         }\r
4779                         SystemTimeToFileTime(&sTime, Time);\r
4780                         SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
4781 \r
4782                         /* \96¼\91O */\r
4783                         if(FindField(Str, Fname, 8+offs+offs2, YES) == SUCCESS)\r
4784                         {\r
4785                                 Flag = 'B';\r
4786                                 if(OrgListType & LIST_MELCOM)\r
4787                                 {\r
4788                                         Flag = Fname[14];\r
4789                                         Fname[14] = NUL;\r
4790                                         RemoveTailingSpaces(Fname);\r
4791                                 }\r
4792                                 else\r
4793                                 {\r
4794                                         if((Pos = strstr(Fname, " -> ")) != NULL)\r
4795                                                 *Pos = NUL;\r
4796                                 }\r
4797 \r
4798                                 if(strchr("dl", *Str) != NULL)\r
4799                                 {\r
4800                                         if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) ||\r
4801                                            (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))\r
4802                                         {\r
4803                                                 *(Fname + strlen(Fname) - 1) = NUL;\r
4804                                         }\r
4805                                         Ret = NODE_DIR;\r
4806                                         if(*Str == 'l')\r
4807                                                 *Link = YES;\r
4808                                 }\r
4809                                 else if(strchr("-+f", *Str) != NULL)\r
4810                                         Ret = NODE_FILE;\r
4811 \r
4812                                 if((Ret == NODE_FILE) && (Flag != 'B'))\r
4813                                         Ret = NODE_NONE;\r
4814                         }\r
4815                         break;\r
4816         }\r
4817 \r
4818         if((Ret != NODE_NONE) && (strlen(Fname) > 0))\r
4819         {\r
4820                 if(CheckSpecialDirName(Fname) == YES)\r
4821                         Ret = NODE_NONE;\r
4822                 else\r
4823                         ChangeFnameRemote2Local(Fname, FMAX_PATH);\r
4824         }\r
4825         return(Ret);\r
4826 }\r
4827 \r
4828 \r
4829 /*----- \8ew\92è\82Ì\94Ô\8d\86\82Ì\83t\83B\81[\83\8b\83h\82ð\8b\81\82ß\82é ----------------------------------------\r
4830 *\r
4831 *       Parameter\r
4832 *               char *Str : \95\8e\9a\97ñ\r
4833 *               char *Buf : \95\8e\9a\97ñ\82Ì\83R\83s\81[\90æ\r
4834 *               int Num : \83t\83B\81[\83\8b\83h\94Ô\8d\86\r
4835 *               int ToLast : \95\8e\9a\97ñ\82Ì\8dÅ\8cã\82Ü\82Å\83R\83s\81[ (YES/NO)\r
4836 *\r
4837 *       Return Value\r
4838 *               int \83X\83e\81[\83^\83X\r
4839 *                       SUCCESS/FAIL\r
4840 *----------------------------------------------------------------------------*/\r
4841 \r
4842 static int FindField(char *Str, char *Buf, int Num, int ToLast)\r
4843 {\r
4844         char *Pos;\r
4845         int Sts;\r
4846 \r
4847         Sts = FAIL;\r
4848         *Buf = NUL;\r
4849         if(Num >= 0)\r
4850         {\r
4851                 while(*Str == ' ')\r
4852                         Str++;\r
4853 \r
4854                 for(; Num > 0; Num--)\r
4855                 {\r
4856                         if((Str = strchr(Str, ' ')) != NULL)\r
4857                         {\r
4858                                 while(*Str == ' ')\r
4859                                 {\r
4860                                         if(*Str == NUL)\r
4861                                         {\r
4862                                                 Str = NULL;\r
4863                                                 break;\r
4864                                         }\r
4865                                         Str++;\r
4866                                 }\r
4867                         }\r
4868                         else\r
4869                                 break;\r
4870                 }\r
4871         }\r
4872 \r
4873         if(Str != NULL)\r
4874         {\r
4875                 if((ToLast == YES) || ((Pos = strchr(Str, ' ')) == NULL))\r
4876                         strcpy(Buf, Str);\r
4877                 else\r
4878                 {\r
4879                         strncpy(Buf, Str, Pos - Str);\r
4880                         *(Buf + (Pos - Str)) = NUL;\r
4881                 }\r
4882                 Sts = SUCCESS;\r
4883         }\r
4884         return(Sts);\r
4885 }\r
4886 \r
4887 \r
4888 /*----- \95\8e\9a\97ñ\82©\82ç\8c\8e\82ð\8b\81\82ß\82é --------------------------------------------------\r
4889 *\r
4890 *       Parameter\r
4891 *               char *Str : \95\8e\9a\97ñ\r
4892 *               WORD *Month : \8c\8e (0=\8c\8e\82ð\95\\82·\95\8e\9a\97ñ\82Å\82Í\82È\82¢)\r
4893 *               WORD *Day : \93ú (0=\93ú\82Í\8aÜ\82Ü\82ê\82Ä\82¢\82È\82¢)\r
4894 *\r
4895 *       Return Value\r
4896 *               \82È\82µ\r
4897 *----------------------------------------------------------------------------*/\r
4898 \r
4899 static void GetMonth(char *Str, WORD *Month, WORD *Day)\r
4900 {\r
4901         static const char DateStr[] = { "JanFebMarAprMayJunJulAugSepOctNovDec" };\r
4902         char *Pos;\r
4903 \r
4904         *Month = 0;\r
4905         *Day = 0;\r
4906 \r
4907         if(IsDigit(*Str) == 0)\r
4908         {\r
4909                 _strlwr(Str);\r
4910                 *Str = toupper(*Str);\r
4911                 if((Pos = strstr(DateStr, Str)) != NULL)\r
4912                         *Month = ((Pos - DateStr) / 3) + 1;\r
4913         }\r
4914         else\r
4915         {\r
4916                 /* \81u10\8c\8e\81v\82Ì\82æ\82¤\82È\93ú\95t\82ð\95Ô\82·\82à\82Ì\82ª\82 \82é */\r
4917                 /* \8a¿\8e\9a\82ªJIS\82Ì\8e\9e\82Ì\82ÝSJIS\82É\95Ï\8a· */\r
4918                 ConvAutoToSJIS(Str, KANJI_NOCNV);\r
4919 \r
4920                 Pos = Str;\r
4921                 while(*Pos != NUL)\r
4922                 {\r
4923                         if(!IsDigit(*Pos))\r
4924                         {\r
4925                                 if((_mbsncmp(Pos, "\8c\8e", 1) == 0) ||\r
4926                                    (memcmp(Pos, "\xB7\xEE", 2) == 0) || /* EUC\82Ì\81u\8c\8e\81v */\r
4927                                    (memcmp(Pos, "\xD4\xC2", 2) == 0))   /* GB\83R\81[\83h\82Ì\81u\8c\8e\81v */\r
4928                                 {\r
4929                                         Pos += 2;\r
4930                                         *Month = atoi(Str);\r
4931                                         if((*Month < 1) || (*Month > 12))\r
4932                                                 *Month = 0;\r
4933                                         else\r
4934                                         {\r
4935                                                 /* \81u10\8c\8e11\93ú\81v\82Ì\82æ\82¤\82É\93ú\82ª\82­\82Á\82Â\82¢\82Ä\82¢\82é\8e\96\82ª\82 \82é */\r
4936                                                 if(*Pos != NUL)\r
4937                                                 {\r
4938                                                         *Day = atoi(Pos);\r
4939                                                         if((*Day < 1) || (*Day > 31))\r
4940                                                                 *Day = 0;\r
4941                                                 }\r
4942                                         }\r
4943                                 }\r
4944                                 else if(_mbsncmp(Pos, "/", 1) == 0)\r
4945                                 {\r
4946                                         /* \81u10/\81v\82Ì\82æ\82¤\82È\93ú\95t\82ð\95Ô\82·\82à\82Ì\82ª\82 \82é */\r
4947                                         Pos += 1;\r
4948                                         *Month = atoi(Str);\r
4949                                         if((*Month < 1) || (*Month > 12))\r
4950                                                 *Month = 0;\r
4951                                         else\r
4952                                         {\r
4953                                                 /* \81u10/11\81v\82Ì\82æ\82¤\82É\93ú\82ª\82­\82Á\82Â\82¢\82Ä\82¢\82é\8e\96\82ª\82 \82é */\r
4954                                                 if(*Pos != NUL)\r
4955                                                 {\r
4956                                                         *Day = atoi(Pos);\r
4957                                                         if((*Day < 1) || (*Day > 31))\r
4958                                                                 *Day = 0;\r
4959                                                 }\r
4960                                         }\r
4961                                 }\r
4962                                 break;\r
4963                         }\r
4964                         Pos++;\r
4965                 }\r
4966         }\r
4967         return;\r
4968 }\r
4969 \r
4970 \r
4971 /*----- \95\8e\9a\97ñ\82©\82ç\94N\8c\8e\93ú\82ð\8b\81\82ß\82é ----------------------------------------------\r
4972 *\r
4973 *       Parameter\r
4974 *               char *Str : \95\8e\9a\97ñ\r
4975 *               WORD *Year : \94N\r
4976 *               WORD *Month : \8c\8e\r
4977 *               WORD *Day : \93ú\r
4978 *\r
4979 *       Return Value\r
4980 *               int \83X\83e\81[\83^\83X (SUCCESS/FAIL=\93ú\95t\82ð\95\\82·\95\8e\9a\82Å\82Í\82È\82¢)\r
4981 *\r
4982 *       Note\r
4983 *               \88È\89º\82Ì\8c`\8e®\82ð\83T\83|\81[\83g\r
4984 *                       01/07/25\r
4985 *               FAIL\82ð\95Ô\82·\8e\9e\82Í *Year = 0; *Month = 0; *Day = 0\r
4986 *----------------------------------------------------------------------------*/\r
4987 static int GetYearMonthDay(char *Str, WORD *Year, WORD *Month, WORD *Day)\r
4988 {\r
4989         int Sts;\r
4990 \r
4991         Sts = FAIL;\r
4992         if(strlen(Str) == 8)\r
4993         {\r
4994                 if(IsDigit(Str[0]) && IsDigit(Str[1]) && !IsDigit(Str[2]) &&\r
4995                    IsDigit(Str[3]) && IsDigit(Str[4]) && !IsDigit(Str[5]) &&\r
4996                    IsDigit(Str[6]) && IsDigit(Str[7]))\r
4997                 {\r
4998                         *Year = atoi(&Str[0]);\r
4999                         *Month = atoi(&Str[3]);\r
5000                         *Day = atoi(&Str[6]);\r
5001                         Sts = SUCCESS;\r
5002                 }\r
5003         }\r
5004         return(Sts);\r
5005 }\r
5006 \r
5007 \r
5008 /*----- \95\8e\9a\97ñ\82©\82ç\8e\9e\8d\8f\82ð\8eæ\82è\8fo\82· ----------------------------------------------\r
5009 *\r
5010 *       Parameter\r
5011 *               char *Str : \95\8e\9a\97ñ\r
5012 *               WORD *Hour : \8e\9e\r
5013 *               WORD *Minute : \95ª\r
5014 *\r
5015 *       Return Value\r
5016 *               int \83X\83e\81[\83^\83X (SUCCESS/FAIL=\8e\9e\8d\8f\82ð\95\\82·\95\8e\9a\82Å\82Í\82È\82¢)\r
5017 *\r
5018 *       Note\r
5019 *               \88È\89º\82Ì\8c`\8e®\82ð\83T\83|\81[\83g\r
5020 *                       HH:MM\r
5021 *                       HH\8e\9eMM\95ª\r
5022 *               FAIL\82ð\95Ô\82·\8e\9e\82Í *Hour = 0; *Minute = 0\r
5023 *----------------------------------------------------------------------------*/\r
5024 \r
5025 static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute)\r
5026 {\r
5027         int Ret;\r
5028         char *Pos;\r
5029 \r
5030         Ret = FAIL;\r
5031         if((_mbslen(Str) >= 3) && (isdigit(Str[0]) != 0))\r
5032         {\r
5033                 *Hour = atoi(Str);\r
5034                 if(*Hour <= 24)\r
5035                 {\r
5036                         if((Pos = _mbschr(Str, ':')) != NULL)\r
5037                         {\r
5038                                 Pos++;\r
5039                                 if(IsDigit(*Pos) != 0)\r
5040                                 {\r
5041                                         *Minute = atoi(Pos);\r
5042                                         if(*Minute < 60)\r
5043                                                 Ret = SUCCESS;\r
5044                                 }\r
5045                         }\r
5046                         else\r
5047                         {\r
5048                                 /* \8a¿\8e\9a\82ªJIS\82Ì\8e\9e\82Ì\82ÝSJIS\82É\95Ï\8a· */\r
5049                                 ConvAutoToSJIS(Str, KANJI_NOCNV);\r
5050 \r
5051                                 Pos = Str;\r
5052                                 while(*Pos != NUL)\r
5053                                 {\r
5054                                         if(IsDigit(*Pos) == 0)\r
5055                                         {\r
5056                                                 if((_mbsncmp(Pos, "\8e\9e", 1) == 0) ||\r
5057                                                    (memcmp(Pos, "\xBB\xFE", 2) == 0))   /* EUC\82Ì\81u\8e\9e\81v */\r
5058                                                 {\r
5059                                                         Pos += 2;\r
5060                                                         if(*Pos != NUL)\r
5061                                                         {\r
5062                                                                 *Minute = atoi(Pos);\r
5063                                                                 if(*Minute < 60)\r
5064                                                                         Ret = SUCCESS;\r
5065                                                         }\r
5066                                                 }\r
5067                                                 break;\r
5068                                         }\r
5069                                         Pos++;\r
5070                                 }\r
5071                         }\r
5072                 }\r
5073         }\r
5074         else if((_stricmp(Str, "a:m") == 0) || (_stricmp(Str, "p:m") == 0))\r
5075         {\r
5076                 *Hour = 0;\r
5077                 *Minute = 0;\r
5078                 Ret = SUCCESS;\r
5079         }\r
5080 \r
5081         if(Ret == FAIL)\r
5082         {\r
5083                 *Hour = 0;\r
5084                 *Minute = 0;\r
5085         }\r
5086         return(Ret);\r
5087 }\r
5088 \r
5089 \r
5090 /*----- VAX VMS\82Ì\93ú\95t\95\8e\9a\97ñ\82©\82ç\93ú\95t\82ð\8eæ\82è\8fo\82· ---------------------------------\r
5091 *\r
5092 *       Parameter\r
5093 *               char *Str : \95\8e\9a\97ñ\r
5094 *               WORD *Year : \94N\r
5095 *               WORD *Month : \8c\8e\r
5096 *               WORD *Day : \93ú\r
5097 *\r
5098 *       Return Value\r
5099 *               int \83X\83e\81[\83^\83X (SUCCESS/FAIL=\93ú\95t\82ð\95\\82·\95\8e\9a\82Å\82Í\82È\82¢)\r
5100 *\r
5101 *       Note\r
5102 *               \88È\89º\82Ì\8c`\8e®\82ð\83T\83|\81[\83g\r
5103 *                       18-SEP-1998\r
5104 *               FAIL\82ð\95Ô\82·\8e\9e\82Í *Year = 0; *Month = 0; *Day = 0\r
5105 *----------------------------------------------------------------------------*/\r
5106 \r
5107 static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day)\r
5108 {\r
5109         char *Pos;\r
5110         int Ret;\r
5111         WORD Tmp;\r
5112         char Buf[4];\r
5113 \r
5114         Ret = FAIL;\r
5115         *Day = atoi(Str);\r
5116         if((Pos = strchr(Str, '-')) != NULL)\r
5117         {\r
5118                 Pos++;\r
5119                 strncpy(Buf, Pos, 3);\r
5120                 Buf[3] = NUL;\r
5121                 GetMonth(Buf, Month, &Tmp);\r
5122                 if((Pos = strchr(Pos, '-')) != NULL)\r
5123                 {\r
5124                         Pos++;\r
5125                         *Year = atoi(Pos);\r
5126                         Ret = SUCCESS;\r
5127                 }\r
5128         }\r
5129 \r
5130         if(Ret == FAIL)\r
5131         {\r
5132                 *Year = 0;\r
5133                 *Month = 0;\r
5134                 *Day = 0;\r
5135         }\r
5136         return(Ret);\r
5137 }\r
5138 \r
5139 \r
5140 /*----- 1900\94N\91ã\82©2000\94N\91ã\82©\82ð\8c\88\82ß\82é ------------------------------------------\r
5141 *\r
5142 *       Parameter\r
5143 *               int Year : \94N\81i\82Q\8c\85\81j\r
5144 *\r
5145 *       Return Value\r
5146 *               int \94N\r
5147 *----------------------------------------------------------------------------*/\r
5148 \r
5149 int Assume1900or2000(int Year)\r
5150 {\r
5151         if(Year >= 60)\r
5152                 Year += 1900;\r
5153         else\r
5154                 Year += 2000;\r
5155         return(Year);\r
5156 }\r
5157 \r
5158 \r
5159 \r
5160 /*----- "."\82â".."\82©\82Ç\82¤\82©\82ð\95Ô\82· -----------------------------------------------\r
5161 *\r
5162 *       Parameter\r
5163 *               char *Fname : \83t\83@\83C\83\8b\96¼\r
5164 *\r
5165 *       Return Value\r
5166 *               int \83X\83e\81[\83^\83X (YES="."\82©".."\82Ì\82Ç\82¿\82ç\82©/NO)\r
5167 *----------------------------------------------------------------------------*/\r
5168 \r
5169 static int CheckSpecialDirName(char *Fname)\r
5170 {\r
5171         int Sts;\r
5172 \r
5173         Sts = NO;\r
5174         if((strcmp(Fname, ".") == 0) || (strcmp(Fname, "..") == 0))\r
5175                 Sts = YES;\r
5176 \r
5177         return(Sts);\r
5178 }\r
5179 \r
5180 \r
5181 /*----- \83t\83B\83\8b\83^\82É\8ew\92è\82³\82ê\82½\83t\83@\83C\83\8b\96¼\82©\82Ç\82¤\82©\82ð\95Ô\82· --------------------------\r
5182 *\r
5183 *       Parameter\r
5184 *               char Fname : \83t\83@\83C\83\8b\96¼\r
5185 *               int Type : \83t\83@\83C\83\8b\82Ì\83^\83C\83v (NODE_xxx)\r
5186 *\r
5187 *       Return Value\r
5188 *               int \83X\83e\81[\83^\83X\r
5189 *                       YES/NO=\95\\8e¦\82µ\82È\82¢\r
5190 *\r
5191 *       Note\r
5192 *               \83t\83B\83\8b\83^\95\8e\9a\97ñ\82Í\88È\89º\82Ì\8c`\8e®\r
5193 *                       *.txt;*.log\r
5194 *----------------------------------------------------------------------------*/\r
5195 \r
5196 static int AskFilterStr(char *Fname, int Type)\r
5197 {\r
5198         int Ret;\r
5199         char *Tbl;\r
5200         char *Pos;\r
5201         char Tmp[FILTER_EXT_LEN+1];\r
5202 \r
5203         Tbl = FilterStr;\r
5204         Ret = YES;\r
5205         if((strlen(Tbl) > 0) && (Type == NODE_FILE))\r
5206         {\r
5207                 Ret = NO;\r
5208                 while((Tbl != NULL) && (*Tbl != NUL))\r
5209                 {\r
5210                         while(*Tbl == ';')\r
5211                                 Tbl++;\r
5212                         if(*Tbl == NUL)\r
5213                                 break;\r
5214 \r
5215                         strcpy(Tmp, Tbl);\r
5216                         if((Pos = strchr(Tmp, ';')) != NULL)\r
5217                                 *Pos = NUL;\r
5218 \r
5219                         if(CheckFname(Fname, Tmp) == SUCCESS)\r
5220                         {\r
5221                                 Ret = YES;\r
5222                                 break;\r
5223                         }\r
5224 \r
5225                         Tbl = strchr(Tbl, ';');\r
5226                 }\r
5227         }\r
5228         return(Ret);\r
5229 }\r
5230 \r
5231 \r
5232 /*----- \83t\83B\83\8b\83^\82ð\90Ý\92è\82·\82é ----------------------------------------------------\r
5233 *\r
5234 *       Parameter\r
5235 *               \82È\82µ\r
5236 *\r
5237 *       Return Value\r
5238 *               \82È\82µ\r
5239 *----------------------------------------------------------------------------*/\r
5240 \r
5241 void SetFilter(int *CancelCheckWork)\r
5242 {\r
5243         if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(filter_dlg), GetMainHwnd(), FilterWndProc) == YES)\r
5244         {\r
5245                 DispWindowTitle();\r
5246                 GetLocalDirForWnd();\r
5247                 GetRemoteDirForWnd(CACHE_LASTREAD, CancelCheckWork);\r
5248         }\r
5249         return;\r
5250 }\r
5251 \r
5252 \r
5253 /*----- \83t\83B\83\8b\83^\93ü\97Í\83_\83C\83A\83\8d\83O\82Ì\83R\81[\83\8b\83o\83b\83N ----------------------------------\r
5254 *\r
5255 *       Parameter\r
5256 *               HWND hDlg : \83E\83C\83\93\83h\83E\83n\83\93\83h\83\8b\r
5257 *               UINT message : \83\81\83b\83Z\81[\83W\94Ô\8d\86\r
5258 *               WPARAM wParam : \83\81\83b\83Z\81[\83W\82Ì WPARAM \88ø\90\94\r
5259 *               LPARAM lParam : \83\81\83b\83Z\81[\83W\82Ì LPARAM \88ø\90\94\r
5260 *\r
5261 *       Return Value\r
5262 *               BOOL TRUE/FALSE\r
5263 *----------------------------------------------------------------------------*/\r
5264 \r
5265 static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
5266 {\r
5267         switch (iMessage)\r
5268         {\r
5269                 case WM_INITDIALOG :\r
5270                         SendDlgItemMessage(hDlg, FILTER_STR, EM_LIMITTEXT, FILTER_EXT_LEN+1, 0);\r
5271                         SendDlgItemMessage(hDlg, FILTER_STR, WM_SETTEXT, 0, (LPARAM)FilterStr);\r
5272                         return(TRUE);\r
5273 \r
5274                 case WM_COMMAND :\r
5275                         switch(GET_WM_COMMAND_ID(wParam, lParam))\r
5276                         {\r
5277                                 case IDOK :\r
5278                                         SendDlgItemMessage(hDlg, FILTER_STR, WM_GETTEXT, FILTER_EXT_LEN, (LPARAM)FilterStr);\r
5279                                         EndDialog(hDlg, YES);\r
5280                                         break;\r
5281 \r
5282                                 case IDCANCEL :\r
5283                                         EndDialog(hDlg, NO);\r
5284                                         break;\r
5285 \r
5286                                 case FILTER_NOR :\r
5287                                         strcpy(FilterStr, "*");\r
5288                                         EndDialog(hDlg, YES);\r
5289                                         break;\r
5290 \r
5291                                 case IDHELP :\r
5292                                         hHelpWin = HtmlHelp(NULL, AskHelpFilePath(), HH_HELP_CONTEXT, IDH_HELP_TOPIC_0000021);\r
5293                                         break;\r
5294                         }\r
5295             return(TRUE);\r
5296         }\r
5297         return(FALSE);\r
5298 }\r
5299 \r
5300 \r
5301 \r
5302 \r
5303 \r
5304 static int atoi_n(const char *Str, int Len)\r
5305 {\r
5306         char *Tmp;\r
5307         int Ret;\r
5308 \r
5309         Ret = 0;\r
5310         if((Tmp = malloc(Len+1)) != NULL)\r
5311         {\r
5312                 memset(Tmp, 0, Len+1);\r
5313                 strncpy(Tmp, Str, Len);\r
5314                 Ret = atoi(Tmp);\r
5315                 free(Tmp);\r
5316         }\r
5317         return(Ret);\r
5318 }\r
5319 \r
5320 \r
5321 \r
5322 \r