virtual bool SuccessWaiting () const { unsigned long address = ntohl(HostToIP(m_host)); bool online = g_application.getNetwork().HasInterfaceForIP(address); if (!online) // setup endtime so we dont return true until network is consistently connected m_end.Set (m_settle_time_ms); return online && m_end.IsTimePast(); }
bool SuccessWaiting () const override { unsigned long address = ntohl(HostToIP(m_host)); bool online = CServiceBroker::GetNetwork().HasInterfaceForIP(address); if (!online) // setup endtime so we dont return true until network is consistently connected m_end.Set (m_settle_time_ms); return online && m_end.IsTimePast(); }
bool CMACDiscoveryJob::DoWork() { unsigned long ipAddress = HostToIP(m_host); if (ipAddress == INADDR_NONE) { CLog::Log(LOGERROR, "%s - can't determine ip of '%s'", __FUNCTION__, m_host.c_str()); return false; } std::vector<CNetworkInterface*>& ifaces = g_application.getNetwork().GetInterfaceList(); for (std::vector<CNetworkInterface*>::const_iterator it = ifaces.begin(); it != ifaces.end(); ++it) { if ((*it)->GetHostMacAddress(ipAddress, m_macAddres)) return true; } return false; }
static bool Ping(const CWakeOnAccess::WakeUpEntry& server, unsigned timeOutMs = 2000) { if (server.upnpUuid.empty()) { unsigned long dst_ip = HostToIP(server.host); return CServiceBroker::GetNetwork().PingHost(dst_ip, server.ping_port, timeOutMs, server.ping_mode & 1); } else // upnp mode { std::string host = LookupUPnPHost(server.upnpUuid); if (host.empty()) { Sleep(timeOutMs); host = LookupUPnPHost(server.upnpUuid); } return !host.empty(); } }
bool CWakeOnAccess::WakeUpHost(const WakeUpEntry& server) { std::string heading = StringUtils::Format(LOCALIZED(13027).c_str(), server.host.c_str()); ProgressDialogHelper dlg (heading); { NetworkStartWaiter waitObj (m_netsettle_ms, server.host); // wait until network connected before sending wake-on-lan if (dlg.ShowAndWait (waitObj, m_netinit_sec, LOCALIZED(13028)) != ProgressDialogHelper::Success) { if (g_application.getNetwork().IsConnected() && HostToIP(server.host) == INADDR_NONE) { // network connected (at least one interface) but dns-lookup failed (host by name, not ip-address), so dont abort yet CLog::Log(LOGWARNING, "WakeOnAccess timeout/cancel while waiting for network (proceeding anyway)"); } else { CLog::Log(LOGNOTICE, "WakeOnAccess timeout/cancel while waiting for network"); return false; // timedout or canceled ; give up } } } { ULONG dst_ip = HostToIP(server.host); if (g_application.getNetwork().PingHost(dst_ip, server.ping_port, 500)) // quick ping with short timeout to not block too long { CLog::Log(LOGNOTICE,"WakeOnAccess success exit, server already running"); return true; } } if (!g_application.getNetwork().WakeOnLan(server.mac.c_str())) { CLog::Log(LOGERROR,"WakeOnAccess failed to send. (Is it blocked by firewall?)"); if (g_application.IsCurrentThread() || !g_application.m_pPlayer->IsPlaying()) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, heading, LOCALIZED(13029)); return false; } { PingResponseWaiter waitObj (dlg.HasDialog(), server); // wait for ping response .. ProgressDialogHelper::wait_result result = dlg.ShowAndWait (waitObj, server.wait_online1_sec, LOCALIZED(13030)); if (result == ProgressDialogHelper::TimedOut) result = dlg.ShowAndWait (waitObj, server.wait_online2_sec, LOCALIZED(13031)); if (result != ProgressDialogHelper::Success) { CLog::Log(LOGNOTICE,"WakeOnAccess timeout/cancel while waiting for response"); return false; // timedout or canceled } } // we have ping response ; just add extra wait-for-services before returning if requested { WaitCondition waitObj ; // wait uninteruptable fixed time for services .. dlg.ShowAndWait (waitObj, server.wait_services_sec, LOCALIZED(13032)); CLog::Log(LOGNOTICE,"WakeOnAccess sequence completed, server started"); } return true; }
static bool Ping (const CWakeOnAccess::WakeUpEntry& server) { ULONG dst_ip = HostToIP(server.host); return g_application.getNetwork().PingHost(dst_ip, server.ping_port, 2000, server.ping_mode & 1); }