TNB Library
TnbDialupManager.h
[詳解]
1#pragma once
17#include "TnbStrVector.h"
18#include "TnbStrEx.h"
19#include "TnbMap.h"
20#include "TnbThread.h"
21#include "TnbStaticMap.h"
22#include <Ras.h>
23#include <RasError.h>
24#ifndef _WIN32_WCE
25 #include "TnbRegistryAccessor.h"
26 #pragma comment(lib,"RasApi32.lib")
27 #if ( WINVER >= 0x500 )
28 #ifndef RASEAPINFO
29 #error
30 // WINVER 0x0500 以上の場合、VC6++ 付属の RAS.h は使用できません(バグ)
31 // SDK のRAS.h をインクルードするようにしてください。
32 //(オプション→ディレクトリで SDKのヘッダのほうが先になるようにする、など)。
33 #endif
34 #endif
35#endif
36
37
38
39//TNB Library
40namespace TNB
41{
42
43
44
46#define _DIALUP_TRACE(FUNC, VAL) \
47 if ( (VAL) != 0 ) { TRACE3("%s failed: Error %u[%s]\n", _T(#FUNC), VAL, GetErrorString(VAL)); }
48
49
50
68{
69public:
70
84 struct IListener
85 {
87 virtual ~IListener(void) {}
88
94 virtual void OnDialupError(DWORD dwError) = 0;
95
103 virtual void OnDialupChangeState(RASCONNSTATE eState) = 0;
104
105 private:
106 friend class CDialupManager;
107 };
108
109private:
110
111 CThread m_threadWatch;
112 IListener* m_piListener;
113 HRASCONN m_hRasConn;
114 CSyncSection m_syncFunc;
115 enum
116 {
117 E_ConnectCheckInterval = 100,
118 E_DisconnectCheckInterval = 500,
119 };
120
126 struct TRasConn
127 {
128 DWORD dwSize;
129 HRASCONN hRasConn;
130 TCHAR szEntryName[RAS_MaxEntryName + 1];
131 #ifndef _WIN32_WCE
132 TCHAR szDeviceType[RAS_MaxDeviceType + 1];
133 TCHAR szDeviceName[RAS_MaxDeviceName + 1];
134 TCHAR szPhonebook[MAX_PATH];
135 DWORD dwSubEntry;
136 #endif
141 operator LPRASCONN(){ return reinterpret_cast<LPRASCONN>(this); }
148 bool IsPhoneBookEqual(CStr& s) const
149 {
150 #ifndef _WIN32_WCE
151 return (s.IsEmpty() || STRLIB::Compare(szPhonebook, s) == 0);
152 #else
153 return s.IsEmpty();
154 #endif
155 }
156
157 };
158
160 typedef CVectorT<TRasConn> CRasConnVector;
161
166 static CRasConnVector ms_GetConnectingEnties(void)
167 {
168 CRasConnVector aRasConn;
169 CByteVector ba;
170 TRasConn* P = reinterpret_cast<TRasConn*>(ba.GetBuffer(sizeof(TRasConn)));
171 P->dwSize = sizeof(TRasConn);
172 DWORD dwBufferSize = sizeof(TRasConn);
173 DWORD dwEntries = 0;
174 DWORD dwRc = ::RasEnumConnections(*P, &dwBufferSize, &dwEntries);
175 if ( dwRc == ERROR_BUFFER_TOO_SMALL )
176 {
177 P = reinterpret_cast<TRasConn*>(ba.GetBuffer(dwBufferSize));
178 P->dwSize = sizeof(TRasConn);
179 dwRc = ::RasEnumConnections(*P, &dwBufferSize, &dwEntries);
180 }
181 if ( dwRc != ERROR_SUCCESS )
182 {
183 _DIALUP_TRACE(RasEnumConnections, dwRc);
184 aRasConn.Invalid();
185 return aRasConn;
186 }
187 else
188 {
189 loop ( i, dwEntries )
190 {
191 aRasConn.Add(P[i]);
192 }
193 }
194 return aRasConn;
195 }
196
198 typedef CMapT<HRASCONN, CDialupManager*> CHndThisMap;
199
204 void m_ClearHandleRasConn(void)
205 {
206 if ( m_hRasConn != NULL )
207 {
208 ms_ElementMap().RemoveKey(m_hRasConn);
209 m_hRasConn = NULL;
210 }
211 }
212
217 static CHndThisMap& ms_ElementMap(void)
218 {
219 static CHndThisMap s_mapHndThis;
220 return s_mapHndThis;
221 }
222
232 static VOID WINAPI
233 ms_RasDialFunc1(HRASCONN h, UINT uMsg, RASCONNSTATE state, DWORD dwError, DWORD dwExError)
234 {
235 if ( dwError != 0 )
236 {
237 TRACE3("RasDialFunc s=%d e=%u[%s]\n", state, dwError, GetErrorString(dwError));
239 if ( ms_ElementMap().Lookup(h, P) != 0 )
240 {
241 //発見
242 if ( (reinterpret_cast<ULONG_PTR>(P) & 0x80000000) == 0 )
243 {
244 if ( P->m_piListener != NULL )
245 {
246 if ( P->m_threadWatch.IsAlive() )
247 {
248 P->m_piListener->OnDialupError(dwError);
249 }
250 }
251 P->HangUp();
252 }
253 }
254 else
255 {
256 ms_ElementMap()[h] = reinterpret_cast<CDialupManager*>(static_cast<size_t>(dwError | 0x80000000));
257 }
258 }
259 }
260
265 virtual DWORD Run(void)
266 {
267 DWORD dwRc;
268 RASCONNSTATUS tStatus;
269 RASCONNSTATE eNowState = static_cast<RASCONNSTATE>(0xFFFF);
270 //
271 m_piListener->OnDialupChangeState(RASCS_OpenPort);
272 //
273 bool boIsFirst = true;
274 while ( IsRunnable() )
275 {
276 ::Sleep(E_ConnectCheckInterval);
277 dwRc = GetConnectStatus(tStatus);
278 if ( dwRc != NULL )
279 {
280 //エラー処理はms_RasDialFunc1()で行っています。
281 if ( dwRc == ERROR_INVALID_HANDLE )
282 {
283 ::Sleep(500);
284 continue;
285 }
286 break;
287 }
288 if ( tStatus.dwError != 0 )
289 {
290 //エラー処理はms_RasDialFunc1()で行っています。
291 break;
292 }
293 //
294 if ( boIsFirst )
295 {
296 boIsFirst = false;
297 eNowState = tStatus.rasconnstate;
298 TRACE1("ChangeState =[%s]\n", StateToString(eNowState));
299 m_piListener->OnDialupChangeState(eNowState);
300 }
301 else if ( eNowState != tStatus.rasconnstate )
302 {
303 eNowState = tStatus.rasconnstate;
304 TRACE1("ChangeState =[%s]\n", StateToString(eNowState));
305 m_piListener->OnDialupChangeState(eNowState);
306 }
307 //
308 if ( eNowState == RASCS_Connected )
309 {
310 while ( IsRunnable() )
311 {
312 dwRc = GetConnectStatus(tStatus);
313 if ( dwRc != NULL || tStatus.rasconnstate == RASCS_Disconnected )
314 {
315 //切断された
316 TRACE1("ChangeState =[%s]\n", StateToString(tStatus.rasconnstate));
317 m_ClearHandleRasConn();
319 break;
320 }
321 ::Sleep(E_DisconnectCheckInterval);
322 }
323 break;
324 }
325 if ( eNowState == RASCS_Disconnected )
326 {
327 m_ClearHandleRasConn();
328 break;
329 }
330 }
331 return 0;
332 }
333
338 static void ms_CheckPhoneBook(LPCTSTR& _lpszPhoneBook)
339 {
340 if ( _lpszPhoneBook != NULL && _lpszPhoneBook[0] == '\0' )
341 {
342 _lpszPhoneBook = NULL;
343 }
344 }
345
346 #ifndef _WIN32_WCE
347 static LPCTSTR NcStr(LPCTSTR lpsz) { return lpsz; }
348 #else
349 class NcStr
350 {
351 CStr m_str;
352 bool m_isNull;
353 public:
354 NcStr(LPCTSTR lpsz) : m_str(lpsz), m_isNull(lpsz == NULL) {}
355 operator LPTSTR(void) { return m_isNull ? NULL : m_str.GetBuffer(256); }
356 };
357 #endif //_WIN32_WCE
358
359public:
360
367 {
374 #ifndef _WIN32_WCE
379 LPCTSTR GetPhoneBook(void) const
380 {
381 if ( strPhoneBook.IsEmpty() )
382 {
383 return NULL;
384 }
385 return strPhoneBook;
386 }
387 #else
388 LPWSTR GetPhoneBook(void) const { return NULL; }
389 #endif
395 bool IsInvalid(void) const
396 {
397 return strEntryName.IsEmpty();
398 }
399 };
400
404 CDialupManager(void) : m_piListener(NULL), m_hRasConn(NULL)
405 {
406 m_threadWatch.SetRunner(this);
407 }
408
413 virtual ~CDialupManager(void)
414 {
415 m_ClearHandleRasConn();
416 }
417
424 bool IsAttach(void) const
425 {
426 return m_hRasConn != NULL;
427 }
428
439 bool Attach(LPCTSTR lpszPhoneBook, LPCTSTR lpszEntryName, IListener* piDialupListener = NULL)
440 {
441 EXCLUSIVE(&m_syncFunc);
442 ms_CheckPhoneBook(lpszPhoneBook);
443 Detach();
444 HRASCONN hRasConn = GetRasConn(lpszPhoneBook, lpszEntryName);
445 if ( hRasConn != NULL )
446 {
447 //発見
448 m_hRasConn = hRasConn;
449 ms_ElementMap()[m_hRasConn] = this;
450 m_piListener = piDialupListener;
451 if ( piDialupListener != NULL )
452 {
453 #ifdef _DEBUG
454 m_threadWatch.Start(CStr(lpszEntryName) + _T("Dialup"));
455 #else
456 m_threadWatch.Start();
457 #endif
458 }
459 return true;
460 }
461 return false;
462 }
463
475 DWORD Dial(const TDialParams& D, IListener* piDialupListener = NULL)
476 {
477 EXCLUSIVE(&m_syncFunc);
478 if ( D.IsInvalid() )
479 {
480 TRACE0("Dial パラメータ異常\n");
481 return ERROR_INVALID_PARAMETER;
482 }
483 //==アタッチしていたらデタッチしておく
484 Detach();
485 //==デバイス指定
486 DWORD dwSize = 0;
487 ::RasGetEntryProperties(D.GetPhoneBook(), NcStr(D.strEntryName), NULL, &dwSize, NULL, NULL);
488 CByteVector ba;
489 LPRASENTRY ptEntry = reinterpret_cast<LPRASENTRY>(ba.GetBuffer(dwSize));
490 ptEntry->dwSize = dwSize;
491 DWORD dwRc = ::RasGetEntryProperties(D.GetPhoneBook(), NcStr(D.strEntryName), ptEntry, &dwSize, NULL, NULL);
492 if ( dwRc != 0 )
493 {
494 _DIALUP_TRACE(RasGetEntryProperties, dwRc);
495 return dwRc;
496 }
497 if ( ! D.strDeviceName.IsEmpty() )
498 {
499 if ( D.strDeviceName.Compare(ptEntry->szDeviceName) != 0 )
500 {
501 STRLIB::Copy(ptEntry->szDeviceName, D.strDeviceName);
502 dwRc = ::RasSetEntryProperties(D.GetPhoneBook(), NcStr(D.strEntryName), ptEntry, dwSize, NULL, NULL);
503 if ( dwRc != 0 )
504 {
505 _DIALUP_TRACE(RasSetEntryProperties, dwRc);
506 return dwRc;
507 }
508 }
509 }
510 //
511 RASDIALPARAMS t;
512 t.dwSize = sizeof(RASDIALPARAMS);
513 STRLIB::Copy(t.szEntryName, D.strEntryName);
514 STRLIB::Copy(t.szUserName, D.strUserName);
515 STRLIB::Copy(t.szPassword, D.strPassword);
516 STRLIB::Copy(t.szPhoneNumber, D.strPhoneNumber);
517 t.szCallbackNumber[0] = '\0';
518 t.szDomain[0] = '\0';
519 //
520 HRASCONN hRasConn = NULL;
521 if ( piDialupListener == NULL )
522 {
523 //===同期
524 dwRc = ::RasDial(NULL, D.GetPhoneBook(), &t, 0, NULL, &hRasConn);
525 }
526 else
527 {
528 //===非同期
529 dwRc = ::RasDial(NULL, D.GetPhoneBook(), &t, 1, ms_RasDialFunc1, &hRasConn);
530 }
531 if ( dwRc != 0 )
532 {
533 _DIALUP_TRACE(RasDial, dwRc);
534 return dwRc;
535 }
536 //
537 dwRc = ::RasSetEntryDialParams(D.GetPhoneBook(), &t, false);
538 if ( dwRc != 0 )
539 {
540 _DIALUP_TRACE(RasSetEntryDialParams, dwRc);
541 HangUp();
542 return dwRc;
543 }
544 //
545 m_hRasConn = hRasConn;
546 //
547 CDialupManager* pMan;
548 if ( ms_ElementMap().Lookup(hRasConn, pMan) != 0 )
549 {
550 DWORD dwError = static_cast<DWORD>(reinterpret_cast<size_t>(pMan));
551 ASSERTLIB((dwError & 0x80000000) != 0);
552 dwError &= 0x7FFFFFFF;
553 _DIALUP_TRACE(RasDial, dwError);
554 HangUp();
555 return dwError;
556 }
557 //
558 ms_ElementMap()[hRasConn] = this;
559 if ( piDialupListener != NULL )
560 {
561 m_piListener = piDialupListener;
562 #ifdef _DEBUG
563 m_threadWatch.Start(D.strEntryName + _T("Dialup"));
564 #else
565 m_threadWatch.Start();
566 #endif
567 }
568 return 0;
569 }
570
575 void Detach(void)
576 {
577 EXCLUSIVE(&m_syncFunc);
578 if ( m_hRasConn == NULL )
579 {
580 return;
581 }
582 m_threadWatch.Stop();
583 m_piListener = NULL;
584 m_ClearHandleRasConn();
585 return;
586 }
587
594 DWORD HangUp(void)
595 {
596 EXCLUSIVE(&m_syncFunc);
597 if ( m_hRasConn == NULL )
598 {
599 m_piListener = NULL;
600 return 0;
601 }
602 //
603 m_threadWatch.Stop();
604 DWORD dwRc = ::RasHangUp(m_hRasConn);
605 _DIALUP_TRACE(RasHangUp, dwRc);
606 //
607 RASCONNSTATUS tStatus;
608 while ( true )
609 {
610 if ( GetConnectStatus(tStatus) == ERROR_INVALID_HANDLE )
611 {
612 break;
613 }
614 ::Sleep(10);
615 }
616 if ( dwRc == ERROR_NO_CONNECTION )
617 {
618 dwRc = 0;
619 }
620 m_piListener = NULL;
621 m_ClearHandleRasConn();
622 return dwRc;
623 }
624
631 DWORD GetConnectStatus(RASCONNSTATUS& _tStatus) const
632 {
633 _tStatus.dwSize = sizeof(RASCONNSTATUS);
634 DWORD dwRc = ::RasGetConnectStatus(m_hRasConn, &_tStatus);
635 _DIALUP_TRACE(RasGetConnectStatus, dwRc);
636 return dwRc;
637 }
638
645 {
646 CStr str;
647 RASCONNSTATUS tStatus;
648 DWORD dwRc = GetConnectStatus(tStatus);
649 if ( dwRc == 0 )
650 {
651 str = tStatus.szDeviceName;
652 }
653 return str;
654 }
655
661 CStr GetIpAddress(void) const
662 {
663 return GetIpAddress(m_hRasConn);
664 }
665
671 operator HRASCONN()
672 {
673 return m_hRasConn;
674 }
675
681 {
682 return m_threadWatch;
683 }
684
685
686 //============================================================================
687
688
694 static CStr GetIpAddress(HRASCONN hRasConn)
695 {
696 RASPPPIP tRasPppIp = { sizeof(RASPPPIP) };
697 DWORD dwLen = sizeof(RASPPPIP);
698 DWORD dwRc = ::RasGetProjectionInfo(hRasConn, RASP_PppIp, &tRasPppIp, &dwLen);
699 _DIALUP_TRACE(RasGetProjectionInfo, dwRc);
700 if ( dwRc == 0 )
701 {
702 return tRasPppIp.szIpAddress;
703 }
704 return _T("");
705 }
706
713 static HRASCONN GetRasConn(LPCTSTR lpszPhoneBook, LPCTSTR lpszEntryname)
714 {
715 CStr strPb = lpszPhoneBook;
716 CRasConnVector aRass = ms_GetConnectingEnties();
717 loop ( i, aRass.GetSize() )
718 {
719 const TRasConn &T = aRass.At(i);
720 if ( STRLIB::Compare(T.szEntryName, lpszEntryname) == 0 )
721 {
722 if ( T.IsPhoneBookEqual(strPb) )
723 {
724 //発見
725 HRASCONN hRasComm = T.hRasConn;
726 RASCONNSTATUS tStatus = { sizeof(RASCONNSTATUS) };
727 DWORD dwRc = ::RasGetConnectStatus(hRasComm, &tStatus);
728 _DIALUP_TRACE(RasGetConnectStatus, dwRc);
729 if ( dwRc != 0 || tStatus.rasconnstate != RASCS_Connected )
730 {
731 return NULL;
732 }
733 return hRasComm;
734 }
735 }
736 }
737 return NULL;
738 }
739
745 static CStrVector EnumEntryNames(LPCTSTR lpszPhoneBook)
746 {
747 ms_CheckPhoneBook(lpszPhoneBook);
748 CStrVector vstrNames;
749 CByteVector ba;
750 LPRASENTRYNAME P = reinterpret_cast<LPRASENTRYNAME>(ba.GetBuffer(sizeof(RASENTRYNAME)));
751 P->dwSize = sizeof(RASENTRYNAME);
752 DWORD dwBufferSize = sizeof(RASENTRYNAME);
753 DWORD dwEntries = 0;
754 DWORD dwRc = ::RasEnumEntries(NULL, NcStr(lpszPhoneBook), P, &dwBufferSize, &dwEntries);
755 if ( dwRc == ERROR_BUFFER_TOO_SMALL )
756 {
757 P = reinterpret_cast<LPRASENTRYNAME>(ba.GetBuffer(dwBufferSize));
758 P->dwSize = sizeof(RASENTRYNAME);
759 dwRc = ::RasEnumEntries(NULL, NcStr(lpszPhoneBook), P, &dwBufferSize, &dwEntries);
760 }
761 if ( dwRc != ERROR_SUCCESS )
762 {
763 _DIALUP_TRACE(RasEnumEntries, dwRc);
764 vstrNames.Invalid();
765 return vstrNames;
766 }
767 else
768 {
769 vstrNames.SetIncrementSize(dwEntries);
770 loop ( i, dwEntries )
771 {
772 vstrNames.Add(P->szEntryName);
773 P++;
774 }
775 }
776 return vstrNames;
777 }
778
784 {
785 CStrVector vstrEntryNames;
786 //
787 CRasConnVector aRass = ms_GetConnectingEnties();
788 if ( ! aRass.IsValid() )
789 {
790 vstrEntryNames.Invalid();
791 return vstrEntryNames;
792 }
793 size_t iLen = aRass.GetSize();
794 vstrEntryNames.SetIncrementSize(iLen);
795 loop ( i, iLen )
796 {
797 vstrEntryNames.Add(aRass.At(i).szEntryName);
798 }
799 //
800 return vstrEntryNames;
801 }
802
809 static TDialParams GetDialParams(LPCTSTR lpszPhoneBook, LPCTSTR lpszEntryName)
810 {
811 ms_CheckPhoneBook(lpszPhoneBook);
812 TDialParams tRc;
813 //
814 RASDIALPARAMS tParams = { sizeof(RASDIALPARAMS) };
815 STRLIB::Copy(tParams.szEntryName, lpszEntryName);
816 //
817 BOOL boHasPassword = TRUE;
818 DWORD dwParamsRc = ::RasGetEntryDialParams(NcStr(lpszPhoneBook), &tParams, &boHasPassword);
819 if ( dwParamsRc != 0 )
820 {
821 _DIALUP_TRACE(RasGetEntryDialParams, dwParamsRc);
822 return tRc;
823 }
824 //
825 DWORD dwSize = 0;
826 ::RasGetEntryProperties(NcStr(lpszPhoneBook), NcStr(lpszEntryName), NULL, &dwSize, NULL, NULL);
827 CByteVector ba;
828 LPRASENTRY ptEntry = reinterpret_cast<LPRASENTRY>(ba.GetBuffer(dwSize));
829 ptEntry->dwSize = dwSize;
830 DWORD dwPropertyRc = ::RasGetEntryProperties(NcStr(lpszPhoneBook), NcStr(lpszEntryName), ptEntry, &dwSize, NULL, NULL);
831 if ( dwPropertyRc != 0 )
832 {
833 _DIALUP_TRACE(RasGetEntryProperties, dwPropertyRc);
834 return tRc;
835 }
836 //
837 tRc.strEntryName = lpszEntryName;
838 tRc.strUserName = tParams.szUserName;
839 if ( boHasPassword )
840 {
841 tRc.strPassword = tParams.szPassword;
842 }
843 tRc.strPhoneNumber = ptEntry->szLocalPhoneNumber;
844 tRc.strDeviceName = ptEntry->szDeviceName;
845 tRc.strPhoneBook = lpszPhoneBook;
846 //
847 return tRc;
848 }
849
856 static CStrVector EnumDeviceNames(bool boIsModemOnly = true)
857 {
858 CStrVector vstrNames;
859 CByteVector ba;
860 LPRASDEVINFO P = reinterpret_cast<LPRASDEVINFO>(ba.GetBuffer(sizeof(RASDEVINFO)));
861 P->dwSize = sizeof(RASDEVINFO);
862 DWORD dwBufferSize = sizeof(RASDEVINFO);
863 DWORD dwEntries = 0;
864 DWORD dwRc = ::RasEnumDevices(P, &dwBufferSize, &dwEntries);
865 if ( dwRc == ERROR_BUFFER_TOO_SMALL )
866 {
867 P = reinterpret_cast<LPRASDEVINFO>(ba.GetBuffer(dwBufferSize));
868 P->dwSize = sizeof(RASDEVINFO);
869 dwRc = ::RasEnumDevices(P, &dwBufferSize, &dwEntries);
870 }
871 if ( dwRc != ERROR_SUCCESS)
872 {
873 _DIALUP_TRACE(RasEnumDevices, dwRc);
874 vstrNames.Invalid();
875 return vstrNames;
876 }
877 else
878 {
879 vstrNames.SetIncrementSize(dwEntries);
880 loop ( i, dwEntries )
881 {
882 if ( ! boIsModemOnly || STRLIB::Compare(P->szDeviceType, RASDT_Modem) == 0)
883 {
884 vstrNames.Add(P->szDeviceName);
885 }
886 P++;
887 }
888 }
889 return vstrNames;
890 }
891
892 #ifndef _WIN32_WCE
902 static int EnumModemPorts(CStrVector& _vstrModemNames)
903 {
904 OSVERSIONINFO tOsVerInfo = { sizeof(OSVERSIONINFO) };
905 ::GetVersionEx(&tOsVerInfo);
906 //OSにより取得するレジストリパスが違う
907 CStr strModemBase;
908 if ( tOsVerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
909 {
910 //Windows95/98系
911 strModemBase = "SYSTEM\\CurrentControlSet\\Services\\Class\\Modem";
912 }
913 else
914 {
915 //WindowsNT系
916 strModemBase = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E96D-E325-11CE-BFC1-08002BE10318}";
917 }
918 //
919 int iFoundItemNumber = 0;
920 _vstrModemNames.RemoveAll();
921 _vstrModemNames.SetSize(257);
922// CRegistryAccessor regbase(CRegistryAccessor(HKEY_LOCAL_MACHINE)[strModemBase]);
923 CRegistryAccessor regbase(CRegistryAccessor(HKEY_LOCAL_MACHINE).GetHandle(strModemBase));
924 CStrVector strSecNames = regbase.EnumSectionNames();
925 loop ( i, strSecNames.GetSize() )
926 {
927 CRegistryAccessor::CSection reg =regbase[strSecNames[i]];
928 //モデム名取得 //"FriendlyName"のキーだとデバイスマネージャと同じ表記
929 CStr strModemName = reg.QueryString(_T("Model"));
930 if ( strModemName.IsEmpty() )
931 {
932 continue;
933 }
934 //COMポートを取得する
935 CStr strPort = reg.QueryString(_T("AttachedTo"));
936 if ( strPort.GetLength() < 4 )
937 {
938 continue;
939 }
940 int iPort = strPort.ToInt(3);
941 if ( iPort < 0 || iPort > 256 )
942 {
943 continue;
944 }
945 _vstrModemNames.Set(iPort, strModemName);
946 iFoundItemNumber++;
947 }
948 return iFoundItemNumber;
949 }
950
960 static int SetUserInitCommand(LPCTSTR lpszModemName, LPCTSTR lpszCommand)
961 {
962 OSVERSIONINFO tOsVerInfo = { sizeof(OSVERSIONINFO) };
963 ::GetVersionEx(&tOsVerInfo);
964 //OSにより取得するレジストリパスが違う
965 CStr strModemBase;
966 if ( tOsVerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
967 {
968 //Windows95/98系
969 strModemBase = "SYSTEM\\CurrentControlSet\\Services\\Class\\Modem";
970 }
971 else
972 {
973 //WindowsNT系
974 strModemBase = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E96D-E325-11CE-BFC1-08002BE10318}";
975 }
976 //
977 CRegistryAccessor regbase(CRegistryAccessor(HKEY_LOCAL_MACHINE).GetHandle(strModemBase));
978 CStrVector strSecNames = regbase.EnumSectionNames();
979 loop ( i, strSecNames.GetSize() )
980 {
981 CRegistryAccessor::CSection reg =regbase[strSecNames[i]];
982 //モデム名取得 //"FriendlyName"のキーだとデバイスマネージャと同じ表記
983 CStr strModemName = reg.QueryString(_T("Model"));
984 if ( strModemName.IsEqual(lpszModemName) )
985 {
986 bool r;
987 if ( lpszCommand == NULL || lpszCommand[0] == 0 )
988 {
989 r = reg.DeleteKey(_T("UserInit"));
990 }
991 else
992 {
993 r = reg.WriteString(_T("UserInit"), lpszCommand);
994 }
995 return r;
996 }
997 }
998 return false;
999 }
1000 #endif //_WIN32_WCE
1001
1015 LPCTSTR lpszPhoneBook,
1016 LPCTSTR lpszEntryName,
1017 LPCTSTR lpszDeviceName,
1018 LPCTSTR lpszAreaCode,
1019 LPCTSTR lpszPhoneNumber,
1020 LPCTSTR lpszUserName,
1021 LPCTSTR lpszPassword )
1022 {
1023 if ( lpszPhoneBook != NULL && lpszPhoneBook[0] == '\0' )
1024 {
1025 lpszPhoneBook = NULL;
1026 }
1027 // RASENTRY 構造体のサイズ
1028 RASENTRY rasEntry = { sizeof(RASENTRY) };
1029 rasEntry.dwfOptions =
1030 // DNSを使用する
1031 RASEO_SpecificNameServers
1032 // リモートデフォルトゲートウェイ
1033 | RASEO_RemoteDefaultGateway;
1034 //
1035 CStr strAreaCode = lpszAreaCode;
1036 if ( ! strAreaCode.IsEmpty() )
1037 {
1038 // 市外ダイアルを使用する
1039 rasEntry.dwfOptions |= RASEO_UseCountryAndAreaCodes;
1040 }
1041 rasEntry.dwfOptions = 0x38010118; //なんでしたっけ?
1042 //
1043 rasEntry.dwCountryID = 81;
1044 rasEntry.dwCountryCode = 81;
1045 rasEntry.dwfNetProtocols = RASNP_Ip;
1046 rasEntry.dwFramingProtocol = RASFP_Ppp;
1047 _tcsncpy(rasEntry.szAreaCode, strAreaCode, sizeof(rasEntry.szAreaCode) - 1);
1048 _tcsncpy(rasEntry.szLocalPhoneNumber, lpszPhoneNumber, sizeof(rasEntry.szLocalPhoneNumber) - 1);
1049 _tcsncpy(rasEntry.szDeviceType, RASDT_Modem, sizeof(rasEntry.szDeviceType) - 1);
1050 _tcsncpy(rasEntry.szDeviceName, lpszDeviceName, sizeof(rasEntry.szDeviceName) - 1);
1051 DWORD dwError;
1052 dwError = ::RasSetEntryProperties (NcStr(lpszPhoneBook), NcStr(lpszEntryName), &rasEntry, sizeof(RASENTRY), NULL, NULL);
1053 if ( dwError != 0 )
1054 {
1055 // エラー処理
1056 return false;
1057 }
1058 RASDIALPARAMS dialParm = {sizeof(RASDIALPARAMS)};
1059 dialParm.dwSize = sizeof (RASDIALPARAMS);
1060 _tcsncpy(dialParm.szEntryName, lpszEntryName, sizeof(dialParm.szEntryName) - 1);
1061 _tcsncpy(dialParm.szUserName, lpszUserName, sizeof(dialParm.szUserName) - 1);
1062 _tcsncpy(dialParm.szPassword, lpszPassword, sizeof(dialParm.szPassword) - 1);
1063 //
1064 dwError = ::RasSetEntryDialParams(NcStr(lpszPhoneBook), &dialParm, FALSE);
1065 if ( dwError != 0 )
1066 {
1067 // エラー処理
1068 return false;
1069 }
1070 return true;
1071 }
1072
1078 static CStr GetErrorString(DWORD dwError)
1079 {
1080 CStr str;
1081 #ifndef _WIN32_WCE
1082 ::RasGetErrorString(dwError, str.GetBuffer(256), 256 * sizeof(TCHAR));
1083 str.ReleaseBuffer();
1084 #else
1085 if ( dwError >= 600 && dwError <= 752 )
1086 {
1087 str.Format(_T("RASエラー(%d)"), dwError);
1088 }
1089 #endif
1090 if ( str.IsEmpty() )
1091 {
1092 str = SystemErrorToMessageText(dwError);
1093 }
1094 str.Remove('\n');
1095 str.Remove('\r');
1096 return str;
1097 }
1098
1105 {
1107 {
1108 { RASCS_OpenPort ,_T("ポートを開いています") },
1109 { RASCS_PortOpened ,_T("ポートを開きました") },
1110 { RASCS_ConnectDevice ,_T("機器を接続しています") },
1111 { RASCS_DeviceConnected ,_T("機器を接続しました") },
1112 { RASCS_AllDevicesConnected ,_T("すべての機器を接続しました") },
1113 { RASCS_Authenticate ,_T("認証中です") },
1114 { RASCS_AuthNotify ,_T("認証を終了しました") },
1115 { RASCS_AuthRetry ,_T("認証をリトライ中です") },
1116 { RASCS_AuthCallback ,_T("認証をコールバック中です") },
1117 { RASCS_AuthChangePassword ,_T("認証パスワードを変更しています")},
1118 { RASCS_AuthProject ,_T("投影の認証中です") },
1119 { RASCS_AuthLinkSpeed ,_T("接続速度を認証中です") },
1120 { RASCS_AuthAck ,_T("ACK認証中です") },
1121 { RASCS_ReAuthenticate ,_T("再認証中です") },
1122 { RASCS_Authenticated ,_T("認証が終了しました") },
1123 { RASCS_PrepareForCallback ,_T("コールバック準備中です") },
1124 { RASCS_WaitForModemReset ,_T("モデムのリセット待ちです") },
1125 { RASCS_WaitForCallback ,_T("コールバックの待機中です") },
1126 { RASCS_Projected ,_T("投影終了しました") },
1127 #ifndef _WIN32_WCE
1128 #if ( WINVER >= 0x400 )
1129 { RASCS_StartAuthentication ,_T("認証を開始します") },
1130 { RASCS_CallbackComplete ,_T("コールバックが完了しました") },
1131 { RASCS_LogonNetwork ,_T("ネットワークにログオンしました")},
1132 #endif
1133 { RASCS_SubEntryConnected ,_T("SubEntryConnected") },
1134 { RASCS_SubEntryDisconnected ,_T("SubEntryDisconnected") },
1135 { RASCS_Interactive ,_T("Interactive") },
1136 { RASCS_RetryAuthentication ,_T("RetryAuthentication") },
1137 { RASCS_CallbackSetByCaller ,_T("CallbackSetByCaller") },
1138 { RASCS_PasswordExpired ,_T("PasswordExpired") },
1139 #if ( WINVER >= 0x500 )
1140 { RASCS_InvokeEapUI ,_T("InvokeEapUI") },
1141 #endif
1142 #endif //_WIN32_WCE
1143 { RASCS_Connected ,_T("接続完了") },
1144 { RASCS_Disconnected ,_T("切断完了") },
1145 };
1146 LPCTSTR P = CStaticMapT<RASCONNSTATE, LPCTSTR>::Find(eState, map);
1147 return (P != NULL) ? CStr(P) : CStr::Fmt(_T("Unknown State Code [%d]"), eState);
1148 }
1149};
1150
1151
1152
1153#undef _DIALUP_TRACE
1154
1155
1156
1157}; // TNB
1158
1159
1160
1161#ifdef _TnbDOXYGEN //Document作成用シンボル
1162
1167{
1199};
1200
1201#endif //_TnbDOXYGEN
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
#define _DIALUP_TRACE(FUNC, VAL)
本ヘッダ専用 TRACE マクロ
RASCONNSTATE
RAS状態コード
@ RASCS_CallbackSetByCaller
CallbackSetByCaller
@ RASCS_Disconnected
切断完了
@ RASCS_SubEntryConnected
SubEntryConnected
@ RASCS_AuthCallback
認証をコールバック中です
@ RASCS_PrepareForCallback
コールバック準備中です
@ RASCS_Projected
投影終了しました
@ RASCS_InvokeEapUI
InvokeEapUI
@ RASCS_AuthNotify
認証を終了しました
@ RASCS_CallbackComplete
コールバックが完了しました
@ RASCS_LogonNetwork
ネットワークにログオンしました
@ RASCS_OpenPort
ポートを開いています
@ RASCS_AuthAck
ACK認証中です
@ RASCS_Authenticated
認証が終了しました
@ RASCS_WaitForCallback
コールバックの待機中です
@ RASCS_AllDevicesConnected
すべての機器を接続しました
@ RASCS_WaitForModemReset
モデムのリセット待ちです
@ RASCS_PortOpened
ポートを開きました
@ RASCS_SubEntryDisconnected
SubEntryDisconnected
@ RASCS_Interactive
Interactive
@ RASCS_AuthProject
投影の認証中です
@ RASCS_DeviceConnected
機器を接続しました
@ RASCS_ConnectDevice
機器を接続しています
@ RASCS_PasswordExpired
PasswordExpired
@ RASCS_AuthLinkSpeed
接続速度を認証中です
@ RASCS_Authenticate
認証中です
@ RASCS_AuthChangePassword
認証パスワードを変更しています
@ RASCS_Connected
接続完了
@ RASCS_ReAuthenticate
再認証中です
@ RASCS_AuthRetry
認証をリトライ中です
@ RASCS_RetryAuthentication
RetryAuthentication
@ RASCS_StartAuthentication
認証を開始します
マップ型情報管理関係のヘッダ
レジストリアクセス関係のヘッダ
静的簡易マップ管理関係のヘッダ
文字列処理関係のヘッダ
文字列情報配列管理関係のヘッダ
スレッド管理関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
ダイアルアップ管理クラス
CThreadStatus & ReferThreadStatus(void)
[参照] 監視スレッド状態参照.
bool IsAttach(void) const
[確認] アタッチしているか.
CStr GetIpAddress(void) const
[取得] IPアドレス取得.
static TDialParams GetDialParams(LPCTSTR lpszPhoneBook, LPCTSTR lpszEntryName)
[取得] エントリのダイアルパラメータ取得
bool Attach(LPCTSTR lpszPhoneBook, LPCTSTR lpszEntryName, IListener *piDialupListener=NULL)
[設定] アタッチ.
DWORD GetConnectStatus(RASCONNSTATUS &_tStatus) const
[取得] 接続状態取得
CDialupManager(void)
コンストラクタ
static CStr GetIpAddress(HRASCONN hRasConn)
[取得] 接続のIPアドレス取得
static int SetUserInitCommand(LPCTSTR lpszModemName, LPCTSTR lpszCommand)
[取得] デバイス初期化コマンド設定.
static int EnumModemPorts(CStrVector &_vstrModemNames)
[取得] デバイス(モデム)名一覧.
DWORD Dial(const TDialParams &D, IListener *piDialupListener=NULL)
[操作] ダイアル.
static bool CreatePhoneBookEntry(LPCTSTR lpszPhoneBook, LPCTSTR lpszEntryName, LPCTSTR lpszDeviceName, LPCTSTR lpszAreaCode, LPCTSTR lpszPhoneNumber, LPCTSTR lpszUserName, LPCTSTR lpszPassword)
[作成] 電話エントリ作成
static CStr GetErrorString(DWORD dwError)
[変換] エラーコードを文字列に変換
void Detach(void)
[設定] デタッチ.
static CStrVector EnumDeviceNames(bool boIsModemOnly=true)
[取得] 接続されているデバイス名一覧
static CStrVector EnumConnectedEntryNames(void)
[取得] 接続中エントリ名一覧
CStr GetConnectedDeviceName(void) const
[取得] デバイス名取得.
DWORD HangUp(void)
[操作] 切断.
static HRASCONN GetRasConn(LPCTSTR lpszPhoneBook, LPCTSTR lpszEntryname)
[確認] 指定Entry接続完了状態チェック
virtual ~CDialupManager(void)
デストラクタ
static CStr StateToString(RASCONNSTATE eState)
[変換] ステータスを文字列に変換
static CStrVector EnumEntryNames(LPCTSTR lpszPhoneBook)
[取得] エントリ名一覧
マップ型情報管理テンプレート
Definition: TnbMap.h:66
bool RemoveKey(INK key)
[削除] キーと値を削除
Definition: TnbMap.h:504
レジストリアクセスクラス
virtual CStrVector EnumSectionNames(LPCTSTR lpszSectionName=NULL) const
[取得] セクション名一覧取得
静的簡易マップクラス.
Definition: TnbStaticMap.h:52
static VAL Find(const TYP &key, const TYPS &ts, const VAL &def=VAL())
[検索] 値検索
Definition: TnbStaticMap.h:90
int Compare(const TYP *lpszSubject) const
[確認] 文字列比較
Definition: TnbStr.h:658
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
Definition: TnbStr.h:954
size_t GetLength(void) const
[取得] 文字列長
Definition: TnbStr.h:518
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
Definition: TnbStr.h:1206
int Remove(TYP t)
[処理] 文字削除.
Definition: TnbStr.h:1108
bool IsEqual(const TYP *lpszSubject) const
[確認] 文字列比較
Definition: TnbStr.h:669
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
Definition: TnbStr.h:359
int ToInt(INDEX iOffset=0, int iBase=10) const
[取得] 数値(int)へ変換
Definition: TnbStr.h:842
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
Definition: TnbStr.h:914
Section排他管理クラス
Definition: TnbSync.h:125
スレッド状態管理クラス
Definition: TnbThread.h:128
bool IsAlive(void) const
[確認] スレッドが生きているか
Definition: TnbThread.h:177
スレッド管理クラス
Definition: TnbThread.h:316
bool SetRunner(IRunner *pRunner)
[設定] ランナー、設定
Definition: TnbThread.h:420
bool Stop(DWORD dwWait=15000)
[設定] スレッド停止 スレッドに対して停止要求します。
Definition: TnbThread.h:505
bool Start(LPCTSTR lpszName=NULL)
[設定] スレッド開始
Definition: TnbThread.h:618
配列型情報管理テンプレート
Definition: TnbVector.h:75
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
TYP * GetBuffer(size_t size=0)
[操作] データアドレス取得
Definition: TnbVector.h:745
void SetIncrementSize(size_t size)
[設定] 余白サイズ
Definition: TnbVector.h:340
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbVector.h:233
void Invalid(void)
[操作] 無効状態にする
Definition: TnbVector.h:604
bool IsValid(void) const
[確認] 有効チェック
Definition: TnbVector.h:687
virtual bool SetSize(size_t size)
[操作] サイズ指定
Definition: TnbVector.h:618
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
virtual bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
Definition: TnbVector.h:265
セクション情報アクセスクラス
Definition: TnbAccessor.h:294
CStr QueryString(LPCTSTR lpszKey, LPCTSTR lpszDefault=NULL) const
[取得] 文字列情報取得
Definition: TnbAccessor.h:506
bool WriteString(LPCTSTR lpszKey, LPCTSTR lpszValue)
[追加] 文字列情報記録
Definition: TnbAccessor.h:495
bool DeleteKey(LPCTSTR lpszKey)
[削除] 指定キー削除
Definition: TnbAccessor.h:461
int Compare(LPCSTR P1, LPCSTR P2, INT_PTR len=-1, DWORD dwCmpFlags=0)
[比較] 文字列比較(ASCII/SJIS用)
Definition: TnbStrLib.h:135
TNB::CStrT< TCHAR > CStr
文字列クラス
Definition: TnbStr.h:1785
void Copy(LPSTR _dst, LPCSTR src)
[複製] 文字列コピー(ASCII/SJIS用)
Definition: TnbStrLib.h:89
void SystemErrorToMessageText(CSimpleStr &_str, DWORD dwError)
[変換] SystemErrorコード文字列化.
Definition: TnbDef.h:981
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
TNB Library
Definition: TnbDoxyTitle.txt:2
ダイアルアップのリスナーインターフェース
virtual void OnDialupChangeState(RASCONNSTATE eState)=0
[通知] 状態変化発生
virtual void OnDialupError(DWORD dwError)=0
[通知] エラー発生.
virtual ~IListener(void)
デストラクタ
ダイアルパラメータ型
LPCTSTR GetPhoneBook(void) const
電話帳名取得
bool IsInvalid(void) const
本情報は有効か否か
スレッド実行管理ランナーインターフェース
Definition: TnbThread.h:341
bool IsRunnable(void) const
[確認] 実行可能か否か
Definition: TnbThread.h:355