Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

889 lines
21 KiB

  1. /////////////////////////////////////////////////////////////////////////////
  2. //
  3. // RAS API wrappers for wide/ansi
  4. //
  5. // Works on all NT platforms correctly, maintaining unicode
  6. // whenever possible.
  7. //
  8. /////////////////////////////////////////////////////////////////////////////
  9. #include "wininetp.h"
  10. #include "rashelp.h"
  11. #include "autodial.h"
  12. /////////////////////////////////////////////////////////////////////////////
  13. /////////////////////////////////////////////////////////////////////////////
  14. ENUM_TYPE GetOSVersion::_EnumType = ENUM_NONE;
  15. GetOSVersion::GetOSVersion()
  16. {
  17. if(_EnumType == ENUM_NONE)
  18. {
  19. if(0 == GlobalPlatformType)
  20. GlobalPlatformType = PlatformType(&GlobalPlatformVersion5);
  21. INET_ASSERT(PLATFORM_TYPE_WINNT == GlobalPlatformType);
  22. if(TRUE == GlobalPlatformVersion5)
  23. _EnumType = ENUM_WIN2K;
  24. else
  25. _EnumType = ENUM_UNICODE;
  26. }
  27. }
  28. GetOSVersion::~GetOSVersion()
  29. {
  30. }
  31. /////////////////////////////////////////////////////////////////////////////
  32. /////////////////////////////////////////////////////////////////////////////
  33. RasEnumHelp::RasEnumHelp()
  34. {
  35. DWORD dwBufSize, dwStructSize = 0;
  36. // init
  37. _dwEntries = 0;
  38. _dwLastError = 0;
  39. switch(_EnumType)
  40. {
  41. case ENUM_UNICODE:
  42. dwStructSize = sizeof(RASENTRYNAMEW);
  43. break;
  44. case ENUM_WIN2K:
  45. dwStructSize = sizeof(W2KRASENTRYNAMEW);
  46. break;
  47. }
  48. // allocate space for 16 entries
  49. dwBufSize = 16 * dwStructSize;
  50. _preList = (LPRASENTRYNAMEA)LocalAlloc(LPTR, dwBufSize);
  51. if(_preList)
  52. {
  53. do
  54. {
  55. // set up list
  56. _preList[0].dwSize = dwStructSize;
  57. // call ras to enumerate
  58. _dwLastError = ERROR_UNKNOWN;
  59. _dwLastError = _RasEnumEntriesW(
  60. NULL,
  61. NULL,
  62. (LPRASENTRYNAMEW)_preList,
  63. &dwBufSize,
  64. &_dwEntries
  65. );
  66. // reallocate buffer if necessary
  67. if(ERROR_BUFFER_TOO_SMALL == _dwLastError)
  68. {
  69. LocalFree(_preList);
  70. _preList = (LPRASENTRYNAMEA)LocalAlloc(LPTR, dwBufSize);
  71. if(NULL == _preList)
  72. {
  73. _dwLastError = ERROR_NOT_ENOUGH_MEMORY;
  74. break;
  75. }
  76. }
  77. else
  78. {
  79. break;
  80. }
  81. } while(TRUE);
  82. }
  83. else
  84. {
  85. _dwLastError = ERROR_NOT_ENOUGH_MEMORY;
  86. }
  87. if(_preList && (ERROR_SUCCESS != _dwLastError))
  88. {
  89. LocalFree(_preList);
  90. _preList = NULL;
  91. _dwEntries = 0;
  92. }
  93. return;
  94. }
  95. RasEnumHelp::~RasEnumHelp()
  96. {
  97. if(_preList)
  98. {
  99. LocalFree(_preList);
  100. }
  101. }
  102. DWORD
  103. RasEnumHelp::GetError()
  104. {
  105. return _dwLastError;
  106. }
  107. DWORD
  108. RasEnumHelp::GetEntryCount()
  109. {
  110. return _dwEntries;
  111. }
  112. LPWSTR
  113. RasEnumHelp::GetEntryW(DWORD dwConnectionNum)
  114. {
  115. LPWSTR pwszName = NULL;
  116. if(dwConnectionNum >= _dwEntries)
  117. {
  118. return NULL;
  119. }
  120. switch(_EnumType)
  121. {
  122. case ENUM_UNICODE:
  123. {
  124. LPRASENTRYNAMEW lpTemp = (LPRASENTRYNAMEW)_preList;
  125. if(*lpTemp[dwConnectionNum].szEntryName)
  126. pwszName = lpTemp[dwConnectionNum].szEntryName;
  127. break;
  128. }
  129. case ENUM_WIN2K:
  130. {
  131. LPW2KRASENTRYNAMEW lpTemp = (LPW2KRASENTRYNAMEW)_preList;
  132. if(*lpTemp[dwConnectionNum].szEntryName)
  133. pwszName = lpTemp[dwConnectionNum].szEntryName;
  134. break;
  135. }
  136. }
  137. return pwszName;
  138. }
  139. LPSTR
  140. RasEnumHelp::GetEntryA(DWORD dwConnectionNum)
  141. {
  142. LPSTR pszName = NULL;
  143. if(dwConnectionNum >= _dwEntries)
  144. {
  145. return NULL;
  146. }
  147. switch(_EnumType)
  148. {
  149. case ENUM_UNICODE:
  150. {
  151. LPRASENTRYNAMEW lpTemp = (LPRASENTRYNAMEW)_preList;
  152. if(*lpTemp[dwConnectionNum].szEntryName)
  153. {
  154. WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1,
  155. _szCurrentEntryA, RAS_MaxEntryName + 1, NULL, NULL);
  156. pszName = _szCurrentEntryA;
  157. }
  158. break;
  159. }
  160. case ENUM_WIN2K:
  161. {
  162. LPW2KRASENTRYNAMEW lpTemp = (LPW2KRASENTRYNAMEW)_preList;
  163. if(*lpTemp[dwConnectionNum].szEntryName)
  164. {
  165. WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1,
  166. _szCurrentEntryA, RAS_MaxEntryName + 1, NULL, NULL);
  167. pszName = _szCurrentEntryA;
  168. }
  169. break;
  170. }
  171. }
  172. return pszName;
  173. }
  174. /////////////////////////////////////////////////////////////////////////////
  175. //
  176. // RasEnumConnHelp
  177. //
  178. /////////////////////////////////////////////////////////////////////////////
  179. RasEnumConnHelp::RasEnumConnHelp()
  180. {
  181. DWORD dwBufSize;
  182. // init
  183. _dwConnections = 0;
  184. _dwLastError = 0;
  185. switch(_EnumType)
  186. {
  187. case ENUM_UNICODE:
  188. _dwStructSize = sizeof(RASCONNW);
  189. break;
  190. case ENUM_WIN2K:
  191. _dwStructSize = sizeof(W2KRASCONNW);
  192. break;
  193. }
  194. // allocate space for MAX_CONNECTION entries
  195. dwBufSize = MAX_CONNECTION * _dwStructSize;
  196. _pRasCon = (LPRASCONNA)LocalAlloc(LPTR, dwBufSize);
  197. if(_pRasCon == NULL)
  198. {
  199. _dwLastError = ERROR_NOT_ENOUGH_MEMORY;
  200. }
  201. return;
  202. }
  203. RasEnumConnHelp::~RasEnumConnHelp()
  204. {
  205. if(_pRasCon)
  206. {
  207. LocalFree(_pRasCon);
  208. _pRasCon = NULL;
  209. }
  210. }
  211. DWORD RasEnumConnHelp::Enum()
  212. {
  213. DWORD dwBufSize;
  214. _dwLastError = 0;
  215. if(_pRasCon)
  216. {
  217. dwBufSize = MAX_CONNECTION * _dwStructSize;
  218. do
  219. {
  220. // set up list
  221. _pRasCon[0].dwSize = _dwStructSize;
  222. // call ras to enumerate
  223. _dwLastError = ERROR_UNKNOWN;
  224. switch(_EnumType)
  225. {
  226. case ENUM_UNICODE:
  227. case ENUM_WIN2K:
  228. _dwLastError = _RasEnumConnectionsW((LPRASCONNW)_pRasCon, &dwBufSize, &_dwConnections);
  229. break;
  230. }
  231. // reallocate buffer if necessary
  232. if(ERROR_BUFFER_TOO_SMALL == _dwLastError)
  233. {
  234. LocalFree(_pRasCon);
  235. _pRasCon = (LPRASCONNA)LocalAlloc(LPTR, dwBufSize);
  236. if(NULL == _pRasCon)
  237. {
  238. _dwLastError = ERROR_NOT_ENOUGH_MEMORY;
  239. break;
  240. }
  241. }
  242. else
  243. {
  244. break;
  245. }
  246. } while(TRUE);
  247. }
  248. else
  249. {
  250. _dwLastError = ERROR_NOT_ENOUGH_MEMORY;
  251. }
  252. return _dwLastError;
  253. }
  254. DWORD
  255. RasEnumConnHelp::GetError()
  256. {
  257. return _dwLastError;
  258. }
  259. DWORD
  260. RasEnumConnHelp::GetConnectionsCount()
  261. {
  262. return _dwConnections;
  263. }
  264. LPWSTR
  265. RasEnumConnHelp::GetEntryW(DWORD dwConnectionNum)
  266. {
  267. LPWSTR pwszName = NULL;
  268. if((_pRasCon == NULL) || (dwConnectionNum >= _dwConnections))
  269. {
  270. return NULL;
  271. }
  272. switch(_EnumType)
  273. {
  274. case ENUM_UNICODE:
  275. {
  276. LPRASCONNW lpTemp = (LPRASCONNW)_pRasCon;
  277. if(*lpTemp[dwConnectionNum].szEntryName)
  278. pwszName = lpTemp[dwConnectionNum].szEntryName;
  279. break;
  280. }
  281. case ENUM_WIN2K:
  282. {
  283. LPW2KRASCONNW lpTemp = (LPW2KRASCONNW)_pRasCon;
  284. if(*lpTemp[dwConnectionNum].szEntryName)
  285. pwszName = lpTemp[dwConnectionNum].szEntryName;
  286. break;
  287. }
  288. }
  289. return pwszName;
  290. }
  291. LPSTR
  292. RasEnumConnHelp::GetEntryA(DWORD dwConnectionNum)
  293. {
  294. LPSTR pszName = NULL;
  295. if((_pRasCon == NULL) || (dwConnectionNum >= _dwConnections))
  296. {
  297. return NULL;
  298. }
  299. switch(_EnumType)
  300. {
  301. case ENUM_UNICODE:
  302. {
  303. LPRASCONNW lpTemp = (LPRASCONNW)_pRasCon;
  304. if(*lpTemp[dwConnectionNum].szEntryName)
  305. {
  306. WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1, _szEntryNameA, RAS_MaxEntryName + 1, NULL, NULL);
  307. pszName = _szEntryNameA;
  308. }
  309. break;
  310. }
  311. case ENUM_WIN2K:
  312. {
  313. LPW2KRASCONNW lpTemp = (LPW2KRASCONNW )_pRasCon;
  314. if(*lpTemp[dwConnectionNum].szEntryName)
  315. {
  316. WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1, _szEntryNameA, RAS_MaxEntryName + 1, NULL, NULL);
  317. pszName = _szEntryNameA;
  318. }
  319. break;
  320. }
  321. }
  322. return pszName;
  323. }
  324. LPWSTR
  325. RasEnumConnHelp::GetLastEntryW(DWORD dwConnectionNum)
  326. {
  327. UNREFERENCED_PARAMETER(dwConnectionNum);
  328. if(_pRasCon == NULL)
  329. return NULL;
  330. return _szEntryNameW;
  331. }
  332. LPSTR
  333. RasEnumConnHelp::GetLastEntryA(DWORD dwConnectionNum)
  334. {
  335. UNREFERENCED_PARAMETER(dwConnectionNum);
  336. if(_pRasCon == NULL)
  337. return NULL;
  338. return _szEntryNameA;
  339. }
  340. HRASCONN
  341. RasEnumConnHelp::GetHandle(DWORD dwConnectionNum)
  342. {
  343. HRASCONN hTemp = NULL;
  344. if((_pRasCon == NULL) || (dwConnectionNum >= _dwConnections))
  345. {
  346. return NULL;
  347. }
  348. switch(_EnumType)
  349. {
  350. case ENUM_UNICODE:
  351. {
  352. LPRASCONNW lpTemp = (LPRASCONNW)_pRasCon;
  353. hTemp = lpTemp[dwConnectionNum].hrasconn;
  354. break;
  355. }
  356. case ENUM_WIN2K:
  357. {
  358. LPW2KRASCONNW lpTemp = (LPW2KRASCONNW)_pRasCon;
  359. hTemp = lpTemp[dwConnectionNum].hrasconn;
  360. break;
  361. }
  362. }
  363. return hTemp;
  364. }
  365. /////////////////////////////////////////////////////////////////////////////
  366. //
  367. // RasEntryPropHelp
  368. //
  369. /////////////////////////////////////////////////////////////////////////////
  370. RasEntryPropHelp::RasEntryPropHelp()
  371. {
  372. // init
  373. _dwLastError = 0;
  374. switch(_EnumType)
  375. {
  376. case ENUM_UNICODE:
  377. _dwStructSize = sizeof(RASENTRYW);
  378. break;
  379. case ENUM_WIN2K:
  380. _dwStructSize = sizeof(W2KRASENTRYW);
  381. break;
  382. }
  383. _pRasEntry = (LPRASENTRYA)LocalAlloc(LPTR, _dwStructSize * 2);
  384. if(_pRasEntry)
  385. {
  386. _pRasEntry->dwSize = _dwStructSize;
  387. }
  388. else
  389. {
  390. _dwLastError = ERROR_NOT_ENOUGH_MEMORY;
  391. }
  392. if(_pRasEntry && (ERROR_SUCCESS != _dwLastError))
  393. {
  394. LocalFree(_pRasEntry);
  395. _pRasEntry = NULL;
  396. }
  397. return;
  398. }
  399. RasEntryPropHelp::~RasEntryPropHelp()
  400. {
  401. if(_pRasEntry)
  402. {
  403. LocalFree(_pRasEntry);
  404. _pRasEntry = NULL;
  405. }
  406. }
  407. DWORD RasEntryPropHelp::GetError()
  408. {
  409. return _dwLastError;
  410. }
  411. DWORD RasEntryPropHelp::GetA(LPSTR lpszEntryName)
  412. {
  413. DWORD dwSize = _dwStructSize * 2;
  414. switch(_EnumType)
  415. {
  416. case ENUM_UNICODE:
  417. {
  418. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  419. MultiByteToWideChar(CP_ACP, 0, lpszEntryName, -1, _szEntryNameW, RAS_MaxEntryName + 1 );
  420. _dwLastError = _RasGetEntryPropertiesW(NULL, _szEntryNameW, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
  421. break;
  422. }
  423. case ENUM_WIN2K:
  424. {
  425. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  426. MultiByteToWideChar(CP_ACP, 0, lpszEntryName, -1, _szEntryNameW, RAS_MaxEntryName + 1);
  427. _dwLastError = _RasGetEntryPropertiesW(NULL, _szEntryNameW, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
  428. break;
  429. }
  430. }
  431. return(_dwLastError);
  432. }
  433. DWORD RasEntryPropHelp::GetW(LPWSTR lpszEntryName)
  434. {
  435. DWORD dwSize = _dwStructSize * 2;
  436. switch(_EnumType)
  437. {
  438. case ENUM_UNICODE:
  439. {
  440. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  441. _dwLastError = _RasGetEntryPropertiesW(NULL, lpszEntryName, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
  442. break;
  443. }
  444. case ENUM_WIN2K:
  445. {
  446. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  447. _dwLastError = _RasGetEntryPropertiesW(NULL, lpszEntryName, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
  448. break;
  449. }
  450. }
  451. return(_dwLastError);
  452. }
  453. LPWSTR RasEntryPropHelp::GetDeviceTypeW(VOID)
  454. {
  455. LPWSTR lpwstr = NULL;
  456. if(_pRasEntry)
  457. {
  458. switch(_EnumType)
  459. {
  460. case ENUM_UNICODE:
  461. {
  462. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  463. if(*lpTemp->szDeviceType)
  464. lpwstr = lpTemp->szDeviceType;
  465. break;
  466. }
  467. case ENUM_WIN2K:
  468. {
  469. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  470. if(*lpTemp->szDeviceType)
  471. lpwstr = lpTemp->szDeviceType;
  472. break;
  473. }
  474. }
  475. }
  476. return lpwstr;
  477. }
  478. LPSTR RasEntryPropHelp::GetDeviceTypeA(VOID)
  479. {
  480. LPSTR lpstr = NULL;
  481. if(_pRasEntry)
  482. {
  483. switch(_EnumType)
  484. {
  485. case ENUM_UNICODE:
  486. {
  487. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  488. if(*lpTemp->szDeviceType)
  489. {
  490. WideCharToMultiByte(CP_ACP, 0, lpTemp->szDeviceType, -1, _szDeviceTypeA, RAS_MaxDeviceType + 1, NULL, NULL);
  491. lpstr = _szDeviceTypeA;
  492. }
  493. break;
  494. }
  495. case ENUM_WIN2K:
  496. {
  497. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  498. if(*lpTemp->szDeviceType)
  499. {
  500. WideCharToMultiByte(CP_ACP, 0, lpTemp->szDeviceType, -1, _szDeviceTypeA, RAS_MaxDeviceType + 1, NULL, NULL);
  501. lpstr = _szDeviceTypeA;
  502. }
  503. break;
  504. }
  505. }
  506. }
  507. return lpstr;
  508. }
  509. LPWSTR RasEntryPropHelp::GetAutodiallDllW()
  510. {
  511. LPWSTR lpwstr = NULL;
  512. if(_pRasEntry)
  513. {
  514. switch(_EnumType)
  515. {
  516. case ENUM_UNICODE:
  517. {
  518. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  519. if(*lpTemp->szAutodialDll)
  520. lpwstr = lpTemp->szAutodialDll;
  521. break;
  522. }
  523. case ENUM_WIN2K:
  524. {
  525. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  526. if(*lpTemp->szAutodialDll)
  527. lpwstr = lpTemp->szAutodialDll;
  528. break;
  529. }
  530. }
  531. }
  532. return lpwstr;
  533. }
  534. LPSTR RasEntryPropHelp::GetAutodiallDllA()
  535. {
  536. LPSTR lpstr = NULL;
  537. if(_pRasEntry)
  538. {
  539. switch(_EnumType)
  540. {
  541. case ENUM_UNICODE:
  542. {
  543. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  544. if(*lpTemp->szAutodialDll)
  545. {
  546. WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialDll, -1, _szAutodialDllA, MAX_PATH, NULL, NULL);
  547. lpstr = _szAutodialDllA;
  548. }
  549. break;
  550. }
  551. case ENUM_WIN2K:
  552. {
  553. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  554. if(*lpTemp->szAutodialDll)
  555. {
  556. WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialDll, -1, _szAutodialDllA, MAX_PATH, NULL, NULL);
  557. lpstr = _szAutodialDllA;
  558. }
  559. break;
  560. }
  561. }
  562. }
  563. return lpstr;
  564. }
  565. LPWSTR RasEntryPropHelp::GetAutodialFuncW()
  566. {
  567. LPWSTR lpwstr = NULL;
  568. if(_pRasEntry)
  569. {
  570. switch(_EnumType)
  571. {
  572. case ENUM_UNICODE:
  573. {
  574. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  575. if(*lpTemp->szAutodialFunc)
  576. lpwstr = lpTemp->szAutodialFunc;
  577. break;
  578. }
  579. case ENUM_WIN2K:
  580. {
  581. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  582. if(*lpTemp->szAutodialFunc)
  583. lpwstr = lpTemp->szAutodialFunc;
  584. break;
  585. }
  586. }
  587. }
  588. return lpwstr;
  589. }
  590. LPSTR RasEntryPropHelp::GetAutodialFuncA()
  591. {
  592. LPSTR lpstr = NULL;
  593. if(_pRasEntry)
  594. {
  595. switch(_EnumType)
  596. {
  597. case ENUM_UNICODE:
  598. {
  599. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  600. if(*lpTemp->szAutodialFunc)
  601. {
  602. WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialFunc, -1, _szAutodialFuncA, RAS_MaxDeviceType + 1, NULL, NULL);
  603. lpstr = _szAutodialFuncA;
  604. }
  605. break;
  606. }
  607. case ENUM_WIN2K:
  608. {
  609. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  610. if(*lpTemp->szAutodialFunc)
  611. {
  612. WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialFunc, -1, _szAutodialFuncA, RAS_MaxDeviceType + 1, NULL, NULL);
  613. lpstr = _szAutodialFuncA;
  614. }
  615. break;
  616. }
  617. }
  618. }
  619. return lpstr;
  620. }
  621. LPWSTR RasEntryPropHelp::GetCustomDialDllW()
  622. {
  623. LPWSTR lpwstr = NULL;
  624. if(_pRasEntry)
  625. {
  626. switch(_EnumType)
  627. {
  628. case ENUM_UNICODE: // Not is NT4
  629. break;
  630. case ENUM_WIN2K:
  631. {
  632. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry ;
  633. if(*lpTemp->szCustomDialDll)
  634. lpwstr = lpTemp->szCustomDialDll;
  635. break;
  636. }
  637. }
  638. }
  639. return lpwstr;
  640. }
  641. LPWSTR RasEntryPropHelp::GetPhoneNumberW()
  642. {
  643. LPWSTR lpwstr = NULL;
  644. if(_pRasEntry)
  645. {
  646. switch(_EnumType)
  647. {
  648. case ENUM_UNICODE:
  649. {
  650. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  651. if(*lpTemp->szLocalPhoneNumber)
  652. lpwstr = lpTemp->szLocalPhoneNumber;
  653. break;
  654. }
  655. case ENUM_WIN2K:
  656. {
  657. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  658. if(*lpTemp->szLocalPhoneNumber)
  659. lpwstr = lpTemp->szLocalPhoneNumber;
  660. break;
  661. }
  662. }
  663. }
  664. return lpwstr;
  665. }
  666. DWORD RasEntryPropHelp::GetCountryCode()
  667. {
  668. DWORD dwCode = 0;
  669. if(_pRasEntry)
  670. {
  671. // country code is at the same place for all versions of the struct,
  672. // so take the shortcut
  673. dwCode = _pRasEntry->dwCountryCode;
  674. }
  675. return dwCode;
  676. }
  677. DWORD RasEntryPropHelp::GetOptions()
  678. {
  679. DWORD dwOptions = 0;
  680. if(_pRasEntry)
  681. {
  682. // dwfOptions is at the same place for all versions of the struct,
  683. // so take the shortcut
  684. dwOptions = _pRasEntry->dwfOptions;
  685. }
  686. return dwOptions;
  687. }
  688. LPWSTR RasEntryPropHelp::GetAreaCodeW()
  689. {
  690. LPWSTR lpwstr = NULL;
  691. if(_pRasEntry)
  692. {
  693. switch(_EnumType)
  694. {
  695. case ENUM_UNICODE:
  696. {
  697. LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
  698. if(*lpTemp->szAreaCode)
  699. lpwstr = lpTemp->szAreaCode;
  700. break;
  701. }
  702. case ENUM_WIN2K:
  703. {
  704. LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
  705. if(*lpTemp->szAreaCode)
  706. lpwstr = lpTemp->szAreaCode;
  707. break;
  708. }
  709. }
  710. }
  711. return lpwstr;
  712. }
  713. /////////////////////////////////////////////////////////////////////////////
  714. /////////////////////////////////////////////////////////////////////////////
  715. RasGetConnectStatusHelp::RasGetConnectStatusHelp(HRASCONN hrasconn)
  716. {
  717. // init
  718. _dwLastError = 0;
  719. switch(_EnumType)
  720. {
  721. case ENUM_UNICODE:
  722. case ENUM_WIN2K:
  723. _dwStructSize = sizeof(RASCONNSTATUSW);
  724. break;
  725. }
  726. _pRasConnStatus = (LPRASCONNSTATUSA)LocalAlloc(LPTR, _dwStructSize);
  727. if(_pRasConnStatus)
  728. {
  729. _pRasConnStatus->dwSize = _dwStructSize;
  730. _dwLastError = _RasGetConnectStatusW(hrasconn, (LPRASCONNSTATUSW)_pRasConnStatus);
  731. if(_pRasConnStatus && (ERROR_SUCCESS != _dwLastError))
  732. {
  733. LocalFree(_pRasConnStatus);
  734. _pRasConnStatus = NULL;
  735. }
  736. }
  737. else
  738. {
  739. _dwLastError = ERROR_NOT_ENOUGH_MEMORY;
  740. }
  741. return;
  742. }
  743. RasGetConnectStatusHelp::~RasGetConnectStatusHelp()
  744. {
  745. _dwLastError = 0;
  746. if(_pRasConnStatus)
  747. {
  748. LocalFree(_pRasConnStatus);
  749. _pRasConnStatus = NULL;
  750. }
  751. }
  752. DWORD RasGetConnectStatusHelp::GetError()
  753. {
  754. return _dwLastError;
  755. }
  756. RASCONNSTATE RasGetConnectStatusHelp::ConnState()
  757. {
  758. RASCONNSTATE hConnState = (RASCONNSTATE)NULL;
  759. if(_pRasConnStatus)
  760. {
  761. LPRASCONNSTATUSW lpTemp = (LPRASCONNSTATUSW)_pRasConnStatus;
  762. hConnState = lpTemp->rasconnstate;
  763. }
  764. return hConnState;
  765. }
  766. /////////////////////////////////////////////////////////////////////////////
  767. /////////////////////////////////////////////////////////////////////////////