MbnEventImpl.h 12 KB

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