void Run() override { try { std::unique_ptr<CURL, CURLEasyDeleter> cHandle{curl_easy_init()}; if (cHandle) { size_t (*curlWriteCallback)(void *, size_t, size_t, ServerListQuery *) = []( void *ptr, size_t size, size_t nmemb, ServerListQuery *self) -> size_t { size_t numBytes = size * nmemb; self->buffer.append(reinterpret_cast<char *>(ptr), numBytes); return numBytes; }; curl_easy_setopt(cHandle.get(), CURLOPT_USERAGENT, OpenSpades_VER_STR); curl_easy_setopt(cHandle.get(), CURLOPT_URL, cl_serverListUrl.CString()); curl_easy_setopt(cHandle.get(), CURLOPT_WRITEFUNCTION, curlWriteCallback); curl_easy_setopt(cHandle.get(), CURLOPT_WRITEDATA, this); if (0 == curl_easy_perform(cHandle.get())) { ProcessResponse(); } else { SPRaise("HTTP request error."); } } else { SPRaise("Failed to create cURL object."); } } catch (std::exception &ex) { std::unique_ptr<MainScreenServerList> lst{new MainScreenServerList()}; lst->message = ex.what(); ReturnResult(std::move(lst)); } catch (...) { std::unique_ptr<MainScreenServerList> lst{new MainScreenServerList()}; lst->message = "Unknown error."; ReturnResult(std::move(lst)); } }
void ProcessResponse() { Json::Reader reader; Json::Value root; std::unique_ptr<MainScreenServerList> resp{new MainScreenServerList()}; if (reader.parse(buffer, root, false)) { for (Json::Value::iterator it = root.begin(); it != root.end(); ++it) { Json::Value &obj = *it; std::unique_ptr<ServerItem> srv{ServerItem::Create(obj)}; if (srv) { resp->list.emplace_back( new MainScreenServerItem( srv.get(), owner->favorites.count(srv->GetAddress()) >= 1), false); } } } ReturnResult(std::move(resp)); }
void OnPaint(CefRefPtr<CefBrowser> browser, PaintElementType type, const RectList &dirtyRects, const void *buffer, int width, int height) { if (m_image == NULL || m_queue.size() == 0) return; // copy the buffer into the bitmap Gdiplus::BitmapData data; Gdiplus::Rect rect(0, 0, Zephyros::PageImage::ImageWidth, Zephyros::PageImage::ImageHeight); m_image->LockBits(&rect, Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &data); int w = min(Zephyros::PageImage::ImageWidth, width); int h = min(Zephyros::PageImage::ImageHeight, height); for (int y = 0; y < h; ++y) memcpy((BYTE*) data.Scan0 + y * data.Stride, (BYTE*) buffer + y * 4 * w, 4 * w); m_image->UnlockBits(&data); m_numPainted++; if (m_numPainted >= 100) ReturnResult(); else m_timerId = SetTimer(NULL, m_timerId, 3000, PaintComplete); }
bool RakNetCommandParser::OnCommand(const char *command, unsigned numParameters, char **parameterList, TransportInterface *transport, SystemAddress systemAddress, const char *originalString) { (void) originalString; (void) numParameters; if (peer==0) return false; if (strcmp(command, "Startup")==0) { SocketDescriptor socketDescriptor((unsigned short)atoi(parameterList[1]), parameterList[3]); ReturnResult(peer->Startup((unsigned short)atoi(parameterList[0]), atoi(parameterList[2]), &socketDescriptor, 1), command, transport, systemAddress); } else if (strcmp(command, "InitializeSecurity")==0) { peer->InitializeSecurity(0,0,0,0); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "DisableSecurity")==0) { peer->DisableSecurity(); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "AddToSecurityExceptionList")==0) { peer->AddToSecurityExceptionList(parameterList[1]); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "RemoveFromSecurityExceptionList")==0) { peer->RemoveFromSecurityExceptionList(parameterList[1]); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "IsInSecurityExceptionList")==0) { ReturnResult(peer->IsInSecurityExceptionList(parameterList[1]),command, transport, systemAddress); } else if (strcmp(command, "SetMaximumIncomingConnections")==0) { peer->SetMaximumIncomingConnections((unsigned short)atoi(parameterList[0])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "GetMaximumIncomingConnections")==0) { ReturnResult(peer->GetMaximumIncomingConnections(), command, transport, systemAddress); } else if (strcmp(command, "Connect")==0) { ReturnResult(peer->Connect(parameterList[0], (unsigned short)atoi(parameterList[1]),parameterList[2],atoi(parameterList[3])), command, transport, systemAddress); } else if (strcmp(command, "Disconnect")==0) { peer->Shutdown(atoi(parameterList[0]), (unsigned char)atoi(parameterList[1])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "IsActive")==0) { ReturnResult(peer->IsActive(), command, transport, systemAddress); } else if (strcmp(command, "GetConnectionList")==0) { SystemAddress remoteSystems[32]; unsigned short count=32; unsigned i; if (peer->GetConnectionList(remoteSystems, &count)) { if (count==0) { transport->Send(systemAddress, "GetConnectionList() returned no systems connected.\r\n"); } else { transport->Send(systemAddress, "GetConnectionList() returned:\r\n"); for (i=0; i < count; i++) transport->Send(systemAddress, "%i %s %i:%i\r\n", i, remoteSystems[i].ToString(false), remoteSystems[i].binaryAddress, remoteSystems[i].port); } } else transport->Send(systemAddress, "GetConnectionList() returned false.\r\n"); } else if (strcmp(command, "CloseConnection")==0) { peer->CloseConnection(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1])),atoi(parameterList[2])!=0,(unsigned char)atoi(parameterList[3])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "IsConnected")==0) { ReturnResult(peer->IsConnected(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))), command, transport, systemAddress); } else if (strcmp(command, "GetIndexFromSystemAddress")==0) { ReturnResult(peer->GetIndexFromSystemAddress(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))), command, transport, systemAddress); } else if (strcmp(command, "GetSystemAddressFromIndex")==0) { ReturnResult(peer->GetSystemAddressFromIndex(atoi(parameterList[0])), command, transport, systemAddress); } else if (strcmp(command, "AddToBanList")==0) { peer->AddToBanList(parameterList[0], atoi(parameterList[1])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "RemoveFromBanList")==0) { peer->RemoveFromBanList(parameterList[0]); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "ClearBanList")==0) { peer->ClearBanList(); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "IsBanned")==0) { ReturnResult(peer->IsBanned(parameterList[0]), command, transport, systemAddress); } else if (strcmp(command, "Ping1")==0) { peer->Ping(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "Ping2")==0) { peer->Ping(parameterList[0], (unsigned short) atoi(parameterList[1]), atoi(parameterList[2])!=0); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "GetAveragePing")==0) { ReturnResult(peer->GetAveragePing(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))), command, transport, systemAddress); } else if (strcmp(command, "GetLastPing")==0) { ReturnResult(peer->GetLastPing(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))), command, transport, systemAddress); } else if (strcmp(command, "GetLowestPing")==0) { ReturnResult(peer->GetLowestPing(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))), command, transport, systemAddress); } else if (strcmp(command, "SetOccasionalPing")==0) { peer->SetOccasionalPing(atoi(parameterList[0])!=0); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "SetOfflinePingResponse")==0) { peer->SetOfflinePingResponse(parameterList[0], atoi(parameterList[1])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "GetInternalID")==0) { ReturnResult(peer->GetInternalID(), command, transport, systemAddress); } else if (strcmp(command, "GetExternalID")==0) { ReturnResult(peer->GetExternalID(IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))), command, transport, systemAddress); } else if (strcmp(command, "SetTimeoutTime")==0) { peer->SetTimeoutTime(atoi(parameterList[0]), IntegersToSystemAddress(atoi(parameterList[0]), atoi(parameterList[1]))); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "SetMTUSize")==0) { ReturnResult(peer->SetMTUSize(atoi(parameterList[0]), UNASSIGNED_SYSTEM_ADDRESS), command, transport, systemAddress); } else if (strcmp(command, "GetMTUSize")==0) { ReturnResult(peer->GetMTUSize(UNASSIGNED_SYSTEM_ADDRESS), command, transport, systemAddress); } else if (strcmp(command, "GetNumberOfAddresses")==0) { ReturnResult((int)peer->GetNumberOfAddresses(), command, transport, systemAddress); } else if (strcmp(command, "GetLocalIP")==0) { ReturnResult((char*) peer->GetLocalIP(atoi(parameterList[0])), command, transport, systemAddress); } else if (strcmp(command, "AllowConnectionResponseIPMigration")==0) { peer->AllowConnectionResponseIPMigration(atoi(parameterList[0])!=0); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "AdvertiseSystem")==0) { peer->AdvertiseSystem(parameterList[0], (unsigned short) atoi(parameterList[1]),parameterList[2],atoi(parameterList[3])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "ApplyNetworkSimulator")==0) { peer->ApplyNetworkSimulator(atof(parameterList[0]), (unsigned short) atoi(parameterList[1]),(unsigned short) atoi(parameterList[2])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "IsNetworkSimulatorActive")==0) { ReturnResult(peer->IsNetworkSimulatorActive(), command, transport, systemAddress); } else if (strcmp(command, "SetIncomingPassword")==0) { peer->SetIncomingPassword(parameterList[0], atoi(parameterList[1])); ReturnResult(command, transport, systemAddress); } else if (strcmp(command, "GetIncomingPassword")==0) { char password[256]; int passwordLength; peer->GetIncomingPassword(password, &passwordLength); if (passwordLength) ReturnResult((char*)password, command, transport, systemAddress); else ReturnResult(0, command, transport, systemAddress); } return true; }