void CWakeOnAccess::WakeUpHost(const WakeUpEntry& server) { CStdString heading = LOCALIZED(13027); heading.Format (heading, server.host); 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) { CLog::Log(LOGNOTICE,"WakeOnAccess timeout/cancel while waiting for network"); return; // timedout or canceled } } { 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; } } 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.IsPlaying()) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, heading, LOCALIZED(13029)); return; } { 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; // timedout or canceled } } { 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"); } }
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; }