#include <stdlib.h>\r
#include <string.h>\r
#include <mbstring.h>\r
+// 自動切断対策\r
+#include <time.h>\r
#include <malloc.h>\r
#include <windowsx.h>\r
#include <commctrl.h>\r
static DWORD MainThreadId;\r
// ポータブル版判定\r
static char PortableFilePath[FMAX_PATH+1];\r
-int PortableVersion;\r
+static int PortableVersion;\r
+// ローカル側自動更新\r
+HANDLE ChangeNotification = INVALID_HANDLE_VALUE;\r
\r
\r
/*===== グローバルなワーク =====*/\r
int WinHeight = 513;\r
int LocalWidth = 389;\r
int TaskHeight = 100;\r
-int LocalTabWidth[4] = { 160, 110, 60, 37 };\r
-int RemoteTabWidth[6] = { 160, 110, 60, 37, 60, 60 };\r
+int LocalTabWidth[4] = { 150, 120, 60, 37 };\r
+int RemoteTabWidth[6] = { 150, 120, 60, 37, 60, 60 };\r
char UserMailAdrs[USER_MAIL_LEN+1] = { "who@example.com" };\r
char ViewerName[VIEWERS][FMAX_PATH+1] = { { "notepad" }, { "" }, { "" } };\r
HFONT ListFont = NULL;\r
int SaveWinPos = NO;\r
// アスキーモード判別の改良\r
//char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0" };\r
-char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0*.js\0*.vbs\0*.css\0*.rss\0*.rdf\0*.xml\0*.xhtml\0*.xht\0*.shtml\0*.shtm\0*.sh\0*.py\0*.rb\0" };\r
+char AsciiExt[ASCII_EXT_LEN+1] = { "*.txt\0*.html\0*.htm\0*.cgi\0*.pl\0*.js\0*.vbs\0*.css\0*.rss\0*.rdf\0*.xml\0*.xhtml\0*.xht\0*.shtml\0*.shtm\0*.sh\0*.py\0*.rb\0*.properties\0*.sql\0*.asp\0*.aspx\0*.php\0*.htaccess\0" };\r
int RecvMode = TRANS_DLG;\r
int SendMode = TRANS_DLG;\r
int MoveMode = MOVE_DLG;\r
int FwallType = 1;\r
int FwallDefault = NO;\r
int FwallSecurity = SECURITY_AUTO;\r
-int FwallResolv = NO;\r
+int FwallResolve = NO;\r
int FwallLower = NO;\r
int FwallDelimiter = '@';\r
-int PasvDefault = NO;\r
+// ルータ対策\r
+//int PasvDefault = NO;\r
+int PasvDefault = YES;\r
char MirrorNoTrn[MIRROR_LEN+1] = { "*.bak\0" };\r
char MirrorNoDel[MIRROR_LEN+1] = { "" };\r
int MirrorFnameCnv = NO;\r
BYTE SSLRootCAFileHash[20];\r
// ファイルアイコン表示対応\r
int DispFileIcon = NO;\r
+// タイムスタンプのバグ修正\r
+int DispTimeSeconds = NO;\r
+// ファイルの属性を数字で表示\r
+int DispPermissionsNumber = NO;\r
// ディレクトリ自動作成\r
int MakeAllDir = YES;\r
+// UTF-8対応\r
+int LocalKanjiCode = KANJI_SJIS;\r
+// 自動切断対策\r
+int NoopEnable = NO;\r
+// UPnP対応\r
+int UPnPEnabled = YES;\r
+time_t LastDataConnectionTime = 0;\r
+// 全設定暗号化対応\r
+int EncryptAllSettings = NO;\r
+// ローカル側自動更新\r
+int AutoRefreshFileList = YES;\r
+// 古い処理内容を消去\r
+int RemoveOldLog = NO;\r
\r
\r
\r
\r
InitCommonControls();\r
\r
+ // UPnP対応\r
+ CoInitialize(NULL);\r
+ LoadUPnP();\r
+\r
+ // UTF-8対応\r
+ LoadUnicodeNormalizationDll();\r
+\r
// FTPS対応\r
#ifdef USE_OPENSSL\r
LoadOpenSSL();\r
#endif\r
// SFTP対応\r
FreePuTTY();\r
+ // UPnP対応\r
+ FreeUPnP();\r
+ CoUninitialize();\r
OleUninitialize();\r
return(Ret);\r
}\r
DispTransferType();\r
SetHostKanaCnvImm(YES);\r
SetHostKanjiCodeImm(KANJI_NOCNV);\r
- // 本当はローカルのデフォルトをUTF-8にしたいが旧バージョンとの互換性のためShift_JISに設定\r
-// SetLocalKanjiCodeImm(KANJI_UTF8N);\r
- SetLocalKanjiCodeImm(KANJI_SJIS);\r
+ // UTF-8対応\r
+ SetLocalKanjiCodeImm(LocalKanjiCode);\r
DispListType();\r
DispDotFileMode();\r
DispSyncMoveMode();\r
DispWindowTitle();\r
// SourceForge.JPによるフォーク\r
// SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.");\r
- SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2012 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu).");\r
+ SetTaskMsg("FFFTP Ver." VER_STR " Copyright(C) 1997-2010 Sota & cooperators.\r\nCopyright (C) 2011-2014 FFFTP Project (Hiromichi Matsushima, Suguru Kawamoto, IWAMOTO Kouichi, vitamin0x, unarist, Asami, fortran90, tomo1192, Yuji Tanaka, Moriguchi Hirokazu, Fu-sen).");\r
\r
if(ForceIni)\r
SetTaskMsg("%s%s", MSGJPN283, IniPath);\r
\r
switch (message)\r
{\r
+ // ローカル側自動更新\r
+ case WM_CREATE :\r
+ SetTimer(hWnd, 1, 1000, NULL);\r
+ break;\r
+\r
+ // ローカル側自動更新\r
// 自動切断対策\r
case WM_TIMER :\r
- if(wParam == 1)\r
- NoopProc();\r
+ switch(wParam)\r
+ {\r
+ case 1:\r
+ if(WaitForSingleObject(ChangeNotification, 0) == WAIT_OBJECT_0)\r
+ {\r
+ if(AskUserOpeDisabled() == NO)\r
+ {\r
+ FindNextChangeNotification(ChangeNotification);\r
+ if(AutoRefreshFileList == YES)\r
+ {\r
+ FILELIST* Base;\r
+ char Name[FMAX_PATH+1];\r
+ int Pos;\r
+ Base = NULL;\r
+ MakeSelectedFileList(WIN_LOCAL, NO, NO, &Base, &CancelFlg);\r
+ GetHotSelected(WIN_LOCAL, Name);\r
+ Pos = SendMessage(GetLocalHwnd(), LVM_GETTOPINDEX, 0, 0);\r
+ GetLocalDirForWnd();\r
+ SelectFileInList(GetLocalHwnd(), SELECT_LIST, Base);\r
+ SetHotSelected(WIN_LOCAL, Name);\r
+ SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)(SendMessage(GetLocalHwnd(), LVM_GETITEMCOUNT, 0, 0) - 1), (LPARAM)TRUE);\r
+ SendMessage(GetLocalHwnd(), LVM_ENSUREVISIBLE, (WPARAM)Pos, (LPARAM)TRUE);\r
+ }\r
+ }\r
+ }\r
+ if(NoopEnable == YES && AskNoopInterval() > 0 && time(NULL) - LastDataConnectionTime >= AskNoopInterval())\r
+ {\r
+ NoopProc(NO);\r
+ LastDataConnectionTime = time(NULL);\r
+ }\r
+ break;\r
+ }\r
break;\r
\r
case WM_COMMAND :\r
{\r
case MENU_CONNECT :\r
// 自動切断対策\r
- KillTimer(hWnd, 1);\r
+ NoopEnable = NO;\r
ConnectProc(DLG_TYPE_CON, -1);\r
// 自動切断対策\r
- if(AskNoopInterval() > 0)\r
- SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+ NoopEnable = YES;\r
break;\r
\r
case MENU_CONNECT_NUM :\r
// 自動切断対策\r
- KillTimer(hWnd, 1);\r
+ NoopEnable = NO;\r
ConnectProc(DLG_TYPE_CON, (int)lParam);\r
// 自動切断対策\r
- if(AskNoopInterval() > 0)\r
- SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+ NoopEnable = YES;\r
if(AskConnecting() == YES)\r
{\r
if(HIWORD(wParam) & OPT_MIRROR)\r
\r
case MENU_SET_CONNECT :\r
// 自動切断対策\r
- KillTimer(hWnd, 1);\r
+ NoopEnable = NO;\r
ConnectProc(DLG_TYPE_SET, -1);\r
// 自動切断対策\r
- if(AskNoopInterval() > 0)\r
- SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+ NoopEnable = YES;\r
break;\r
\r
case MENU_QUICK :\r
// 自動切断対策\r
- KillTimer(hWnd, 1);\r
+ NoopEnable = NO;\r
QuickConnectProc();\r
// 自動切断対策\r
- if(AskNoopInterval() > 0)\r
- SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+ NoopEnable = YES;\r
break;\r
\r
case MENU_DISCONNECT :\r
case MENU_HIST_19 :\r
case MENU_HIST_20 :\r
// 自動切断対策\r
- KillTimer(hWnd, 1);\r
+ NoopEnable = NO;\r
HistoryConnectProc(LOWORD(wParam));\r
// 自動切断対策\r
- if(AskNoopInterval() > 0)\r
- SetTimer(hWnd, 1, AskNoopInterval() * 1000, NULL);\r
+ NoopEnable = YES;\r
break;\r
\r
case MENU_UPDIR :\r
break;\r
\r
case MENU_REMOTE_UPDIR :\r
+ // デッドロック対策\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
SuppressRefresh = 1;\r
SetCurrentDirAsDirHist();\r
ChangeDir(WIN_REMOTE, "..");\r
break;\r
\r
case MENU_LOCAL_UPDIR :\r
+ // デッドロック対策\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
SetCurrentDirAsDirHist();\r
ChangeDir(WIN_LOCAL, "..");\r
break;\r
break;\r
\r
case MENU_REFRESH :\r
+ // デッドロック対策\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
// 同時接続対応\r
CancelFlg = NO;\r
SuppressRefresh = 1;\r
break;\r
\r
case REFRESH_LOCAL :\r
+ // デッドロック対策\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
GetLocalDirForWnd();\r
break;\r
\r
case REFRESH_REMOTE :\r
+ // デッドロック対策\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
// 同時接続対応\r
CancelFlg = NO;\r
SuppressRefresh = 1;\r
break;\r
\r
case MENU_SELECT_ALL :\r
- SelectFileInList(hWndCurFocus, SELECT_ALL);\r
+ // ローカル側自動更新\r
+// SelectFileInList(hWndCurFocus, SELECT_ALL);\r
+ SelectFileInList(hWndCurFocus, SELECT_ALL, NULL);\r
break;\r
\r
case MENU_SELECT :\r
- SelectFileInList(hWndCurFocus, SELECT_REGEXP);\r
+ // ローカル側自動更新\r
+// SelectFileInList(hWndCurFocus, SELECT_REGEXP);\r
+ SelectFileInList(hWndCurFocus, SELECT_REGEXP, NULL);\r
break;\r
\r
case MENU_FIND :\r
break;\r
\r
case MENU_DOTFILE :\r
+ // デッドロック対策\r
+ if(AskUserOpeDisabled() == YES)\r
+ break;\r
// 同時接続対応\r
CancelFlg = NO;\r
DotFile ^= 1;\r
OtpCalcTool();\r
break;\r
\r
+ // FTPS対応\r
+ case MENU_FW_FTP_FILTER :\r
+ TurnStatefulFTPFilter();\r
+ break;\r
+\r
case MENU_URL_COPY :\r
CopyURLtoClipBoard();\r
break;\r
break;\r
\r
case WM_DESTROY :\r
+ // ローカル側自動更新\r
+ KillTimer(hWnd, 1);\r
+ if(ChangeNotification != INVALID_HANDLE_VALUE)\r
+ FindCloseChangeNotification(ChangeNotification);\r
// WSACleanup();\r
// DestroyWindow(hWndFtp);\r
PostQuitMessage(0);\r
if(CmdOption & OPT_SAVEON)\r
SuppressSave = NO;\r
\r
+ // UTF-8対応\r
+ if(CmdOption & OPT_SJIS)\r
+ Kanji = KANJI_SJIS;\r
+ if(CmdOption & OPT_UTF8N)\r
+ Kanji = KANJI_UTF8N;\r
+ if(CmdOption & OPT_UTF8BOM)\r
+ Kanji = KANJI_UTF8BOM;\r
+ if(CmdOption & OPT_SJIS_NAME)\r
+ FnameKanji = KANJI_SJIS;\r
+ if(CmdOption & OPT_UTF8N_NAME)\r
+ FnameKanji = KANJI_UTF8N;\r
+\r
if(Sts == 0)\r
{\r
if(ConnectOnStart == YES)\r
*CmdOption |= OPT_MIRROR;\r
else if((strcmp(&Tmp[1], "d") == 0) || (strcmp(&Tmp[1], "-mirrordown") == 0))\r
*CmdOption |= OPT_MIRRORDOWN;\r
- else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
+ // 廃止予定\r
+// else if((strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
+// *CmdOption |= OPT_EUC;\r
+// else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
+// *CmdOption |= OPT_JIS;\r
+ else if((strcmp(&Tmp[1], "eu") == 0) || (strcmp(&Tmp[1], "e") == 0) || (strcmp(&Tmp[1], "-euc") == 0))\r
*CmdOption |= OPT_EUC;\r
- else if((strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
+ else if((strcmp(&Tmp[1], "ji") == 0) || (strcmp(&Tmp[1], "j") == 0) || (strcmp(&Tmp[1], "-jis") == 0))\r
*CmdOption |= OPT_JIS;\r
else if((strcmp(&Tmp[1], "a") == 0) || (strcmp(&Tmp[1], "-ascii") == 0))\r
*CmdOption |= OPT_ASCII;\r
*CmdOption |= OPT_QUIT;\r
else if((strcmp(&Tmp[1], "k") == 0) || (strcmp(&Tmp[1], "-kana") == 0))\r
*CmdOption |= OPT_KANA;\r
- else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
+ // 廃止予定\r
+// else if((strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
+// *CmdOption |= OPT_EUC_NAME;\r
+// else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
+// *CmdOption |= OPT_JIS_NAME;\r
+ else if((strcmp(&Tmp[1], "eun") == 0) || (strcmp(&Tmp[1], "u") == 0) || (strcmp(&Tmp[1], "-eucname") == 0))\r
*CmdOption |= OPT_EUC_NAME;\r
- else if((strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
+ else if((strcmp(&Tmp[1], "jin") == 0) || (strcmp(&Tmp[1], "i") == 0) || (strcmp(&Tmp[1], "-jisname") == 0))\r
*CmdOption |= OPT_JIS_NAME;\r
else if((strcmp(&Tmp[1], "n") == 0) || (strcmp(&Tmp[1], "-ini") == 0))\r
{\r
{\r
}\r
#endif\r
+ // UTF-8対応\r
+ else if((strcmp(&Tmp[1], "sj") == 0) || (strcmp(&Tmp[1], "-sjis") == 0))\r
+ *CmdOption |= OPT_SJIS;\r
+ else if((strcmp(&Tmp[1], "u8") == 0) || (strcmp(&Tmp[1], "-utf8") == 0))\r
+ *CmdOption |= OPT_UTF8N;\r
+ else if((strcmp(&Tmp[1], "8b") == 0) || (strcmp(&Tmp[1], "-utf8bom") == 0))\r
+ *CmdOption |= OPT_UTF8BOM;\r
+ else if((strcmp(&Tmp[1], "sjn") == 0) || (strcmp(&Tmp[1], "-sjisname") == 0))\r
+ *CmdOption |= OPT_SJIS_NAME;\r
+ else if((strcmp(&Tmp[1], "u8n") == 0) || (strcmp(&Tmp[1], "-utf8name") == 0))\r
+ *CmdOption |= OPT_UTF8N_NAME;\r
else\r
{\r
SetTaskMsg(MSGJPN180, Tmp);\r
for(i = 0; i < 5; i++)\r
Hash[i] = _byteswap_ulong(Hash[i]);\r
// 同梱する"ssl.pem"に合わせてSHA1ハッシュ値を変更すること\r
- if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\x63\xAC\x6C\x43\xCE\xD6\x5B\xCF\x33\xB9\x45\x70\xC3\x9B\x8C\x91\x19\x0D\xEF\xE6", 20) == 0\r
+ if(memcmp(&Hash, &SSLRootCAFileHash, 20) == 0 || memcmp(&Hash, "\xD8\x8A\x7B\x2F\xBF\x23\x57\x16\xDA\x02\x14\x2B\xD4\x2E\x09\x80\xA0\x4C\x72\x62", 20) == 0\r
|| DialogBox(GetFtpInst(), MAKEINTRESOURCE(updatesslroot_dlg), GetMainHwnd(), ExeEscDialogProc) == YES)\r
{\r
memcpy(&SSLRootCAFileHash, &Hash, 20);\r
return TRUE;\r
}\r
\r
-// ファイルアイコン表示対応\r
-int AskDispFileIcon(void)\r
-{\r
- return(DispFileIcon);\r
-}\r
-\r
// ポータブル版判定\r
void CheckPortableVersion()\r
{\r
return(PortableVersion);\r
}\r
\r
+// 全設定暗号化対応\r
+int Restart()\r
+{\r
+ int Sts;\r
+ char* CommandLine;\r
+ STARTUPINFO si;\r
+ PROCESS_INFORMATION pi;\r
+ Sts = FFFTP_FAIL;\r
+ if(CommandLine = (char*)malloc(sizeof(char) * (strlen(GetCommandLine()) + 1)))\r
+ {\r
+ strcpy(CommandLine, GetCommandLine());\r
+ GetStartupInfo(&si);\r
+ if(CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))\r
+ {\r
+ CloseHandle(pi.hThread);\r
+ CloseHandle(pi.hProcess);\r
+ Sts = FFFTP_SUCCESS;\r
+ }\r
+ free(CommandLine);\r
+ }\r
+ return Sts;\r
+}\r
+\r
+void RestartAndTerminate()\r
+{\r
+ Restart();\r
+ exit(1);\r
+}\r
+\r