CConnectMage.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. #include "stdafx.h"
  2. #include "CConnectMage.h"
  3. CConnectMage::CConnectMage() : m_clash_Api(nullptr), m_clash_config(nullptr), m_connect_status(ConnectState::Stop), m_Asyntask(4)
  4. {
  5. SNotifyCenter::getSingleton().addEvent(EVENTID(EventConnect));
  6. m_isclash_config = false;
  7. }
  8. CConnectMage::~CConnectMage()
  9. {
  10. if (m_clash_Api)
  11. {
  12. delete m_clash_Api;
  13. m_clash_Api = nullptr;
  14. }
  15. }
  16. BOOL CConnectMage::setProxy()
  17. {
  18. BOOL isok = FALSE;
  19. if (m_clash_config)
  20. {
  21. isok = m_clash_config->SetProxy();
  22. }
  23. return isok;
  24. }
  25. void CConnectMage::Stop()
  26. {
  27. m_connect_status = ConnectState::Stop;
  28. m_Asyntask.AddTask(&CConnectMage::ThreadFun_ChangeClash_Stop, this, (LPARAM)nullptr);
  29. }
  30. void CConnectMage::ReqConfig()
  31. {
  32. m_Asyntask.AddTask(&CConnectMage::ThreadFun_ChangeClash_Config, this, (LPARAM)nullptr);
  33. }
  34. void CConnectMage::ChangeClashNode()
  35. {
  36. m_Asyntask.AddTask(&CConnectMage::ThreadFun_ChangeClash_Node, this, (LPARAM)nullptr);
  37. }
  38. void CConnectMage::ChangeClashInit()
  39. {
  40. }
  41. void CConnectMage::Init()
  42. {
  43. if (!m_clash_Api)
  44. {
  45. m_clash_Api = new ClashApi();
  46. m_clash_Api->SetProt(m_clash_config->GetClasApiPort());
  47. }
  48. }
  49. void CConnectMage::SetNodeName(std::string name)
  50. {
  51. m_name = name;
  52. }
  53. void CConnectMage::SetClashConfig(CLashConfig* m)
  54. {
  55. m_clash_config = m;
  56. }
  57. ConnectState CConnectMage::GetConnectStatus()
  58. {
  59. return m_connect_status;
  60. }
  61. void CConnectMage::ThreadFun_ChangeClash_Config(LPARAM lParam)
  62. {
  63. if (!CApp::getSingletonPtr()->GetClashRuning())
  64. {
  65. m_connect_status = ConnectState::Stop;
  66. m_error = L"内核没有启动,重启电脑或者软件";
  67. EventConnect* pEvt = new EventConnect(nullptr);
  68. pEvt->status = m_connect_status;
  69. pEvt->msg = m_error;
  70. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  71. pEvt->Release();
  72. return;
  73. }
  74. if (m_clash_config == nullptr || m_clash_Api == nullptr)
  75. {
  76. m_connect_status = ConnectState::Stop;
  77. m_error = L"错误,重启电脑";
  78. EventConnect* pEvt = new EventConnect(nullptr);
  79. pEvt->status = m_connect_status;
  80. pEvt->msg = m_error;
  81. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  82. pEvt->Release();
  83. return;
  84. }
  85. //创建配置
  86. if (!m_clash_config->MakeClash())
  87. {
  88. m_connect_status = ConnectState::Stop;
  89. m_error = L"没有生成配置,检查系统是否有管理员";
  90. EventConnect* pEvt = new EventConnect(nullptr);
  91. pEvt->status = m_connect_status;
  92. pEvt->msg = m_error;
  93. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  94. pEvt->Release();
  95. return;
  96. }
  97. /*std::filesystem::path config;
  98. if (m_connect_status == ConnectState::Stop && CApp::getSingletonPtr()->GetSysMode() == PROXY_MODE::tun_mode)
  99. {
  100. config = CApp::getSingletonPtr()->GetConfigPath() / DSPROXY_CONFIG_INIT_ClASH_NAME;
  101. }*/
  102. //切换请求
  103. if (m_clash_Api->RequestConfigUpdate(m_clash_config->GetRunConfig()))
  104. {
  105. m_isclash_config = true;
  106. if (m_name.empty())
  107. {
  108. CServerList* serverlist = CApp::getSingletonPtr()->GetServerList();
  109. if (serverlist)
  110. {
  111. serverlist->MinimumSelectNode();
  112. if (!serverlist->node_name.empty())
  113. {
  114. if (m_clash_Api->UpdateProxyGroup("Proxy", serverlist->node_name))
  115. {
  116. m_connect_status = ConnectState::SwitchNodeSuccEss;
  117. m_error = L"切换成功";
  118. //m_clash_config->SetProxy();
  119. }
  120. else {
  121. m_connect_status = ConnectState::Stop;
  122. m_error = L"切换失败,可以重新尝试";
  123. }
  124. }
  125. }
  126. }
  127. else {
  128. if (m_clash_Api->UpdateProxyGroup("Proxy", m_name))
  129. {
  130. m_connect_status = ConnectState::SwitchNodeSuccEss;
  131. m_error = L"切换成功";
  132. m_clash_config->SetProxy();
  133. }
  134. else {
  135. m_connect_status = ConnectState::Stop;
  136. m_error = L"切换失败,可以重新尝试";
  137. }
  138. }
  139. }
  140. else {
  141. m_connect_status = ConnectState::Stop;
  142. m_error = L"切换失败,可以重新尝试";
  143. }
  144. EventConnect* pEvt = new EventConnect(nullptr);
  145. pEvt->status = m_connect_status;
  146. pEvt->msg = m_error;
  147. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  148. pEvt->Release();
  149. }
  150. void CConnectMage::ThreadFun_ChangeClash_Node(LPARAM lParam)
  151. {
  152. if (m_clash_config == nullptr || m_clash_Api == nullptr)
  153. {
  154. m_connect_status = ConnectState::Stop;
  155. m_error = L"错误,重启电脑";
  156. EventConnect* pEvt = new EventConnect(nullptr);
  157. pEvt->status = m_connect_status;
  158. pEvt->msg = m_error;
  159. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  160. pEvt->Release();
  161. return;
  162. }
  163. if (m_clash_Api->UpdateProxyGroup("Proxy", m_name))
  164. {
  165. m_connect_status = ConnectState::SwitchNodeSuccEss;
  166. m_error = L"切换成功..点击断开";
  167. //m_clash_config->SetProxy();
  168. }
  169. else {
  170. m_connect_status = ConnectState::Stop;
  171. m_error = L"切换失败,可以重新尝试";
  172. }
  173. EventConnect* pEvt = new EventConnect(nullptr);
  174. pEvt->status = m_connect_status;
  175. pEvt->msg = m_error;
  176. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  177. pEvt->Release();
  178. }
  179. void CConnectMage::ThreadFun_ChangeClash_Stop(LPARAM lParam)
  180. {
  181. if (!CApp::getSingletonPtr()->GetClashRuning())
  182. {
  183. m_connect_status = ConnectState::Stop;
  184. m_error = L"内核没有启动,重启电脑或者软件";
  185. EventConnect* pEvt = new EventConnect(nullptr);
  186. pEvt->status = m_connect_status;
  187. pEvt->msg = m_error;
  188. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  189. pEvt->Release();
  190. return;
  191. }
  192. if (m_clash_config == nullptr || m_clash_Api == nullptr)
  193. {
  194. m_connect_status = ConnectState::Stop;
  195. m_error = L"错误,重启电脑";
  196. EventConnect* pEvt = new EventConnect(nullptr);
  197. pEvt->status = m_connect_status;
  198. pEvt->msg = m_error;
  199. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  200. pEvt->Release();
  201. return;
  202. }
  203. //创建配置
  204. if (!m_clash_config->MakeClash())
  205. {
  206. m_connect_status = ConnectState::Stop;
  207. m_error = L"没有生成配置,检查系统是否有管理员";
  208. EventConnect* pEvt = new EventConnect(nullptr);
  209. pEvt->status = m_connect_status;
  210. pEvt->msg = m_error;
  211. SNotifyCenter::getSingleton().FireEventAsync(pEvt);
  212. pEvt->Release();
  213. return;
  214. }
  215. /*std::filesystem::path config;
  216. if (m_connect_status == ConnectState::Stop && CApp::getSingletonPtr()->GetSysMode() == PROXY_MODE::tun_mode)
  217. {
  218. config = CApp::getSingletonPtr()->GetConfigPath() / DSPROXY_CONFIG_INIT_ClASH_NAME;
  219. }*/
  220. //切换请求
  221. if (m_clash_Api->RequestConfigUpdate(CApp::getSingletonPtr()->GetConfigPath() / DSPROXY_CONFIG_INIT_ClASH_NAME))
  222. {
  223. m_isclash_config = true;
  224. if (m_name.empty())
  225. {
  226. CServerList* serverlist = CApp::getSingletonPtr()->GetServerList();
  227. if (serverlist)
  228. {
  229. serverlist->MinimumSelectNode();
  230. if (!serverlist->node_name.empty())
  231. {
  232. if (m_clash_Api->UpdateProxyGroup("Proxy", serverlist->node_name))
  233. {
  234. m_connect_status = ConnectState::SwitchNodeSuccEss;
  235. m_error = L"切换成功";
  236. //m_clash_config->SetProxy();
  237. }
  238. else {
  239. m_connect_status = ConnectState::Stop;
  240. m_error = L"切换失败,可以重新尝试";
  241. }
  242. }
  243. }
  244. }
  245. else {
  246. if (m_clash_Api->UpdateProxyGroup("Proxy", m_name))
  247. {
  248. m_connect_status = ConnectState::SwitchNodeSuccEss;
  249. m_error = L"切换成功";
  250. //m_clash_config->SetProxy();
  251. }
  252. else {
  253. m_connect_status = ConnectState::Stop;
  254. m_error = L"切换失败,可以重新尝试";
  255. }
  256. }
  257. }
  258. else {
  259. m_connect_status = ConnectState::Stop;
  260. m_error = L"切换失败,可以重新尝试";
  261. }
  262. }