📄 remconn.cxx
字号:
{ if (rasConnection != NULL) { Ras.HangUp(rasConnection); rasConnection = NULL; }}static int GetRasStatus(HRASCONN rasConnection, DWORD & rasError){ RASCONNSTATUS status; status.dwSize = IsWinVer401() ? sizeof(status) : SizeWin400_RASCONNSTATUS; rasError = Ras.GetConnectStatus(rasConnection, &status); if (rasError == ERROR_INVALID_HANDLE) { PError << "RAS Connection Status invalid handle, retrying."; rasError = Ras.GetConnectStatus(rasConnection, &status); } if (rasError == 0) { rasError = status.dwError; SetLastError(rasError); return status.rasconnstate; } PError << "RAS Connection Status failed (" << rasError << "), retrying."; rasError = Ras.GetConnectStatus(rasConnection, &status); if (rasError == 0) rasError = status.dwError; SetLastError(rasError); return -1;}PRemoteConnection::Status PRemoteConnection::GetStatus() const{ if (!Ras.IsLoaded()) return NotInstalled; if (rasConnection == NULL) { switch (osError) { case SUCCESS : return Idle; case ERROR_CANNOT_FIND_PHONEBOOK_ENTRY : return NoNameOrNumber; case ERROR_LINE_BUSY : return LineBusy; case ERROR_NO_DIALTONE : return NoDialTone; case ERROR_NO_ANSWER : case ERROR_NO_CARRIER : return NoAnswer; case ERROR_PORT_ALREADY_OPEN : case ERROR_PORT_NOT_AVAILABLE : return PortInUse; case ERROR_ACCESS_DENIED : case ERROR_NO_DIALIN_PERMISSION : case ERROR_AUTHENTICATION_FAILURE : return AccessDenied; case ERROR_HARDWARE_FAILURE : case ERROR_PORT_OR_DEVICE : return HardwareFailure; } return GeneralFailure; } switch (GetRasStatus(rasConnection, ((PRemoteConnection*)this)->osError)) { case RASCS_Connected : return Connected; case RASCS_Disconnected : break; case -1 : return ConnectionLost; default : return InProgress; } PError << "RAS Connection Status disconnected, retrying."; switch (GetRasStatus(rasConnection, ((PRemoteConnection*)this)->osError)) { case RASCS_Connected : return Connected; case RASCS_Disconnected : return Idle; case -1 : return ConnectionLost; } return InProgress;}PString PRemoteConnection::GetAddress(){ if (Ras.GetProjectionInfo == NULL) { osError = ERROR_CALL_NOT_IMPLEMENTED; return PString(); } if (rasConnection == NULL) { osError = ERROR_INVALID_HANDLE; return PString(); } RASPPPIP ip; ip.dwSize = sizeof(ip); DWORD size = sizeof(ip); osError = Ras.GetProjectionInfo(rasConnection, RASP_PppIp, &ip, &size); if (osError != ERROR_SUCCESS) return PString(); osError = ip.dwError; if (osError != ERROR_SUCCESS) return PString(); return ip.szIpAddress;}PStringArray PRemoteConnection::GetAvailableNames(){ PStringArray array; if (!Ras.IsLoaded()) return array; RASENTRYNAME entry; entry.dwSize = sizeof(RASENTRYNAME); LPRASENTRYNAME entries = &entry; DWORD size = sizeof(entry); DWORD numEntries; DWORD rasError = Ras.EnumEntries(NULL, NULL, entries, &size, &numEntries); if (rasError == ERROR_BUFFER_TOO_SMALL) { entries = new RASENTRYNAME[size/sizeof(RASENTRYNAME)]; entries[0].dwSize = sizeof(RASENTRYNAME); rasError = Ras.EnumEntries(NULL, NULL, entries, &size, &numEntries); } if (rasError == 0) { array.SetSize(numEntries); for (DWORD i = 0; i < numEntries; i++) array[i] = entries[i].szEntryName; } if (entries != &entry) delete [] entries; return array;}PRemoteConnection::Status PRemoteConnection::GetConfiguration(Configuration & config){ return GetConfiguration(remoteName, config);}static DWORD MyRasGetEntryProperties(const char * name, PBYTEArray & entrybuf){ LPRASENTRY entry = (LPRASENTRY)entrybuf.GetPointer(sizeof(RASENTRY)); entry->dwSize = sizeof(RASENTRY); DWORD entrySize = sizeof(RASENTRY); DWORD error = Ras.GetEntryProperties(NULL, (char *)name, entry, &entrySize, NULL, 0); if (error == ERROR_BUFFER_TOO_SMALL) { entry = (LPRASENTRY)entrybuf.GetPointer(entrySize); error = Ras.GetEntryProperties(NULL, (char *)name, entry, &entrySize, NULL, 0); } return error;}PRemoteConnection::Status PRemoteConnection::GetConfiguration(const PString & name, Configuration & config){ if (!Ras.IsLoaded() || Ras.GetEntryProperties == NULL) return NotInstalled; PBYTEArray entrybuf; switch (MyRasGetEntryProperties(name, entrybuf)) { case 0 : break; case ERROR_CANNOT_FIND_PHONEBOOK_ENTRY : return NoNameOrNumber; default : return GeneralFailure; } LPRASENTRY entry = (LPRASENTRY)(const BYTE *)entrybuf; config.device = entry->szDeviceType + PString("/") + entry->szDeviceName; if ((entry->dwfOptions&RASEO_UseCountryAndAreaCodes) == 0) config.phoneNumber = entry->szLocalPhoneNumber; else config.phoneNumber = psprintf("+%u %s %s", entry->dwCountryCode, entry->szAreaCode, entry->szLocalPhoneNumber); if ((entry->dwfOptions&RASEO_SpecificIpAddr) == 0) config.ipAddress = ""; else config.ipAddress = psprintf("%u.%u.%u.%u", entry->ipaddr.a, entry->ipaddr.b, entry->ipaddr.c, entry->ipaddr.d); if ((entry->dwfOptions&RASEO_SpecificNameServers) == 0) config.dnsAddress = ""; else config.dnsAddress = psprintf("%u.%u.%u.%u", entry->ipaddrDns.a, entry->ipaddrDns.b, entry->ipaddrDns.c, entry->ipaddrDns.d); config.script = entry->szScript; config.subEntries = entry->dwSubEntries; config.dialAllSubEntries = entry->dwDialMode == RASEDM_DialAll; return Connected;}PRemoteConnection::Status PRemoteConnection::SetConfiguration(const Configuration & config, BOOL create){ return SetConfiguration(remoteName, config, create);}PRemoteConnection::Status PRemoteConnection::SetConfiguration(const PString & name, const Configuration & config, BOOL create){ if (!Ras.IsLoaded() || Ras.SetEntryProperties == NULL || Ras.ValidateEntryName == NULL) return NotInstalled; PBYTEArray entrybuf; switch (MyRasGetEntryProperties(name, entrybuf)) { case 0 : break; case ERROR_CANNOT_FIND_PHONEBOOK_ENTRY : if (!create) return NoNameOrNumber; if (Ras.ValidateEntryName(NULL, (char *)(const char *)name) != 0) return GeneralFailure; break; default : return GeneralFailure; } LPRASENTRY entry = (LPRASENTRY)(const BYTE *)entrybuf; PINDEX barpos = config.device.Find('/'); if (barpos == P_MAX_INDEX) strncpy(entry->szDeviceName, config.device, sizeof(entry->szDeviceName)-1); else { strncpy(entry->szDeviceType, config.device.Left(barpos), sizeof(entry->szDeviceType)-1); strncpy(entry->szDeviceName, config.device.Mid(barpos+1), sizeof(entry->szDeviceName)-1); } strncpy(entry->szLocalPhoneNumber, config.phoneNumber, sizeof(entry->szLocalPhoneNumber)-1); PStringArray dots = config.ipAddress.Tokenise('.'); if (dots.GetSize() != 4) entry->dwfOptions &= ~RASEO_SpecificIpAddr; else { entry->dwfOptions |= RASEO_SpecificIpAddr; entry->ipaddr.a = (BYTE)dots[0].AsInteger(); entry->ipaddr.b = (BYTE)dots[1].AsInteger(); entry->ipaddr.c = (BYTE)dots[2].AsInteger(); entry->ipaddr.d = (BYTE)dots[3].AsInteger(); } dots = config.dnsAddress.Tokenise('.'); if (dots.GetSize() != 4) entry->dwfOptions &= ~RASEO_SpecificNameServers; else { entry->dwfOptions |= RASEO_SpecificNameServers; entry->ipaddrDns.a = (BYTE)dots[0].AsInteger(); entry->ipaddrDns.b = (BYTE)dots[1].AsInteger(); entry->ipaddrDns.c = (BYTE)dots[2].AsInteger(); entry->ipaddrDns.d = (BYTE)dots[3].AsInteger(); } strncpy(entry->szScript, config.script, sizeof(entry->szScript-1)); entry->dwDialMode = config.dialAllSubEntries ? RASEDM_DialAll : RASEDM_DialAsNeeded; if (Ras.SetEntryProperties(NULL, (char *)(const char *)name, entry, entrybuf.GetSize(), NULL, 0) != 0) return GeneralFailure; return Connected;}PRemoteConnection::Status PRemoteConnection::RemoveConfiguration(const PString & name){ if (!Ras.IsLoaded() || Ras.SetEntryProperties == NULL || Ras.ValidateEntryName == NULL) return NotInstalled; switch (Ras.DeleteEntry(NULL, (char *)(const char *)name)) { case 0 : return Connected; case ERROR_INVALID_NAME : return NoNameOrNumber; } return GeneralFailure;}// End of File ////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -