MbnEventImpl.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. #ifndef _MBN_EVENT_HELPER_
  2. #define _MBN_EVENT_HELPER_
  3. #include <atlbase.h>
  4. #include "mbnapi.h"
  5. #include <tchar.h>
  6. #include <conio.h>
  7. #include <comdef.h>
  8. #include "PortableDevice.h"
  9. #include "MobileDialFSM.h"
  10. #pragma comment(lib, "mbnapi_uuid.lib")
  11. // Macro that releases a COM object if not NULL.
  12. #define SAFE_RELEASE(p) do { if ((p)) { (p)->Release(); (p) = NULL; } } while(0)
  13. LPCTSTR ConvertToString(BSTR& bstrValue);
  14. void FreeBString(BSTR& bstrValue);
  15. class CMbnImplHelper;
  16. void EnterWowRedirection();
  17. void LeaveWowRedirection();
  18. class CustomSignalEvents : IMbnSignalEvents
  19. {
  20. private:
  21. DWORD m_dwRefCount;
  22. CMbnImplHelper* m_pHelper;
  23. int m_nFormattedVal;
  24. int m_nOldValue;
  25. public:
  26. DWORD GetRef()
  27. {
  28. return m_dwRefCount;
  29. }
  30. CustomSignalEvents(CMbnImplHelper* helper): m_dwRefCount(0), m_pHelper(helper),
  31. m_nFormattedVal(0),
  32. m_nOldValue(4){}
  33. HRESULT STDMETHODCALLTYPE OnSignalStateChange(IMbnSignal *newInterface);
  34. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
  35. {
  36. if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IMbnSignalEvents))
  37. {
  38. *ppvObject = static_cast<IMbnSignalEvents*>(this);
  39. AddRef();
  40. return S_OK;
  41. }
  42. return E_NOINTERFACE;
  43. }
  44. ULONG STDMETHODCALLTYPE AddRef()
  45. {
  46. m_dwRefCount++;
  47. return m_dwRefCount;
  48. }
  49. ULONG STDMETHODCALLTYPE Release()
  50. {
  51. m_dwRefCount--;
  52. if (0 == m_dwRefCount)
  53. {
  54. delete this;
  55. return 0;
  56. }
  57. return m_dwRefCount;
  58. }
  59. };
  60. class CustomConnectionEvents : IMbnConnectionEvents
  61. {
  62. private:
  63. DWORD m_dwRefCount;
  64. CMbnImplHelper* m_pHelper;
  65. public:
  66. CustomConnectionEvents(CMbnImplHelper* helper): m_dwRefCount(0), m_pHelper(helper){}
  67. HRESULT STDMETHODCALLTYPE OnConnectComplete(
  68. IMbnConnection *newConnection,
  69. ULONG requestID, HRESULT status);
  70. HRESULT STDMETHODCALLTYPE OnDisconnectComplete(
  71. IMbnConnection *newConnection,
  72. ULONG reqeustID, HRESULT status);
  73. HRESULT STDMETHODCALLTYPE OnConnectStateChange( IMbnConnection *newConnection);
  74. HRESULT STDMETHODCALLTYPE OnVoiceCallStateChange( IMbnConnection *newConnection);
  75. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
  76. {
  77. if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IMbnConnectionEvents))
  78. {
  79. *ppvObject = static_cast<IMbnConnectionEvents*>(this);
  80. AddRef();
  81. return S_OK;
  82. }
  83. return E_NOINTERFACE;
  84. }
  85. ULONG STDMETHODCALLTYPE AddRef()
  86. {
  87. return ++m_dwRefCount;
  88. }
  89. ULONG STDMETHODCALLTYPE Release()
  90. {
  91. if (0 == --m_dwRefCount)
  92. {
  93. delete this;
  94. return 0;
  95. }
  96. return m_dwRefCount;
  97. }
  98. };
  99. class CustomConnctionMnrEvents : IMbnConnectionManagerEvents
  100. {
  101. private:
  102. DWORD m_dwRefCount;
  103. CMbnImplHelper* m_pHelper;
  104. public:
  105. CustomConnctionMnrEvents(CMbnImplHelper* helper): m_dwRefCount(0), m_pHelper(helper){}
  106. HRESULT STDMETHODCALLTYPE OnConnectionArrival(IMbnConnection *newConnection);
  107. HRESULT STDMETHODCALLTYPE OnConnectionRemoval(IMbnConnection *oldConnection);
  108. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
  109. {
  110. if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IMbnConnectionManagerEvents))
  111. {
  112. *ppvObject = static_cast<IMbnConnectionManagerEvents*>(this);
  113. AddRef();
  114. return S_OK;
  115. }
  116. return E_NOINTERFACE;
  117. }
  118. ULONG STDMETHODCALLTYPE AddRef()
  119. {
  120. return ++m_dwRefCount;
  121. }
  122. ULONG STDMETHODCALLTYPE Release()
  123. {
  124. if (0 == --m_dwRefCount)
  125. {
  126. delete this;
  127. return 0;
  128. }
  129. return m_dwRefCount;
  130. }
  131. };
  132. class CustomConnectionProfileManagerEvents : IMbnConnectionProfileManagerEvents {
  133. private:
  134. DWORD m_dwRefCount;
  135. CMbnImplHelper* m_pHelper;
  136. public:
  137. CustomConnectionProfileManagerEvents(CMbnImplHelper* helper): m_dwRefCount(0), m_pHelper(helper){}
  138. HRESULT STDMETHODCALLTYPE OnConnectionProfileArrival(
  139. IMbnConnectionProfile *newConnectionProfile
  140. );
  141. HRESULT STDMETHODCALLTYPE OnConnectionProfileRemoval(
  142. IMbnConnectionProfile *oldConnectionProfile
  143. );
  144. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
  145. {
  146. if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IMbnConnectionProfileManagerEvents))
  147. {
  148. *ppvObject = static_cast<IMbnConnectionProfileManagerEvents*>(this);
  149. AddRef();
  150. return S_OK;
  151. }
  152. return E_NOINTERFACE;
  153. }
  154. ULONG STDMETHODCALLTYPE AddRef()
  155. {
  156. return ++m_dwRefCount;
  157. }
  158. ULONG STDMETHODCALLTYPE Release()
  159. {
  160. if (0 == --m_dwRefCount)
  161. {
  162. delete this;
  163. return 0;
  164. }
  165. return m_dwRefCount;
  166. }
  167. };
  168. class CustomConnectionProfileEvents : IMbnConnectionProfileEvents {
  169. private:
  170. DWORD m_dwRefCount;
  171. CMbnImplHelper* m_pHelper;
  172. public:
  173. CustomConnectionProfileEvents(CMbnImplHelper* helper): m_dwRefCount(0), m_pHelper(helper){}
  174. HRESULT STDMETHODCALLTYPE OnProfileUpdate(
  175. IMbnConnectionProfile *newProfile
  176. );
  177. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
  178. {
  179. if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IMbnConnectionProfileEvents))
  180. {
  181. *ppvObject = static_cast<IMbnConnectionProfileEvents*>(this);
  182. AddRef();
  183. return S_OK;
  184. }
  185. return E_NOINTERFACE;
  186. }
  187. ULONG STDMETHODCALLTYPE AddRef()
  188. {
  189. return ++m_dwRefCount;
  190. }
  191. ULONG STDMETHODCALLTYPE Release()
  192. {
  193. if (0 == --m_dwRefCount)
  194. {
  195. delete this;
  196. return 0;
  197. }
  198. return m_dwRefCount;
  199. }
  200. };
  201. class CMbnImplHelper
  202. {
  203. friend class CMobileDialFSM;
  204. private:
  205. CMobileDialFSM* m_pFSM;
  206. HRESULT m_hrConInit;
  207. //ATL::CComPtr<IMbnInterface> m_pCurInterface;
  208. ATL::CComPtr<IMbnInterface> m_pTmpInterface;
  209. CustomConnectionEvents* m_cntEvent;
  210. CustomSignalEvents* m_signalEvent;
  211. CustomConnctionMnrEvents* m_cntMnrEvent;
  212. CustomConnectionProfileManagerEvents* m_cntPfMnrEvent;
  213. CustomConnectionProfileEvents* m_cntPfEvent;
  214. BOOL m_bSignalEventInitied;
  215. BOOL m_bCntEventInitied;
  216. BOOL m_bCntMnrEventInitied;
  217. BOOL m_bCntPfMnrEventInited;
  218. BOOL m_bCntPfEventInited;
  219. IConnectionPoint* m_pCntPointForSignal;
  220. IConnectionPoint* m_pCntPointForCntEvent;
  221. IConnectionPoint* m_pCntPointForCntMnrEvent;
  222. IConnectionPoint* m_pCntPointForCntProfileMnrEvent;
  223. IConnectionPoint* m_pCntPointForProfileEvent;
  224. IConnectionPointContainer* m_pContainer, *m_pContainer2;
  225. DWORD m_dwCkCnt, m_dwCkSignal, m_dwCkCntMnr, m_dwCkCntPfMnr, m_dwCkPf;
  226. MBN_ACTIVATION_STATE m_cntState;
  227. MOBILEDIAL_CONNECTION_STATE m_curState;
  228. MOBILEDIAL_CONNECTION_STATE m_tmpState;
  229. CSimpleStringA m_csXmlData;
  230. CSimpleStringA m_csProfileName;
  231. CSimpleStringA m_interfaceID;
  232. //Set value valid in two way:
  233. //1. listen from Event
  234. //2. Invoke Connect routine and returned suc.
  235. //it cannot programmatic disconnect if the value is invalid(-1)
  236. //[Josephus in 16:33:04 2016/5/26]
  237. ULONG m_ulRequestID;
  238. ULONG m_ulTempID;
  239. int m_nSignalVal;
  240. BOOL m_bSelected;
  241. int m_nWhichGnrt;
  242. DWORD m_dwErroCode;
  243. CSimpleStringA m_csTmpProfileName;
  244. BOOL m_bDialFromDialog;
  245. BOOL m_bHasProfile;
  246. public:
  247. CMbnImplHelper(CMobileDialFSM* fsm): m_pFSM(fsm), m_hrConInit(S_FALSE),
  248. /*m_pCurInterface(NULL),*/m_pTmpInterface(NULL),
  249. m_signalEvent(NULL),
  250. m_cntEvent(NULL),
  251. m_cntMnrEvent(NULL),
  252. m_cntPfMnrEvent(NULL),
  253. m_cntPfEvent(NULL),
  254. m_bSignalEventInitied(FALSE),
  255. m_bCntEventInitied(FALSE),
  256. m_bCntMnrEventInitied(FALSE),
  257. m_bCntPfMnrEventInited(FALSE),
  258. m_bCntPfEventInited(FALSE),
  259. m_pCntPointForSignal(NULL),
  260. m_pCntPointForCntEvent(NULL),
  261. m_pCntPointForCntMnrEvent(NULL),
  262. m_pCntPointForProfileEvent(NULL),
  263. m_pContainer(NULL),
  264. m_pContainer2(NULL),
  265. m_dwCkCnt(0), m_dwCkSignal(0), m_dwCkCntMnr(0), m_dwCkCntPfMnr(0), m_dwCkPf(0),
  266. m_cntState(MBN_ACTIVATION_STATE_NONE),
  267. m_curState(MBD_NO_MOBILEDONGLE),
  268. m_csProfileName(true),
  269. m_interfaceID(""),
  270. m_ulRequestID(-1),
  271. m_ulTempID(-1),
  272. m_nSignalVal(0),
  273. m_bSelected(FALSE),
  274. m_nWhichGnrt(0),
  275. m_dwErroCode(0),
  276. m_csTmpProfileName(true),
  277. m_bDialFromDialog(FALSE),
  278. m_bHasProfile(FALSE)
  279. {
  280. m_hrConInit = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  281. if(FAILED(m_hrConInit))
  282. {
  283. if(m_hrConInit != RPC_E_CHANGED_MODE)
  284. {
  285. Dbg("*** ERROR: Failed to ConInitializeEx with code 0x%08x", m_hrConInit);
  286. }
  287. else
  288. {
  289. Dbg("*** Warning: A previous call to CoInitializeEx specified the concurrency model for this thread as MTA.");
  290. }
  291. }
  292. m_signalEvent = new CustomSignalEvents(this);
  293. m_cntEvent = new CustomConnectionEvents(this);
  294. m_cntMnrEvent = new CustomConnctionMnrEvents(this);
  295. m_cntPfMnrEvent = new CustomConnectionProfileManagerEvents(this);
  296. m_cntPfEvent = new CustomConnectionProfileEvents(this);
  297. }
  298. ~CMbnImplHelper()
  299. {
  300. LOG_FUNCTION();
  301. SAFE_RELEASE(m_pContainer);
  302. SAFE_RELEASE(m_pContainer);
  303. SAFE_RELEASE(m_pContainer);
  304. SAFE_RELEASE(m_pContainer);
  305. SAFE_RELEASE(m_pContainer);
  306. SAFE_RELEASE(m_signalEvent);
  307. SAFE_RELEASE(m_cntMnrEvent);
  308. SAFE_RELEASE(m_cntEvent);
  309. SAFE_RELEASE(m_cntPfMnrEvent);
  310. SAFE_RELEASE(m_cntPfEvent);
  311. if(m_hrConInit != S_FALSE && SUCCEEDED(m_hrConInit))
  312. {
  313. Dbg("Perform CoUninitialize...");
  314. CoUninitialize();
  315. }
  316. }
  317. // bUpdateOnly : TRUE:只是更新网卡列表, FALSE:选取当前网卡,兼容旧接口
  318. // >0 如果当前未存储接口值,则将找到的第一个进行赋予
  319. // =0 无设备
  320. // <0 也有可能是无设备造成的错误,或者是有设备但是打不开接口
  321. int EnumerateInterfaces(BOOL bUpdateOnly = FALSE);
  322. //Store in m_pTmpInterface if returned true.
  323. BOOL GetInterface(LPCTSTR interfaceID);
  324. ATL::CComPtr<IMbnInterface> GetInterfaceEx(LPCTSTR interfaceID);
  325. BOOL SetCurInterface(LPCTSTR interfaceID);
  326. BOOL IsValidInterface(LPCTSTR interfaceID);
  327. BOOL GetInterfaceInfo(LPCTSTR interfaceID, pMbnDongleSubInfo pSubInfo);
  328. BOOL CheckAndRefleshCurInterface();
  329. BOOL AdviseSignalEvent();
  330. BOOL AdviseCntMnrEvent();
  331. BOOL AdviseConnectEvent();
  332. BOOL AdviseCntProfileMnrEvent();
  333. BOOL AdviseCntProfileEvent();
  334. BOOL UnAdviseCustomEvents();
  335. BOOL GetConnectState();
  336. // 0: 表示无网卡; 1: 错误 2: 稍后查询; 3: 3G; 4: 4G;
  337. int GetGeneration(ATL::CComPtr<IMbnInterface> pInterface);
  338. BOOL GetConnectState(ATL::CComPtr<IMbnInterface> pInterface, MBN_ACTIVATION_STATE& state);
  339. // 仅获取网络信号
  340. BOOL GetSignalValue(ATL::CComPtr<IMbnInterface> pInterface, ULONG& ulSignalStrength);
  341. BOOL SearchForProfileName(ptMbnDongleInfo pInfo = NULL);
  342. BOOL Connect();
  343. BOOL DisConnect(BOOL bManual = FALSE, LPCTSTR lpszInterface = "");
  344. ULONG ConnectEx2(LPCTSTR lpcszInterface, LPCTSTR lpcszProfileName);
  345. BOOL ConnectEx(LPCTSTR lpcszInterface, LPCTSTR lpcszProfileName);
  346. BOOL DisConnectEx(LPCTSTR lpcszInterface);
  347. MOBILEDIAL_CONNECTION_STATE GetCurState() {
  348. return m_curState;
  349. }
  350. void SetInteralError(LRESULT result) {
  351. SetMBNCode(result);
  352. SetTmpState(MBD_INTERNAL_ERROR);
  353. }
  354. void SetStatusFromTmp2Main() {
  355. SetCurState(m_tmpState);
  356. }
  357. BOOL GetInterfaceID(CSimpleStringA& csItfID)
  358. {
  359. if(m_bSelected){
  360. csItfID = m_interfaceID;
  361. }
  362. return m_bSelected;
  363. }
  364. void SetSignalVal(int val, ULONG ulOrigin)
  365. {
  366. m_pFSM->TellDlgTheResult(Error_Succeed, WM_SIGNAL_CHANGE, ulOrigin);
  367. if(m_nSignalVal != val) {
  368. m_nSignalVal = val;
  369. FSMEvent* signalEvent = new FSMEvent(USER_EVT_SIGNAL);
  370. signalEvent->param1 = val;
  371. m_pFSM->PostEventFIFO(signalEvent);
  372. }
  373. }
  374. int GetGenerationVal() {
  375. return m_nWhichGnrt;
  376. }
  377. void ClearCurInterface() {
  378. m_bSelected = FALSE;
  379. m_interfaceID = "";
  380. m_nWhichGnrt = 0;
  381. SetCurState(MBD_NO_MOBILEDONGLE);
  382. }
  383. BOOL HasAnyProfile() const {
  384. return m_bHasProfile;
  385. }
  386. //For MBD_INTERNAL_ERROR error-type.
  387. void SetMBNCode(DWORD dwVal) {m_dwErroCode = dwVal;}
  388. DWORD GetMBNCode() {return m_dwErroCode;}
  389. void OnConnectComplete(ULONG requestID, LPCTSTR newInterface, HRESULT status);
  390. void OnDisconnectComplete(ULONG requestID, LPCTSTR newInterface);
  391. void OnConnectStateChange(HRESULT hr, MBN_ACTIVATION_STATE state, LPCTSTR newInterface);
  392. void OnConnectionArrival(LPCTSTR newInterface);
  393. void OnConnectionRemoval(LPCTSTR newInterface);
  394. void OnConnectionProfileRemoval(IMbnConnectionProfile *oldConnectionProfile);
  395. void OnConnectionProfileArrival(IMbnConnectionProfile *newConnectionProfile);
  396. void OnProfileUpdate(IMbnConnectionProfile *newProfile);
  397. BOOL IsTheDealProfileEvents(IMbnConnectionProfile *profile, BOOL bSucc);
  398. ErrorCodeEnum AddProfile(const CSimpleStringA& csInterfaceID, const AccessKeyInfo& newInfo, bool fApplyNow);
  399. ErrorCodeEnum UpdateProfile(const CSimpleStringA& csInterfaceID, LPCTSTR lpszProfileName, const AccessKeyInfo& newInfo, bool fApplyNow);
  400. ErrorCodeEnum DeleteProfile(const CSimpleStringA& csInterfaceID, LPCTSTR lpszProfileName);
  401. ErrorCodeEnum DealWithProfile(const CSimpleStringA& csInterfaceID, LPCTSTR lpszProfileName, BOOL bDelete, const CSimpleStringW& csUpdateCtx);
  402. void SetRequestID(ULONG requestID = (ULONG)-1) {
  403. m_ulRequestID = requestID;
  404. m_pFSM->StorePersistentRequetsId(m_ulRequestID);
  405. }
  406. private:
  407. // m_tmpState store the error status when return FALSE
  408. BOOL _IsValidInterface(ATL::CComPtr<IMbnInterface> pInterface);
  409. void SetCurState(MOBILEDIAL_CONNECTION_STATE newState)
  410. {
  411. //if(newState != m_curState && m_pFSM->GetCurrState()->id == CMobileDialFSM::s3) {
  412. // FSMEvent* fsmEvent = new FSMEvent(USER_EVT_STATUSCHANGE);
  413. // fsmEvent->param1 = newState;
  414. // m_pFSM->PostEventLIFO(fsmEvent);
  415. //}
  416. m_curState = newState;
  417. }
  418. void SetTmpState(MOBILEDIAL_CONNECTION_STATE newState) {
  419. m_tmpState = newState;
  420. }
  421. ErrorCodeEnum _CreateProfile(const CSimpleStringA& csInterfaceID,
  422. const AccessKeyInfo& newInfo, bool fApplyNow, bool bUpdate, CSimpleStringW& csContent);
  423. };
  424. #endif