// ソフトウェア自動更新\r
// リリースバージョンはリリース予定年(10進数4桁)+月(2桁)+日(2桁)+通し番号(0スタート2桁)とする\r
// 2014年7月31日中の30個目のリリースは2014073129\r
-#define RELEASE_VERSION_NUM 2015072001 /* リリースバージョン */\r
+#define RELEASE_VERSION_NUM 2015080901 /* リリースバージョン */\r
\r
\r
// SourceForge.JPによるフォーク\r
#define WM_REFRESH_LOCAL_FLG (WM_USER+7)\r
#define WM_REFRESH_REMOTE_FLG (WM_USER+8)\r
\r
+// UPnP対応\r
+#define WM_ADDPORTMAPPING (WM_USER+9)\r
+#define WM_REMOVEPORTMAPPING (WM_USER+10)\r
+\r
/*===== ホスト番号 =====*/\r
/* ホスト番号は 0~ の値を取る */\r
\r
} INTCONVTBL;\r
\r
\r
+// UPnP対応\r
+typedef struct\r
+{\r
+ int r;\r
+ HANDLE h;\r
+ char* Adrs;\r
+ int Port;\r
+ char* ExtAdrs;\r
+} ADDPORTMAPPINGDATA;\r
+\r
+typedef struct\r
+{\r
+ int r;\r
+ HANDLE h;\r
+ int Port;\r
+} REMOVEPORTMAPPINGDATA;\r
+\r
/*=================================================\r
* プロトタイプ\r
*=================================================*/\r
int LoadUPnP();\r
void FreeUPnP();\r
int IsUPnPLoaded();\r
-int AddPortMapping(char* Adrs, int Port);\r
+int AddPortMapping(char* Adrs, int Port, char* ExtAdrs);\r
int RemovePortMapping(int Port);\r
int CheckClosedAndReconnect(void);\r
// 同時接続対応\r
// UPnP対応\r
char Adrs[16];\r
int Port;\r
+ char ExtAdrs[40];\r
\r
// ソケットにデータを付与\r
GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
// UPnP対応\r
if(IsUPnPLoaded() == YES && UPnPEnabled == YES)\r
{\r
- if(AddPortMapping(AddressToStringIPv4(Adrs, &saTmpAddr.sin_addr), ntohs(saCtrlAddr.sin_port)) == FFFTP_SUCCESS)\r
+ if(AddPortMapping(AddressToStringIPv4(Adrs, &saTmpAddr.sin_addr), ntohs(saCtrlAddr.sin_port), ExtAdrs) == FFFTP_SUCCESS)\r
+ {\r
+ saTmpAddr.sin_addr.s_addr = inet_addr(ExtAdrs);\r
SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin_port));\r
+ }\r
}\r
}\r
else\r
char Adrs[40];\r
// UPnP対応\r
int Port;\r
+ char ExtAdrs[40];\r
\r
// ソケットにデータを付与\r
GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
// UPnP対応\r
if(IsUPnPLoaded() == YES && UPnPEnabled == YES)\r
{\r
- if(AddPortMapping(AddressToStringIPv6(Adrs, &saTmpAddr.sin6_addr), ntohs(saCtrlAddr.sin6_port)) == FFFTP_SUCCESS)\r
+ if(AddPortMapping(AddressToStringIPv6(Adrs, &saTmpAddr.sin6_addr), ntohs(saCtrlAddr.sin6_port), ExtAdrs) == FFFTP_SUCCESS)\r
+ {\r
+ saTmpAddr.sin6_addr = inet6_addr(ExtAdrs);\r
SetAsyncTableDataMapPort(listen_skt, ntohs(saCtrlAddr.sin6_port));\r
+ }\r
}\r
}\r
else\r
// NOOPコマンドでは効果が無いホストが多いためLISTコマンドを使用\r
void NoopProc(int Force)\r
{\r
- int CancelCheckWork;\r
- CancelCheckWork = NO;\r
+// CancelFlg = NO;\r
if(Force == YES || (AskConnecting() == YES && AskUserOpeDisabled() == NO))\r
{\r
if(AskReuseCmdSkt() == NO || AskShareProh() == YES || AskTransferNow() == NO)\r
{\r
DisableUserOpe();\r
- DoDirListCmdSkt("", "", 999, &CancelCheckWork);\r
+ DoDirListCmdSkt("", "", 999, &CancelFlg);\r
EnableUserOpe();\r
}\r
}\r
PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);\r
break;\r
\r
+ // UPnP対応\r
+ case WM_ADDPORTMAPPING :\r
+ ((ADDPORTMAPPINGDATA*)lParam)->r = AddPortMapping(((ADDPORTMAPPINGDATA*)lParam)->Adrs, ((ADDPORTMAPPINGDATA*)lParam)->Port, ((ADDPORTMAPPINGDATA*)lParam)->ExtAdrs);\r
+ SetEvent(((ADDPORTMAPPINGDATA*)lParam)->h);\r
+ break;\r
+\r
+ case WM_REMOVEPORTMAPPING :\r
+ ((REMOVEPORTMAPPINGDATA*)lParam)->r = RemovePortMapping(((REMOVEPORTMAPPINGDATA*)lParam)->Port);\r
+ SetEvent(((REMOVEPORTMAPPINGDATA*)lParam)->h);\r
+ break;\r
+\r
case WM_PAINT :\r
BeginPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
EndPaint(hWnd, (LPPAINTSTRUCT) &ps);\r
return Sts;\r
}\r
\r
-int AddPortMapping(char* Adrs, int Port)\r
+int AddPortMapping(char* Adrs, int Port, char* ExtAdrs)\r
{\r
int Sts;\r
WCHAR Tmp1[40];\r
BSTR Tmp3;\r
BSTR Tmp4;\r
IStaticPortMapping* pPortMap;\r
+ BSTR Tmp5;\r
+ ADDPORTMAPPINGDATA Data;\r
Sts = FFFTP_FAIL;\r
- MtoW(Tmp1, 40, Adrs, -1);\r
- if((Tmp2 = SysAllocString(Tmp1)) != NULL)\r
+ if(IsMainThread())\r
{\r
- if((Tmp3 = SysAllocString(L"TCP")) != NULL)\r
+ MtoW(Tmp1, 40, Adrs, -1);\r
+ if((Tmp2 = SysAllocString(Tmp1)) != NULL)\r
{\r
- if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)\r
+ if((Tmp3 = SysAllocString(L"TCP")) != NULL)\r
{\r
- if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)\r
+ if((Tmp4 = SysAllocString(L"FFFTP")) != NULL)\r
{\r
- Sts = FFFTP_SUCCESS;\r
- pPortMap->lpVtbl->Release(pPortMap);\r
+ if(pUPnPMap->lpVtbl->Add(pUPnPMap, Port, Tmp3, Port, Tmp2, VARIANT_TRUE, Tmp4, &pPortMap) == S_OK)\r
+ {\r
+ if(pPortMap->lpVtbl->get_ExternalIPAddress(pPortMap, &Tmp5) == S_OK)\r
+ {\r
+ WtoM(ExtAdrs, 40, Tmp5, -1);\r
+ Sts = FFFTP_SUCCESS;\r
+ SysFreeString(Tmp5);\r
+ }\r
+ pPortMap->lpVtbl->Release(pPortMap);\r
+ }\r
+ SysFreeString(Tmp4);\r
}\r
- SysFreeString(Tmp4);\r
+ SysFreeString(Tmp3);\r
+ }\r
+ SysFreeString(Tmp2);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if(Data.h = CreateEvent(NULL, TRUE, FALSE, NULL))\r
+ {\r
+ Data.Adrs = Adrs;\r
+ Data.Port = Port;\r
+ Data.ExtAdrs = ExtAdrs;\r
+ if(PostMessage(GetMainHwnd(), WM_ADDPORTMAPPING, 0, (LPARAM)&Data))\r
+ {\r
+ if(WaitForSingleObject(Data.h, INFINITE) == WAIT_OBJECT_0)\r
+ Sts = Data.r;\r
}\r
- SysFreeString(Tmp3);\r
+ CloseHandle(Data.h);\r
}\r
- SysFreeString(Tmp2);\r
}\r
return Sts;\r
}\r
{\r
int Sts;\r
BSTR Tmp;\r
+ REMOVEPORTMAPPINGDATA Data;\r
Sts = FFFTP_FAIL;\r
- if((Tmp = SysAllocString(L"TCP")) != NULL)\r
+ if(IsMainThread())\r
{\r
- if(pUPnPMap->lpVtbl->Remove(pUPnPMap, Port, Tmp) == S_OK)\r
- Sts = FFFTP_SUCCESS;\r
- SysFreeString(Tmp);\r
+ if((Tmp = SysAllocString(L"TCP")) != NULL)\r
+ {\r
+ if(pUPnPMap->lpVtbl->Remove(pUPnPMap, Port, Tmp) == S_OK)\r
+ Sts = FFFTP_SUCCESS;\r
+ SysFreeString(Tmp);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if(Data.h = CreateEvent(NULL, TRUE, FALSE, NULL))\r
+ {\r
+ Data.Port = Port;\r
+ if(PostMessage(GetMainHwnd(), WM_ADDPORTMAPPING, 0, (LPARAM)&Data))\r
+ {\r
+ if(WaitForSingleObject(Data.h, INFINITE) == WAIT_OBJECT_0)\r
+ Sts = Data.r;\r
+ }\r
+ CloseHandle(Data.h);\r
+ }\r
}\r
return Sts;\r
}\r