return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
\r
case WM_DROPFILES :\r
+ // 同時接続対応\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
// ドラッグ中は処理しない。ドラッグ後にWM_LBUTTONDOWNが飛んでくるため、そこで処理する。\r
if (Dragging == YES) \r
return (FALSE);\r
hCsrDrg = LoadCursor(NULL, IDC_ARROW);\r
SetCursor(hCsrDrg);\r
\r
+ // 同時接続対応\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
Point.x = (long)(short)LOWORD(lParam);\r
Point.y = (long)(short)HIWORD(lParam);\r
ClientToScreen(hWnd, &Point);\r
\r
} \r
\r
+#if defined(HAVE_TANDEM)\r
+ if(FileListBaseNoExpand == NULL)\r
+ pf = FileListBase;\r
+ else\r
+#endif\r
pf = FileListBaseNoExpand;\r
for (filenum = 0; pf ; filenum++) {\r
pf = pf->Next;\r
{\r
if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||\r
+#if defined(HAVE_TANDEM)\r
+ ((AskHostType() == HTYPE_TANDEM) &&\r
+ ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+ ((Cmp = Attr - Pos->Attr) < 0)) ||\r
+#endif\r
(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
((Cmp = Size - Pos->Size) < 0)) ||\r
(((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
{\r
if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
+#if defined(HAVE_TANDEM)\r
+ ((AskHostType() == HTYPE_TANDEM) &&\r
+ ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+ ((Cmp = Attr - Pos->Attr) > 0)) ||\r
+#endif\r
(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
((Cmp = Size - Pos->Size) > 0)) ||\r
(((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
LvItem.iSubItem = 3;\r
+#if defined(HAVE_TANDEM)\r
+ if (AskHostType() == HTYPE_TANDEM) {\r
+ _itoa_s(Attr, Tmp, sizeof(Tmp), 10);\r
+ LvItem.pszText = Tmp;\r
+ } else\r
+#endif\r
LvItem.pszText = GetFileExt(Name);\r
LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
\r
{\r
/* 属性 */\r
strcpy(Tmp, "");\r
+#if defined(HAVE_TANDEM)\r
+ if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM))\r
+#else\r
if(InfoExist & FINFO_ATTR)\r
+#endif\r
AttrValue2String(Attr, Tmp);\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
*Buf = -1;\r
Ret = NO;\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM) {\r
+ RemoveComma(Tmp);\r
+ *Buf = _atoi64(Tmp);\r
+ Ret = YES;\r
+ } else\r
+#endif\r
if(strlen(Tmp) > 0)\r
{\r
RemoveComma(Tmp);\r
{\r
LvItem.mask = LVIF_TEXT;\r
LvItem.iItem = Pos;\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM)\r
+ LvItem.iSubItem = 3;\r
+ else\r
+#endif\r
LvItem.iSubItem = 4;\r
LvItem.pszText = Tmp;\r
LvItem.cchTextMax = 20;\r
SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);\r
if(strlen(Tmp) > 0)\r
{\r
+#if defined(HAVE_TANDEM)\r
+ if(AskHostType() == HTYPE_TANDEM)\r
+ *Buf = atoi(Tmp);\r
+ else\r
+#endif\r
*Buf = AttrString2Value(Tmp);\r
Ret = YES;\r
}\r
strcpy(Pkt.File, GetFileName(Name));\r
\r
memset(&Pkt.Time, 0, sizeof(FILETIME));\r
+#if defined(HAVE_TANDEM)\r
+ /* Guardian スペースへのアップロードのためにサイズが必要 */\r
+ Pkt.Size = 0;\r
+ Pkt.InfoExist = 0;\r
+#endif\r
if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE)\r
{\r
FindClose(fHnd);\r
Pkt.Time = Find.ftLastWriteTime;\r
+#if defined(HAVE_TANDEM)\r
+ Pkt.Size = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow);\r
+ Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
+#endif\r
}\r
AddFileList(&Pkt, Base);\r
}\r
}\r
}\r
}\r
+#if defined(HAVE_TANDEM)\r
+ /* 以下のフォーマットをチェック */\r
+ /* LIST_TANDEM */\r
+\r
+ /* OSS の場合は自動判別可能のため Ret == LIST_UNKNOWN のチェックは後 */\r
+ if(AskRealHostType() == HTYPE_TANDEM) {\r
+ if(Ret == LIST_UNKNOWN) {\r
+ SetOSS(NO);\r
+ Ret = LIST_TANDEM;\r
+ } else {\r
+ SetOSS(YES);\r
+ }\r
+ }\r
+#endif\r
\r
// MLSD対応\r
if(Ret == LIST_UNKNOWN)\r
\r
/* まずクリアしておく */\r
Ret = NODE_NONE;\r
+ // バグ対策\r
+ memset(Fname, NUL, FMAX_PATH+1);\r
*Size = -1;\r
*Attr = 0;\r
*Link = NO;\r
}\r
break;\r
\r
+#if defined(HAVE_TANDEM)\r
+ case LIST_TANDEM :\r
+ *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
+ /* Open 中だったらずらす */\r
+ if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS)\r
+ break;\r
+ if (!strncmp(Buf, "O", 1)) {\r
+ offs = 1;\r
+ }\r
+ /* 日付 */\r
+ if(FindField(Str, Buf, 3 + offs, NO) != FFFTP_SUCCESS)\r
+ break;\r
+ if (Buf[1] == '-') { /* 日付が 1桁 */\r
+ sTime.wYear = Assume1900or2000(atoi(Buf + 6));\r
+ Buf[5] = 0;\r
+ GetMonth(Buf+2, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */\r
+ sTime.wDay = atoi(Buf);\r
+ sTime.wDayOfWeek = 0;\r
+ } else {\r
+ sTime.wYear = Assume1900or2000(atoi(Buf + 7));\r
+ Buf[6] = 0;\r
+ GetMonth(Buf+3, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */\r
+ sTime.wDay = atoi(Buf);\r
+ sTime.wDayOfWeek = 0;\r
+ }\r
+ /* 時刻 */\r
+ FindField(Str, Buf, 4 + offs, NO);\r
+ sTime.wHour = atoi(Buf);\r
+ sTime.wMinute = atoi(Buf+3);\r
+ sTime.wSecond = atoi(Buf+6);\r
+ sTime.wMilliseconds = 0;\r
+ SystemTimeToFileTime(&sTime, Time);\r
+ SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+\r
+ /* 属性 セキュリティではなく FileCode を保存する */\r
+ FindField(Str, Buf, 1 + offs, NO);\r
+ *Attr = atoi(Buf);\r
+ /* サイズ */\r
+ FindField(Str, Buf, 2 + offs, NO);\r
+ *Size = _atoi64(Buf);\r
+ /* オーナ名 */\r
+ if(FindField(Str, Buf, 5 + offs, NO) == FFFTP_SUCCESS) {\r
+ if(strncmp(Buf, "Owner", sizeof("Owner"))) {\r
+ memset(Owner, NUL, OWNER_NAME_LEN+1);\r
+ strncpy(Owner, Buf, OWNER_NAME_LEN);\r
+ /* 通常は 255,255 だが、20, 33 などにも対応する */\r
+ /* 最後の文字が , だったら後ろとつなげる */\r
+ if (Buf[strlen(Buf)-1] == ',') {\r
+ FindField(Str, Buf, 6 + offs, NO);\r
+ strncat(Owner, Buf, OWNER_NAME_LEN - strlen(Buf));\r
+ }\r
+ /* ファイル名 */\r
+ if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS) {\r
+ Ret = NODE_FILE;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+#endif\r
+\r
+ // MLSD対応\r
+ // 以下の形式に対応\r
+ // fact1=value1;fact2=value2;fact3=value3; filename\r\n\r
+ // 不完全な実装のホストが存在するため以下の形式も許容\r
+ // fact1=value1;fact2=value2;fact3=value3 filename\r\n\r
+ // fact1=value1;fact2=value2;fact3=value3;filename\r\n\r
+ case LIST_MLSD:\r
+ {\r
+ int i = 0;\r
+ char StrBuf[(FMAX_PATH * 2) + 1];\r
+ char Fact[FMAX_PATH + 1];\r
+ char Name[FMAX_PATH + 1];\r
+ char Value[FMAX_PATH + 1];\r
+ char* pFileName;\r
+ strncpy(StrBuf, Str, FMAX_PATH * 2);\r
+ StrBuf[FMAX_PATH * 2] = '\0';\r
+ if((pFileName = strstr(StrBuf, "; ")) != NULL)\r
+ {\r
+ *pFileName = '\0';\r
+ pFileName += 2;\r
+ }\r
+ else if((pFileName = strchr(StrBuf, ' ')) != NULL)\r
+ {\r
+ *pFileName = '\0';\r
+ pFileName++;\r
+ }\r
+ else if((pFileName = strrchr(StrBuf, ';')) != NULL)\r
+ {\r
+ *pFileName = '\0';\r
+ pFileName++;\r
+ }\r
+ if(pFileName != NULL)\r
+ strcpy(Fname, pFileName);\r
+ while(FindField2(StrBuf, Fact, ';', i, NO) == FFFTP_SUCCESS)\r
+ {\r
+ if(FindField2(Fact, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Fact, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
+ {\r
+ if(_stricmp(Name, "type") == 0)\r
+ {\r
+ if(_stricmp(Value, "dir") == 0)\r
+ Ret = NODE_DIR;\r
+ else if(_stricmp(Value, "file") == 0)\r
+ Ret = NODE_FILE;\r
+ }\r
+ else if(_stricmp(Name, "size") == 0)\r
+ {\r
+ *Size = _atoi64(Value);\r
+ *InfoExist |= FINFO_SIZE;\r
+ }\r
+ else if(_stricmp(Name, "modify") == 0)\r
+ {\r
+ sTime.wYear = atoi_n(Value, 4);\r
+ sTime.wMonth = atoi_n(Value + 4, 2);\r
+ sTime.wDay = atoi_n(Value + 6, 2);\r
+ sTime.wHour = atoi_n(Value + 8, 2);\r
+ sTime.wMinute = atoi_n(Value + 10, 2);\r
+ sTime.wSecond = atoi_n(Value + 12, 2);\r
+ sTime.wMilliseconds = 0;\r
+ SystemTimeToFileTime(&sTime, Time);\r
+ // 時刻はGMT\r
+// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+ *InfoExist |= FINFO_DATE | FINFO_TIME;\r
+ }\r
+ else if(_stricmp(Name, "UNIX.mode") == 0)\r
+ {\r
+ *Attr = strtol(Value, NULL, 16);\r
+ *InfoExist |= FINFO_ATTR;\r
+ }\r
+ else if(_stricmp(Name, "UNIX.owner") == 0)\r
+ strcpy(Owner, Value);\r
+ }\r
+ i++;\r
+ }\r
+ }\r
+ break;\r
+\r
case LIST_UNIX_10 :\r
case LIST_UNIX_11 :\r
case LIST_UNIX_12 :\r
Ret = NODE_NONE;\r
}\r
break;\r
-\r
- // MLSD対応\r
- case LIST_MLSD:\r
- {\r
- int i = 0;\r
- char Tmp[FMAX_PATH + 1];\r
- char Name[FMAX_PATH + 1];\r
- char Value[FMAX_PATH + 1];\r
- while(FindField2(Str, Tmp, ';', i, NO) == FFFTP_SUCCESS)\r
- {\r
- if(i >= 1 && strncmp(Tmp, " ", 1) == 0)\r
- strcpy(Fname, strstr(Str, "; ") + 2);\r
- else if(FindField2(Tmp, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Tmp, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
- {\r
- if(_stricmp(Name, "type") == 0)\r
- {\r
- if(_stricmp(Value, "dir") == 0)\r
- Ret = NODE_DIR;\r
- else if(_stricmp(Value, "file") == 0)\r
- Ret = NODE_FILE;\r
- }\r
- else if(_stricmp(Name, "size") == 0)\r
- {\r
- *Size = _atoi64(Value);\r
- *InfoExist |= FINFO_SIZE;\r
- }\r
- else if(_stricmp(Name, "modify") == 0)\r
- {\r
- sTime.wYear = atoi_n(Value, 4);\r
- sTime.wMonth = atoi_n(Value + 4, 2);\r
- sTime.wDay = atoi_n(Value + 6, 2);\r
- sTime.wHour = atoi_n(Value + 8, 2);\r
- sTime.wMinute = atoi_n(Value + 10, 2);\r
- sTime.wSecond = atoi_n(Value + 12, 2);\r
- sTime.wMilliseconds = 0;\r
- SystemTimeToFileTime(&sTime, Time);\r
-// SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
- *InfoExist |= FINFO_DATE | FINFO_TIME;\r
- }\r
- else if(_stricmp(Name, "UNIX.mode") == 0)\r
- {\r
- *Attr = strtol(Value, NULL, 16);\r
- *InfoExist |= FINFO_ATTR;\r
- }\r
- else if(_stricmp(Name, "UNIX.owner") == 0)\r
- strcpy(Owner, Value);\r
- }\r
- i++;\r
- }\r
- }\r
- break;\r
}\r
\r
// UTF-8対応\r