The Formatting String Catastrophe
This commit is contained in:
parent
14b9689b6d
commit
332983c97b
@ -212,7 +212,7 @@ public:
|
|||||||
|
|
||||||
Logger::info("Application: Initializing SDL");
|
Logger::info("Application: Initializing SDL");
|
||||||
if (SDL_Init(0))
|
if (SDL_Init(0))
|
||||||
throw ApplicationException(strf("Couldn't initialize SDL: %s", SDL_GetError()));
|
throw ApplicationException(strf("Couldn't initialize SDL: {}", SDL_GetError()));
|
||||||
|
|
||||||
if (char* basePath = SDL_GetBasePath()) {
|
if (char* basePath = SDL_GetBasePath()) {
|
||||||
File::changeDirectory(basePath);
|
File::changeDirectory(basePath);
|
||||||
@ -231,15 +231,15 @@ public:
|
|||||||
|
|
||||||
Logger::info("Application: Initializing SDL Video");
|
Logger::info("Application: Initializing SDL Video");
|
||||||
if (SDL_InitSubSystem(SDL_INIT_VIDEO))
|
if (SDL_InitSubSystem(SDL_INIT_VIDEO))
|
||||||
throw ApplicationException(strf("Couldn't initialize SDL Video: %s", SDL_GetError()));
|
throw ApplicationException(strf("Couldn't initialize SDL Video: {}", SDL_GetError()));
|
||||||
|
|
||||||
Logger::info("Application: Initializing SDL Joystick");
|
Logger::info("Application: Initializing SDL Joystick");
|
||||||
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK))
|
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK))
|
||||||
throw ApplicationException(strf("Couldn't initialize SDL Joystick: %s", SDL_GetError()));
|
throw ApplicationException(strf("Couldn't initialize SDL Joystick: {}", SDL_GetError()));
|
||||||
|
|
||||||
Logger::info("Application: Initializing SDL Sound");
|
Logger::info("Application: Initializing SDL Sound");
|
||||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO))
|
if (SDL_InitSubSystem(SDL_INIT_AUDIO))
|
||||||
throw ApplicationException(strf("Couldn't initialize SDL Sound: %s", SDL_GetError()));
|
throw ApplicationException(strf("Couldn't initialize SDL Sound: {}", SDL_GetError()));
|
||||||
|
|
||||||
SDL_JoystickEventState(SDL_ENABLE);
|
SDL_JoystickEventState(SDL_ENABLE);
|
||||||
|
|
||||||
@ -251,7 +251,7 @@ public:
|
|||||||
m_sdlWindow = SDL_CreateWindow(m_windowTitle.utf8Ptr(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
m_sdlWindow = SDL_CreateWindow(m_windowTitle.utf8Ptr(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||||
m_windowSize[0], m_windowSize[1], SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
|
m_windowSize[0], m_windowSize[1], SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
|
||||||
if (!m_sdlWindow)
|
if (!m_sdlWindow)
|
||||||
throw ApplicationException::format("Application: Could not create SDL window: %s", SDL_GetError());
|
throw ApplicationException::format("Application: Could not create SDL window: {}", SDL_GetError());
|
||||||
|
|
||||||
SDL_ShowWindow(m_sdlWindow);
|
SDL_ShowWindow(m_sdlWindow);
|
||||||
SDL_RaiseWindow(m_sdlWindow);
|
SDL_RaiseWindow(m_sdlWindow);
|
||||||
@ -263,7 +263,7 @@ public:
|
|||||||
|
|
||||||
m_sdlGlContext = SDL_GL_CreateContext(m_sdlWindow);
|
m_sdlGlContext = SDL_GL_CreateContext(m_sdlWindow);
|
||||||
if (!m_sdlGlContext)
|
if (!m_sdlGlContext)
|
||||||
throw ApplicationException::format("Application: Could not create OpenGL context: %s", SDL_GetError());
|
throw ApplicationException::format("Application: Could not create OpenGL context: {}", SDL_GetError());
|
||||||
|
|
||||||
SDL_GL_SwapWindow(m_sdlWindow);
|
SDL_GL_SwapWindow(m_sdlWindow);
|
||||||
setVSyncEnabled(m_windowVSync);
|
setVSyncEnabled(m_windowVSync);
|
||||||
@ -288,7 +288,7 @@ public:
|
|||||||
SDL_CloseAudioDevice(m_sdlAudioDevice);
|
SDL_CloseAudioDevice(m_sdlAudioDevice);
|
||||||
Logger::error("Application: Could not open 44.1khz / 16 bit stereo audio device, no sound available!");
|
Logger::error("Application: Could not open 44.1khz / 16 bit stereo audio device, no sound available!");
|
||||||
} else {
|
} else {
|
||||||
Logger::info("Application: Opened default audio device with 44.1khz / 16 bit stereo audio, %s sample size buffer", obtained.samples);
|
Logger::info("Application: Opened default audio device with 44.1khz / 16 bit stereo audio, {} sample size buffer", obtained.samples);
|
||||||
SDL_PauseAudioDevice(m_sdlAudioDevice, 0);
|
SDL_PauseAudioDevice(m_sdlAudioDevice, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,14 +375,14 @@ public:
|
|||||||
Thread::sleepPrecise(spareMilliseconds);
|
Thread::sleepPrecise(spareMilliseconds);
|
||||||
}
|
}
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
Logger::error("Application: exception thrown, shutting down: %s", outputException(e, true));
|
Logger::error("Application: exception thrown, shutting down: {}", outputException(e, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Logger::info("Application: shutdown...");
|
Logger::info("Application: shutdown...");
|
||||||
m_application->shutdown();
|
m_application->shutdown();
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
Logger::error("Application: threw exception during shutdown: %s", outputException(e, true));
|
Logger::error("Application: threw exception during shutdown: {}", outputException(e, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_CloseAudioDevice(m_sdlAudioDevice);
|
SDL_CloseAudioDevice(m_sdlAudioDevice);
|
||||||
@ -432,10 +432,10 @@ private:
|
|||||||
parent->m_windowMode = WindowMode::Fullscreen;
|
parent->m_windowMode = WindowMode::Fullscreen;
|
||||||
SDL_SetWindowFullscreen(parent->m_sdlWindow, SDL_WINDOW_FULLSCREEN);
|
SDL_SetWindowFullscreen(parent->m_sdlWindow, SDL_WINDOW_FULLSCREEN);
|
||||||
} else {
|
} else {
|
||||||
Logger::warn("Failed to set resolution %s, %s", (unsigned)requestedDisplayMode.w, (unsigned)requestedDisplayMode.h);
|
Logger::warn("Failed to set resolution {}, {}", (unsigned)requestedDisplayMode.w, (unsigned)requestedDisplayMode.h);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger::warn("Unable to set requested display resolution %s, %s", (int)fullScreenResolution[0], (int)fullScreenResolution[1]);
|
Logger::warn("Unable to set requested display resolution {}, {}", (int)fullScreenResolution[0], (int)fullScreenResolution[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_DisplayMode actualDisplayMode;
|
SDL_DisplayMode actualDisplayMode;
|
||||||
|
@ -32,13 +32,13 @@ PcP2PNetworkingService::PcP2PNetworkingService(PcPlatformServicesStatePtr state)
|
|||||||
|
|
||||||
m_discordOnActivityJoinToken = m_state->discordCore->ActivityManager().OnActivityJoin.Connect([this](char const* peerId) {
|
m_discordOnActivityJoinToken = m_state->discordCore->ActivityManager().OnActivityJoin.Connect([this](char const* peerId) {
|
||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
Logger::info("Joining discord peer at '%s'", peerId);
|
Logger::info("Joining discord peer at '{}'", peerId);
|
||||||
addPendingJoin(strf("+platform:%s", peerId));
|
addPendingJoin(strf("+platform:{}", peerId));
|
||||||
});
|
});
|
||||||
m_discordOnActivityRequestToken = m_state->discordCore->ActivityManager().OnActivityJoinRequest.Connect([this](discord::User const& user) {
|
m_discordOnActivityRequestToken = m_state->discordCore->ActivityManager().OnActivityJoinRequest.Connect([this](discord::User const& user) {
|
||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
String userName = String(user.GetUsername());
|
String userName = String(user.GetUsername());
|
||||||
Logger::info("Received join request from user '%s'", userName);
|
Logger::info("Received join request from user '{}'", userName);
|
||||||
m_discordJoinRequests.emplace_back(make_pair(user.GetId(), userName));
|
m_discordJoinRequests.emplace_back(make_pair(user.GetId(), userName));
|
||||||
});
|
});
|
||||||
m_discordOnReceiveMessage = m_state->discordCore->LobbyManager().OnNetworkMessage.Connect(bind(&PcP2PNetworkingService::discordOnReceiveMessage, this, _1, _2, _3, _4, _5));
|
m_discordOnReceiveMessage = m_state->discordCore->LobbyManager().OnNetworkMessage.Connect(bind(&PcP2PNetworkingService::discordOnReceiveMessage, this, _1, _2, _3, _4, _5));
|
||||||
@ -54,9 +54,9 @@ PcP2PNetworkingService::~PcP2PNetworkingService() {
|
|||||||
if (m_state->discordAvailable) {
|
if (m_state->discordAvailable) {
|
||||||
MutexLocker discordLocker(m_state->discordMutex);
|
MutexLocker discordLocker(m_state->discordMutex);
|
||||||
if (m_discordServerLobby) {
|
if (m_discordServerLobby) {
|
||||||
Logger::info("Deleting discord server lobby %s", m_discordServerLobby->first);
|
Logger::info("Deleting discord server lobby {}", m_discordServerLobby->first);
|
||||||
m_state->discordCore->LobbyManager().DeleteLobby(m_discordServerLobby->first, [](discord::Result res) {
|
m_state->discordCore->LobbyManager().DeleteLobby(m_discordServerLobby->first, [](discord::Result res) {
|
||||||
Logger::error("Could not connect delete server lobby (err %s)", (int)res);
|
Logger::error("Could not connect delete server lobby (err {})", (int)res);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,18 +108,18 @@ void Star::PcP2PNetworkingService::setActivityData(String const& title, Maybe<pa
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (auto lobby = m_discordServerLobby)
|
if (auto lobby = m_discordServerLobby)
|
||||||
activity.GetParty().SetId(strf("%s", lobby->first).c_str());
|
activity.GetParty().SetId(strf("{}", lobby->first).c_str());
|
||||||
|
|
||||||
if (m_joinLocation.is<JoinLocal>()) {
|
if (m_joinLocation.is<JoinLocal>()) {
|
||||||
if (auto lobby = m_discordServerLobby) {
|
if (auto lobby = m_discordServerLobby) {
|
||||||
String joinSecret = strf("connect:discord_%s_%s_%s", m_state->discordCurrentUser->GetId(), lobby->first, lobby->second);
|
String joinSecret = strf("connect:discord_{}_{}_{}", m_state->discordCurrentUser->GetId(), lobby->first, lobby->second);
|
||||||
Logger::info("Setting discord join secret as %s", joinSecret);
|
Logger::info("Setting discord join secret as {}", joinSecret);
|
||||||
activity.GetSecrets().SetJoin(joinSecret.utf8Ptr());
|
activity.GetSecrets().SetJoin(joinSecret.utf8Ptr());
|
||||||
}
|
}
|
||||||
} else if (m_joinLocation.is<JoinRemote>()) {
|
} else if (m_joinLocation.is<JoinRemote>()) {
|
||||||
String address = strf("%s", (HostAddressWithPort)m_joinLocation.get<JoinRemote>());
|
String address = strf("{}", (HostAddressWithPort)m_joinLocation.get<JoinRemote>());
|
||||||
String joinSecret = strf("connect:address_%s", address);
|
String joinSecret = strf("connect:address_{}", address);
|
||||||
Logger::info("Setting discord join secret as %s", joinSecret);
|
Logger::info("Setting discord join secret as {}", joinSecret);
|
||||||
activity.GetSecrets().SetJoin(joinSecret.utf8Ptr());
|
activity.GetSecrets().SetJoin(joinSecret.utf8Ptr());
|
||||||
|
|
||||||
activity.GetParty().SetId(address.utf8Ptr());
|
activity.GetParty().SetId(address.utf8Ptr());
|
||||||
@ -128,7 +128,7 @@ void Star::PcP2PNetworkingService::setActivityData(String const& title, Maybe<pa
|
|||||||
m_discordUpdatingActivity = true;
|
m_discordUpdatingActivity = true;
|
||||||
m_state->discordCore->ActivityManager().UpdateActivity(activity, [this](discord::Result res) {
|
m_state->discordCore->ActivityManager().UpdateActivity(activity, [this](discord::Result res) {
|
||||||
if (res != discord::Result::Ok)
|
if (res != discord::Result::Ok)
|
||||||
Logger::error("failed to set discord activity (err %s)", (int)res);
|
Logger::error("failed to set discord activity (err {})", (int)res);
|
||||||
|
|
||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
m_discordUpdatingActivity = false;
|
m_discordUpdatingActivity = false;
|
||||||
@ -193,7 +193,7 @@ void Star::PcP2PNetworkingService::update() {
|
|||||||
|
|
||||||
m_state->discordCore->ActivityManager().SendRequestReply(p.first, reply, [](discord::Result res) {
|
m_state->discordCore->ActivityManager().SendRequestReply(p.first, reply, [](discord::Result res) {
|
||||||
if (res != discord::Result::Ok)
|
if (res != discord::Result::Ok)
|
||||||
Logger::error("Could not send discord activity join response (err %s)", (int)res);
|
Logger::error("Could not send discord activity join response (err {})", (int)res);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -230,17 +230,17 @@ Either<String, P2PSocketUPtr> PcP2PNetworkingService::connectToPeer(P2PNetworkin
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return makeLeft(strf("Unsupported peer type '%s'", type));
|
return makeLeft(strf("Unsupported peer type '{}'", type));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PcP2PNetworkingService::addPendingJoin(String connectionString) {
|
void PcP2PNetworkingService::addPendingJoin(String connectionString) {
|
||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
|
|
||||||
if (connectionString.extract(":") != "+platform")
|
if (connectionString.extract(":") != "+platform")
|
||||||
throw ApplicationException::format("malformed connection string '%s'", connectionString);
|
throw ApplicationException::format("malformed connection string '{}'", connectionString);
|
||||||
|
|
||||||
if (connectionString.extract(":") != "connect")
|
if (connectionString.extract(":") != "connect")
|
||||||
throw ApplicationException::format("malformed connection string '%s'", connectionString);
|
throw ApplicationException::format("malformed connection string '{}'", connectionString);
|
||||||
|
|
||||||
String target = move(connectionString);
|
String target = move(connectionString);
|
||||||
String targetType = target.extract("_");
|
String targetType = target.extract("_");
|
||||||
@ -248,7 +248,7 @@ void PcP2PNetworkingService::addPendingJoin(String connectionString) {
|
|||||||
if (targetType == "address")
|
if (targetType == "address")
|
||||||
m_pendingJoin = HostAddressWithPort(target);
|
m_pendingJoin = HostAddressWithPort(target);
|
||||||
else
|
else
|
||||||
m_pendingJoin = P2PNetworkingPeerId(strf("%s_%s", targetType, target));
|
m_pendingJoin = P2PNetworkingPeerId(strf("{}_{}", targetType, target));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STAR_ENABLE_STEAM_INTEGRATION
|
#ifdef STAR_ENABLE_STEAM_INTEGRATION
|
||||||
@ -312,7 +312,7 @@ auto PcP2PNetworkingService::createSteamP2PSocket(CSteamID steamId) -> unique_pt
|
|||||||
|
|
||||||
void PcP2PNetworkingService::steamOnConnectionFailure(P2PSessionConnectFail_t* callback) {
|
void PcP2PNetworkingService::steamOnConnectionFailure(P2PSessionConnectFail_t* callback) {
|
||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
Logger::warn("Connection with steam user %s failed", callback->m_steamIDRemote.ConvertToUint64());
|
Logger::warn("Connection with steam user {} failed", callback->m_steamIDRemote.ConvertToUint64());
|
||||||
if (auto socket = m_steamOpenSockets.value(callback->m_steamIDRemote.ConvertToUint64())) {
|
if (auto socket = m_steamOpenSockets.value(callback->m_steamIDRemote.ConvertToUint64())) {
|
||||||
MutexLocker socketLocker(socket->mutex);
|
MutexLocker socketLocker(socket->mutex);
|
||||||
steamCloseSocket(socket);
|
steamCloseSocket(socket);
|
||||||
@ -320,7 +320,7 @@ void PcP2PNetworkingService::steamOnConnectionFailure(P2PSessionConnectFail_t* c
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PcP2PNetworkingService::steamOnJoinRequested(GameRichPresenceJoinRequested_t* callback) {
|
void PcP2PNetworkingService::steamOnJoinRequested(GameRichPresenceJoinRequested_t* callback) {
|
||||||
Logger::info("Queueing join request with steam friend id %s to address %s", callback->m_steamIDFriend.ConvertToUint64(), callback->m_rgchConnect);
|
Logger::info("Queueing join request with steam friend id {} to address {}", callback->m_steamIDFriend.ConvertToUint64(), callback->m_rgchConnect);
|
||||||
addPendingJoin(callback->m_rgchConnect);
|
addPendingJoin(callback->m_rgchConnect);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,19 +330,19 @@ void PcP2PNetworkingService::steamOnSessionRequest(P2PSessionRequest_t* callback
|
|||||||
// non-friends can even initiate P2P sessions.
|
// non-friends can even initiate P2P sessions.
|
||||||
if (m_acceptingP2PConnections && SteamFriends()->HasFriend(callback->m_steamIDRemote, k_EFriendFlagImmediate)) {
|
if (m_acceptingP2PConnections && SteamFriends()->HasFriend(callback->m_steamIDRemote, k_EFriendFlagImmediate)) {
|
||||||
if (SteamNetworking()->AcceptP2PSessionWithUser(callback->m_steamIDRemote)) {
|
if (SteamNetworking()->AcceptP2PSessionWithUser(callback->m_steamIDRemote)) {
|
||||||
Logger::info("Accepted steam p2p connection with user %s", callback->m_steamIDRemote.ConvertToUint64());
|
Logger::info("Accepted steam p2p connection with user {}", callback->m_steamIDRemote.ConvertToUint64());
|
||||||
m_pendingIncomingConnections.append(createSteamP2PSocket(callback->m_steamIDRemote));
|
m_pendingIncomingConnections.append(createSteamP2PSocket(callback->m_steamIDRemote));
|
||||||
} else {
|
} else {
|
||||||
Logger::error("Accepting steam p2p connection from user %s failed!", callback->m_steamIDRemote.ConvertToUint64());
|
Logger::error("Accepting steam p2p connection from user {} failed!", callback->m_steamIDRemote.ConvertToUint64());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger::error("Ignoring steam p2p connection from user %s", callback->m_steamIDRemote.ConvertToUint64());
|
Logger::error("Ignoring steam p2p connection from user {}", callback->m_steamIDRemote.ConvertToUint64());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PcP2PNetworkingService::steamCloseSocket(SteamP2PSocket* socket) {
|
void PcP2PNetworkingService::steamCloseSocket(SteamP2PSocket* socket) {
|
||||||
if (socket->connected) {
|
if (socket->connected) {
|
||||||
Logger::info("Closing p2p connection with steam user %s", socket->steamId.ConvertToUint64());
|
Logger::info("Closing p2p connection with steam user {}", socket->steamId.ConvertToUint64());
|
||||||
m_steamOpenSockets.remove(socket->steamId.ConvertToUint64());
|
m_steamOpenSockets.remove(socket->steamId.ConvertToUint64());
|
||||||
socket->connected = false;
|
socket->connected = false;
|
||||||
}
|
}
|
||||||
@ -386,7 +386,7 @@ bool PcP2PNetworkingService::DiscordP2PSocket::sendMessage(ByteArray const& mess
|
|||||||
|
|
||||||
discord::Result res = parent->m_state->discordCore->LobbyManager().SendNetworkMessage(lobbyId, remoteUserId, DiscordMainNetworkChannel, (uint8_t*)message.ptr(), message.size());
|
discord::Result res = parent->m_state->discordCore->LobbyManager().SendNetworkMessage(lobbyId, remoteUserId, DiscordMainNetworkChannel, (uint8_t*)message.ptr(), message.size());
|
||||||
if (res != discord::Result::Ok)
|
if (res != discord::Result::Ok)
|
||||||
throw ApplicationException::format("discord::Network::Send returned error (err %s)", (int)res);
|
throw ApplicationException::format("discord::Network::Send returned error (err {})", (int)res);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -407,13 +407,13 @@ void PcP2PNetworkingService::discordCloseSocket(DiscordP2PSocket* socket) {
|
|||||||
if (!m_joinLocation.is<JoinLocal>() && m_discordOpenSockets.empty()) {
|
if (!m_joinLocation.is<JoinLocal>() && m_discordOpenSockets.empty()) {
|
||||||
auto res = m_state->discordCore->LobbyManager().DisconnectNetwork(socket->lobbyId);
|
auto res = m_state->discordCore->LobbyManager().DisconnectNetwork(socket->lobbyId);
|
||||||
if (res != discord::Result::Ok)
|
if (res != discord::Result::Ok)
|
||||||
Logger::error("failed to leave network for lobby %s (err %s)", socket->lobbyId, (int)res);
|
Logger::error("failed to leave network for lobby {} (err {})", socket->lobbyId, (int)res);
|
||||||
|
|
||||||
m_state->discordCore->LobbyManager().DisconnectLobby(socket->lobbyId, [this, lobbyId = socket->lobbyId](discord::Result res) {
|
m_state->discordCore->LobbyManager().DisconnectLobby(socket->lobbyId, [this, lobbyId = socket->lobbyId](discord::Result res) {
|
||||||
if (res != discord::Result::Ok)
|
if (res != discord::Result::Ok)
|
||||||
Logger::error("failed to leave discord lobby %s", lobbyId);
|
Logger::error("failed to leave discord lobby {}", lobbyId);
|
||||||
|
|
||||||
Logger::info("Left discord lobby %s", lobbyId);
|
Logger::info("Left discord lobby {}", lobbyId);
|
||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
m_discordServerLobby = {};
|
m_discordServerLobby = {};
|
||||||
m_discordForceUpdateActivity = true;
|
m_discordForceUpdateActivity = true;
|
||||||
@ -438,7 +438,7 @@ P2PSocketUPtr PcP2PNetworkingService::discordConnectRemote(discord::UserId remot
|
|||||||
socket->lobbyId = lobbyId;
|
socket->lobbyId = lobbyId;
|
||||||
m_discordOpenSockets[remoteUserId] = socket.get();
|
m_discordOpenSockets[remoteUserId] = socket.get();
|
||||||
|
|
||||||
Logger::info("Connect to discord lobby %s", lobbyId);
|
Logger::info("Connect to discord lobby {}", lobbyId);
|
||||||
m_state->discordCore->LobbyManager().ConnectLobby(lobbyId, lobbySecret.utf8Ptr(), [this, remoteUserId, lobbyId](discord::Result res, discord::Lobby const& lobby) {
|
m_state->discordCore->LobbyManager().ConnectLobby(lobbyId, lobbySecret.utf8Ptr(), [this, remoteUserId, lobbyId](discord::Result res, discord::Lobby const& lobby) {
|
||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
if (res == discord::Result::Ok) {
|
if (res == discord::Result::Ok) {
|
||||||
@ -448,25 +448,25 @@ P2PSocketUPtr PcP2PNetworkingService::discordConnectRemote(discord::UserId remot
|
|||||||
res = m_state->discordCore->LobbyManager().ConnectNetwork(lobbyId);
|
res = m_state->discordCore->LobbyManager().ConnectNetwork(lobbyId);
|
||||||
if (res != discord::Result::Ok) {
|
if (res != discord::Result::Ok) {
|
||||||
discordCloseSocket(socket);
|
discordCloseSocket(socket);
|
||||||
return Logger::error("Could not connect to discord lobby network (err %s)", (int)res);
|
return Logger::error("Could not connect to discord lobby network (err {})", (int)res);
|
||||||
}
|
}
|
||||||
|
|
||||||
res = m_state->discordCore->LobbyManager().OpenNetworkChannel(lobbyId, DiscordMainNetworkChannel, true);
|
res = m_state->discordCore->LobbyManager().OpenNetworkChannel(lobbyId, DiscordMainNetworkChannel, true);
|
||||||
if (res != discord::Result::Ok) {
|
if (res != discord::Result::Ok) {
|
||||||
discordCloseSocket(socket);
|
discordCloseSocket(socket);
|
||||||
return Logger::error("Could not open discord main network channel (err %s)", (int)res);
|
return Logger::error("Could not open discord main network channel (err {})", (int)res);
|
||||||
}
|
}
|
||||||
|
|
||||||
socket->mode = DiscordSocketMode::Connected;
|
socket->mode = DiscordSocketMode::Connected;
|
||||||
Logger::info("Discord p2p connection opened to remote user %s via lobby %s", remoteUserId, lobbyId);
|
Logger::info("Discord p2p connection opened to remote user {} via lobby {}", remoteUserId, lobbyId);
|
||||||
|
|
||||||
m_discordServerLobby = make_pair(lobbyId, String());
|
m_discordServerLobby = make_pair(lobbyId, String());
|
||||||
m_discordForceUpdateActivity = true;
|
m_discordForceUpdateActivity = true;
|
||||||
} else {
|
} else {
|
||||||
Logger::error("discord::Lobbies::Connect callback no matching remoteUserId %s found", remoteUserId);
|
Logger::error("discord::Lobbies::Connect callback no matching remoteUserId {} found", remoteUserId);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger::error("failed to connect to remote lobby (err %s)", (int)res);
|
Logger::error("failed to connect to remote lobby (err {})", (int)res);
|
||||||
if (auto socket = m_discordOpenSockets.value(remoteUserId)) {
|
if (auto socket = m_discordOpenSockets.value(remoteUserId)) {
|
||||||
MutexLocker socketLocker(socket->mutex);
|
MutexLocker socketLocker(socket->mutex);
|
||||||
discordCloseSocket(socket);
|
discordCloseSocket(socket);
|
||||||
@ -481,17 +481,17 @@ void PcP2PNetworkingService::discordOnReceiveMessage(discord::LobbyId lobbyId, d
|
|||||||
MutexLocker serviceLocker(m_mutex);
|
MutexLocker serviceLocker(m_mutex);
|
||||||
|
|
||||||
if (lobbyId != m_discordServerLobby->first)
|
if (lobbyId != m_discordServerLobby->first)
|
||||||
return Logger::error("Received message from unexpected lobby %s", lobbyId);
|
return Logger::error("Received message from unexpected lobby {}", lobbyId);
|
||||||
|
|
||||||
if (auto socket = m_discordOpenSockets.value(userId)) {
|
if (auto socket = m_discordOpenSockets.value(userId)) {
|
||||||
if (channel == DiscordMainNetworkChannel) {
|
if (channel == DiscordMainNetworkChannel) {
|
||||||
MutexLocker socketLocker(socket->mutex);
|
MutexLocker socketLocker(socket->mutex);
|
||||||
socket->incoming.append(ByteArray((char const*)data, size));
|
socket->incoming.append(ByteArray((char const*)data, size));
|
||||||
} else {
|
} else {
|
||||||
Logger::error("Received discord message on unexpected channel %s, ignoring", channel);
|
Logger::error("Received discord message on unexpected channel {}, ignoring", channel);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger::error("Could not find associated discord socket for user id %s", userId);
|
Logger::error("Could not find associated discord socket for user id {}", userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -508,7 +508,7 @@ void PcP2PNetworkingService::discordOnLobbyMemberConnect(discord::LobbyId lobbyI
|
|||||||
|
|
||||||
m_discordOpenSockets[userId] = socket.get();
|
m_discordOpenSockets[userId] = socket.get();
|
||||||
m_pendingIncomingConnections.append(move(socket));
|
m_pendingIncomingConnections.append(move(socket));
|
||||||
Logger::info("Accepted new discord connection from remote user %s", userId);
|
Logger::info("Accepted new discord connection from remote user {}", userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -548,13 +548,13 @@ void PcP2PNetworkingService::setJoinLocation(JoinLocation location) {
|
|||||||
|
|
||||||
} else if (m_joinLocation.is<JoinLocal>()) {
|
} else if (m_joinLocation.is<JoinLocal>()) {
|
||||||
auto steamId = SteamUser()->GetSteamID().ConvertToUint64();
|
auto steamId = SteamUser()->GetSteamID().ConvertToUint64();
|
||||||
Logger::info("Setting steam rich presence connection as steamid_%s", steamId);
|
Logger::info("Setting steam rich presence connection as steamid_{}", steamId);
|
||||||
SteamFriends()->SetRichPresence("connect", strf("+platform:connect:steamid_%s", steamId).c_str());
|
SteamFriends()->SetRichPresence("connect", strf("+platform:connect:steamid_{}", steamId).c_str());
|
||||||
|
|
||||||
} else if (m_joinLocation.is<JoinRemote>()) {
|
} else if (m_joinLocation.is<JoinRemote>()) {
|
||||||
auto address = (HostAddressWithPort)location.get<JoinRemote>();
|
auto address = (HostAddressWithPort)location.get<JoinRemote>();
|
||||||
Logger::info("Setting steam rich presence connection as address_%s", address);
|
Logger::info("Setting steam rich presence connection as address_{}", address);
|
||||||
SteamFriends()->SetRichPresence("connect", strf("+platform:connect:address_%s", address).c_str());
|
SteamFriends()->SetRichPresence("connect", strf("+platform:connect:address_{}", address).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -562,9 +562,9 @@ void PcP2PNetworkingService::setJoinLocation(JoinLocation location) {
|
|||||||
#ifdef STAR_ENABLE_DISCORD_INTEGRATION
|
#ifdef STAR_ENABLE_DISCORD_INTEGRATION
|
||||||
if (m_state->discordAvailable && m_state->discordCurrentUser) {
|
if (m_state->discordAvailable && m_state->discordCurrentUser) {
|
||||||
if (m_discordServerLobby) {
|
if (m_discordServerLobby) {
|
||||||
Logger::info("Deleting discord server lobby %s", m_discordServerLobby->first);
|
Logger::info("Deleting discord server lobby {}", m_discordServerLobby->first);
|
||||||
m_state->discordCore->LobbyManager().DeleteLobby(m_discordServerLobby->first, [](discord::Result res) {
|
m_state->discordCore->LobbyManager().DeleteLobby(m_discordServerLobby->first, [](discord::Result res) {
|
||||||
Logger::error("Could not connect delete server lobby (err %s)", (int)res);
|
Logger::error("Could not connect delete server lobby (err {})", (int)res);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -591,21 +591,21 @@ void PcP2PNetworkingService::setJoinLocation(JoinLocation location) {
|
|||||||
// successfully joined lobby network
|
// successfully joined lobby network
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
Logger::error("Failed to open discord main network channel (err %s)", (int)res);
|
Logger::error("Failed to open discord main network channel (err {})", (int)res);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Logger::error("Failed to join discord lobby network (err %s)", (int)res);
|
Logger::error("Failed to join discord lobby network (err {})", (int)res);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Created lobby but failed to join the lobby network, delete lobby
|
// Created lobby but failed to join the lobby network, delete lobby
|
||||||
Logger::error("Failed to join discord lobby network (err %s)", (int)res);
|
Logger::error("Failed to join discord lobby network (err {})", (int)res);
|
||||||
|
|
||||||
Logger::info("Deleting discord lobby %s", lobbyId);
|
Logger::info("Deleting discord lobby {}", lobbyId);
|
||||||
m_state->discordCore->LobbyManager().DeleteLobby(lobbyId, [lobbyId](discord::Result res) {
|
m_state->discordCore->LobbyManager().DeleteLobby(lobbyId, [lobbyId](discord::Result res) {
|
||||||
Logger::error("failed to delete lobby %s (err %s)", lobbyId, (int)res);
|
Logger::error("failed to delete lobby {} (err {})", lobbyId, (int)res);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
Logger::error("failed to create discord lobby (err %s)", (int)res);
|
Logger::error("failed to create discord lobby (err {})", (int)res);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -43,26 +43,26 @@ PcPlatformServicesState::PcPlatformServicesState()
|
|||||||
discord::User user;
|
discord::User user;
|
||||||
auto res = discordCore->UserManager().GetCurrentUser(&user);
|
auto res = discordCore->UserManager().GetCurrentUser(&user);
|
||||||
if (res != discord::Result::Ok)
|
if (res != discord::Result::Ok)
|
||||||
Logger::error("Could not get current discord user. (err %s)", (int)res);
|
Logger::error("Could not get current discord user. (err {})", (int)res);
|
||||||
else
|
else
|
||||||
discordCurrentUser = user;
|
discordCurrentUser = user;
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
Logger::error("Failed to instantiate discord core (err %s)", (int)res);
|
Logger::error("Failed to instantiate discord core (err {})", (int)res);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (discordAvailable) {
|
if (discordAvailable) {
|
||||||
MutexLocker locker(discordMutex);
|
MutexLocker locker(discordMutex);
|
||||||
discordCore->SetLogHook(discord::LogLevel::Info, [](discord::LogLevel level, char const* msg) {
|
discordCore->SetLogHook(discord::LogLevel::Info, [](discord::LogLevel level, char const* msg) {
|
||||||
if (level == discord::LogLevel::Debug)
|
if (level == discord::LogLevel::Debug)
|
||||||
Logger::debug("[DISCORD]: %s", msg);
|
Logger::debug("[DISCORD]: {}", msg);
|
||||||
else if (level == discord::LogLevel::Error)
|
else if (level == discord::LogLevel::Error)
|
||||||
Logger::debug("[DISCORD]: %s", msg);
|
Logger::debug("[DISCORD]: {}", msg);
|
||||||
else if (level == discord::LogLevel::Info)
|
else if (level == discord::LogLevel::Info)
|
||||||
Logger::info("[DISCORD]: %s", msg);
|
Logger::info("[DISCORD]: {}", msg);
|
||||||
else if (level == discord::LogLevel::Warn)
|
else if (level == discord::LogLevel::Warn)
|
||||||
Logger::warn("[DISCORD]: %s", msg);
|
Logger::warn("[DISCORD]: {}", msg);
|
||||||
});
|
});
|
||||||
discordEventShutdown = false;
|
discordEventShutdown = false;
|
||||||
discordEventThread = Thread::invoke("PcPlatformServices::discordEventThread", [this]() {
|
discordEventThread = Thread::invoke("PcPlatformServices::discordEventThread", [this]() {
|
||||||
@ -117,10 +117,10 @@ PcPlatformServicesUPtr PcPlatformServices::create(String const& path, StringList
|
|||||||
auto p2pNetworkingService = make_shared<PcP2PNetworkingService>(services->m_state);
|
auto p2pNetworkingService = make_shared<PcP2PNetworkingService>(services->m_state);
|
||||||
for (auto& argument : platformArguments) {
|
for (auto& argument : platformArguments) {
|
||||||
if (argument.beginsWith("+platform:connect:")) {
|
if (argument.beginsWith("+platform:connect:")) {
|
||||||
Logger::info("PC platform services joining from command line argument '%s'", argument);
|
Logger::info("PC platform services joining from command line argument '{}'", argument);
|
||||||
p2pNetworkingService->addPendingJoin(move(argument));
|
p2pNetworkingService->addPendingJoin(move(argument));
|
||||||
} else {
|
} else {
|
||||||
throw ApplicationException::format("Unrecognized PC platform services command line argument '%s'", argument);
|
throw ApplicationException::format("Unrecognized PC platform services command line argument '{}'", argument);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ PcPlatformServicesUPtr PcPlatformServices::create(String const& path, StringList
|
|||||||
#ifdef STAR_ENABLE_DISCORD_INTEGRATION
|
#ifdef STAR_ENABLE_DISCORD_INTEGRATION
|
||||||
MutexLocker discordLocker(services->m_state->discordMutex);
|
MutexLocker discordLocker(services->m_state->discordMutex);
|
||||||
if (services->m_state->discordAvailable) {
|
if (services->m_state->discordAvailable) {
|
||||||
Logger::debug("Registering starbound to discord at path: %s", path);
|
Logger::debug("Registering starbound to discord at path: {}", path);
|
||||||
services->m_state->discordCore->ActivityManager().RegisterCommand(path.utf8Ptr());
|
services->m_state->discordCore->ActivityManager().RegisterCommand(path.utf8Ptr());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -76,7 +76,7 @@ OpenGl20Renderer::OpenGl20Renderer() {
|
|||||||
if (!GLEW_VERSION_2_0)
|
if (!GLEW_VERSION_2_0)
|
||||||
throw RendererException("OpenGL 2.0 not available!");
|
throw RendererException("OpenGL 2.0 not available!");
|
||||||
|
|
||||||
Logger::info("OpenGL version: '%s' vendor: '%s' renderer: '%s' shader: '%s'",
|
Logger::info("OpenGL version: '{}' vendor: '{}' renderer: '{}' shader: '{}'",
|
||||||
(const char*)glGetString(GL_VERSION),
|
(const char*)glGetString(GL_VERSION),
|
||||||
(const char*)glGetString(GL_VENDOR),
|
(const char*)glGetString(GL_VENDOR),
|
||||||
(const char*)glGetString(GL_RENDERER),
|
(const char*)glGetString(GL_RENDERER),
|
||||||
@ -132,7 +132,7 @@ void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<Strin
|
|||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
glGetShaderInfoLog(shader, sizeof(logBuffer), NULL, logBuffer);
|
glGetShaderInfoLog(shader, sizeof(logBuffer), NULL, logBuffer);
|
||||||
throw RendererException(strf("Failed to compile %s shader: %s\n", name, logBuffer));
|
throw RendererException(strf("Failed to compile {} shader: {}\n", name, logBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
return shader;
|
return shader;
|
||||||
@ -158,7 +158,7 @@ void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<Strin
|
|||||||
if (!status) {
|
if (!status) {
|
||||||
glGetProgramInfoLog(program, sizeof(logBuffer), NULL, logBuffer);
|
glGetProgramInfoLog(program, sizeof(logBuffer), NULL, logBuffer);
|
||||||
glDeleteProgram(program);
|
glDeleteProgram(program);
|
||||||
throw RendererException(strf("Failed to link program: %s\n", logBuffer));
|
throw RendererException(strf("Failed to link program: {}\n", logBuffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_program != 0)
|
if (m_program != 0)
|
||||||
@ -175,8 +175,8 @@ void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<Strin
|
|||||||
m_textureUniforms.clear();
|
m_textureUniforms.clear();
|
||||||
m_textureSizeUniforms.clear();
|
m_textureSizeUniforms.clear();
|
||||||
for (size_t i = 0; i < MultiTextureCount; ++i) {
|
for (size_t i = 0; i < MultiTextureCount; ++i) {
|
||||||
m_textureUniforms.append(glGetUniformLocation(m_program, strf("texture%s", i).c_str()));
|
m_textureUniforms.append(glGetUniformLocation(m_program, strf("texture{}", i).c_str()));
|
||||||
m_textureSizeUniforms.append(glGetUniformLocation(m_program, strf("textureSize%s", i).c_str()));
|
m_textureSizeUniforms.append(glGetUniformLocation(m_program, strf("textureSize{}", i).c_str()));
|
||||||
}
|
}
|
||||||
m_screenSizeUniform = glGetUniformLocation(m_program, "screenSize");
|
m_screenSizeUniform = glGetUniformLocation(m_program, "screenSize");
|
||||||
m_vertexTransformUniform = glGetUniformLocation(m_program, "vertexTransform");
|
m_vertexTransformUniform = glGetUniformLocation(m_program, "vertexTransform");
|
||||||
@ -193,7 +193,7 @@ void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<Strin
|
|||||||
|
|
||||||
effectParameter.parameterUniform = glGetUniformLocation(m_program, p.second.getString("uniform").utf8Ptr());
|
effectParameter.parameterUniform = glGetUniformLocation(m_program, p.second.getString("uniform").utf8Ptr());
|
||||||
if (effectParameter.parameterUniform == -1) {
|
if (effectParameter.parameterUniform == -1) {
|
||||||
Logger::warn("OpenGL20 effect parameter '%s' has no associated uniform, skipping", p.first);
|
Logger::warn("OpenGL20 effect parameter '{}' has no associated uniform, skipping", p.first);
|
||||||
} else {
|
} else {
|
||||||
String type = p.second.getString("type");
|
String type = p.second.getString("type");
|
||||||
if (type == "bool") {
|
if (type == "bool") {
|
||||||
@ -209,7 +209,7 @@ void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<Strin
|
|||||||
} else if (type == "vec4") {
|
} else if (type == "vec4") {
|
||||||
effectParameter.parameterType = RenderEffectParameter::typeIndexOf<Vec4F>();
|
effectParameter.parameterType = RenderEffectParameter::typeIndexOf<Vec4F>();
|
||||||
} else {
|
} else {
|
||||||
throw RendererException::format("Unrecognized effect parameter type '%s'", type);
|
throw RendererException::format("Unrecognized effect parameter type '{}'", type);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_effectParameters[p.first] = effectParameter;
|
m_effectParameters[p.first] = effectParameter;
|
||||||
@ -243,7 +243,7 @@ void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<Strin
|
|||||||
EffectTexture effectTexture;
|
EffectTexture effectTexture;
|
||||||
effectTexture.textureUniform = glGetUniformLocation(m_program, p.second.getString("textureUniform").utf8Ptr());
|
effectTexture.textureUniform = glGetUniformLocation(m_program, p.second.getString("textureUniform").utf8Ptr());
|
||||||
if (effectTexture.textureUniform == -1) {
|
if (effectTexture.textureUniform == -1) {
|
||||||
Logger::warn("OpenGL20 effect parameter '%s' has no associated uniform, skipping", p.first);
|
Logger::warn("OpenGL20 effect parameter '{}' has no associated uniform, skipping", p.first);
|
||||||
} else {
|
} else {
|
||||||
effectTexture.textureUnit = parameterTextureUnit++;
|
effectTexture.textureUnit = parameterTextureUnit++;
|
||||||
glUniform1i(effectTexture.textureUniform, effectTexture.textureUnit);
|
glUniform1i(effectTexture.textureUniform, effectTexture.textureUnit);
|
||||||
@ -253,7 +253,7 @@ void OpenGl20Renderer::setEffectConfig(Json const& effectConfig, StringMap<Strin
|
|||||||
if (auto tsu = p.second.optString("textureSizeUniform")) {
|
if (auto tsu = p.second.optString("textureSizeUniform")) {
|
||||||
effectTexture.textureSizeUniform = glGetUniformLocation(m_program, tsu->utf8Ptr());
|
effectTexture.textureSizeUniform = glGetUniformLocation(m_program, tsu->utf8Ptr());
|
||||||
if (effectTexture.textureSizeUniform == -1)
|
if (effectTexture.textureSizeUniform == -1)
|
||||||
Logger::warn("OpenGL20 effect parameter '%s' has textureSizeUniform '%s' with no associated uniform", p.first, *tsu);
|
Logger::warn("OpenGL20 effect parameter '{}' has textureSizeUniform '{}' with no associated uniform", p.first, *tsu);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_effectTextures[p.first] = effectTexture;
|
m_effectTextures[p.first] = effectTexture;
|
||||||
@ -270,7 +270,7 @@ void OpenGl20Renderer::setEffectParameter(String const& parameterName, RenderEff
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (ptr->parameterType != value.typeIndex())
|
if (ptr->parameterType != value.typeIndex())
|
||||||
throw RendererException::format("OpenGL20Renderer::setEffectParameter '%s' parameter type mismatch", parameterName);
|
throw RendererException::format("OpenGL20Renderer::setEffectParameter '{}' parameter type mismatch", parameterName);
|
||||||
|
|
||||||
flushImmediatePrimitives();
|
flushImmediatePrimitives();
|
||||||
|
|
||||||
@ -354,7 +354,7 @@ TextureGroupPtr OpenGl20Renderer::createTextureGroup(TextureGroupSize textureSiz
|
|||||||
else // TextureGroupSize::Small
|
else // TextureGroupSize::Small
|
||||||
atlasNumCells = 64;
|
atlasNumCells = 64;
|
||||||
|
|
||||||
Logger::info("detected supported OpenGL texture size %s, using atlasNumCells %s", maxTextureSize, atlasNumCells);
|
Logger::info("detected supported OpenGL texture size {}, using atlasNumCells {}", maxTextureSize, atlasNumCells);
|
||||||
|
|
||||||
auto glTextureGroup = make_shared<GlTextureGroup>(atlasNumCells);
|
auto glTextureGroup = make_shared<GlTextureGroup>(atlasNumCells);
|
||||||
glTextureGroup->textureAtlasSet.textureFiltering = filtering;
|
glTextureGroup->textureAtlasSet.textureFiltering = filtering;
|
||||||
|
@ -52,7 +52,7 @@ bool SteamStatisticsService::reportEvent(String const&, Json const&) {
|
|||||||
|
|
||||||
bool SteamStatisticsService::unlockAchievement(String const& name) {
|
bool SteamStatisticsService::unlockAchievement(String const& name) {
|
||||||
if (!SteamUserStats()->SetAchievement(name.utf8Ptr())) {
|
if (!SteamUserStats()->SetAchievement(name.utf8Ptr())) {
|
||||||
Logger::error("Cannot set Steam achievement %s", name);
|
Logger::error("Cannot set Steam achievement {}", name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -94,7 +94,7 @@ void SteamStatisticsService::onUserStatsReceived(UserStatsReceived_t* callback)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (callback->m_eResult != k_EResultOK) {
|
if (callback->m_eResult != k_EResultOK) {
|
||||||
m_error = {strf("Steam RequestCurrentStats failed with code %d", (int)callback->m_eResult)};
|
m_error = {strf("Steam RequestCurrentStats failed with code {}", (int)callback->m_eResult)};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,14 +117,14 @@ void SteamStatisticsService::onUserStatsStored(UserStatsStored_t* callback) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_error = {strf("Steam StoreStats failed with code %d", (int)callback->m_eResult)};
|
m_error = {strf("Steam StoreStats failed with code {}", (int)callback->m_eResult)};
|
||||||
}
|
}
|
||||||
|
|
||||||
void SteamStatisticsService::onAchievementStored(UserAchievementStored_t* callback) {
|
void SteamStatisticsService::onAchievementStored(UserAchievementStored_t* callback) {
|
||||||
if (callback->m_nGameID != m_appId)
|
if (callback->m_nGameID != m_appId)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Logger::debug("Steam achievement %s stored successfully", callback->m_rgchAchievementName);
|
Logger::debug("Steam achievement {} stored successfully", callback->m_rgchAchievementName);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -231,7 +231,7 @@ AnimatedPartSet::AnimationMode AnimatedPartSet::stringToAnimationMode(String con
|
|||||||
} else if (string.equals("transition", String::CaseInsensitive)) {
|
} else if (string.equals("transition", String::CaseInsensitive)) {
|
||||||
return Transition;
|
return Transition;
|
||||||
} else {
|
} else {
|
||||||
throw AnimatedPartSetException(strf("No such AnimationMode '%s'", string));
|
throw AnimatedPartSetException(strf("No such AnimationMode '{}'", string));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ namespace Star {
|
|||||||
|
|
||||||
static void validatePath(AssetPath const& components, bool canContainSubPath, bool canContainDirectives) {
|
static void validatePath(AssetPath const& components, bool canContainSubPath, bool canContainDirectives) {
|
||||||
if (components.basePath.empty() || components.basePath[0] != '/')
|
if (components.basePath.empty() || components.basePath[0] != '/')
|
||||||
throw AssetException(strf("Path '%s' must be absolute", components.basePath));
|
throw AssetException(strf("Path '{}' must be absolute", components.basePath));
|
||||||
|
|
||||||
bool first = true;
|
bool first = true;
|
||||||
bool slashed = true;
|
bool slashed = true;
|
||||||
@ -31,19 +31,19 @@ static void validatePath(AssetPath const& components, bool canContainSubPath, bo
|
|||||||
if (c == '/') {
|
if (c == '/') {
|
||||||
if (!first) {
|
if (!first) {
|
||||||
if (slashed)
|
if (slashed)
|
||||||
throw AssetException(strf("Path '%s' contains consecutive //, not allowed", components.basePath));
|
throw AssetException(strf("Path '{}' contains consecutive //, not allowed", components.basePath));
|
||||||
else if (dotted)
|
else if (dotted)
|
||||||
throw AssetException(strf("Path '%s' '.' and '..' not allowed", components.basePath));
|
throw AssetException(strf("Path '{}' '.' and '..' not allowed", components.basePath));
|
||||||
}
|
}
|
||||||
slashed = true;
|
slashed = true;
|
||||||
dotted = false;
|
dotted = false;
|
||||||
} else if (c == ':') {
|
} else if (c == ':') {
|
||||||
if (slashed)
|
if (slashed)
|
||||||
throw AssetException(strf("Path '%s' has ':' after directory", components.basePath));
|
throw AssetException(strf("Path '{}' has ':' after directory", components.basePath));
|
||||||
break;
|
break;
|
||||||
} else if (c == '?') {
|
} else if (c == '?') {
|
||||||
if (slashed)
|
if (slashed)
|
||||||
throw AssetException(strf("Path '%s' has '?' after directory", components.basePath));
|
throw AssetException(strf("Path '{}' has '?' after directory", components.basePath));
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
slashed = false;
|
slashed = false;
|
||||||
@ -52,12 +52,12 @@ static void validatePath(AssetPath const& components, bool canContainSubPath, bo
|
|||||||
first = false;
|
first = false;
|
||||||
}
|
}
|
||||||
if (slashed)
|
if (slashed)
|
||||||
throw AssetException(strf("Path '%s' cannot be a file", components.basePath));
|
throw AssetException(strf("Path '{}' cannot be a file", components.basePath));
|
||||||
|
|
||||||
if (!canContainSubPath && components.subPath)
|
if (!canContainSubPath && components.subPath)
|
||||||
throw AssetException::format("Path '%s' cannot contain sub-path", components);
|
throw AssetException::format("Path '{}' cannot contain sub-path", components);
|
||||||
if (!canContainDirectives && !components.directives.empty())
|
if (!canContainDirectives && !components.directives.empty())
|
||||||
throw AssetException::format("Path '%s' cannot contain directives", components);
|
throw AssetException::format("Path '{}' cannot contain directives", components);
|
||||||
}
|
}
|
||||||
|
|
||||||
Maybe<RectU> FramesSpecification::getRect(String const& frame) const {
|
Maybe<RectU> FramesSpecification::getRect(String const& frame) const {
|
||||||
@ -76,7 +76,7 @@ Assets::Assets(Settings settings, StringList assetSources) {
|
|||||||
m_assetSources = move(assetSources);
|
m_assetSources = move(assetSources);
|
||||||
|
|
||||||
for (auto& sourcePath : m_assetSources) {
|
for (auto& sourcePath : m_assetSources) {
|
||||||
Logger::info("Loading assets from: '%s'", sourcePath);
|
Logger::info("Loading assets from: '{}'", sourcePath);
|
||||||
AssetSourcePtr source;
|
AssetSourcePtr source;
|
||||||
if (File::isDirectory(sourcePath))
|
if (File::isDirectory(sourcePath))
|
||||||
source = make_shared<DirectoryAssetSource>(sourcePath, m_settings.pathIgnore);
|
source = make_shared<DirectoryAssetSource>(sourcePath, m_settings.pathIgnore);
|
||||||
@ -168,7 +168,7 @@ String Assets::assetSource(String const& path) const {
|
|||||||
MutexLocker assetsLocker(m_assetsMutex);
|
MutexLocker assetsLocker(m_assetsMutex);
|
||||||
if (auto p = m_files.ptr(path))
|
if (auto p = m_files.ptr(path))
|
||||||
return m_assetSourcePaths.getLeft(p->source);
|
return m_assetSourcePaths.getLeft(p->source);
|
||||||
throw AssetException(strf("No such asset '%s'", path));
|
throw AssetException(strf("No such asset '{}'", path));
|
||||||
}
|
}
|
||||||
|
|
||||||
StringList Assets::scan(String const& suffix) const {
|
StringList Assets::scan(String const& suffix) const {
|
||||||
@ -384,7 +384,7 @@ FramesSpecification Assets::parseFramesSpecification(Json const& frameConfig, St
|
|||||||
RectU rect = RectU(jsonToRectI(pair.second));
|
RectU rect = RectU(jsonToRectI(pair.second));
|
||||||
if (rect.isEmpty())
|
if (rect.isEmpty())
|
||||||
throw AssetException(
|
throw AssetException(
|
||||||
strf("Empty rect in frame specification in image %s frame %s", framesSpecification.framesFile, frameName));
|
strf("Empty rect in frame specification in image {} frame {}", framesSpecification.framesFile, frameName));
|
||||||
else
|
else
|
||||||
framesSpecification.frames[frameName] = rect;
|
framesSpecification.frames[frameName] = rect;
|
||||||
}
|
}
|
||||||
@ -398,13 +398,13 @@ FramesSpecification Assets::parseFramesSpecification(Json const& frameConfig, St
|
|||||||
Vec2U dimensions(jsonToVec2I(grid.get("dimensions")));
|
Vec2U dimensions(jsonToVec2I(grid.get("dimensions")));
|
||||||
|
|
||||||
if (dimensions[0] == 0 || dimensions[1] == 0)
|
if (dimensions[0] == 0 || dimensions[1] == 0)
|
||||||
throw AssetException(strf("Image %s \"dimensions\" in frameGrid cannot be zero", framesSpecification.framesFile));
|
throw AssetException(strf("Image {} \"dimensions\" in frameGrid cannot be zero", framesSpecification.framesFile));
|
||||||
|
|
||||||
if (grid.contains("names")) {
|
if (grid.contains("names")) {
|
||||||
auto nameList = grid.get("names");
|
auto nameList = grid.get("names");
|
||||||
for (size_t y = 0; y < nameList.size(); ++y) {
|
for (size_t y = 0; y < nameList.size(); ++y) {
|
||||||
if (y >= dimensions[1])
|
if (y >= dimensions[1])
|
||||||
throw AssetException(strf("Image %s row %s is out of bounds for y-dimension %s",
|
throw AssetException(strf("Image {} row {} is out of bounds for y-dimension {}",
|
||||||
framesSpecification.framesFile,
|
framesSpecification.framesFile,
|
||||||
y + 1,
|
y + 1,
|
||||||
dimensions[1]));
|
dimensions[1]));
|
||||||
@ -413,7 +413,7 @@ FramesSpecification Assets::parseFramesSpecification(Json const& frameConfig, St
|
|||||||
continue;
|
continue;
|
||||||
for (unsigned x = 0; x < rowList.size(); ++x) {
|
for (unsigned x = 0; x < rowList.size(); ++x) {
|
||||||
if (x >= dimensions[0])
|
if (x >= dimensions[0])
|
||||||
throw AssetException(strf("Image %s column %s is out of bounds for x-dimension %s",
|
throw AssetException(strf("Image {} column {} is out of bounds for x-dimension {}",
|
||||||
framesSpecification.framesFile,
|
framesSpecification.framesFile,
|
||||||
x + 1,
|
x + 1,
|
||||||
dimensions[0]));
|
dimensions[0]));
|
||||||
@ -431,7 +431,7 @@ FramesSpecification Assets::parseFramesSpecification(Json const& frameConfig, St
|
|||||||
// If "names" not specified, use auto naming algorithm
|
// If "names" not specified, use auto naming algorithm
|
||||||
for (size_t y = 0; y < dimensions[1]; ++y)
|
for (size_t y = 0; y < dimensions[1]; ++y)
|
||||||
for (size_t x = 0; x < dimensions[0]; ++x)
|
for (size_t x = 0; x < dimensions[0]; ++x)
|
||||||
framesSpecification.frames[strf("%s", y * dimensions[0] + x)] =
|
framesSpecification.frames[strf("{}", y * dimensions[0] + x)] =
|
||||||
RectU::withSize(Vec2U(begin[0] + x * size[0], begin[1] + y * size[1]), size);
|
RectU::withSize(Vec2U(begin[0] + x * size[0], begin[1] + y * size[1]), size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -449,7 +449,7 @@ FramesSpecification Assets::parseFramesSpecification(Json const& frameConfig, St
|
|||||||
auto it = aliases->find(value);
|
auto it = aliases->find(value);
|
||||||
if (it != aliases->end()) {
|
if (it != aliases->end()) {
|
||||||
if (i == aliases->size())
|
if (i == aliases->size())
|
||||||
throw AssetException(strf("Infinite alias loop detected for alias '%s'", key));
|
throw AssetException(strf("Infinite alias loop detected for alias '{}'", key));
|
||||||
|
|
||||||
value = it->second.toString();
|
value = it->second.toString();
|
||||||
} else {
|
} else {
|
||||||
@ -458,7 +458,7 @@ FramesSpecification Assets::parseFramesSpecification(Json const& frameConfig, St
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!framesSpecification.frames.contains(value))
|
if (!framesSpecification.frames.contains(value))
|
||||||
throw AssetException(strf("No such frame '%s' found for alias '%s'", value, key));
|
throw AssetException(strf("No such frame '{}' found for alias '{}'", value, key));
|
||||||
framesSpecification.aliases[key] = move(value);
|
framesSpecification.aliases[key] = move(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -493,7 +493,7 @@ shared_ptr<Assets::AssetData> Assets::tryAsset(AssetId const& id) const {
|
|||||||
freshen(i->second);
|
freshen(i->second);
|
||||||
return i->second;
|
return i->second;
|
||||||
} else {
|
} else {
|
||||||
throw AssetException::format("Error loading asset %s", id.path);
|
throw AssetException::format("Error loading asset {}", id.path);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
auto j = m_queue.find(id);
|
auto j = m_queue.find(id);
|
||||||
@ -516,7 +516,7 @@ shared_ptr<Assets::AssetData> Assets::getAsset(AssetId const& id) const {
|
|||||||
freshen(asset);
|
freshen(asset);
|
||||||
return asset;
|
return asset;
|
||||||
} else {
|
} else {
|
||||||
throw AssetException::format("Error loading asset %s", id.path);
|
throw AssetException::format("Error loading asset {}", id.path);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Try to load the asset in-thread, if we cannot, then the asset has been
|
// Try to load the asset in-thread, if we cannot, then the asset has been
|
||||||
@ -648,13 +648,13 @@ FramesSpecificationConstPtr Assets::bestFramesSpecification(String const& image)
|
|||||||
IODevicePtr Assets::open(String const& path) const {
|
IODevicePtr Assets::open(String const& path) const {
|
||||||
if (auto p = m_files.ptr(path))
|
if (auto p = m_files.ptr(path))
|
||||||
return p->source->open(p->sourceName);
|
return p->source->open(p->sourceName);
|
||||||
throw AssetException(strf("No such asset '%s'", path));
|
throw AssetException(strf("No such asset '{}'", path));
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteArray Assets::read(String const& path) const {
|
ByteArray Assets::read(String const& path) const {
|
||||||
if (auto p = m_files.ptr(path))
|
if (auto p = m_files.ptr(path))
|
||||||
return p->source->read(p->sourceName);
|
return p->source->read(p->sourceName);
|
||||||
throw AssetException(strf("No such asset '%s'", path));
|
throw AssetException(strf("No such asset '{}'", path));
|
||||||
}
|
}
|
||||||
|
|
||||||
Json Assets::readJson(String const& path) const {
|
Json Assets::readJson(String const& path) const {
|
||||||
@ -673,21 +673,21 @@ Json Assets::readJson(String const& path) const {
|
|||||||
try {
|
try {
|
||||||
result = jsonPatch(result, patch.toArray());
|
result = jsonPatch(result, patch.toArray());
|
||||||
} catch (JsonPatchTestFail const& e) {
|
} catch (JsonPatchTestFail const& e) {
|
||||||
Logger::debug("Patch test failure from file %s in source: %s. Caused by: %s", pair.first, m_assetSourcePaths.getLeft(pair.second), e.what());
|
Logger::debug("Patch test failure from file {} in source: {}. Caused by: {}", pair.first, m_assetSourcePaths.getLeft(pair.second), e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (patchData.at(0).type() == Json::Type::Object) {
|
} else if (patchData.at(0).type() == Json::Type::Object) {
|
||||||
try {
|
try {
|
||||||
result = jsonPatch(result, patchData);
|
result = jsonPatch(result, patchData);
|
||||||
} catch (JsonPatchTestFail const& e) {
|
} catch (JsonPatchTestFail const& e) {
|
||||||
Logger::debug("Patch test failure from file %s in source: %s. Caused by: %s", pair.first, m_assetSourcePaths.getLeft(pair.second), e.what());
|
Logger::debug("Patch test failure from file {} in source: {}. Caused by: {}", pair.first, m_assetSourcePaths.getLeft(pair.second), e.what());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw JsonPatchException(strf("Patch data is wrong type: %s", Json::typeName(patchData.at(0).type())));
|
throw JsonPatchException(strf("Patch data is wrong type: {}", Json::typeName(patchData.at(0).type())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (JsonPatchException const& e) {
|
} catch (JsonPatchException const& e) {
|
||||||
Logger::error("Could not apply patch from file %s in source: %s. Caused by: %s", pair.first, m_assetSourcePaths.getLeft(pair.second), e.what());
|
Logger::error("Could not apply patch from file {} in source: {}. Caused by: {}", pair.first, m_assetSourcePaths.getLeft(pair.second), e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (patchJson.isType(Json::Type::Object)) { //Kae: Do a good ol' json merge instead if the .patch file is a Json object
|
else if (patchJson.isType(Json::Type::Object)) { //Kae: Do a good ol' json merge instead if the .patch file is a Json object
|
||||||
@ -697,7 +697,7 @@ Json Assets::readJson(String const& path) const {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
throw JsonParsingException(strf("Cannot parse json file: %s", path), e);
|
throw JsonParsingException(strf("Cannot parse json file: {}", path), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -707,9 +707,9 @@ bool Assets::doLoad(AssetId const& id) const {
|
|||||||
// data.
|
// data.
|
||||||
return (bool)loadAsset(id);
|
return (bool)loadAsset(id);
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
Logger::error("Exception caught loading asset: %s, %s", id.path, outputException(e, true));
|
Logger::error("Exception caught loading asset: {}, {}", id.path, outputException(e, true));
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
Logger::error("Unknown exception caught loading asset: %s", id.path);
|
Logger::error("Unknown exception caught loading asset: {}", id.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// There was an exception, remove the asset from the queue and fill the cache
|
// There was an exception, remove the asset from the queue and fill the cache
|
||||||
@ -727,9 +727,9 @@ bool Assets::doPost(AssetId const& id) const {
|
|||||||
if (id.type == AssetType::Audio)
|
if (id.type == AssetType::Audio)
|
||||||
assetData = postProcessAudio(assetData);
|
assetData = postProcessAudio(assetData);
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
Logger::error("Exception caught post-processing asset: %s, %s", id.path, outputException(e, true));
|
Logger::error("Exception caught post-processing asset: {}, {}", id.path, outputException(e, true));
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
Logger::error("Unknown exception caught post-processing asset: %s", id.path);
|
Logger::error("Unknown exception caught post-processing asset: {}", id.path);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_queue.remove(id);
|
m_queue.remove(id);
|
||||||
@ -769,10 +769,10 @@ shared_ptr<Assets::AssetData> Assets::loadAsset(AssetId const& id) const {
|
|||||||
|
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
if (id.type == AssetType::Image && m_settings.missingImage) {
|
if (id.type == AssetType::Image && m_settings.missingImage) {
|
||||||
Logger::error("Could not load image asset '%s', using placeholder default.\n%s", id.path, outputException(e, false));
|
Logger::error("Could not load image asset '{}', using placeholder default.\n{}", id.path, outputException(e, false));
|
||||||
assetData = loadImage({*m_settings.missingImage, {}, {}});
|
assetData = loadImage({*m_settings.missingImage, {}, {}});
|
||||||
} else if (id.type == AssetType::Audio && m_settings.missingAudio) {
|
} else if (id.type == AssetType::Audio && m_settings.missingAudio) {
|
||||||
Logger::error("Could not load audio asset '%s', using placeholder default.\n%s", id.path, outputException(e, false));
|
Logger::error("Could not load audio asset '{}', using placeholder default.\n{}", id.path, outputException(e, false));
|
||||||
assetData = loadAudio({*m_settings.missingAudio, {}, {}});
|
assetData = loadAudio({*m_settings.missingAudio, {}, {}});
|
||||||
} else {
|
} else {
|
||||||
throw;
|
throw;
|
||||||
@ -821,7 +821,7 @@ shared_ptr<Assets::AssetData> Assets::loadJson(AssetPath const& path) const {
|
|||||||
newData->json = topJson->json.query(*path.subPath);
|
newData->json = topJson->json.query(*path.subPath);
|
||||||
return newData;
|
return newData;
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
throw AssetException(strf("Could not read JSON value %s", path), e);
|
throw AssetException(strf("Could not read JSON value {}", path), e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return unlockDuring([&]() {
|
return unlockDuring([&]() {
|
||||||
@ -830,7 +830,7 @@ shared_ptr<Assets::AssetData> Assets::loadJson(AssetPath const& path) const {
|
|||||||
newData->json = readJson(path.basePath);
|
newData->json = readJson(path.basePath);
|
||||||
return newData;
|
return newData;
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
throw AssetException(strf("Could not read JSON asset %s", path), e);
|
throw AssetException(strf("Could not read JSON asset {}", path), e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -882,7 +882,7 @@ shared_ptr<Assets::AssetData> Assets::loadImage(AssetPath const& path) const {
|
|||||||
|
|
||||||
// Base image must have frames data associated with it.
|
// Base image must have frames data associated with it.
|
||||||
if (!imageData->frames)
|
if (!imageData->frames)
|
||||||
throw AssetException::format("No associated frames file found for image '%s' while resolving image frame '%s'", path.basePath, path);
|
throw AssetException::format("No associated frames file found for image '{}' while resolving image frame '{}'", path.basePath, path);
|
||||||
|
|
||||||
if (auto alias = imageData->frames->aliases.ptr(*path.subPath)) {
|
if (auto alias = imageData->frames->aliases.ptr(*path.subPath)) {
|
||||||
imageData = as<ImageData>(loadAsset(AssetId{AssetType::Image, {path.basePath, *alias, path.directives}}));
|
imageData = as<ImageData>(loadAsset(AssetId{AssetType::Image, {path.basePath, *alias, path.directives}}));
|
||||||
@ -897,7 +897,7 @@ shared_ptr<Assets::AssetData> Assets::loadImage(AssetPath const& path) const {
|
|||||||
} else {
|
} else {
|
||||||
auto frameRect = imageData->frames->frames.ptr(*path.subPath);
|
auto frameRect = imageData->frames->frames.ptr(*path.subPath);
|
||||||
if (!frameRect)
|
if (!frameRect)
|
||||||
throw AssetException(strf("No such frame %s in frames spec %s", *path.subPath, imageData->frames->framesFile));
|
throw AssetException(strf("No such frame {} in frames spec {}", *path.subPath, imageData->frames->framesFile));
|
||||||
|
|
||||||
return unlockDuring([&]() {
|
return unlockDuring([&]() {
|
||||||
// Need to flip frame coordinates because frame configs assume top
|
// Need to flip frame coordinates because frame configs assume top
|
||||||
|
@ -17,7 +17,7 @@ DirectoryAssetSource::DirectoryAssetSource(String const& baseDirectory, StringLi
|
|||||||
m_metadata = Json::parseJson(File::readFileString(metadataFile)).toObject();
|
m_metadata = Json::parseJson(File::readFileString(metadataFile)).toObject();
|
||||||
break;
|
break;
|
||||||
} catch (JsonException const& e) {
|
} catch (JsonException const& e) {
|
||||||
throw AssetSourceException(strf("Could not load metadata file '%s' from assets", metadataFile), e);
|
throw AssetSourceException(strf("Could not load metadata file '{}' from assets", metadataFile), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -52,7 +52,7 @@ ByteArray DirectoryAssetSource::read(String const& path) {
|
|||||||
|
|
||||||
String DirectoryAssetSource::toFilesystem(String const& path) const {
|
String DirectoryAssetSource::toFilesystem(String const& path) const {
|
||||||
if (!path.beginsWith("/"))
|
if (!path.beginsWith("/"))
|
||||||
throw AssetSourceException::format("Asset path '%s' must be absolute in DirectoryAssetSource::toFilesystem", path);
|
throw AssetSourceException::format("Asset path '{}' must be absolute in DirectoryAssetSource::toFilesystem", path);
|
||||||
else
|
else
|
||||||
return File::relativeTo(m_baseDirectory, File::convertDirSeparators(path.substr(1)));
|
return File::relativeTo(m_baseDirectory, File::convertDirSeparators(path.substr(1)));
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ IODevicePtr PackedAssetSource::open(String const& path) {
|
|||||||
|
|
||||||
auto p = m_index.ptr(path);
|
auto p = m_index.ptr(path);
|
||||||
if (!p)
|
if (!p)
|
||||||
throw AssetSourceException::format("Requested file '%s' does not exist in the packed assets file", path);
|
throw AssetSourceException::format("Requested file '{}' does not exist in the packed assets file", path);
|
||||||
|
|
||||||
return make_shared<AssetReader>(m_packedFile, p->first, p->second);
|
return make_shared<AssetReader>(m_packedFile, p->first, p->second);
|
||||||
}
|
}
|
||||||
@ -148,7 +148,7 @@ IODevicePtr PackedAssetSource::open(String const& path) {
|
|||||||
ByteArray PackedAssetSource::read(String const& path) {
|
ByteArray PackedAssetSource::read(String const& path) {
|
||||||
auto p = m_index.ptr(path);
|
auto p = m_index.ptr(path);
|
||||||
if (!p)
|
if (!p)
|
||||||
throw AssetSourceException::format("Requested file '%s' does not exist in the packed assets file", path);
|
throw AssetSourceException::format("Requested file '{}' does not exist in the packed assets file", path);
|
||||||
|
|
||||||
ByteArray data(p->second, 0);
|
ByteArray data(p->second, 0);
|
||||||
m_packedFile->readFullAbsolute(p->first, data.ptr(), p->second);
|
m_packedFile->readFullAbsolute(p->first, data.ptr(), p->second);
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
namespace Star {
|
namespace Star {
|
||||||
|
|
||||||
void VersionOptionParser::printVersion(std::ostream& os) {
|
void VersionOptionParser::printVersion(std::ostream& os) {
|
||||||
format(os, "Starbound Version %s (%s)\n", StarVersionString, StarArchitectureString);
|
format(os, "Starbound Version {} ({})\n", StarVersionString, StarArchitectureString);
|
||||||
format(os, "Source Identifier - %s\n", StarSourceIdentifierString);
|
format(os, "Source Identifier - {}\n", StarSourceIdentifierString);
|
||||||
}
|
}
|
||||||
|
|
||||||
VersionOptionParser::VersionOptionParser() {
|
VersionOptionParser::VersionOptionParser() {
|
||||||
@ -29,7 +29,7 @@ VersionOptionParser::Options VersionOptionParser::parseOrDie(StringList const& c
|
|||||||
|
|
||||||
if (!errors.empty()) {
|
if (!errors.empty()) {
|
||||||
for (auto const& err : errors)
|
for (auto const& err : errors)
|
||||||
coutf("Error: %s\n", err);
|
coutf("Error: {}\n", err);
|
||||||
coutf("\n");
|
coutf("\n");
|
||||||
printHelp(std::cout);
|
printHelp(std::cout);
|
||||||
std::exit(1);
|
std::exit(1);
|
||||||
|
@ -127,7 +127,7 @@ void ClientApplication::startup(StringList const& cmdLineArgs) {
|
|||||||
RootLoader rootLoader({AdditionalAssetsSettings, AdditionalDefaultConfiguration, String("starbound.log"), LogLevel::Info, false, String("starbound.config")});
|
RootLoader rootLoader({AdditionalAssetsSettings, AdditionalDefaultConfiguration, String("starbound.log"), LogLevel::Info, false, String("starbound.config")});
|
||||||
m_root = rootLoader.initOrDie(cmdLineArgs).first;
|
m_root = rootLoader.initOrDie(cmdLineArgs).first;
|
||||||
|
|
||||||
Logger::info("Client Version %s (%s) Source ID: %s Protocol: %s", StarVersionString, StarArchitectureString, StarSourceIdentifierString, StarProtocolVersion);
|
Logger::info("Client Version {} ({}) Source ID: {} Protocol: {}", StarVersionString, StarArchitectureString, StarSourceIdentifierString, StarProtocolVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::shutdown() {
|
void ClientApplication::shutdown() {
|
||||||
@ -198,7 +198,7 @@ void ClientApplication::renderInit(RendererPtr renderer) {
|
|||||||
Application::renderInit(renderer);
|
Application::renderInit(renderer);
|
||||||
auto assets = m_root->assets();
|
auto assets = m_root->assets();
|
||||||
|
|
||||||
String rendererConfig = strf("/rendering/%s.config", renderer->rendererId());
|
String rendererConfig = strf("/rendering/{}.config", renderer->rendererId());
|
||||||
if (assets->assetExists(rendererConfig)) {
|
if (assets->assetExists(rendererConfig)) {
|
||||||
StringMap<String> shaders;
|
StringMap<String> shaders;
|
||||||
auto config = assets->json(rendererConfig);
|
auto config = assets->json(rendererConfig);
|
||||||
@ -216,7 +216,7 @@ void ClientApplication::renderInit(RendererPtr renderer) {
|
|||||||
renderer->setEffectConfig(config, shaders);
|
renderer->setEffectConfig(config, shaders);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Logger::warn("No rendering config found for renderer with id '%s'", renderer->rendererId());
|
Logger::warn("No rendering config found for renderer with id '{}'", renderer->rendererId());
|
||||||
|
|
||||||
if (m_root->configuration()->get("limitTextureAtlasSize").optBool().value(false))
|
if (m_root->configuration()->get("limitTextureAtlasSize").optBool().value(false))
|
||||||
renderer->setSizeLimitEnabled(true);
|
renderer->setSizeLimitEnabled(true);
|
||||||
@ -489,7 +489,7 @@ void ClientApplication::changeState(MainAppState newState) {
|
|||||||
try {
|
try {
|
||||||
packetSocket = TcpPacketSocket::open(TcpSocket::connectTo(*address));
|
packetSocket = TcpPacketSocket::open(TcpSocket::connectTo(*address));
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
setError(strf("Join failed! Error connecting to '%s'", *address), e);
|
setError(strf("Join failed! Error connecting to '{}'", *address), e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,7 +499,7 @@ void ClientApplication::changeState(MainAppState newState) {
|
|||||||
if (auto p2pNetworkingService = appController()->p2pNetworkingService()) {
|
if (auto p2pNetworkingService = appController()->p2pNetworkingService()) {
|
||||||
auto result = p2pNetworkingService->connectToPeer(*p2pPeerId);
|
auto result = p2pNetworkingService->connectToPeer(*p2pPeerId);
|
||||||
if (result.isLeft()) {
|
if (result.isLeft()) {
|
||||||
setError(strf("Cannot join peer: %s", result.left()));
|
setError(strf("Cannot join peer: {}", result.left()));
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
packetSocket = P2PPacketSocket::open(move(result.right()));
|
packetSocket = P2PPacketSocket::open(move(result.right()));
|
||||||
@ -534,7 +534,7 @@ void ClientApplication::changeState(MainAppState newState) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (auto errorMessage = m_universeClient->connect(m_universeServer->addLocalClient(), "", "")) {
|
if (auto errorMessage = m_universeClient->connect(m_universeServer->addLocalClient(), "", "")) {
|
||||||
setError(strf("Error connecting locally: %s", *errorMessage));
|
setError(strf("Error connecting locally: {}", *errorMessage));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -558,8 +558,8 @@ void ClientApplication::setError(String const& error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::setError(String const& error, std::exception const& e) {
|
void ClientApplication::setError(String const& error, std::exception const& e) {
|
||||||
Logger::error("%s\n%s", error, outputException(e, true));
|
Logger::error("{}\n{}", error, outputException(e, true));
|
||||||
m_errorScreen->setMessage(strf("%s\n%s", error, outputException(e, false)));
|
m_errorScreen->setMessage(strf("{}\n{}", error, outputException(e, false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientApplication::updateMods() {
|
void ClientApplication::updateMods() {
|
||||||
@ -570,10 +570,10 @@ void ClientApplication::updateMods() {
|
|||||||
StringList modDirectories;
|
StringList modDirectories;
|
||||||
for (auto contentId : ugcService->subscribedContentIds()) {
|
for (auto contentId : ugcService->subscribedContentIds()) {
|
||||||
if (auto contentDirectory = ugcService->contentDownloadDirectory(contentId)) {
|
if (auto contentDirectory = ugcService->contentDownloadDirectory(contentId)) {
|
||||||
Logger::info("Loading mods from user generated content with id '%s' from directory '%s'", contentId, *contentDirectory);
|
Logger::info("Loading mods from user generated content with id '{}' from directory '{}'", contentId, *contentDirectory);
|
||||||
modDirectories.append(*contentDirectory);
|
modDirectories.append(*contentDirectory);
|
||||||
} else {
|
} else {
|
||||||
Logger::warn("User generated content with id '%s' is not available", contentId);
|
Logger::warn("User generated content with id '{}' is not available", contentId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -656,7 +656,7 @@ void ClientApplication::updateTitle() {
|
|||||||
changeState(MainAppState::MultiPlayer);
|
changeState(MainAppState::MultiPlayer);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
setError(strf("invalid port: %s", portString));
|
setError(strf("invalid port: {}", portString));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
changeState(MainAppState::MultiPlayer);
|
changeState(MainAppState::MultiPlayer);
|
||||||
@ -760,7 +760,7 @@ void ClientApplication::updateRunning() {
|
|||||||
m_cinematicOverlay->stop();
|
m_cinematicOverlay->stop();
|
||||||
String errMessage;
|
String errMessage;
|
||||||
if (auto disconnectReason = m_universeClient->disconnectReason())
|
if (auto disconnectReason = m_universeClient->disconnectReason())
|
||||||
errMessage = strf("You were disconnected from the server for the following reason:\n%s", *disconnectReason);
|
errMessage = strf("You were disconnected from the server for the following reason:\n{}", *disconnectReason);
|
||||||
else
|
else
|
||||||
errMessage = "Client-server connection no longer valid!";
|
errMessage = "Client-server connection no longer valid!";
|
||||||
setError(errMessage);
|
setError(errMessage);
|
||||||
@ -805,12 +805,12 @@ void ClientApplication::updateRunning() {
|
|||||||
Vec2F aimPosition = m_player->aimPosition();
|
Vec2F aimPosition = m_player->aimPosition();
|
||||||
LogMap::set("render_fps", appController()->renderFps());
|
LogMap::set("render_fps", appController()->renderFps());
|
||||||
LogMap::set("update_rate", appController()->updateRate());
|
LogMap::set("update_rate", appController()->updateRate());
|
||||||
LogMap::set("player_pos", strf("%4.2f %4.2f", m_player->position()[0], m_player->position()[1]));
|
LogMap::set("player_pos", strf("{:4.2f} {:4.2f}", m_player->position()[0], m_player->position()[1]));
|
||||||
LogMap::set("player_vel", strf("%4.2f %4.2f", m_player->velocity()[0], m_player->velocity()[1]));
|
LogMap::set("player_vel", strf("{:4.2f} {:4.2f}", m_player->velocity()[0], m_player->velocity()[1]));
|
||||||
LogMap::set("player_aim", strf("%4.2f %4.2f", aimPosition[0], aimPosition[1]));
|
LogMap::set("player_aim", strf("{:4.2f} {:4.2f}", aimPosition[0], aimPosition[1]));
|
||||||
if (m_universeClient->worldClient()) {
|
if (m_universeClient->worldClient()) {
|
||||||
LogMap::set("liquid_level", strf("%d", m_universeClient->worldClient()->liquidLevel(Vec2I::floor(aimPosition)).level));
|
LogMap::set("liquid_level", strf("{}", m_universeClient->worldClient()->liquidLevel(Vec2I::floor(aimPosition)).level));
|
||||||
LogMap::set("dungeonId", strf("%d", m_universeClient->worldClient()->dungeonId(Vec2I::floor(aimPosition))));
|
LogMap::set("dungeonId", strf("{}", m_universeClient->worldClient()->dungeonId(Vec2I::floor(aimPosition))));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_mainInterface->currentState() == MainInterface::ReturnToTitle)
|
if (m_mainInterface->currentState() == MainInterface::ReturnToTitle)
|
||||||
|
@ -59,13 +59,13 @@ namespace {
|
|||||||
uint32_t fileSize = readLEType<uint32_t>(device);
|
uint32_t fileSize = readLEType<uint32_t>(device);
|
||||||
fileSize += sigLength + sizeof(fileSize);
|
fileSize += sigLength + sizeof(fileSize);
|
||||||
if (fileSize != device->size())
|
if (fileSize != device->size())
|
||||||
throw AudioException(strf("Wav file is wrong size, reports %d is actually %d", fileSize, device->size()));
|
throw AudioException(strf("Wav file is wrong size, reports {} is actually {}", fileSize, device->size()));
|
||||||
|
|
||||||
device->readFull(waveSig.get(), sigLength);
|
device->readFull(waveSig.get(), sigLength);
|
||||||
|
|
||||||
if ((strcmp(riffSig.get(), "RIFF") != 0) || (strcmp(waveSig.get(), "WAVE") != 0)) { // bytes are not magic
|
if ((strcmp(riffSig.get(), "RIFF") != 0) || (strcmp(waveSig.get(), "WAVE") != 0)) { // bytes are not magic
|
||||||
auto p = [](char a) { return isprint(a) ? a : '?'; };
|
auto p = [](char a) { return isprint(a) ? a : '?'; };
|
||||||
throw AudioException(strf("Wav file has wrong magic bytes, got `%c%c%c%c' and `%c%c%c%c' but expected `RIFF' and `WAVE'",
|
throw AudioException(strf("Wav file has wrong magic bytes, got `{}{}{}{}' and `{}{}{}{}' but expected `RIFF' and `WAVE'",
|
||||||
p(riffSig[0]), p(riffSig[1]), p(riffSig[2]), p(riffSig[3]), p(waveSig[0]), p(waveSig[1]), p(waveSig[2]), p(waveSig[3])));
|
p(riffSig[0]), p(riffSig[1]), p(riffSig[2]), p(riffSig[3]), p(waveSig[0]), p(waveSig[1]), p(waveSig[2]), p(waveSig[3])));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ namespace {
|
|||||||
device->readFull(fmtSig.get(), sigLength);
|
device->readFull(fmtSig.get(), sigLength);
|
||||||
if (strcmp(fmtSig.get(), "fmt ") != 0) { // friendship is magic
|
if (strcmp(fmtSig.get(), "fmt ") != 0) { // friendship is magic
|
||||||
auto p = [](char a) { return isprint(a) ? a : '?'; };
|
auto p = [](char a) { return isprint(a) ? a : '?'; };
|
||||||
throw AudioException(strf("Wav file fmt subchunk has wrong magic bytes, got `%c%c%c%c' but expected `fmt '",
|
throw AudioException(strf("Wav file fmt subchunk has wrong magic bytes, got `{}{}{}{}' but expected `fmt '",
|
||||||
p(fmtSig[0]),
|
p(fmtSig[0]),
|
||||||
p(fmtSig[1]),
|
p(fmtSig[1]),
|
||||||
p(fmtSig[2]),
|
p(fmtSig[2]),
|
||||||
@ -84,7 +84,7 @@ namespace {
|
|||||||
uint32_t fmtSubchunkSize = readLEType<uint32_t>(device);
|
uint32_t fmtSubchunkSize = readLEType<uint32_t>(device);
|
||||||
fmtSubchunkSize += sigLength;
|
fmtSubchunkSize += sigLength;
|
||||||
if (fmtSubchunkSize < 20)
|
if (fmtSubchunkSize < 20)
|
||||||
throw AudioException(strf("fmt subchunk is sized wrong, expected 20 got %d. Is this wav file not PCM?", fmtSubchunkSize));
|
throw AudioException(strf("fmt subchunk is sized wrong, expected 20 got {}. Is this wav file not PCM?", fmtSubchunkSize));
|
||||||
|
|
||||||
uint16_t audioFormat = readLEType<uint16_t>(device);
|
uint16_t audioFormat = readLEType<uint16_t>(device);
|
||||||
if (audioFormat != 1)
|
if (audioFormat != 1)
|
||||||
@ -110,14 +110,14 @@ namespace {
|
|||||||
device->readFull(dataSig.get(), sigLength);
|
device->readFull(dataSig.get(), sigLength);
|
||||||
if (strcmp(dataSig.get(), "data") != 0) { // magic or more magic?
|
if (strcmp(dataSig.get(), "data") != 0) { // magic or more magic?
|
||||||
auto p = [](char a) { return isprint(a) ? a : '?'; };
|
auto p = [](char a) { return isprint(a) ? a : '?'; };
|
||||||
throw AudioException(strf("Wav file data subchunk has wrong magic bytes, got `%c%c%c%c' but expected `data'",
|
throw AudioException(strf("Wav file data subchunk has wrong magic bytes, got `{}{}{}{}' but expected `data'",
|
||||||
p(dataSig[0]), p(dataSig[1]), p(dataSig[2]), p(dataSig[3])));
|
p(dataSig[0]), p(dataSig[1]), p(dataSig[2]), p(dataSig[3])));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t wavDataSize = readLEType<uint32_t>(device);
|
uint32_t wavDataSize = readLEType<uint32_t>(device);
|
||||||
size_t wavDataOffset = (size_t)device->pos();
|
size_t wavDataOffset = (size_t)device->pos();
|
||||||
if (wavDataSize + wavDataOffset > (size_t)device->size()) {
|
if (wavDataSize + wavDataOffset > (size_t)device->size()) {
|
||||||
throw AudioException(strf("Wav file data size reported is inconsistent with file size, got %d but expected %d",
|
throw AudioException(strf("Wav file data size reported is inconsistent with file size, got {} but expected {}",
|
||||||
device->size(), wavDataSize + wavDataOffset));
|
device->size(), wavDataSize + wavDataOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -886,7 +886,7 @@ void BTreeDatabase::updateBlock(BlockIndex blockIndex, ByteArray const& block) {
|
|||||||
|
|
||||||
void BTreeDatabase::rawReadBlock(BlockIndex blockIndex, size_t blockOffset, char* block, size_t size) const {
|
void BTreeDatabase::rawReadBlock(BlockIndex blockIndex, size_t blockOffset, char* block, size_t size) const {
|
||||||
if (blockOffset > m_blockSize || size > m_blockSize - blockOffset)
|
if (blockOffset > m_blockSize || size > m_blockSize - blockOffset)
|
||||||
throw DBException::format("Read past end of block, offset: %s size %s", blockOffset, size);
|
throw DBException::format("Read past end of block, offset: {} size {}", blockOffset, size);
|
||||||
|
|
||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
return;
|
return;
|
||||||
@ -896,7 +896,7 @@ void BTreeDatabase::rawReadBlock(BlockIndex blockIndex, size_t blockOffset, char
|
|||||||
|
|
||||||
void BTreeDatabase::rawWriteBlock(BlockIndex blockIndex, size_t blockOffset, char const* block, size_t size) const {
|
void BTreeDatabase::rawWriteBlock(BlockIndex blockIndex, size_t blockOffset, char const* block, size_t size) const {
|
||||||
if (blockOffset > m_blockSize || size > m_blockSize - blockOffset)
|
if (blockOffset > m_blockSize || size > m_blockSize - blockOffset)
|
||||||
throw DBException::format("Write past end of block, offset: %s size %s", blockOffset, size);
|
throw DBException::format("Write past end of block, offset: {} size {}", blockOffset, size);
|
||||||
|
|
||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
return;
|
return;
|
||||||
@ -910,7 +910,7 @@ auto BTreeDatabase::readFreeIndexBlock(BlockIndex blockIndex) -> FreeIndexBlock
|
|||||||
ByteArray magic(2, 0);
|
ByteArray magic(2, 0);
|
||||||
rawReadBlock(blockIndex, 0, magic.ptr(), 2);
|
rawReadBlock(blockIndex, 0, magic.ptr(), 2);
|
||||||
if (magic != ByteArray(FreeIndexMagic, 2))
|
if (magic != ByteArray(FreeIndexMagic, 2))
|
||||||
throw DBException::format("Internal exception! block %s missing free index block marker!", blockIndex);
|
throw DBException::format("Internal exception! block {} missing free index block marker!", blockIndex);
|
||||||
|
|
||||||
FreeIndexBlock freeIndexBlock;
|
FreeIndexBlock freeIndexBlock;
|
||||||
DataStreamBuffer buffer(max(sizeof(BlockIndex), (size_t)4));
|
DataStreamBuffer buffer(max(sizeof(BlockIndex), (size_t)4));
|
||||||
@ -1124,20 +1124,20 @@ void BTreeDatabase::doCommit() {
|
|||||||
|
|
||||||
void BTreeDatabase::checkIfOpen(char const* methodName, bool shouldBeOpen) const {
|
void BTreeDatabase::checkIfOpen(char const* methodName, bool shouldBeOpen) const {
|
||||||
if (shouldBeOpen && !m_open)
|
if (shouldBeOpen && !m_open)
|
||||||
throw DBException::format("BTreeDatabase method '%s' called when not open, must be open.", methodName);
|
throw DBException::format("BTreeDatabase method '{}' called when not open, must be open.", methodName);
|
||||||
else if (!shouldBeOpen && m_open)
|
else if (!shouldBeOpen && m_open)
|
||||||
throw DBException::format("BTreeDatabase method '%s' called when open, cannot call when open.", methodName);
|
throw DBException::format("BTreeDatabase method '{}' called when open, cannot call when open.", methodName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BTreeDatabase::checkBlockIndex(size_t blockIndex) const {
|
void BTreeDatabase::checkBlockIndex(size_t blockIndex) const {
|
||||||
BlockIndex blockCount = (m_deviceSize - HeaderSize) / m_blockSize;
|
BlockIndex blockCount = (m_deviceSize - HeaderSize) / m_blockSize;
|
||||||
if (blockIndex >= blockCount)
|
if (blockIndex >= blockCount)
|
||||||
throw DBException::format("blockIndex: %s out of block range", blockIndex);
|
throw DBException::format("blockIndex: {} out of block range", blockIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BTreeDatabase::checkKeySize(ByteArray const& k) const {
|
void BTreeDatabase::checkKeySize(ByteArray const& k) const {
|
||||||
if (k.size() != m_keySize)
|
if (k.size() != m_keySize)
|
||||||
throw DBException::format("Wrong key size %s", k.size());
|
throw DBException::format("Wrong key size {}", k.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t BTreeDatabase::maxFreeIndexLength() const {
|
uint32_t BTreeDatabase::maxFreeIndexLength() const {
|
||||||
|
@ -179,7 +179,7 @@ template <typename LeftT, typename RightT, typename LeftMapT, typename RightMapT
|
|||||||
BiMap<LeftT, RightT, LeftMapT, RightMapT>::BiMap(std::initializer_list<value_type> list) {
|
BiMap<LeftT, RightT, LeftMapT, RightMapT>::BiMap(std::initializer_list<value_type> list) {
|
||||||
for (value_type const& v : list) {
|
for (value_type const& v : list) {
|
||||||
if (!insert(v.first, v.second))
|
if (!insert(v.first, v.second))
|
||||||
throw MapException::format("Repeat pair in BiMap initializer_list construction: (%s, %s)", outputAny(v.first), outputAny(v.second));
|
throw MapException::format("Repeat pair in BiMap initializer_list construction: ({}, {})", outputAny(v.first), outputAny(v.second));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,10 +324,10 @@ bool BiMap<LeftT, RightT, LeftMapT, RightMapT>::insert(Left const& left, Right c
|
|||||||
template <typename LeftT, typename RightT, typename LeftMapT, typename RightMapT>
|
template <typename LeftT, typename RightT, typename LeftMapT, typename RightMapT>
|
||||||
void BiMap<LeftT, RightT, LeftMapT, RightMapT>::add(Left const& left, Right const& right) {
|
void BiMap<LeftT, RightT, LeftMapT, RightMapT>::add(Left const& left, Right const& right) {
|
||||||
if (m_leftMap.contains(left))
|
if (m_leftMap.contains(left))
|
||||||
throw MapException(strf("BiMap already contains left side value '%s'", outputAny(left)));
|
throw MapException(strf("BiMap already contains left side value '{}'", outputAny(left)));
|
||||||
|
|
||||||
if (m_rightMap.contains(right))
|
if (m_rightMap.contains(right))
|
||||||
throw MapException(strf("BiMap already contains right side value '%s'", outputAny(right)));
|
throw MapException(strf("BiMap already contains right side value '{}'", outputAny(right)));
|
||||||
|
|
||||||
insert(left, right);
|
insert(left, right);
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ void Buffer::open(IOMode mode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String Buffer::deviceName() const {
|
String Buffer::deviceName() const {
|
||||||
return strf("Buffer <%s>", (void*)this);
|
return strf("Buffer <{}>", (void*)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamOffset Buffer::size() {
|
StreamOffset Buffer::size() {
|
||||||
@ -244,7 +244,7 @@ size_t ExternalBuffer::writeAbsolute(StreamOffset, char const*, size_t) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String ExternalBuffer::deviceName() const {
|
String ExternalBuffer::deviceName() const {
|
||||||
return strf("ExternalBuffer <%s>", (void*)this);
|
return strf("ExternalBuffer <{}>", (void*)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamOffset ExternalBuffer::size() {
|
StreamOffset ExternalBuffer::size() {
|
||||||
|
@ -85,14 +85,14 @@ void ByteArray::reserve(size_t newCapacity) {
|
|||||||
if (!m_data) {
|
if (!m_data) {
|
||||||
auto newMem = (char*)Star::malloc(newCapacity);
|
auto newMem = (char*)Star::malloc(newCapacity);
|
||||||
if (!newMem)
|
if (!newMem)
|
||||||
throw MemoryException::format("Could not set new ByteArray capacity %s\n", newCapacity);
|
throw MemoryException::format("Could not set new ByteArray capacity {}\n", newCapacity);
|
||||||
m_data = newMem;
|
m_data = newMem;
|
||||||
m_capacity = newCapacity;
|
m_capacity = newCapacity;
|
||||||
} else {
|
} else {
|
||||||
newCapacity = max({m_capacity * 2, newCapacity, (size_t)8});
|
newCapacity = max({m_capacity * 2, newCapacity, (size_t)8});
|
||||||
auto newMem = (char*)Star::realloc(m_data, newCapacity);
|
auto newMem = (char*)Star::realloc(m_data, newCapacity);
|
||||||
if (!newMem)
|
if (!newMem)
|
||||||
throw MemoryException::format("Could not set new ByteArray capacity %s\n", newCapacity);
|
throw MemoryException::format("Could not set new ByteArray capacity {}\n", newCapacity);
|
||||||
m_data = newMem;
|
m_data = newMem;
|
||||||
m_capacity = newCapacity;
|
m_capacity = newCapacity;
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ inline char ByteArray::operator[](size_t i) const {
|
|||||||
|
|
||||||
inline char ByteArray::at(size_t i) const {
|
inline char ByteArray::at(size_t i) const {
|
||||||
if (i >= m_size)
|
if (i >= m_size)
|
||||||
throw OutOfRangeException(strf("Out of range in ByteArray::at(%s)", i));
|
throw OutOfRangeException(strf("Out of range in ByteArray::at({})", i));
|
||||||
|
|
||||||
return m_data[i];
|
return m_data[i];
|
||||||
}
|
}
|
||||||
|
@ -61,11 +61,11 @@ shared_ptr<Type1 const> as(shared_ptr<Type2 const> const& p) {
|
|||||||
template <typename Type, typename Ptr>
|
template <typename Type, typename Ptr>
|
||||||
auto convert(Ptr const& p) -> decltype(as<Type>(p)) {
|
auto convert(Ptr const& p) -> decltype(as<Type>(p)) {
|
||||||
if (!p)
|
if (!p)
|
||||||
throw PointerConvertException::format("Could not convert from nullptr to %s", typeid(Type).name());
|
throw PointerConvertException::format("Could not convert from nullptr to {}", typeid(Type).name());
|
||||||
else if (auto a = as<Type>(p))
|
else if (auto a = as<Type>(p))
|
||||||
return a;
|
return a;
|
||||||
else
|
else
|
||||||
throw PointerConvertException::format("Could not convert from %s to %s", typeid(*p).name(), typeid(Type).name());
|
throw PointerConvertException::format("Could not convert from {} to {}", typeid(*p).name(), typeid(Type).name());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Type1, typename Type2>
|
template <typename Type1, typename Type2>
|
||||||
|
@ -221,7 +221,7 @@ Color::Color(const String& name) {
|
|||||||
if (i != NamedColors.end())
|
if (i != NamedColors.end())
|
||||||
*this = i->second;
|
*this = i->second;
|
||||||
else
|
else
|
||||||
throw ColorException(strf("Named color %s not found", name), false);
|
throw ColorException(strf("Named color {} not found", name), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -622,7 +622,7 @@ Vec4B Color::hexToVec4B(StringView s) {
|
|||||||
} else if (s.utf8Size() == 8) {
|
} else if (s.utf8Size() == 8) {
|
||||||
hexDecode(s.utf8Ptr(), 8, (char*)cbytes.data(), 4);
|
hexDecode(s.utf8Ptr(), 8, (char*)cbytes.data(), 4);
|
||||||
} else {
|
} else {
|
||||||
throw ColorException(strf("Improper size for hex string '%s' in Color::hexToVec4B", s), false);
|
throw ColorException(strf("Improper size for hex string '{}' in Color::hexToVec4B", s), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Vec4B(move(cbytes));
|
return Vec4B(move(cbytes));
|
||||||
|
@ -23,7 +23,7 @@ void compressData(ByteArray const& in, ByteArray& out, CompressionLevel compress
|
|||||||
strm.opaque = Z_NULL;
|
strm.opaque = Z_NULL;
|
||||||
int deflate_res = deflateInit(&strm, compression);
|
int deflate_res = deflateInit(&strm, compression);
|
||||||
if (deflate_res != Z_OK)
|
if (deflate_res != Z_OK)
|
||||||
throw IOException(strf("Failed to initialise deflate (%d)", deflate_res));
|
throw IOException(strf("Failed to initialise deflate ({})", deflate_res));
|
||||||
|
|
||||||
strm.next_in = (unsigned char*)in.ptr();
|
strm.next_in = (unsigned char*)in.ptr();
|
||||||
strm.avail_in = in.size();
|
strm.avail_in = in.size();
|
||||||
@ -40,7 +40,7 @@ void compressData(ByteArray const& in, ByteArray& out, CompressionLevel compress
|
|||||||
deflateEnd(&strm);
|
deflateEnd(&strm);
|
||||||
|
|
||||||
if (deflate_res != Z_STREAM_END)
|
if (deflate_res != Z_STREAM_END)
|
||||||
throw IOException(strf("Internal error in uncompressData, deflate_res is %s", deflate_res));
|
throw IOException(strf("Internal error in uncompressData, deflate_res is {}", deflate_res));
|
||||||
|
|
||||||
out.append((char const*)temp_buffer, BUFSIZE - strm.avail_out);
|
out.append((char const*)temp_buffer, BUFSIZE - strm.avail_out);
|
||||||
}
|
}
|
||||||
@ -66,7 +66,7 @@ void uncompressData(ByteArray const& in, ByteArray& out) {
|
|||||||
strm.opaque = Z_NULL;
|
strm.opaque = Z_NULL;
|
||||||
int inflate_res = inflateInit(&strm);
|
int inflate_res = inflateInit(&strm);
|
||||||
if (inflate_res != Z_OK)
|
if (inflate_res != Z_OK)
|
||||||
throw IOException(strf("Failed to initialise inflate (%d)", inflate_res));
|
throw IOException(strf("Failed to initialise inflate ({})", inflate_res));
|
||||||
|
|
||||||
strm.next_in = (unsigned char*)in.ptr();
|
strm.next_in = (unsigned char*)in.ptr();
|
||||||
strm.avail_in = in.size();
|
strm.avail_in = in.size();
|
||||||
@ -86,7 +86,7 @@ void uncompressData(ByteArray const& in, ByteArray& out) {
|
|||||||
inflateEnd(&strm);
|
inflateEnd(&strm);
|
||||||
|
|
||||||
if (inflate_res != Z_STREAM_END)
|
if (inflate_res != Z_STREAM_END)
|
||||||
throw IOException(strf("Internal error in uncompressData, inflate_res is %s", inflate_res));
|
throw IOException(strf("Internal error in uncompressData, inflate_res is {}", inflate_res));
|
||||||
|
|
||||||
out.append((char const*)temp_buffer, BUFSIZE - strm.avail_out);
|
out.append((char const*)temp_buffer, BUFSIZE - strm.avail_out);
|
||||||
}
|
}
|
||||||
@ -134,7 +134,7 @@ void CompressedFile::seek(StreamOffset offset, IOSeek seekMode) {
|
|||||||
StreamOffset endPos = pos();
|
StreamOffset endPos = pos();
|
||||||
|
|
||||||
if (retCode < 0) {
|
if (retCode < 0) {
|
||||||
throw IOException::format("Seek error: %s", gzerror((gzFile)m_file, 0));
|
throw IOException::format("Seek error: {}", gzerror((gzFile)m_file, 0));
|
||||||
} else if ((seekMode == IOSeek::Relative && begPos + offset != endPos)
|
} else if ((seekMode == IOSeek::Relative && begPos + offset != endPos)
|
||||||
|| (seekMode == IOSeek::Absolute && offset != endPos)) {
|
|| (seekMode == IOSeek::Absolute && offset != endPos)) {
|
||||||
throw EofException("Error, unexpected end of file found");
|
throw EofException("Error, unexpected end of file found");
|
||||||
@ -153,7 +153,7 @@ size_t CompressedFile::read(char* data, size_t len) {
|
|||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
throw EofException("Error, unexpected end of file found");
|
throw EofException("Error, unexpected end of file found");
|
||||||
else if (ret == -1)
|
else if (ret == -1)
|
||||||
throw IOException::format("Read error: %s", gzerror((gzFile)m_file, 0));
|
throw IOException::format("Read error: {}", gzerror((gzFile)m_file, 0));
|
||||||
else
|
else
|
||||||
return (size_t)ret;
|
return (size_t)ret;
|
||||||
}
|
}
|
||||||
@ -164,7 +164,7 @@ size_t CompressedFile::write(const char* data, size_t len) {
|
|||||||
|
|
||||||
int ret = gzwrite((gzFile)m_file, data, len);
|
int ret = gzwrite((gzFile)m_file, data, len);
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
throw IOException::format("Write error: %s", gzerror((gzFile)m_file, 0));
|
throw IOException::format("Write error: {}", gzerror((gzFile)m_file, 0));
|
||||||
else
|
else
|
||||||
return (size_t)ret;
|
return (size_t)ret;
|
||||||
}
|
}
|
||||||
@ -210,7 +210,7 @@ void CompressedFile::open(IOMode mode) {
|
|||||||
m_file = gzopen(m_filename.utf8Ptr(), modeString.utf8Ptr());
|
m_file = gzopen(m_filename.utf8Ptr(), modeString.utf8Ptr());
|
||||||
|
|
||||||
if (!m_file)
|
if (!m_file)
|
||||||
throw IOException::format("Cannot open filename '%s'", m_filename);
|
throw IOException::format("Cannot open filename '{}'", m_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CompressedFile::close() {
|
void CompressedFile::close() {
|
||||||
|
@ -112,23 +112,23 @@ OutputProxy outputException(std::exception const& e, bool fullStacktrace) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printStack(char const* message) {
|
void printStack(char const* message) {
|
||||||
Logger::info("Stack Trace (%s)...\n%s", message, outputStack(captureStack()));
|
Logger::info("Stack Trace ({})...\n{}", message, outputStack(captureStack()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void fatalError(char const* message, bool showStackTrace) {
|
void fatalError(char const* message, bool showStackTrace) {
|
||||||
if (showStackTrace)
|
if (showStackTrace)
|
||||||
Logger::error("Fatal Error: %s\n%s", message, outputStack(captureStack()));
|
Logger::error("Fatal Error: {}\n{}", message, outputStack(captureStack()));
|
||||||
else
|
else
|
||||||
Logger::error("Fatal Error: %s", message);
|
Logger::error("Fatal Error: {}", message);
|
||||||
|
|
||||||
std::abort();
|
std::abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
void fatalException(std::exception const& e, bool showStackTrace) {
|
void fatalException(std::exception const& e, bool showStackTrace) {
|
||||||
if (showStackTrace)
|
if (showStackTrace)
|
||||||
Logger::error("Fatal Exception caught: %s\nCaught at:\n%s", outputException(e, true), outputStack(captureStack()));
|
Logger::error("Fatal Exception caught: {}\nCaught at:\n{}", outputException(e, true), outputStack(captureStack()));
|
||||||
else
|
else
|
||||||
Logger::error("Fatal Exception caught: %s", outputException(e, showStackTrace));
|
Logger::error("Fatal Exception caught: {}", outputException(e, showStackTrace));
|
||||||
|
|
||||||
std::abort();
|
std::abort();
|
||||||
}
|
}
|
||||||
|
@ -127,9 +127,9 @@ OutputProxy outputStack(StackCapture stack) {
|
|||||||
symbol->MaxNameLen = MAX_SYM_NAME;
|
symbol->MaxNameLen = MAX_SYM_NAME;
|
||||||
|
|
||||||
DWORD64 displacement = 0;
|
DWORD64 displacement = 0;
|
||||||
format(os, "[%i] %p", i, stack.first[i]);
|
format(os, "[{}] {}", i, (void*)stack.first[i]);
|
||||||
if (SymFromAddr(process, stack.first[i], &displacement, symbol))
|
if (SymFromAddr(process, stack.first[i], &displacement, symbol))
|
||||||
format(os, " %s", symbol->Name);
|
format(os, " {}", symbol->Name);
|
||||||
|
|
||||||
if (i + 1 < stack.second)
|
if (i + 1 < stack.second)
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
@ -224,7 +224,7 @@ OutputProxy outputException(std::exception const& e, bool fullStacktrace) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printStack(char const* message) {
|
void printStack(char const* message) {
|
||||||
Logger::info("Stack Trace (%s)...\n%s", message, outputStack(captureStack()));
|
Logger::info("Stack Trace ({})...\n{}", message, outputStack(captureStack()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void fatalError(char const* message, bool showStackTrace) {
|
void fatalError(char const* message, bool showStackTrace) {
|
||||||
|
@ -104,8 +104,8 @@ void File::overwriteFileWithRename(String const& data, String const& filename, S
|
|||||||
|
|
||||||
void File::backupFileInSequence(String const& targetFile, unsigned maximumBackups, String const& backupExtensionPrefix) {
|
void File::backupFileInSequence(String const& targetFile, unsigned maximumBackups, String const& backupExtensionPrefix) {
|
||||||
for (unsigned i = maximumBackups; i > 0; --i) {
|
for (unsigned i = maximumBackups; i > 0; --i) {
|
||||||
String curExtension = i == 1 ? "" : strf("%s%s", backupExtensionPrefix, i - 1);
|
String curExtension = i == 1 ? "" : strf("{}{}", backupExtensionPrefix, i - 1);
|
||||||
String nextExtension = strf("%s%s", backupExtensionPrefix, i);
|
String nextExtension = strf("{}{}", backupExtensionPrefix, i);
|
||||||
|
|
||||||
if (File::isFile(targetFile + curExtension))
|
if (File::isFile(targetFile + curExtension))
|
||||||
File::copy(targetFile + curExtension, targetFile + nextExtension);
|
File::copy(targetFile + curExtension, targetFile + nextExtension);
|
||||||
|
@ -46,19 +46,19 @@ String File::currentDirectory() {
|
|||||||
|
|
||||||
void File::changeDirectory(const String& dirName) {
|
void File::changeDirectory(const String& dirName) {
|
||||||
if (::chdir(dirName.utf8Ptr()) != 0)
|
if (::chdir(dirName.utf8Ptr()) != 0)
|
||||||
throw IOException(strf("could not change directory to %s", dirName));
|
throw IOException(strf("could not change directory to {}", dirName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void File::makeDirectory(String const& dirName) {
|
void File::makeDirectory(String const& dirName) {
|
||||||
if (::mkdir(dirName.utf8Ptr(), 0777) != 0)
|
if (::mkdir(dirName.utf8Ptr(), 0777) != 0)
|
||||||
throw IOException(strf("could not create directory '%s', %s", dirName, strerror(errno)));
|
throw IOException(strf("could not create directory '{}', {}", dirName, strerror(errno)));
|
||||||
}
|
}
|
||||||
|
|
||||||
List<pair<String, bool>> File::dirList(const String& dirName, bool skipDots) {
|
List<pair<String, bool>> File::dirList(const String& dirName, bool skipDots) {
|
||||||
List<std::pair<String, bool>> fileList;
|
List<std::pair<String, bool>> fileList;
|
||||||
DIR* directory = ::opendir(dirName.utf8Ptr());
|
DIR* directory = ::opendir(dirName.utf8Ptr());
|
||||||
if (directory == NULL)
|
if (directory == NULL)
|
||||||
throw IOException::format("dirList failed on dir: '%s'", dirName);
|
throw IOException::format("dirList failed on dir: '{}'", dirName);
|
||||||
|
|
||||||
for (dirent* entry = ::readdir(directory); entry != NULL; entry = ::readdir(directory)) {
|
for (dirent* entry = ::readdir(directory); entry != NULL; entry = ::readdir(directory)) {
|
||||||
String entryString = entry->d_name;
|
String entryString = entry->d_name;
|
||||||
@ -113,13 +113,13 @@ String File::fullPath(const String& fileName) {
|
|||||||
char buffer[PATH_MAX];
|
char buffer[PATH_MAX];
|
||||||
|
|
||||||
if (::realpath(fileName.utf8Ptr(), buffer) == NULL)
|
if (::realpath(fileName.utf8Ptr(), buffer) == NULL)
|
||||||
throw IOException::format("realpath failed on file: '%s' problem path was: '%s'", fileName, buffer);
|
throw IOException::format("realpath failed on file: '{}' problem path was: '{}'", fileName, buffer);
|
||||||
|
|
||||||
return String(buffer);
|
return String(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
String File::temporaryFileName() {
|
String File::temporaryFileName() {
|
||||||
return relativeTo(P_tmpdir, strf("starbound.tmpfile.%s", hexEncode(Random::randBytes(16))));
|
return relativeTo(P_tmpdir, strf("starbound.tmpfile.{}", hexEncode(Random::randBytes(16))));
|
||||||
}
|
}
|
||||||
|
|
||||||
FilePtr File::temporaryFile() {
|
FilePtr File::temporaryFile() {
|
||||||
@ -131,16 +131,16 @@ FilePtr File::ephemeralFile() {
|
|||||||
ByteArray path = ByteArray::fromCStringWithNull(relativeTo(P_tmpdir, "starbound.tmpfile.XXXXXXXX").utf8Ptr());
|
ByteArray path = ByteArray::fromCStringWithNull(relativeTo(P_tmpdir, "starbound.tmpfile.XXXXXXXX").utf8Ptr());
|
||||||
auto res = mkstemp(path.ptr());
|
auto res = mkstemp(path.ptr());
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
throw IOException::format("tmpfile error: %s", strerror(errno));
|
throw IOException::format("tmpfile error: {}", strerror(errno));
|
||||||
if (::unlink(path.ptr()) < 0)
|
if (::unlink(path.ptr()) < 0)
|
||||||
throw IOException::format("Could not remove mkstemp file when creating ephemeralFile: %s", strerror(errno));
|
throw IOException::format("Could not remove mkstemp file when creating ephemeralFile: {}", strerror(errno));
|
||||||
file->m_file = handleFromFd(res);
|
file->m_file = handleFromFd(res);
|
||||||
file->setMode(IOMode::ReadWrite);
|
file->setMode(IOMode::ReadWrite);
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
String File::temporaryDirectory() {
|
String File::temporaryDirectory() {
|
||||||
String dirname = relativeTo(P_tmpdir, strf("starbound.tmpdir.%s", hexEncode(Random::randBytes(16))));
|
String dirname = relativeTo(P_tmpdir, strf("starbound.tmpdir.{}", hexEncode(Random::randBytes(16))));
|
||||||
makeDirectory(dirname);
|
makeDirectory(dirname);
|
||||||
return dirname;
|
return dirname;
|
||||||
}
|
}
|
||||||
@ -171,12 +171,12 @@ bool File::isDirectory(String const& path) {
|
|||||||
|
|
||||||
void File::remove(String const& filename) {
|
void File::remove(String const& filename) {
|
||||||
if (::remove(filename.utf8Ptr()) < 0)
|
if (::remove(filename.utf8Ptr()) < 0)
|
||||||
throw IOException::format("remove error: %s", strerror(errno));
|
throw IOException::format("remove error: {}", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
void File::rename(String const& source, String const& target) {
|
void File::rename(String const& source, String const& target) {
|
||||||
if (::rename(source.utf8Ptr(), target.utf8Ptr()) < 0)
|
if (::rename(source.utf8Ptr(), target.utf8Ptr()) < 0)
|
||||||
throw IOException::format("rename error: %s", strerror(errno));
|
throw IOException::format("rename error: {}", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
void File::overwriteFileWithRename(char const* data, size_t len, String const& filename, String const& newSuffix) {
|
void File::overwriteFileWithRename(char const* data, size_t len, String const& filename, String const& newSuffix) {
|
||||||
@ -200,11 +200,11 @@ void* File::fopen(char const* filename, IOMode mode) {
|
|||||||
|
|
||||||
int fd = ::open(filename, oflag, 0666);
|
int fd = ::open(filename, oflag, 0666);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
throw IOException::format("Error opening file '%s', error: %s", filename, strerror(errno));
|
throw IOException::format("Error opening file '{}', error: {}", filename, strerror(errno));
|
||||||
|
|
||||||
if (mode & IOMode::Append) {
|
if (mode & IOMode::Append) {
|
||||||
if (lseek(fd, 0, SEEK_END) < 0)
|
if (lseek(fd, 0, SEEK_END) < 0)
|
||||||
throw IOException::format("Error opening file '%s', cannot seek: %s", filename, strerror(errno));
|
throw IOException::format("Error opening file '{}', cannot seek: {}", filename, strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
return handleFromFd(fd);
|
return handleFromFd(fd);
|
||||||
@ -221,7 +221,7 @@ void File::fseek(void* f, StreamOffset offset, IOSeek seekMode) {
|
|||||||
retCode = lseek(fd, offset, SEEK_END);
|
retCode = lseek(fd, offset, SEEK_END);
|
||||||
|
|
||||||
if (retCode < 0)
|
if (retCode < 0)
|
||||||
throw IOException::format("Seek error: %s", strerror(errno));
|
throw IOException::format("Seek error: {}", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamOffset File::ftell(void* f) {
|
StreamOffset File::ftell(void* f) {
|
||||||
@ -237,7 +237,7 @@ size_t File::fread(void* file, char* data, size_t len) {
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (errno == EAGAIN || errno == EINTR)
|
if (errno == EAGAIN || errno == EINTR)
|
||||||
return 0;
|
return 0;
|
||||||
throw IOException::format("Read error: %s", strerror(errno));
|
throw IOException::format("Read error: {}", strerror(errno));
|
||||||
} else {
|
} else {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -252,7 +252,7 @@ size_t File::fwrite(void* file, char const* data, size_t len) {
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (errno == EAGAIN || errno == EINTR)
|
if (errno == EAGAIN || errno == EINTR)
|
||||||
return 0;
|
return 0;
|
||||||
throw IOException::format("Write error: %s", strerror(errno));
|
throw IOException::format("Write error: {}", strerror(errno));
|
||||||
} else {
|
} else {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -269,7 +269,7 @@ void File::fsync(void* file) {
|
|||||||
|
|
||||||
void File::fclose(void* file) {
|
void File::fclose(void* file) {
|
||||||
if (::close(fdFromHandle(file)) < 0)
|
if (::close(fdFromHandle(file)) < 0)
|
||||||
throw IOException::format("Close error: %s", strerror(errno));
|
throw IOException::format("Close error: {}", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamOffset File::fsize(void* file) {
|
StreamOffset File::fsize(void* file) {
|
||||||
@ -289,7 +289,7 @@ size_t File::pwrite(void* file, char const* data, size_t len, StreamOffset posit
|
|||||||
|
|
||||||
void File::resize(void* f, StreamOffset size) {
|
void File::resize(void* f, StreamOffset size) {
|
||||||
if (::ftruncate(fdFromHandle(f), size) < 0)
|
if (::ftruncate(fdFromHandle(f), size) < 0)
|
||||||
throw IOException::format("resize error: %s", strerror(errno));
|
throw IOException::format("resize error: {}", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -42,13 +42,13 @@ String File::currentDirectory() {
|
|||||||
|
|
||||||
void File::changeDirectory(const String& dirName) {
|
void File::changeDirectory(const String& dirName) {
|
||||||
if (!SetCurrentDirectoryW(stringToUtf16(dirName).get()))
|
if (!SetCurrentDirectoryW(stringToUtf16(dirName).get()))
|
||||||
throw IOException(strf("could not change directory to %s", dirName));
|
throw IOException(strf("could not change directory to {}", dirName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void File::makeDirectory(String const& dirName) {
|
void File::makeDirectory(String const& dirName) {
|
||||||
if (CreateDirectoryW(stringToUtf16(dirName).get(), NULL) == 0) {
|
if (CreateDirectoryW(stringToUtf16(dirName).get(), NULL) == 0) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
throw IOException(strf("could not create directory '%s', %s", dirName, error));
|
throw IOException(strf("could not create directory '{}', {}", dirName, error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,9 +85,9 @@ String File::fullPath(const String& path) {
|
|||||||
|
|
||||||
fullpath_size = GetFullPathNameW(stringToUtf16(path).get(), (DWORD)MAX_PATH, buffer, (WCHAR**)&lpszLastNamePart);
|
fullpath_size = GetFullPathNameW(stringToUtf16(path).get(), (DWORD)MAX_PATH, buffer, (WCHAR**)&lpszLastNamePart);
|
||||||
if (0 == fullpath_size)
|
if (0 == fullpath_size)
|
||||||
throw IOException::format("GetFullPathName failed on path: '%s'", path);
|
throw IOException::format("GetFullPathName failed on path: '{}'", path);
|
||||||
if (fullpath_size >= MAX_PATH)
|
if (fullpath_size >= MAX_PATH)
|
||||||
throw IOException::format("GetFullPathName failed on path: '%s'", path);
|
throw IOException::format("GetFullPathName failed on path: '{}'", path);
|
||||||
|
|
||||||
return utf16ToString(buffer);
|
return utf16ToString(buffer);
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ List<std::pair<String, bool>> File::dirList(const String& dirName, bool skipDots
|
|||||||
|
|
||||||
hFind = FindFirstFileW(stringToUtf16(File::relativeTo(dirName, "*")).get(), &findFileData);
|
hFind = FindFirstFileW(stringToUtf16(File::relativeTo(dirName, "*")).get(), &findFileData);
|
||||||
if (hFind == INVALID_HANDLE_VALUE)
|
if (hFind == INVALID_HANDLE_VALUE)
|
||||||
throw IOException(strf("Invalid file handle in dirList of '%s', error is %u", dirName, GetLastError()));
|
throw IOException(strf("Invalid file handle in dirList of '{}', error is %u", dirName, GetLastError()));
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
String entry = utf16ToString(findFileData.cFileName);
|
String entry = utf16ToString(findFileData.cFileName);
|
||||||
@ -113,7 +113,7 @@ List<std::pair<String, bool>> File::dirList(const String& dirName, bool skipDots
|
|||||||
FindClose(hFind);
|
FindClose(hFind);
|
||||||
|
|
||||||
if ((dwError != ERROR_NO_MORE_FILES) && (dwError != NO_ERROR))
|
if ((dwError != ERROR_NO_MORE_FILES) && (dwError != NO_ERROR))
|
||||||
throw IOException(strf("FindNextFile error in dirList of '%s'. Error is %u", dirName, dwError));
|
throw IOException(strf("FindNextFile error in dirList of '{}'. Error is %u", dirName, dwError));
|
||||||
|
|
||||||
return fileList;
|
return fileList;
|
||||||
}
|
}
|
||||||
@ -158,10 +158,10 @@ String File::temporaryFileName() {
|
|||||||
WCHAR tempPath[MAX_PATH];
|
WCHAR tempPath[MAX_PATH];
|
||||||
if (!GetTempPathW(MAX_PATH, tempPath)) {
|
if (!GetTempPathW(MAX_PATH, tempPath)) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
throw IOException(strf("Could not call GetTempPath %s", error));
|
throw IOException(strf("Could not call GetTempPath {}", error));
|
||||||
}
|
}
|
||||||
|
|
||||||
return relativeTo(utf16ToString(tempPath), strf("starbound.tmpfile.%s", hexEncode(Random::randBytes(16))));
|
return relativeTo(utf16ToString(tempPath), strf("starbound.tmpfile.{}", hexEncode(Random::randBytes(16))));
|
||||||
}
|
}
|
||||||
|
|
||||||
FilePtr File::temporaryFile() {
|
FilePtr File::temporaryFile() {
|
||||||
@ -179,10 +179,10 @@ String File::temporaryDirectory() {
|
|||||||
WCHAR tempPath[MAX_PATH];
|
WCHAR tempPath[MAX_PATH];
|
||||||
if (!GetTempPathW(MAX_PATH, tempPath)) {
|
if (!GetTempPathW(MAX_PATH, tempPath)) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
throw IOException(strf("Could not call GetTempPath %s", error));
|
throw IOException(strf("Could not call GetTempPath {}", error));
|
||||||
}
|
}
|
||||||
|
|
||||||
String dirname = relativeTo(utf16ToString(tempPath), strf("starbound.tmpdir.%s", hexEncode(Random::randBytes(16))));
|
String dirname = relativeTo(utf16ToString(tempPath), strf("starbound.tmpdir.{}", hexEncode(Random::randBytes(16))));
|
||||||
makeDirectory(dirname);
|
makeDirectory(dirname);
|
||||||
return dirname;
|
return dirname;
|
||||||
}
|
}
|
||||||
@ -191,11 +191,11 @@ void File::remove(String const& filename) {
|
|||||||
if (isDirectory(filename)) {
|
if (isDirectory(filename)) {
|
||||||
if (!RemoveDirectoryW(stringToUtf16(filename).get())) {
|
if (!RemoveDirectoryW(stringToUtf16(filename).get())) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
throw IOException(strf("Rename error: %s", error));
|
throw IOException(strf("Rename error: {}", error));
|
||||||
}
|
}
|
||||||
} else if (::_wremove(stringToUtf16(filename).get()) < 0) {
|
} else if (::_wremove(stringToUtf16(filename).get()) < 0) {
|
||||||
auto error = errno;
|
auto error = errno;
|
||||||
throw IOException::format("remove error: %s", strerror(error));
|
throw IOException::format("remove error: {}", strerror(error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,22 +207,22 @@ void File::rename(String const& source, String const& target) {
|
|||||||
if (!DeleteFileW(stringToUtf16(temp).get())) {
|
if (!DeleteFileW(stringToUtf16(temp).get())) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
if (error != ERROR_FILE_NOT_FOUND)
|
if (error != ERROR_FILE_NOT_FOUND)
|
||||||
throw IOException(strf("error deleting existing temp file: %s", error));
|
throw IOException(strf("error deleting existing temp file: {}", error));
|
||||||
}
|
}
|
||||||
if (!MoveFileExW(stringToUtf16(target).get(), stringToUtf16(temp).get(), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) {
|
if (!MoveFileExW(stringToUtf16(target).get(), stringToUtf16(temp).get(), MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
throw IOException(strf("error temporary file '%s': %s", temp, GetLastError()));
|
throw IOException(strf("error temporary file '{}': {}", temp, GetLastError()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!MoveFileExW(stringToUtf16(source).get(), stringToUtf16(target).get(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) {
|
if (!MoveFileExW(stringToUtf16(source).get(), stringToUtf16(target).get(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
throw IOException(strf("Rename error: %s", error));
|
throw IOException(strf("Rename error: {}", error));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (replace && !DeleteFileW(stringToUtf16(temp).get())) {
|
if (replace && !DeleteFileW(stringToUtf16(temp).get())) {
|
||||||
auto error = GetLastError();
|
auto error = GetLastError();
|
||||||
throw IOException(strf("error deleting temp file '%s': %s", temp, GetLastError()));
|
throw IOException(strf("error deleting temp file '{}': {}", temp, GetLastError()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,19 +266,19 @@ void* File::fopen(char const* filename, IOMode mode) {
|
|||||||
creationDisposition, 0, NULL);
|
creationDisposition, 0, NULL);
|
||||||
|
|
||||||
if (file == INVALID_HANDLE_VALUE)
|
if (file == INVALID_HANDLE_VALUE)
|
||||||
throw IOException::format("could not open file '%s' %s", filename, GetLastError());
|
throw IOException::format("could not open file '{}' {}", filename, GetLastError());
|
||||||
|
|
||||||
LARGE_INTEGER szero;
|
LARGE_INTEGER szero;
|
||||||
szero.QuadPart = 0;
|
szero.QuadPart = 0;
|
||||||
if (!SetFilePointerEx(file, szero, NULL, 0)) {
|
if (!SetFilePointerEx(file, szero, NULL, 0)) {
|
||||||
CloseHandle(file);
|
CloseHandle(file);
|
||||||
throw IOException::format("could not set file pointer in fopen '%s' %s", filename, GetLastError());
|
throw IOException::format("could not set file pointer in fopen '{}' {}", filename, GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode & IOMode::Truncate) {
|
if (mode & IOMode::Truncate) {
|
||||||
if (!SetEndOfFile(file)) {
|
if (!SetEndOfFile(file)) {
|
||||||
CloseHandle(file);
|
CloseHandle(file);
|
||||||
throw IOException::format("could not set end of file in fopen '%s' %s", filename, GetLastError());
|
throw IOException::format("could not set end of file in fopen '{}' {}", filename, GetLastError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,11 +286,11 @@ void* File::fopen(char const* filename, IOMode mode) {
|
|||||||
LARGE_INTEGER size;
|
LARGE_INTEGER size;
|
||||||
if (GetFileSizeEx(file, &size) == 0) {
|
if (GetFileSizeEx(file, &size) == 0) {
|
||||||
CloseHandle(file);
|
CloseHandle(file);
|
||||||
throw IOException::format("could not get file size in fopen '%s' %s", filename, GetLastError());
|
throw IOException::format("could not get file size in fopen '{}' {}", filename, GetLastError());
|
||||||
}
|
}
|
||||||
if (!SetFilePointerEx(file, size, NULL, 0)) {
|
if (!SetFilePointerEx(file, size, NULL, 0)) {
|
||||||
CloseHandle(file);
|
CloseHandle(file);
|
||||||
throw IOException::format("could not set file pointer in fopen '%s' %s", filename, GetLastError());
|
throw IOException::format("could not set file pointer in fopen '{}' {}", filename, GetLastError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +331,7 @@ size_t File::fread(void* f, char* data, size_t len) {
|
|||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
auto err = GetLastError();
|
auto err = GetLastError();
|
||||||
if (err != ERROR_IO_PENDING)
|
if (err != ERROR_IO_PENDING)
|
||||||
throw IOException::format("read error %s", err);
|
throw IOException::format("read error {}", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return numRead;
|
return numRead;
|
||||||
@ -348,7 +348,7 @@ size_t File::fwrite(void* f, char const* data, size_t len) {
|
|||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
auto err = GetLastError();
|
auto err = GetLastError();
|
||||||
if (err != ERROR_IO_PENDING)
|
if (err != ERROR_IO_PENDING)
|
||||||
throw IOException::format("write error %s", err);
|
throw IOException::format("write error {}", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return numWritten;
|
return numWritten;
|
||||||
@ -357,7 +357,7 @@ size_t File::fwrite(void* f, char const* data, size_t len) {
|
|||||||
void File::fsync(void* f) {
|
void File::fsync(void* f) {
|
||||||
HANDLE file = (HANDLE)f;
|
HANDLE file = (HANDLE)f;
|
||||||
if (FlushFileBuffers(file) == 0)
|
if (FlushFileBuffers(file) == 0)
|
||||||
throw IOException::format("fsync error %s", GetLastError());
|
throw IOException::format("fsync error {}", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
void File::fclose(void* f) {
|
void File::fclose(void* f) {
|
||||||
@ -369,7 +369,7 @@ StreamOffset File::fsize(void* f) {
|
|||||||
HANDLE file = (HANDLE)f;
|
HANDLE file = (HANDLE)f;
|
||||||
LARGE_INTEGER size;
|
LARGE_INTEGER size;
|
||||||
if (GetFileSizeEx(file, &size) == 0)
|
if (GetFileSizeEx(file, &size) == 0)
|
||||||
throw IOException::format("could not get file size in fsize %s", GetLastError());
|
throw IOException::format("could not get file size in fsize {}", GetLastError());
|
||||||
return size.QuadPart;
|
return size.QuadPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -381,7 +381,7 @@ size_t File::pread(void* f, char* data, size_t len, StreamOffset position) {
|
|||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
auto err = GetLastError();
|
auto err = GetLastError();
|
||||||
if (err != ERROR_IO_PENDING)
|
if (err != ERROR_IO_PENDING)
|
||||||
throw IOException::format("pread error %s", err);
|
throw IOException::format("pread error {}", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return numRead;
|
return numRead;
|
||||||
@ -395,7 +395,7 @@ size_t File::pwrite(void* f, char const* data, size_t len, StreamOffset position
|
|||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
auto err = GetLastError();
|
auto err = GetLastError();
|
||||||
if (err != ERROR_IO_PENDING)
|
if (err != ERROR_IO_PENDING)
|
||||||
throw IOException::format("pwrite error %s", err);
|
throw IOException::format("pwrite error {}", err);
|
||||||
}
|
}
|
||||||
|
|
||||||
return numWritten;
|
return numWritten;
|
||||||
|
@ -66,7 +66,7 @@ void Font::setPixelSize(unsigned pixelSize) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (FT_Set_Pixel_Sizes(m_fontImpl->face, pixelSize, 0))
|
if (FT_Set_Pixel_Sizes(m_fontImpl->face, pixelSize, 0))
|
||||||
throw FontException(strf("Cannot set font pixel size to: %s", pixelSize));
|
throw FontException(strf("Cannot set font pixel size to: {}", pixelSize));
|
||||||
m_pixelSize = pixelSize;
|
m_pixelSize = pixelSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,21 +105,21 @@ Json const& FormattedJson::toJson() const {
|
|||||||
|
|
||||||
FormattedJson FormattedJson::get(String const& key) const {
|
FormattedJson FormattedJson::get(String const& key) const {
|
||||||
if (type() != Json::Type::Object)
|
if (type() != Json::Type::Object)
|
||||||
throw JsonException::format("Cannot call get with key on FormattedJson type %s, must be Object type", typeName());
|
throw JsonException::format("Cannot call get with key on FormattedJson type {}, must be Object type", typeName());
|
||||||
|
|
||||||
Maybe<pair<ElementLocation, ElementLocation>> entry = m_objectEntryLocations.maybe(key);
|
Maybe<pair<ElementLocation, ElementLocation>> entry = m_objectEntryLocations.maybe(key);
|
||||||
if (entry.isNothing())
|
if (entry.isNothing())
|
||||||
throw JsonException::format("No such key in FormattedJson::get(\"%s\")", key);
|
throw JsonException::format("No such key in FormattedJson::get(\"{}\")", key);
|
||||||
|
|
||||||
return getFormattedJson(entry->second);
|
return getFormattedJson(entry->second);
|
||||||
}
|
}
|
||||||
|
|
||||||
FormattedJson FormattedJson::get(size_t index) const {
|
FormattedJson FormattedJson::get(size_t index) const {
|
||||||
if (type() != Json::Type::Array)
|
if (type() != Json::Type::Array)
|
||||||
throw JsonException::format("Cannot call get with index on FormattedJson type %s, must be Array type", typeName());
|
throw JsonException::format("Cannot call get with index on FormattedJson type {}, must be Array type", typeName());
|
||||||
|
|
||||||
if (index >= m_arrayElementLocations.size())
|
if (index >= m_arrayElementLocations.size())
|
||||||
throw JsonException::format("FormattedJson::get(%s) out of range", index);
|
throw JsonException::format("FormattedJson::get({}) out of range", index);
|
||||||
|
|
||||||
ElementLocation loc = m_arrayElementLocations.at(index);
|
ElementLocation loc = m_arrayElementLocations.at(index);
|
||||||
return getFormattedJson(loc);
|
return getFormattedJson(loc);
|
||||||
@ -263,14 +263,14 @@ FormattedJson FormattedJson::prepend(String const& key, FormattedJson const& val
|
|||||||
|
|
||||||
FormattedJson FormattedJson::insertBefore(String const& key, FormattedJson const& value, String const& beforeKey) const {
|
FormattedJson FormattedJson::insertBefore(String const& key, FormattedJson const& value, String const& beforeKey) const {
|
||||||
if (!m_objectEntryLocations.contains(beforeKey))
|
if (!m_objectEntryLocations.contains(beforeKey))
|
||||||
throw JsonException::format("Cannot insert before key \"%s\", which does not exist", beforeKey);
|
throw JsonException::format("Cannot insert before key \"{}\", which does not exist", beforeKey);
|
||||||
ElementLocation loc = m_objectEntryLocations.get(beforeKey).first;
|
ElementLocation loc = m_objectEntryLocations.get(beforeKey).first;
|
||||||
return objectInsert(key, value, loc);
|
return objectInsert(key, value, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
FormattedJson FormattedJson::insertAfter(String const& key, FormattedJson const& value, String const& afterKey) const {
|
FormattedJson FormattedJson::insertAfter(String const& key, FormattedJson const& value, String const& afterKey) const {
|
||||||
if (!m_objectEntryLocations.contains(afterKey))
|
if (!m_objectEntryLocations.contains(afterKey))
|
||||||
throw JsonException::format("Cannot insert after key \"%s\", which does not exist", afterKey);
|
throw JsonException::format("Cannot insert after key \"{}\", which does not exist", afterKey);
|
||||||
ElementLocation loc = m_objectEntryLocations.get(afterKey).second;
|
ElementLocation loc = m_objectEntryLocations.get(afterKey).second;
|
||||||
return objectInsert(key, value, loc + 1);
|
return objectInsert(key, value, loc + 1);
|
||||||
}
|
}
|
||||||
@ -303,7 +303,7 @@ void removeValueFromArray(List<JsonElement>& elements, size_t loc) {
|
|||||||
|
|
||||||
FormattedJson FormattedJson::eraseKey(String const& key) const {
|
FormattedJson FormattedJson::eraseKey(String const& key) const {
|
||||||
if (type() != Json::Type::Object)
|
if (type() != Json::Type::Object)
|
||||||
throw JsonException::format("Cannot call erase with key on FormattedJson type %s, must be Object type", typeName());
|
throw JsonException::format("Cannot call erase with key on FormattedJson type {}, must be Object type", typeName());
|
||||||
|
|
||||||
Maybe<pair<ElementLocation, ElementLocation>> maybeEntry = m_objectEntryLocations.maybe(key);
|
Maybe<pair<ElementLocation, ElementLocation>> maybeEntry = m_objectEntryLocations.maybe(key);
|
||||||
if (maybeEntry.isNothing())
|
if (maybeEntry.isNothing())
|
||||||
@ -319,10 +319,10 @@ FormattedJson FormattedJson::eraseKey(String const& key) const {
|
|||||||
FormattedJson FormattedJson::insert(size_t index, FormattedJson const& value) const {
|
FormattedJson FormattedJson::insert(size_t index, FormattedJson const& value) const {
|
||||||
if (type() != Json::Type::Array)
|
if (type() != Json::Type::Array)
|
||||||
throw JsonException::format(
|
throw JsonException::format(
|
||||||
"Cannot call insert with index on FormattedJson type %s, must be Array type", typeName());
|
"Cannot call insert with index on FormattedJson type {}, must be Array type", typeName());
|
||||||
|
|
||||||
if (index > m_arrayElementLocations.size())
|
if (index > m_arrayElementLocations.size())
|
||||||
throw JsonException::format("FormattedJson::insert(%s) out of range", index);
|
throw JsonException::format("FormattedJson::insert({}) out of range", index);
|
||||||
|
|
||||||
ElementList elements = m_elements;
|
ElementList elements = m_elements;
|
||||||
ElementLocation insertPosition = elements.size();
|
ElementLocation insertPosition = elements.size();
|
||||||
@ -335,7 +335,7 @@ FormattedJson FormattedJson::insert(size_t index, FormattedJson const& value) co
|
|||||||
|
|
||||||
FormattedJson FormattedJson::append(FormattedJson const& value) const {
|
FormattedJson FormattedJson::append(FormattedJson const& value) const {
|
||||||
if (type() != Json::Type::Array)
|
if (type() != Json::Type::Array)
|
||||||
throw JsonException::format("Cannot call append on FormattedJson type %s, must be Array type", typeName());
|
throw JsonException::format("Cannot call append on FormattedJson type {}, must be Array type", typeName());
|
||||||
|
|
||||||
ElementList elements = m_elements;
|
ElementList elements = m_elements;
|
||||||
insertWithCommaAndFormatting(elements, elements.size(), true, {ValueElement{value}});
|
insertWithCommaAndFormatting(elements, elements.size(), true, {ValueElement{value}});
|
||||||
@ -344,10 +344,10 @@ FormattedJson FormattedJson::append(FormattedJson const& value) const {
|
|||||||
|
|
||||||
FormattedJson FormattedJson::set(size_t index, FormattedJson const& value) const {
|
FormattedJson FormattedJson::set(size_t index, FormattedJson const& value) const {
|
||||||
if (type() != Json::Type::Array)
|
if (type() != Json::Type::Array)
|
||||||
throw JsonException::format("Cannot call set with index on FormattedJson type %s, must be Array type", typeName());
|
throw JsonException::format("Cannot call set with index on FormattedJson type {}, must be Array type", typeName());
|
||||||
|
|
||||||
if (index >= m_arrayElementLocations.size())
|
if (index >= m_arrayElementLocations.size())
|
||||||
throw JsonException::format("FormattedJson::set(%s) out of range", index);
|
throw JsonException::format("FormattedJson::set({}) out of range", index);
|
||||||
|
|
||||||
ElementLocation loc = m_arrayElementLocations.at(index);
|
ElementLocation loc = m_arrayElementLocations.at(index);
|
||||||
ElementList elements = m_elements;
|
ElementList elements = m_elements;
|
||||||
@ -357,10 +357,10 @@ FormattedJson FormattedJson::set(size_t index, FormattedJson const& value) const
|
|||||||
|
|
||||||
FormattedJson FormattedJson::eraseIndex(size_t index) const {
|
FormattedJson FormattedJson::eraseIndex(size_t index) const {
|
||||||
if (type() != Json::Type::Array)
|
if (type() != Json::Type::Array)
|
||||||
throw JsonException::format("Cannot call set with index on FormattedJson type %s, must be Array type", typeName());
|
throw JsonException::format("Cannot call set with index on FormattedJson type {}, must be Array type", typeName());
|
||||||
|
|
||||||
if (index >= m_arrayElementLocations.size())
|
if (index >= m_arrayElementLocations.size())
|
||||||
throw JsonException::format("FormattedJson::eraseIndex(%s) out of range", index);
|
throw JsonException::format("FormattedJson::eraseIndex({}) out of range", index);
|
||||||
|
|
||||||
ElementLocation loc = m_arrayElementLocations.at(index);
|
ElementLocation loc = m_arrayElementLocations.at(index);
|
||||||
ElementList elements = m_elements;
|
ElementList elements = m_elements;
|
||||||
@ -390,7 +390,7 @@ String FormattedJson::typeName() const {
|
|||||||
|
|
||||||
String FormattedJson::toFormattedDouble() const {
|
String FormattedJson::toFormattedDouble() const {
|
||||||
if (!isType(Json::Type::Float))
|
if (!isType(Json::Type::Float))
|
||||||
throw JsonException::format("Cannot call toFormattedDouble on Json type %s, must be Float", typeName());
|
throw JsonException::format("Cannot call toFormattedDouble on Json type {}, must be Float", typeName());
|
||||||
if (m_formatting.isValid())
|
if (m_formatting.isValid())
|
||||||
return *m_formatting;
|
return *m_formatting;
|
||||||
return toJson().repr();
|
return toJson().repr();
|
||||||
@ -398,7 +398,7 @@ String FormattedJson::toFormattedDouble() const {
|
|||||||
|
|
||||||
String FormattedJson::toFormattedInt() const {
|
String FormattedJson::toFormattedInt() const {
|
||||||
if (!isType(Json::Type::Int))
|
if (!isType(Json::Type::Int))
|
||||||
throw JsonException::format("Cannot call toFormattedInt on Json type %s, must be Int", typeName());
|
throw JsonException::format("Cannot call toFormattedInt on Json type {}, must be Int", typeName());
|
||||||
if (m_formatting.isValid())
|
if (m_formatting.isValid())
|
||||||
return *m_formatting;
|
return *m_formatting;
|
||||||
return toJson().repr();
|
return toJson().repr();
|
||||||
@ -454,7 +454,7 @@ FormattedJson FormattedJson::array(ElementList const& elements) {
|
|||||||
|
|
||||||
FormattedJson FormattedJson::objectInsert(String const& key, FormattedJson const& value, ElementLocation loc) const {
|
FormattedJson FormattedJson::objectInsert(String const& key, FormattedJson const& value, ElementLocation loc) const {
|
||||||
if (type() != Json::Type::Object)
|
if (type() != Json::Type::Object)
|
||||||
throw JsonException::format("Cannot call set with key on FormattedJson type %s, must be Object type", typeName());
|
throw JsonException::format("Cannot call set with key on FormattedJson type {}, must be Object type", typeName());
|
||||||
|
|
||||||
Maybe<pair<ElementLocation, ElementLocation>> maybeEntry = m_objectEntryLocations.maybe(key);
|
Maybe<pair<ElementLocation, ElementLocation>> maybeEntry = m_objectEntryLocations.maybe(key);
|
||||||
if (maybeEntry.isValid()) {
|
if (maybeEntry.isValid()) {
|
||||||
|
@ -133,7 +133,7 @@ void HostAddress::set(String const& address) {
|
|||||||
hints.ai_flags = AI_ADDRCONFIG;
|
hints.ai_flags = AI_ADDRCONFIG;
|
||||||
|
|
||||||
if (::getaddrinfo(address.utf8Ptr(), NULL, &hints, &result) != 0)
|
if (::getaddrinfo(address.utf8Ptr(), NULL, &hints, &result) != 0)
|
||||||
throw NetworkException(strf("Failed to determine address for '%s' (%s)", address, netErrorString()));
|
throw NetworkException(strf("Failed to determine address for '{}' ({})", address, netErrorString()));
|
||||||
|
|
||||||
for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {
|
for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {
|
||||||
NetworkMode mode;
|
NetworkMode mode;
|
||||||
@ -171,12 +171,12 @@ void HostAddress::set(NetworkMode mode, uint8_t const* addr) {
|
|||||||
std::ostream& operator<<(std::ostream& os, HostAddress const& address) {
|
std::ostream& operator<<(std::ostream& os, HostAddress const& address) {
|
||||||
switch (address.mode()) {
|
switch (address.mode()) {
|
||||||
case NetworkMode::IPv4:
|
case NetworkMode::IPv4:
|
||||||
format(os, "%d.%d.%d.%d", address.octet(0), address.octet(1), address.octet(2), address.octet(3));
|
format(os, "{}.{}.{}.{}", address.octet(0), address.octet(1), address.octet(2), address.octet(3));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NetworkMode::IPv6:
|
case NetworkMode::IPv6:
|
||||||
format(os,
|
format(os,
|
||||||
"%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",
|
"{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}:{:02x}{:02x}",
|
||||||
address.octet(0),
|
address.octet(0),
|
||||||
address.octet(1),
|
address.octet(1),
|
||||||
address.octet(2),
|
address.octet(2),
|
||||||
@ -196,7 +196,7 @@ std::ostream& operator<<(std::ostream& os, HostAddress const& address) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw NetworkException(strf("Unknown address mode (%d)", (int)address.mode()));
|
throw NetworkException(strf("Unknown address mode ({})", (int)address.mode()));
|
||||||
}
|
}
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
@ -224,7 +224,7 @@ Either<String, HostAddressWithPort> HostAddressWithPort::lookupWithPort(String c
|
|||||||
|
|
||||||
auto portNum = maybeLexicalCast<uint16_t>(port);
|
auto portNum = maybeLexicalCast<uint16_t>(port);
|
||||||
if (!portNum)
|
if (!portNum)
|
||||||
return makeLeft(strf("Could not parse port portion of HostAddressWithPort '%s'", port));
|
return makeLeft(strf("Could not parse port portion of HostAddressWithPort '{}'", port));
|
||||||
|
|
||||||
auto hostAddress = HostAddress::lookup(host);
|
auto hostAddress = HostAddress::lookup(host);
|
||||||
if (hostAddress.isLeft())
|
if (hostAddress.isLeft())
|
||||||
|
@ -42,7 +42,7 @@ void IODevice::writeFull(char const* data, size_t len) {
|
|||||||
|
|
||||||
void IODevice::open(IOMode mode) {
|
void IODevice::open(IOMode mode) {
|
||||||
if (mode != m_mode)
|
if (mode != m_mode)
|
||||||
throw IOException::format("Cannot reopen device '%s", deviceName());
|
throw IOException::format("Cannot reopen device '{}", deviceName());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IODevice::close() {
|
void IODevice::close() {
|
||||||
@ -52,7 +52,7 @@ void IODevice::close() {
|
|||||||
void IODevice::sync() {}
|
void IODevice::sync() {}
|
||||||
|
|
||||||
String IODevice::deviceName() const {
|
String IODevice::deviceName() const {
|
||||||
return strf("IODevice <%s>", (void*)this);
|
return strf("IODevice <{}>", (void*)this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IODevice::atEnd() {
|
bool IODevice::atEnd() {
|
||||||
|
@ -102,7 +102,7 @@ auto IdMapWrapper<BaseMap>::nextId() -> IdType {
|
|||||||
template <typename BaseMap>
|
template <typename BaseMap>
|
||||||
void IdMapWrapper<BaseMap>::add(IdType id, MappedType mappedType) {
|
void IdMapWrapper<BaseMap>::add(IdType id, MappedType mappedType) {
|
||||||
if (!BaseMap::insert(make_pair(move(id), move(mappedType))).second)
|
if (!BaseMap::insert(make_pair(move(id), move(mappedType))).second)
|
||||||
throw IdMapException::format("IdMapWrapper::add(id, value) called with pre-existing id '%s'", outputAny(id));
|
throw IdMapException::format("IdMapWrapper::add(id, value) called with pre-existing id '{}'", outputAny(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BaseMap>
|
template <typename BaseMap>
|
||||||
|
@ -7,7 +7,7 @@ namespace Star {
|
|||||||
|
|
||||||
Image Image::readPng(IODevicePtr device) {
|
Image Image::readPng(IODevicePtr device) {
|
||||||
auto logPngError = [](png_structp png_ptr, png_const_charp c) {
|
auto logPngError = [](png_structp png_ptr, png_const_charp c) {
|
||||||
Logger::debug("PNG error in file: '%s', %s", (char*)png_get_error_ptr(png_ptr), c);
|
Logger::debug("PNG error in file: '{}', {}", (char*)png_get_error_ptr(png_ptr), c);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto readPngData = [](png_structp pngPtr, png_bytep data, png_size_t length) {
|
auto readPngData = [](png_structp pngPtr, png_bytep data, png_size_t length) {
|
||||||
@ -19,7 +19,7 @@ Image Image::readPng(IODevicePtr device) {
|
|||||||
device->readFull((char*)header, sizeof(header));
|
device->readFull((char*)header, sizeof(header));
|
||||||
|
|
||||||
if (png_sig_cmp(header, 0, sizeof(header)))
|
if (png_sig_cmp(header, 0, sizeof(header)))
|
||||||
throw ImageException(strf("File %s is not a png image!", device->deviceName()));
|
throw ImageException(strf("File {} is not a png image!", device->deviceName()));
|
||||||
|
|
||||||
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
|
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
|
||||||
if (!png_ptr)
|
if (!png_ptr)
|
||||||
@ -94,7 +94,7 @@ Image Image::readPng(IODevicePtr device) {
|
|||||||
|
|
||||||
if (bitdepth != 8 || (channels != 3 && channels != 4)) {
|
if (bitdepth != 8 || (channels != 3 && channels != 4)) {
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
||||||
throw ImageException(strf("Unsupported PNG pixel format in file %s", device->deviceName()));
|
throw ImageException(strf("Unsupported PNG pixel format in file {}", device->deviceName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Image image(img_width, img_height, channels == 3 ? PixelFormat::RGB24 : PixelFormat::RGBA32);
|
Image image(img_width, img_height, channels == 3 ? PixelFormat::RGB24 : PixelFormat::RGBA32);
|
||||||
@ -112,7 +112,7 @@ Image Image::readPng(IODevicePtr device) {
|
|||||||
|
|
||||||
tuple<Vec2U, PixelFormat> Image::readPngMetadata(IODevicePtr device) {
|
tuple<Vec2U, PixelFormat> Image::readPngMetadata(IODevicePtr device) {
|
||||||
auto logPngError = [](png_structp png_ptr, png_const_charp c) {
|
auto logPngError = [](png_structp png_ptr, png_const_charp c) {
|
||||||
Logger::debug("PNG error in file: '%s', %s", (char*)png_get_error_ptr(png_ptr), c);
|
Logger::debug("PNG error in file: '{}', {}", (char*)png_get_error_ptr(png_ptr), c);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto readPngData = [](png_structp pngPtr, png_bytep data, png_size_t length) {
|
auto readPngData = [](png_structp pngPtr, png_bytep data, png_size_t length) {
|
||||||
@ -124,7 +124,7 @@ tuple<Vec2U, PixelFormat> Image::readPngMetadata(IODevicePtr device) {
|
|||||||
device->readFull((char*)header, sizeof(header));
|
device->readFull((char*)header, sizeof(header));
|
||||||
|
|
||||||
if (png_sig_cmp(header, 0, sizeof(header)))
|
if (png_sig_cmp(header, 0, sizeof(header)))
|
||||||
throw ImageException(strf("File %s is not a png image!", device->deviceName()));
|
throw ImageException(strf("File {} is not a png image!", device->deviceName()));
|
||||||
|
|
||||||
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
|
png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
|
||||||
if (!png_ptr)
|
if (!png_ptr)
|
||||||
@ -267,7 +267,7 @@ void Image::reset(unsigned width, unsigned height, Maybe<PixelFormat> pf) {
|
|||||||
newData = (uint8_t*)Star::realloc(m_data, imageSize);
|
newData = (uint8_t*)Star::realloc(m_data, imageSize);
|
||||||
|
|
||||||
if (!newData)
|
if (!newData)
|
||||||
throw MemoryException::format("Could not allocate memory for new Image size %s\n", imageSize);
|
throw MemoryException::format("Could not allocate memory for new Image size {}\n", imageSize);
|
||||||
|
|
||||||
m_data = newData;
|
m_data = newData;
|
||||||
memset(m_data, 0, imageSize);
|
memset(m_data, 0, imageSize);
|
||||||
@ -316,7 +316,7 @@ void Image::fillRect(Vec2U const& pos, Vec2U const& size, Vec4B const& c) {
|
|||||||
|
|
||||||
void Image::set(Vec2U const& pos, Vec4B const& c) {
|
void Image::set(Vec2U const& pos, Vec4B const& c) {
|
||||||
if (pos[0] >= m_width || pos[1] >= m_height) {
|
if (pos[0] >= m_width || pos[1] >= m_height) {
|
||||||
throw ImageException(strf("%s out of range in Image::set", pos));
|
throw ImageException(strf("{} out of range in Image::set", pos));
|
||||||
} else if (bytesPerPixel() == 4) {
|
} else if (bytesPerPixel() == 4) {
|
||||||
size_t offset = pos[1] * m_width * 4 + pos[0] * 4;
|
size_t offset = pos[1] * m_width * 4 + pos[0] * 4;
|
||||||
m_data[offset] = c[0];
|
m_data[offset] = c[0];
|
||||||
@ -333,7 +333,7 @@ void Image::set(Vec2U const& pos, Vec4B const& c) {
|
|||||||
|
|
||||||
void Image::set(Vec2U const& pos, Vec3B const& c) {
|
void Image::set(Vec2U const& pos, Vec3B const& c) {
|
||||||
if (pos[0] >= m_width || pos[1] >= m_height) {
|
if (pos[0] >= m_width || pos[1] >= m_height) {
|
||||||
throw ImageException(strf("%s out of range in Image::set", pos));
|
throw ImageException(strf("{} out of range in Image::set", pos));
|
||||||
} else if (bytesPerPixel() == 4) {
|
} else if (bytesPerPixel() == 4) {
|
||||||
size_t offset = pos[1] * m_width * 4 + pos[0] * 4;
|
size_t offset = pos[1] * m_width * 4 + pos[0] * 4;
|
||||||
m_data[offset] = c[0];
|
m_data[offset] = c[0];
|
||||||
@ -351,7 +351,7 @@ void Image::set(Vec2U const& pos, Vec3B const& c) {
|
|||||||
Vec4B Image::get(Vec2U const& pos) const {
|
Vec4B Image::get(Vec2U const& pos) const {
|
||||||
Vec4B c;
|
Vec4B c;
|
||||||
if (pos[0] >= m_width || pos[1] >= m_height) {
|
if (pos[0] >= m_width || pos[1] >= m_height) {
|
||||||
throw ImageException(strf("%s out of range in Image::get", pos));
|
throw ImageException(strf("{} out of range in Image::get", pos));
|
||||||
} else if (bytesPerPixel() == 4) {
|
} else if (bytesPerPixel() == 4) {
|
||||||
size_t offset = pos[1] * m_width * 4 + pos[0] * 4;
|
size_t offset = pos[1] * m_width * 4 + pos[0] * 4;
|
||||||
c[0] = m_data[offset];
|
c[0] = m_data[offset];
|
||||||
@ -422,7 +422,7 @@ Vec4B Image::clamprgb(Vec2I const& pos) const {
|
|||||||
|
|
||||||
Image Image::subImage(Vec2U const& pos, Vec2U const& size) const {
|
Image Image::subImage(Vec2U const& pos, Vec2U const& size) const {
|
||||||
if (pos[0] + size[0] > m_width || pos[1] + size[1] > m_height)
|
if (pos[0] + size[0] > m_width || pos[1] + size[1] > m_height)
|
||||||
throw ImageException(strf("call to subImage with pos %s size %s out of image bounds (%s, %s)", pos, size, m_width, m_height));
|
throw ImageException(strf("call to subImage with pos {} size {} out of image bounds ({}, {})", pos, size, m_width, m_height));
|
||||||
|
|
||||||
Image sub(size[0], size[1], m_pixelFormat);
|
Image sub(size[0], size[1], m_pixelFormat);
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ ImageOperation imageOperationFromString(StringView string) {
|
|||||||
hexDecode(hexPtr, 8, c, 4);
|
hexDecode(hexPtr, 8, c, 4);
|
||||||
}
|
}
|
||||||
else if (!which || (ptr != end && ++ptr != end))
|
else if (!which || (ptr != end && ++ptr != end))
|
||||||
throw ImageOperationException(strf("Improper size for hex string '%s' in imageOperationFromString", StringView(hexPtr, hexLen)), false);
|
throw ImageOperationException(strf("Improper size for hex string '{}' in imageOperationFromString", StringView(hexPtr, hexLen)), false);
|
||||||
else // we're in A of A=B. In vanilla only A=B pairs are evaluated, so only throw an exception if B is also there.
|
else // we're in A of A=B. In vanilla only A=B pairs are evaluated, so only throw an exception if B is also there.
|
||||||
return move(operation);
|
return move(operation);
|
||||||
|
|
||||||
@ -341,7 +341,7 @@ ImageOperation imageOperationFromString(StringView string) {
|
|||||||
return FlipImageOperation{FlipImageOperation::FlipXY};
|
return FlipImageOperation{FlipImageOperation::FlipXY};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw ImageOperationException(strf("Could not recognize ImageOperation type %s", type), false);
|
throw ImageOperationException(strf("Could not recognize ImageOperation type {}", type), false);
|
||||||
}
|
}
|
||||||
} catch (OutOfRangeException const& e) {
|
} catch (OutOfRangeException const& e) {
|
||||||
throw ImageOperationException("Error reading ImageOperation", e);
|
throw ImageOperationException("Error reading ImageOperation", e);
|
||||||
@ -352,52 +352,52 @@ ImageOperation imageOperationFromString(StringView string) {
|
|||||||
|
|
||||||
String imageOperationToString(ImageOperation const& operation) {
|
String imageOperationToString(ImageOperation const& operation) {
|
||||||
if (auto op = operation.ptr<HueShiftImageOperation>()) {
|
if (auto op = operation.ptr<HueShiftImageOperation>()) {
|
||||||
return strf("hueshift=%s", op->hueShiftAmount * 360.0f);
|
return strf("hueshift={}", op->hueShiftAmount * 360.0f);
|
||||||
} else if (auto op = operation.ptr<SaturationShiftImageOperation>()) {
|
} else if (auto op = operation.ptr<SaturationShiftImageOperation>()) {
|
||||||
return strf("saturation=%s", op->saturationShiftAmount * 100.0f);
|
return strf("saturation={}", op->saturationShiftAmount * 100.0f);
|
||||||
} else if (auto op = operation.ptr<BrightnessMultiplyImageOperation>()) {
|
} else if (auto op = operation.ptr<BrightnessMultiplyImageOperation>()) {
|
||||||
return strf("brightness=%s", (op->brightnessMultiply - 1.0f) * 100.0f);
|
return strf("brightness={}", (op->brightnessMultiply - 1.0f) * 100.0f);
|
||||||
} else if (auto op = operation.ptr<FadeToColorImageOperation>()) {
|
} else if (auto op = operation.ptr<FadeToColorImageOperation>()) {
|
||||||
return strf("fade=%s=%s", Color::rgb(op->color).toHex(), op->amount);
|
return strf("fade={}={}", Color::rgb(op->color).toHex(), op->amount);
|
||||||
} else if (auto op = operation.ptr<ScanLinesImageOperation>()) {
|
} else if (auto op = operation.ptr<ScanLinesImageOperation>()) {
|
||||||
return strf("scanlines=%s=%s=%s=%s",
|
return strf("scanlines={}={}={}={}",
|
||||||
Color::rgb(op->fade1.color).toHex(),
|
Color::rgb(op->fade1.color).toHex(),
|
||||||
op->fade1.amount,
|
op->fade1.amount,
|
||||||
Color::rgb(op->fade2.color).toHex(),
|
Color::rgb(op->fade2.color).toHex(),
|
||||||
op->fade2.amount);
|
op->fade2.amount);
|
||||||
} else if (auto op = operation.ptr<SetColorImageOperation>()) {
|
} else if (auto op = operation.ptr<SetColorImageOperation>()) {
|
||||||
return strf("setcolor=%s", Color::rgb(op->color).toHex());
|
return strf("setcolor={}", Color::rgb(op->color).toHex());
|
||||||
} else if (auto op = operation.ptr<ColorReplaceImageOperation>()) {
|
} else if (auto op = operation.ptr<ColorReplaceImageOperation>()) {
|
||||||
String str = "replace";
|
String str = "replace";
|
||||||
for (auto const& pair : op->colorReplaceMap)
|
for (auto const& pair : op->colorReplaceMap)
|
||||||
str += strf(";%s=%s", Color::rgba(pair.first).toHex(), Color::rgba(pair.second).toHex());
|
str += strf(";{}={}", Color::rgba(pair.first).toHex(), Color::rgba(pair.second).toHex());
|
||||||
return str;
|
return str;
|
||||||
} else if (auto op = operation.ptr<AlphaMaskImageOperation>()) {
|
} else if (auto op = operation.ptr<AlphaMaskImageOperation>()) {
|
||||||
if (op->mode == AlphaMaskImageOperation::Additive)
|
if (op->mode == AlphaMaskImageOperation::Additive)
|
||||||
return strf("addmask=%s;%s;%s", op->maskImages.join("+"), op->offset[0], op->offset[1]);
|
return strf("addmask={};{};{}", op->maskImages.join("+"), op->offset[0], op->offset[1]);
|
||||||
else if (op->mode == AlphaMaskImageOperation::Subtractive)
|
else if (op->mode == AlphaMaskImageOperation::Subtractive)
|
||||||
return strf("submask=%s;%s;%s", op->maskImages.join("+"), op->offset[0], op->offset[1]);
|
return strf("submask={};{};{}", op->maskImages.join("+"), op->offset[0], op->offset[1]);
|
||||||
} else if (auto op = operation.ptr<BlendImageOperation>()) {
|
} else if (auto op = operation.ptr<BlendImageOperation>()) {
|
||||||
if (op->mode == BlendImageOperation::Multiply)
|
if (op->mode == BlendImageOperation::Multiply)
|
||||||
return strf("blendmult=%s;%s;%s", op->blendImages.join("+"), op->offset[0], op->offset[1]);
|
return strf("blendmult={};{};{}", op->blendImages.join("+"), op->offset[0], op->offset[1]);
|
||||||
else if (op->mode == BlendImageOperation::Screen)
|
else if (op->mode == BlendImageOperation::Screen)
|
||||||
return strf("blendscreen=%s;%s;%s", op->blendImages.join("+"), op->offset[0], op->offset[1]);
|
return strf("blendscreen={};{};{}", op->blendImages.join("+"), op->offset[0], op->offset[1]);
|
||||||
} else if (auto op = operation.ptr<MultiplyImageOperation>()) {
|
} else if (auto op = operation.ptr<MultiplyImageOperation>()) {
|
||||||
return strf("multiply=%s", Color::rgba(op->color).toHex());
|
return strf("multiply={}", Color::rgba(op->color).toHex());
|
||||||
} else if (auto op = operation.ptr<BorderImageOperation>()) {
|
} else if (auto op = operation.ptr<BorderImageOperation>()) {
|
||||||
if (op->outlineOnly)
|
if (op->outlineOnly)
|
||||||
return strf("outline=%d;%s;%s", op->pixels, Color::rgba(op->startColor).toHex(), Color::rgba(op->endColor).toHex());
|
return strf("outline={};{};{}", op->pixels, Color::rgba(op->startColor).toHex(), Color::rgba(op->endColor).toHex());
|
||||||
else
|
else
|
||||||
return strf("border=%d;%s;%s", op->pixels, Color::rgba(op->startColor).toHex(), Color::rgba(op->endColor).toHex());
|
return strf("border={};{};{}", op->pixels, Color::rgba(op->startColor).toHex(), Color::rgba(op->endColor).toHex());
|
||||||
} else if (auto op = operation.ptr<ScaleImageOperation>()) {
|
} else if (auto op = operation.ptr<ScaleImageOperation>()) {
|
||||||
if (op->mode == ScaleImageOperation::Nearest)
|
if (op->mode == ScaleImageOperation::Nearest)
|
||||||
return strf("scalenearest=%s", op->scale);
|
return strf("scalenearest={}", op->scale);
|
||||||
else if (op->mode == ScaleImageOperation::Bilinear)
|
else if (op->mode == ScaleImageOperation::Bilinear)
|
||||||
return strf("scalebilinear=%s", op->scale);
|
return strf("scalebilinear={}", op->scale);
|
||||||
else if (op->mode == ScaleImageOperation::Bicubic)
|
else if (op->mode == ScaleImageOperation::Bicubic)
|
||||||
return strf("scalebicubic=%s", op->scale);
|
return strf("scalebicubic={}", op->scale);
|
||||||
} else if (auto op = operation.ptr<CropImageOperation>()) {
|
} else if (auto op = operation.ptr<CropImageOperation>()) {
|
||||||
return strf("crop=%s;%s;%s;%s", op->subset.xMin(), op->subset.xMax(), op->subset.yMin(), op->subset.yMax());
|
return strf("crop={};{};{};{}", op->subset.xMin(), op->subset.xMax(), op->subset.yMin(), op->subset.yMax());
|
||||||
} else if (auto op = operation.ptr<FlipImageOperation>()) {
|
} else if (auto op = operation.ptr<FlipImageOperation>()) {
|
||||||
if (op->mode == FlipImageOperation::FlipX)
|
if (op->mode == FlipImageOperation::FlipX)
|
||||||
return "flipx";
|
return "flipx";
|
||||||
|
@ -24,7 +24,7 @@ Json::Type Json::typeFromName(String const& t) {
|
|||||||
else if (t == "null")
|
else if (t == "null")
|
||||||
return Type::Null;
|
return Type::Null;
|
||||||
else
|
else
|
||||||
throw JsonException(strf("String '%s' is not a valid json type", t));
|
throw JsonException(strf("String '{}' is not a valid json type", t));
|
||||||
}
|
}
|
||||||
|
|
||||||
String Json::typeName(Type t) {
|
String Json::typeName(Type t) {
|
||||||
@ -180,7 +180,7 @@ double Json::toDouble() const {
|
|||||||
if (type() == Type::Int)
|
if (type() == Type::Int)
|
||||||
return (double)m_data.get<int64_t>();
|
return (double)m_data.get<int64_t>();
|
||||||
|
|
||||||
throw JsonException::format("Improper conversion to double from %s", typeName());
|
throw JsonException::format("Improper conversion to double from {}", typeName());
|
||||||
}
|
}
|
||||||
|
|
||||||
float Json::toFloat() const {
|
float Json::toFloat() const {
|
||||||
@ -189,7 +189,7 @@ float Json::toFloat() const {
|
|||||||
|
|
||||||
bool Json::toBool() const {
|
bool Json::toBool() const {
|
||||||
if (type() != Type::Bool)
|
if (type() != Type::Bool)
|
||||||
throw JsonException::format("Improper conversion to bool from %s", typeName());
|
throw JsonException::format("Improper conversion to bool from {}", typeName());
|
||||||
return m_data.get<bool>();
|
return m_data.get<bool>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,7 +199,7 @@ int64_t Json::toInt() const {
|
|||||||
} else if (type() == Type::Int) {
|
} else if (type() == Type::Int) {
|
||||||
return m_data.get<int64_t>();
|
return m_data.get<int64_t>();
|
||||||
} else {
|
} else {
|
||||||
throw JsonException::format("Improper conversion to int from %s", typeName());
|
throw JsonException::format("Improper conversion to int from {}", typeName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,43 +209,43 @@ uint64_t Json::toUInt() const {
|
|||||||
} else if (type() == Type::Int) {
|
} else if (type() == Type::Int) {
|
||||||
return (uint64_t)m_data.get<int64_t>();
|
return (uint64_t)m_data.get<int64_t>();
|
||||||
} else {
|
} else {
|
||||||
throw JsonException::format("Improper conversion to unsigned int from %s", typeName());
|
throw JsonException::format("Improper conversion to unsigned int from {}", typeName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String Json::toString() const {
|
String Json::toString() const {
|
||||||
if (type() != Type::String)
|
if (type() != Type::String)
|
||||||
throw JsonException(strf("Cannot convert from %s to string", typeName()));
|
throw JsonException(strf("Cannot convert from {} to string", typeName()));
|
||||||
return *m_data.get<StringConstPtr>();
|
return *m_data.get<StringConstPtr>();
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonArray Json::toArray() const {
|
JsonArray Json::toArray() const {
|
||||||
if (type() != Type::Array)
|
if (type() != Type::Array)
|
||||||
throw JsonException::format("Improper conversion to JsonArray from %s", typeName());
|
throw JsonException::format("Improper conversion to JsonArray from {}", typeName());
|
||||||
return *m_data.get<JsonArrayConstPtr>();
|
return *m_data.get<JsonArrayConstPtr>();
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject Json::toObject() const {
|
JsonObject Json::toObject() const {
|
||||||
if (type() != Type::Object)
|
if (type() != Type::Object)
|
||||||
throw JsonException::format("Improper conversion to JsonObject from %s", typeName());
|
throw JsonException::format("Improper conversion to JsonObject from {}", typeName());
|
||||||
return *m_data.get<JsonObjectConstPtr>();
|
return *m_data.get<JsonObjectConstPtr>();
|
||||||
}
|
}
|
||||||
|
|
||||||
StringConstPtr Json::stringPtr() const {
|
StringConstPtr Json::stringPtr() const {
|
||||||
if (type() != Type::String)
|
if (type() != Type::String)
|
||||||
throw JsonException(strf("Cannot convert from %s to string", typeName()));
|
throw JsonException(strf("Cannot convert from {} to string", typeName()));
|
||||||
return m_data.get<StringConstPtr>();
|
return m_data.get<StringConstPtr>();
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonArrayConstPtr Json::arrayPtr() const {
|
JsonArrayConstPtr Json::arrayPtr() const {
|
||||||
if (type() != Type::Array)
|
if (type() != Type::Array)
|
||||||
throw JsonException::format("Improper conversion to JsonArray from %s", typeName());
|
throw JsonException::format("Improper conversion to JsonArray from {}", typeName());
|
||||||
return m_data.get<JsonArrayConstPtr>();
|
return m_data.get<JsonArrayConstPtr>();
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObjectConstPtr Json::objectPtr() const {
|
JsonObjectConstPtr Json::objectPtr() const {
|
||||||
if (type() != Type::Object)
|
if (type() != Type::Object)
|
||||||
throw JsonException::format("Improper conversion to JsonObject from %s", typeName());
|
throw JsonException::format("Improper conversion to JsonObject from {}", typeName());
|
||||||
return m_data.get<JsonObjectConstPtr>();
|
return m_data.get<JsonObjectConstPtr>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,7 +330,7 @@ bool Json::contains(String const& key) const {
|
|||||||
Json Json::get(size_t index) const {
|
Json Json::get(size_t index) const {
|
||||||
if (auto p = ptr(index))
|
if (auto p = ptr(index))
|
||||||
return *p;
|
return *p;
|
||||||
throw JsonException(strf("Json::get(%s) out of range", index));
|
throw JsonException(strf("Json::get({}) out of range", index));
|
||||||
}
|
}
|
||||||
|
|
||||||
double Json::getDouble(size_t index) const {
|
double Json::getDouble(size_t index) const {
|
||||||
@ -422,7 +422,7 @@ JsonObject Json::getObject(size_t index, JsonObject def) const {
|
|||||||
Json Json::get(String const& key) const {
|
Json Json::get(String const& key) const {
|
||||||
if (auto p = ptr(key))
|
if (auto p = ptr(key))
|
||||||
return *p;
|
return *p;
|
||||||
throw JsonException(strf("No such key in Json::get(\"%s\")", key));
|
throw JsonException(strf("No such key in Json::get(\"{}\")", key));
|
||||||
}
|
}
|
||||||
|
|
||||||
double Json::getDouble(String const& key) const {
|
double Json::getDouble(String const& key) const {
|
||||||
@ -822,7 +822,7 @@ Json Json::convert(Type u) const {
|
|||||||
case Type::Object:
|
case Type::Object:
|
||||||
return toObject();
|
return toObject();
|
||||||
default:
|
default:
|
||||||
throw JsonException::format("Improper conversion to type %s", typeName(u));
|
throw JsonException::format("Improper conversion to type {}", typeName(u));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -997,7 +997,7 @@ size_t hash<Json>::operator()(Json const& v) const {
|
|||||||
|
|
||||||
Json const* Json::ptr(size_t index) const {
|
Json const* Json::ptr(size_t index) const {
|
||||||
if (type() != Type::Array)
|
if (type() != Type::Array)
|
||||||
throw JsonException::format("Cannot call get with index on Json type %s, must be Array type", typeName());
|
throw JsonException::format("Cannot call get with index on Json type {}, must be Array type", typeName());
|
||||||
|
|
||||||
auto const& list = *m_data.get<JsonArrayConstPtr>();
|
auto const& list = *m_data.get<JsonArrayConstPtr>();
|
||||||
if (index >= list.size())
|
if (index >= list.size())
|
||||||
@ -1007,7 +1007,7 @@ Json const* Json::ptr(size_t index) const {
|
|||||||
|
|
||||||
Json const* Json::ptr(String const& key) const {
|
Json const* Json::ptr(String const& key) const {
|
||||||
if (type() != Type::Object)
|
if (type() != Type::Object)
|
||||||
throw JsonException::format("Cannot call get with key on Json type %s, must be Object type", typeName());
|
throw JsonException::format("Cannot call get with key on Json type {}, must be Object type", typeName());
|
||||||
auto const& map = m_data.get<JsonObjectConstPtr>();
|
auto const& map = m_data.get<JsonObjectConstPtr>();
|
||||||
|
|
||||||
auto i = map->find(key);
|
auto i = map->find(key);
|
||||||
|
@ -21,7 +21,7 @@ void JsonBuilderStream::endObject() {
|
|||||||
Json v = pop();
|
Json v = pop();
|
||||||
String k = pop().toString();
|
String k = pop().toString();
|
||||||
if (!object.insert(k, move(v)).second)
|
if (!object.insert(k, move(v)).second)
|
||||||
throw JsonParsingException(strf("Json object contains a duplicate entry for key '%s'", k));
|
throw JsonParsingException(strf("Json object contains a duplicate entry for key '{}'", k));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,9 +62,9 @@ Json inputUtf8Json(InputIterator begin, InputIterator end, bool fragment) {
|
|||||||
Utf32Input pend = parser.parse(wbegin, wend, fragment);
|
Utf32Input pend = parser.parse(wbegin, wend, fragment);
|
||||||
|
|
||||||
if (parser.error())
|
if (parser.error())
|
||||||
throw JsonParsingException(strf("Error parsing json: %s at %s:%s", parser.error(), parser.line(), parser.column()));
|
throw JsonParsingException(strf("Error parsing json: {} at {}:{}", parser.error(), parser.line(), parser.column()));
|
||||||
else if (pend != wend)
|
else if (pend != wend)
|
||||||
throw JsonParsingException(strf("Error extra data at end of input at %s:%s", parser.line(), parser.column()));
|
throw JsonParsingException(strf("Error extra data at end of input at {}:{}", parser.line(), parser.column()));
|
||||||
|
|
||||||
return stream.takeTop();
|
return stream.takeTop();
|
||||||
}
|
}
|
||||||
@ -85,9 +85,9 @@ Jsonlike inputUtf32Json(InputIterator begin, InputIterator end, bool fragment) {
|
|||||||
InputIterator pend = parser.parse(begin, end, fragment);
|
InputIterator pend = parser.parse(begin, end, fragment);
|
||||||
|
|
||||||
if (parser.error()) {
|
if (parser.error()) {
|
||||||
throw JsonParsingException(strf("Error parsing json: %s at %s:%s", parser.error(), parser.line(), parser.column()));
|
throw JsonParsingException(strf("Error parsing json: {} at {}:{}", parser.error(), parser.line(), parser.column()));
|
||||||
} else if (pend != end) {
|
} else if (pend != end) {
|
||||||
throw JsonParsingException(strf("Error extra data at end of input at %s:%s", parser.line(), parser.column()));
|
throw JsonParsingException(strf("Error extra data at end of input at {}:{}", parser.line(), parser.column()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return stream.takeTop();
|
return stream.takeTop();
|
||||||
|
@ -147,7 +147,7 @@ RectD jsonToRectD(Json const& v) {
|
|||||||
auto upperRight = jsonToVec2D(v.get(1));
|
auto upperRight = jsonToVec2D(v.get(1));
|
||||||
return RectD(lowerLeft, upperRight);
|
return RectD(lowerLeft, upperRight);
|
||||||
} catch (JsonException const& e) {
|
} catch (JsonException const& e) {
|
||||||
throw JsonException(strf("Inner position not well formed in jsonToRectD: %s", outputException(e, true)));
|
throw JsonException(strf("Inner position not well formed in jsonToRectD: {}", outputException(e, true)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ RectI jsonToRectI(Json const& v) {
|
|||||||
auto upperRight = jsonToVec2I(v.get(1));
|
auto upperRight = jsonToVec2I(v.get(1));
|
||||||
return RectI(lowerLeft, upperRight);
|
return RectI(lowerLeft, upperRight);
|
||||||
} catch (JsonException const& e) {
|
} catch (JsonException const& e) {
|
||||||
throw JsonException(strf("Inner position not well formed in jsonToRectI: %s", outputException(e, true)));
|
throw JsonException(strf("Inner position not well formed in jsonToRectI: {}", outputException(e, true)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +201,7 @@ RectU jsonToRectU(Json const& v) {
|
|||||||
auto upperRight = jsonToVec2U(v.get(1));
|
auto upperRight = jsonToVec2U(v.get(1));
|
||||||
return RectU(lowerLeft, upperRight);
|
return RectU(lowerLeft, upperRight);
|
||||||
} catch (JsonException const& e) {
|
} catch (JsonException const& e) {
|
||||||
throw JsonException(strf("Inner position not well formed in jsonToRectU: %s", outputException(e, true)));
|
throw JsonException(strf("Inner position not well formed in jsonToRectU: {}", outputException(e, true)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,7 +226,7 @@ Color jsonToColor(Json const& v) {
|
|||||||
} else if (v.type() == Json::Type::String) {
|
} else if (v.type() == Json::Type::String) {
|
||||||
return Color(v.toString());
|
return Color(v.toString());
|
||||||
} else {
|
} else {
|
||||||
throw JsonException(strf("Json of type %s cannot be converted to color", v.typeName()));
|
throw JsonException(strf("Json of type {} cannot be converted to color", v.typeName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ Json jsonFromWeightedPool(WeightedPool<T> const& pool, Converter&& converter);
|
|||||||
template <size_t Size>
|
template <size_t Size>
|
||||||
Array<unsigned, Size> jsonToArrayU(Json const& v) {
|
Array<unsigned, Size> jsonToArrayU(Json const& v) {
|
||||||
if (v.size() != Size)
|
if (v.size() != Size)
|
||||||
throw JsonException(strf("Json array not of size %d in jsonToArrayU", Size).c_str());
|
throw JsonException(strf("Json array not of size {} in jsonToArrayU", Size).c_str());
|
||||||
|
|
||||||
Array<unsigned, Size> res;
|
Array<unsigned, Size> res;
|
||||||
for (size_t i = 0; i < Size; i++) {
|
for (size_t i = 0; i < Size; i++) {
|
||||||
@ -119,7 +119,7 @@ Array<unsigned, Size> jsonToArrayU(Json const& v) {
|
|||||||
template <size_t Size>
|
template <size_t Size>
|
||||||
Array<size_t, Size> jsonToArrayS(Json const& v) {
|
Array<size_t, Size> jsonToArrayS(Json const& v) {
|
||||||
if (v.size() != Size)
|
if (v.size() != Size)
|
||||||
throw JsonException(strf("Json array not of size %d in jsonToArrayS", Size).c_str());
|
throw JsonException(strf("Json array not of size {} in jsonToArrayS", Size).c_str());
|
||||||
|
|
||||||
Array<size_t, Size> res;
|
Array<size_t, Size> res;
|
||||||
for (size_t i = 0; i < Size; i++) {
|
for (size_t i = 0; i < Size; i++) {
|
||||||
@ -132,7 +132,7 @@ Array<size_t, Size> jsonToArrayS(Json const& v) {
|
|||||||
template <size_t Size>
|
template <size_t Size>
|
||||||
Array<int, Size> jsonToArrayI(Json const& v) {
|
Array<int, Size> jsonToArrayI(Json const& v) {
|
||||||
if (v.size() != Size)
|
if (v.size() != Size)
|
||||||
throw JsonException(strf("Json array not of size %d in jsonToArrayI", Size).c_str());
|
throw JsonException(strf("Json array not of size {} in jsonToArrayI", Size).c_str());
|
||||||
|
|
||||||
Array<int, Size> res;
|
Array<int, Size> res;
|
||||||
for (size_t i = 0; i < Size; i++) {
|
for (size_t i = 0; i < Size; i++) {
|
||||||
@ -145,7 +145,7 @@ Array<int, Size> jsonToArrayI(Json const& v) {
|
|||||||
template <size_t Size>
|
template <size_t Size>
|
||||||
Array<float, Size> jsonToArrayF(Json const& v) {
|
Array<float, Size> jsonToArrayF(Json const& v) {
|
||||||
if (v.size() != Size)
|
if (v.size() != Size)
|
||||||
throw JsonException(strf("Json array not of size %d in jsonToArrayF", Size).c_str());
|
throw JsonException(strf("Json array not of size {} in jsonToArrayF", Size).c_str());
|
||||||
|
|
||||||
Array<float, Size> res;
|
Array<float, Size> res;
|
||||||
for (size_t i = 0; i < Size; i++) {
|
for (size_t i = 0; i < Size; i++) {
|
||||||
@ -158,7 +158,7 @@ Array<float, Size> jsonToArrayF(Json const& v) {
|
|||||||
template <size_t Size>
|
template <size_t Size>
|
||||||
Array<double, Size> jsonToArrayD(Json const& v) {
|
Array<double, Size> jsonToArrayD(Json const& v) {
|
||||||
if (v.size() != Size)
|
if (v.size() != Size)
|
||||||
throw JsonException(strf("Json array not of size %d in jsonToArrayD", Size).c_str());
|
throw JsonException(strf("Json array not of size {} in jsonToArrayD", Size).c_str());
|
||||||
|
|
||||||
Array<double, Size> res;
|
Array<double, Size> res;
|
||||||
for (size_t i = 0; i < Size; i++) {
|
for (size_t i = 0; i < Size; i++) {
|
||||||
@ -171,7 +171,7 @@ Array<double, Size> jsonToArrayD(Json const& v) {
|
|||||||
template <size_t Size>
|
template <size_t Size>
|
||||||
Array<String, Size> jsonToStringArray(Json const& v) {
|
Array<String, Size> jsonToStringArray(Json const& v) {
|
||||||
if (v.size() != Size)
|
if (v.size() != Size)
|
||||||
throw JsonException(strf("Json array not of size %d in jsonToStringArray", Size).c_str());
|
throw JsonException(strf("Json array not of size {} in jsonToStringArray", Size).c_str());
|
||||||
|
|
||||||
Array<String, Size> res;
|
Array<String, Size> res;
|
||||||
for (size_t i = 0; i < Size; i++) {
|
for (size_t i = 0; i < Size; i++) {
|
||||||
|
@ -12,7 +12,7 @@ Json jsonPatch(Json const& base, JsonArray const& patch) {
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
} catch (JsonException const& e) {
|
} catch (JsonException const& e) {
|
||||||
throw JsonPatchException(strf("Could not apply patch to base. %s", e.what()));
|
throw JsonPatchException(strf("Could not apply patch to base. {}", e.what()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,9 +32,9 @@ namespace JsonPatching {
|
|||||||
auto operation = op.getString("op");
|
auto operation = op.getString("op");
|
||||||
return JsonPatching::functionMap.get(operation)(base, op);
|
return JsonPatching::functionMap.get(operation)(base, op);
|
||||||
} catch (JsonException const& e) {
|
} catch (JsonException const& e) {
|
||||||
throw JsonPatchException(strf("Could not apply operation to base. %s", e.what()));
|
throw JsonPatchException(strf("Could not apply operation to base. {}", e.what()));
|
||||||
} catch (MapException const&) {
|
} catch (MapException const&) {
|
||||||
throw JsonPatchException(strf("Invalid operation: %s", op.getString("op")));
|
throw JsonPatchException(strf("Invalid operation: {}", op.getString("op")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ namespace JsonPatching {
|
|||||||
auto testValue = pointer.get(base);
|
auto testValue = pointer.get(base);
|
||||||
if (!value) {
|
if (!value) {
|
||||||
if (inverseTest)
|
if (inverseTest)
|
||||||
throw JsonPatchTestFail(strf("Test operation failure, expected %s to be missing.", op.getString("path")));
|
throw JsonPatchTestFail(strf("Test operation failure, expected {} to be missing.", op.getString("path")));
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,11 +57,11 @@ namespace JsonPatching {
|
|||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw JsonPatchTestFail(strf("Test operation failure, expected %s found %s.", value, testValue));
|
throw JsonPatchTestFail(strf("Test operation failure, expected {} found {}.", value, testValue));
|
||||||
} catch (JsonPath::TraversalException& e) {
|
} catch (JsonPath::TraversalException& e) {
|
||||||
if (inverseTest)
|
if (inverseTest)
|
||||||
return base;
|
return base;
|
||||||
throw JsonPatchTestFail(strf("Test operation failure: %s", e.what()));
|
throw JsonPatchTestFail(strf("Test operation failure: {}", e.what()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,21 +8,21 @@ namespace JsonPath {
|
|||||||
buffer.clear();
|
buffer.clear();
|
||||||
|
|
||||||
if (*iterator != '/')
|
if (*iterator != '/')
|
||||||
throw ParsingException::format("Missing leading '/' in Json pointer \"%s\"", path);
|
throw ParsingException::format("Missing leading '/' in Json pointer \"{}\"", path);
|
||||||
iterator++;
|
iterator++;
|
||||||
|
|
||||||
while (iterator != end && *iterator != '/') {
|
while (iterator != end && *iterator != '/') {
|
||||||
if (*iterator == '~') {
|
if (*iterator == '~') {
|
||||||
++iterator;
|
++iterator;
|
||||||
if (iterator == end)
|
if (iterator == end)
|
||||||
throw ParsingException::format("Incomplete escape sequence in Json pointer \"%s\"", path);
|
throw ParsingException::format("Incomplete escape sequence in Json pointer \"{}\"", path);
|
||||||
|
|
||||||
if (*iterator == '0')
|
if (*iterator == '0')
|
||||||
buffer.append('~');
|
buffer.append('~');
|
||||||
else if (*iterator == '1')
|
else if (*iterator == '1')
|
||||||
buffer.append('/');
|
buffer.append('/');
|
||||||
else
|
else
|
||||||
throw ParsingException::format("Invalid escape sequence in Json pointer \"%s\"", path);
|
throw ParsingException::format("Invalid escape sequence in Json pointer \"{}\"", path);
|
||||||
++iterator;
|
++iterator;
|
||||||
} else
|
} else
|
||||||
buffer.append(*iterator++);
|
buffer.append(*iterator++);
|
||||||
@ -38,7 +38,7 @@ namespace JsonPath {
|
|||||||
buffer.clear();
|
buffer.clear();
|
||||||
|
|
||||||
if (*iterator == '.') {
|
if (*iterator == '.') {
|
||||||
throw ParsingException::format("Entry starts with '.' in query path \"%s\"", path);
|
throw ParsingException::format("Entry starts with '.' in query path \"{}\"", path);
|
||||||
|
|
||||||
} else if (*iterator == '[') {
|
} else if (*iterator == '[') {
|
||||||
// Parse array number and ']'
|
// Parse array number and ']'
|
||||||
@ -49,7 +49,7 @@ namespace JsonPath {
|
|||||||
buffer.append(*iterator++);
|
buffer.append(*iterator++);
|
||||||
|
|
||||||
if (iterator == end || *iterator != ']')
|
if (iterator == end || *iterator != ']')
|
||||||
throw ParsingException::format("Array has no trailing ']' or has invalid character in query path \"%s\"", path);
|
throw ParsingException::format("Array has no trailing ']' or has invalid character in query path \"{}\"", path);
|
||||||
|
|
||||||
// Consume trailing ']'
|
// Consume trailing ']'
|
||||||
++iterator;
|
++iterator;
|
||||||
|
@ -143,24 +143,24 @@ namespace JsonPath {
|
|||||||
|
|
||||||
if (value.type() == Json::Type::Array) {
|
if (value.type() == Json::Type::Array) {
|
||||||
if (buffer == "-")
|
if (buffer == "-")
|
||||||
throw TraversalException::format("Tried to get key '%s' in non-object type in pathGet(\"%s\")", buffer, path);
|
throw TraversalException::format("Tried to get key '{}' in non-object type in pathGet(\"{}\")", buffer, path);
|
||||||
Maybe<size_t> i = maybeLexicalCast<size_t>(buffer);
|
Maybe<size_t> i = maybeLexicalCast<size_t>(buffer);
|
||||||
if (!i)
|
if (!i)
|
||||||
throw TraversalException::format("Cannot parse '%s' as index in pathGet(\"%s\")", buffer, path);
|
throw TraversalException::format("Cannot parse '{}' as index in pathGet(\"{}\")", buffer, path);
|
||||||
|
|
||||||
if (*i < value.size())
|
if (*i < value.size())
|
||||||
value = value.get(*i);
|
value = value.get(*i);
|
||||||
else
|
else
|
||||||
throw TraversalException::format("Index %s out of range in pathGet(\"%s\")", buffer, path);
|
throw TraversalException::format("Index {} out of range in pathGet(\"{}\")", buffer, path);
|
||||||
|
|
||||||
} else if (value.type() == Json::Type::Object) {
|
} else if (value.type() == Json::Type::Object) {
|
||||||
if (value.contains(buffer))
|
if (value.contains(buffer))
|
||||||
value = value.get(buffer);
|
value = value.get(buffer);
|
||||||
else
|
else
|
||||||
throw TraversalException::format("No such key '%s' in pathGet(\"%s\")", buffer, path);
|
throw TraversalException::format("No such key '{}' in pathGet(\"{}\")", buffer, path);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw TraversalException::format("Tried to get key '%s' in non-object type in pathGet(\"%s\")", buffer, path);
|
throw TraversalException::format("Tried to get key '{}' in non-object type in pathGet(\"{}\")", buffer, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
@ -218,10 +218,10 @@ namespace JsonPath {
|
|||||||
} else {
|
} else {
|
||||||
Maybe<size_t> i = maybeLexicalCast<size_t>(buffer);
|
Maybe<size_t> i = maybeLexicalCast<size_t>(buffer);
|
||||||
if (!i)
|
if (!i)
|
||||||
throw TraversalException::format("Cannot parse '%s' as index in pathApply(\"%s\")", buffer, path);
|
throw TraversalException::format("Cannot parse '{}' as index in pathApply(\"{}\")", buffer, path);
|
||||||
|
|
||||||
if (*i >= value.size())
|
if (*i >= value.size())
|
||||||
throw TraversalException::format("Index %s out of range in pathApply(\"%s\")", buffer, path);
|
throw TraversalException::format("Index {} out of range in pathApply(\"{}\")", buffer, path);
|
||||||
|
|
||||||
return value.set(*i, pathApply(buffer, value.get(*i), parser, path, iterator, op));
|
return value.set(*i, pathApply(buffer, value.get(*i), parser, path, iterator, op));
|
||||||
}
|
}
|
||||||
@ -232,7 +232,7 @@ namespace JsonPath {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (!value.contains(buffer))
|
if (!value.contains(buffer))
|
||||||
throw TraversalException::format("No such key '%s' in pathApply(\"%s\")", buffer, path);
|
throw TraversalException::format("No such key '{}' in pathApply(\"{}\")", buffer, path);
|
||||||
|
|
||||||
Jsonlike newChild = pathApply(buffer, value.get(buffer), parser, path, iterator, op);
|
Jsonlike newChild = pathApply(buffer, value.get(buffer), parser, path, iterator, op);
|
||||||
iterator = current;
|
iterator = current;
|
||||||
@ -242,7 +242,7 @@ namespace JsonPath {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw TraversalException::format("Tried to get key '%s' in non-object type in pathApply(\"%s\")", buffer, path);
|
throw TraversalException::format("Tried to get key '{}' in non-object type in pathApply(\"{}\")", buffer, path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,16 +262,16 @@ namespace JsonPath {
|
|||||||
return arrayOp(parent, {});
|
return arrayOp(parent, {});
|
||||||
Maybe<size_t> i = maybeLexicalCast<size_t>(*key);
|
Maybe<size_t> i = maybeLexicalCast<size_t>(*key);
|
||||||
if (!i)
|
if (!i)
|
||||||
throw TraversalException::format("Cannot parse '%s' as index in Json path \"%s\"", *key, path);
|
throw TraversalException::format("Cannot parse '{}' as index in Json path \"{}\"", *key, path);
|
||||||
if (i && *i > parent.size())
|
if (i && *i > parent.size())
|
||||||
throw TraversalException::format("Index %s out of range in Json path \"%s\"", *key, path);
|
throw TraversalException::format("Index {} out of range in Json path \"{}\"", *key, path);
|
||||||
if (i && *i == parent.size())
|
if (i && *i == parent.size())
|
||||||
i = {};
|
i = {};
|
||||||
return arrayOp(parent, i);
|
return arrayOp(parent, i);
|
||||||
} else if (parent.type() == Json::Type::Object) {
|
} else if (parent.type() == Json::Type::Object) {
|
||||||
return objectOp(parent, *key);
|
return objectOp(parent, *key);
|
||||||
} else {
|
} else {
|
||||||
throw TraversalException::format("Tried to set key '%s' in non-object type in pathSet(\"%s\")", *key, path);
|
throw TraversalException::format("Tried to set key '{}' in non-object type in pathSet(\"{}\")", *key, path);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -297,7 +297,7 @@ namespace JsonPath {
|
|||||||
EmptyPathOp<Jsonlike> emptyPathOp = [](Jsonlike const&) { return Json{}; };
|
EmptyPathOp<Jsonlike> emptyPathOp = [](Jsonlike const&) { return Json{}; };
|
||||||
ObjectOp<Jsonlike> objectOp = [](Jsonlike const& object, String const& key) {
|
ObjectOp<Jsonlike> objectOp = [](Jsonlike const& object, String const& key) {
|
||||||
if (!object.contains(key))
|
if (!object.contains(key))
|
||||||
throw TraversalException::format("Could not find \"%s\" to remove", key);
|
throw TraversalException::format("Could not find \"{}\" to remove", key);
|
||||||
return object.eraseKey(key);
|
return object.eraseKey(key);
|
||||||
};
|
};
|
||||||
ArrayOp<Jsonlike> arrayOp = [](Jsonlike const& array, Maybe<size_t> i) {
|
ArrayOp<Jsonlike> arrayOp = [](Jsonlike const& array, Maybe<size_t> i) {
|
||||||
|
@ -12,7 +12,7 @@ JsonRpc::JsonRpc() {
|
|||||||
|
|
||||||
void JsonRpc::registerHandler(String const& handler, JsonRpcRemoteFunction func) {
|
void JsonRpc::registerHandler(String const& handler, JsonRpcRemoteFunction func) {
|
||||||
if (m_handlers.contains(handler))
|
if (m_handlers.contains(handler))
|
||||||
throw JsonRpcException(strf("Handler by that name already exists '%s'", handler));
|
throw JsonRpcException(strf("Handler by that name already exists '{}'", handler));
|
||||||
m_handlers.add(handler, move(func));
|
m_handlers.add(handler, move(func));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ void JsonRpc::registerHandlers(JsonRpcHandlers const& handlers) {
|
|||||||
|
|
||||||
void JsonRpc::removeHandler(String const& handler) {
|
void JsonRpc::removeHandler(String const& handler) {
|
||||||
if (!m_handlers.contains(handler))
|
if (!m_handlers.contains(handler))
|
||||||
throw JsonRpcException(strf("No such handler by the name '%s'", handler));
|
throw JsonRpcException(strf("No such handler by the name '{}'", handler));
|
||||||
|
|
||||||
m_handlers.remove(handler);
|
m_handlers.remove(handler);
|
||||||
}
|
}
|
||||||
@ -76,14 +76,14 @@ void JsonRpc::receive(ByteArray const& inbuffer) {
|
|||||||
try {
|
try {
|
||||||
auto handlerName = request.getString("handler");
|
auto handlerName = request.getString("handler");
|
||||||
if (!m_handlers.contains(handlerName))
|
if (!m_handlers.contains(handlerName))
|
||||||
throw JsonRpcException(strf("Unknown handler '%s'", handlerName));
|
throw JsonRpcException(strf("Unknown handler '{}'", handlerName));
|
||||||
m_pending.append(JsonObject{
|
m_pending.append(JsonObject{
|
||||||
{"command", "response"},
|
{"command", "response"},
|
||||||
{"id", request.get("id")},
|
{"id", request.get("id")},
|
||||||
{"result", m_handlers[handlerName](request.get("arguments"))}
|
{"result", m_handlers[handlerName](request.get("arguments"))}
|
||||||
});
|
});
|
||||||
} catch (std::exception& e) {
|
} catch (std::exception& e) {
|
||||||
Logger::error("Exception while handling variant rpc request handler call. %s", outputException(e, false));
|
Logger::error("Exception while handling variant rpc request handler call. {}", outputException(e, false));
|
||||||
JsonObject response;
|
JsonObject response;
|
||||||
response["command"] = "fail";
|
response["command"] = "fail";
|
||||||
response["id"] = request.get("id");
|
response["id"] = request.get("id");
|
||||||
@ -98,7 +98,7 @@ void JsonRpc::receive(ByteArray const& inbuffer) {
|
|||||||
auto responseHandler = m_pendingResponse.take(request.getUInt("id"));
|
auto responseHandler = m_pendingResponse.take(request.getUInt("id"));
|
||||||
responseHandler.fulfill(request.get("result"));
|
responseHandler.fulfill(request.get("result"));
|
||||||
} catch (std::exception& e) {
|
} catch (std::exception& e) {
|
||||||
Logger::error("Exception while handling variant rpc response handler call. %s", outputException(e, true));
|
Logger::error("Exception while handling variant rpc response handler call. {}", outputException(e, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (request.get("command") == "fail") {
|
} else if (request.get("command") == "fail") {
|
||||||
@ -106,7 +106,7 @@ void JsonRpc::receive(ByteArray const& inbuffer) {
|
|||||||
auto responseHandler = m_pendingResponse.take(request.getUInt("id"));
|
auto responseHandler = m_pendingResponse.take(request.getUInt("id"));
|
||||||
responseHandler.fulfill({});
|
responseHandler.fulfill({});
|
||||||
} catch (std::exception& e) {
|
} catch (std::exception& e) {
|
||||||
Logger::error("Exception while handling variant rpc failure handler call. %s", outputException(e, true));
|
Logger::error("Exception while handling variant rpc failure handler call. {}", outputException(e, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ Type lexicalCast(StringView s, std::ios_base::fmtflags flags = std::ios_base::bo
|
|||||||
if (m)
|
if (m)
|
||||||
return m.take();
|
return m.take();
|
||||||
else
|
else
|
||||||
throw BadLexicalCast(strf("Lexical cast failed on '%s'", s));
|
throw BadLexicalCast(strf("Lexical cast failed on '{}'", s));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Type>
|
template <class Type>
|
||||||
|
@ -668,14 +668,14 @@ size_t RandomAccessListMixin<BaseList>::lastIndexOf(const_reference e, size_t ti
|
|||||||
template <typename BaseList>
|
template <typename BaseList>
|
||||||
auto RandomAccessListMixin<BaseList>::at(size_t n) const -> const_reference {
|
auto RandomAccessListMixin<BaseList>::at(size_t n) const -> const_reference {
|
||||||
if (n >= Base::size())
|
if (n >= Base::size())
|
||||||
throw OutOfRangeException(strf("out of range list::at(%s)", n));
|
throw OutOfRangeException(strf("out of range list::at({})", n));
|
||||||
return operator[](n);
|
return operator[](n);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BaseList>
|
template <typename BaseList>
|
||||||
auto RandomAccessListMixin<BaseList>::at(size_t n) -> reference {
|
auto RandomAccessListMixin<BaseList>::at(size_t n) -> reference {
|
||||||
if (n >= Base::size())
|
if (n >= Base::size())
|
||||||
throw OutOfRangeException(strf("out of range list::at(%s)", n));
|
throw OutOfRangeException(strf("out of range list::at({})", n));
|
||||||
return operator[](n);
|
return operator[](n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ bool LockFile::lock(int64_t timeout) {
|
|||||||
auto doFLock = [](String const& filename, bool block) -> shared_ptr<int> {
|
auto doFLock = [](String const& filename, bool block) -> shared_ptr<int> {
|
||||||
int fd = open(filename.utf8Ptr(), O_RDONLY | O_CREAT, 0644);
|
int fd = open(filename.utf8Ptr(), O_RDONLY | O_CREAT, 0644);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
throw StarException(strf("Could not open lock file %s, %s\n", filename, strerror(errno)));
|
throw StarException(strf("Could not open lock file {}, {}\n", filename, strerror(errno)));
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
if (block)
|
if (block)
|
||||||
@ -50,7 +50,7 @@ bool LockFile::lock(int64_t timeout) {
|
|||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
close(fd);
|
close(fd);
|
||||||
if (errno != EWOULDBLOCK)
|
if (errno != EWOULDBLOCK)
|
||||||
throw StarException(strf("Could not lock file %s, %s\n", filename, strerror(errno)));
|
throw StarException(strf("Could not lock file {}, {}\n", filename, strerror(errno)));
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ bool LockFile::lock(int64_t timeout) {
|
|||||||
if (handle == INVALID_HANDLE_VALUE) {
|
if (handle == INVALID_HANDLE_VALUE) {
|
||||||
if (GetLastError() == ERROR_SHARING_VIOLATION)
|
if (GetLastError() == ERROR_SHARING_VIOLATION)
|
||||||
return {};
|
return {};
|
||||||
throw StarException(strf("Could not open lock file %s, error code %s\n", filename, GetLastError()));
|
throw StarException(strf("Could not open lock file {}, error code {}\n", filename, GetLastError()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return make_shared<HANDLE>(handle);
|
return make_shared<HANDLE>(handle);
|
||||||
|
@ -24,7 +24,7 @@ LogLevel LogSink::level() {
|
|||||||
|
|
||||||
void StdoutLogSink::log(char const* msg, LogLevel level) {
|
void StdoutLogSink::log(char const* msg, LogLevel level) {
|
||||||
MutexLocker locker(m_logMutex);
|
MutexLocker locker(m_logMutex);
|
||||||
coutf("[%s] %s\n", LogLevelNames.getRight(level), msg);
|
coutf("[{}] {}\n", LogLevelNames.getRight(level), msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
FileLogSink::FileLogSink(String const& filename, LogLevel level, bool truncate) {
|
FileLogSink::FileLogSink(String const& filename, LogLevel level, bool truncate) {
|
||||||
@ -37,7 +37,7 @@ FileLogSink::FileLogSink(String const& filename, LogLevel level, bool truncate)
|
|||||||
|
|
||||||
void FileLogSink::log(char const* msg, LogLevel level) {
|
void FileLogSink::log(char const* msg, LogLevel level) {
|
||||||
MutexLocker locker(m_logMutex);
|
MutexLocker locker(m_logMutex);
|
||||||
auto line = strf("[%s] [%s] %s\n", Time::printCurrentDateAndTime("<hours>:<minutes>:<seconds>.<millis>"), LogLevelNames.getRight(level), msg);
|
auto line = strf("[{}] [{}] {}\n", Time::printCurrentDateAndTime("<hours>:<minutes>:<seconds>.<millis>"), LogLevelNames.getRight(level), msg);
|
||||||
m_output->write(line.data(), line.size());
|
m_output->write(line.data(), line.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ void Logger::error(char const* msg, Args const&... args) {
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void LogMap::set(String const& key, T const& t) {
|
void LogMap::set(String const& key, T const& t) {
|
||||||
setValue(key, strf("%s", t));
|
setValue(key, strf("{}", t));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ LuaCallbacks& LuaCallbacks::merge(LuaCallbacks const& callbacks) {
|
|||||||
for (auto const& pair : callbacks.m_callbacks)
|
for (auto const& pair : callbacks.m_callbacks)
|
||||||
m_callbacks.add(pair.first, pair.second);
|
m_callbacks.add(pair.first, pair.second);
|
||||||
} catch (MapException const& e) {
|
} catch (MapException const& e) {
|
||||||
throw LuaException(strf("Failed to merge LuaCallbacks: %s", outputException(e, true)));
|
throw LuaException(strf("Failed to merge LuaCallbacks: {}", outputException(e, true)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@ -481,7 +481,7 @@ void LuaEngine::threadPushFunction(int threadIndex, int functionIndex) {
|
|||||||
int status = lua_status(thread);
|
int status = lua_status(thread);
|
||||||
lua_Debug ar;
|
lua_Debug ar;
|
||||||
if (status != LUA_OK || lua_getstack(thread, 0, &ar) > 0 || lua_gettop(thread) > 0)
|
if (status != LUA_OK || lua_getstack(thread, 0, &ar) > 0 || lua_gettop(thread) > 0)
|
||||||
throw LuaException(strf("Cannot push function to active or errored thread with status %s", status));
|
throw LuaException(strf("Cannot push function to active or errored thread with status {}", status));
|
||||||
|
|
||||||
pushHandle(thread, functionIndex);
|
pushHandle(thread, functionIndex);
|
||||||
}
|
}
|
||||||
@ -633,9 +633,9 @@ void LuaEngine::handleError(lua_State* state, int res) {
|
|||||||
|
|
||||||
String error;
|
String error;
|
||||||
if (lua_isstring(state, -1))
|
if (lua_isstring(state, -1))
|
||||||
error = strf("Error code %s, %s", res, lua_tostring(state, -1));
|
error = strf("Error code {}, {}", res, lua_tostring(state, -1));
|
||||||
else
|
else
|
||||||
error = strf("Error code %s, <unknown error>", res);
|
error = strf("Error code {}, <unknown error>", res);
|
||||||
|
|
||||||
lua_pop(state, 1);
|
lua_pop(state, 1);
|
||||||
|
|
||||||
|
@ -1717,20 +1717,20 @@ T& LuaUserData::get() const {
|
|||||||
template <typename Function>
|
template <typename Function>
|
||||||
void LuaCallbacks::registerCallback(String name, Function&& func) {
|
void LuaCallbacks::registerCallback(String name, Function&& func) {
|
||||||
if (!m_callbacks.insert(name, LuaDetail::wrapFunction(forward<Function>(func))).second)
|
if (!m_callbacks.insert(name, LuaDetail::wrapFunction(forward<Function>(func))).second)
|
||||||
throw LuaException::format("Lua callback '%s' was registered twice", name);
|
throw LuaException::format("Lua callback '{}' was registered twice", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Return, typename... Args, typename Function>
|
template <typename Return, typename... Args, typename Function>
|
||||||
void LuaCallbacks::registerCallbackWithSignature(String name, Function&& func) {
|
void LuaCallbacks::registerCallbackWithSignature(String name, Function&& func) {
|
||||||
if (!m_callbacks.insert(name, LuaDetail::wrapFunctionWithSignature<Return, Args...>(forward<Function>(func))).second)
|
if (!m_callbacks.insert(name, LuaDetail::wrapFunctionWithSignature<Return, Args...>(forward<Function>(func))).second)
|
||||||
throw LuaException::format("Lua callback '%s' was registered twice", name);
|
throw LuaException::format("Lua callback '{}' was registered twice", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
template <typename Function>
|
template <typename Function>
|
||||||
void LuaMethods<T>::registerMethod(String name, Function&& func) {
|
void LuaMethods<T>::registerMethod(String name, Function&& func) {
|
||||||
if (!m_methods.insert(name, LuaDetail::wrapMethod(forward<Function>(move(func)))).second)
|
if (!m_methods.insert(name, LuaDetail::wrapMethod(forward<Function>(move(func)))).second)
|
||||||
throw LuaException::format("Lua method '%s' was registered twice", name);
|
throw LuaException::format("Lua method '{}' was registered twice", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -1738,7 +1738,7 @@ template <typename Return, typename... Args, typename Function>
|
|||||||
void LuaMethods<T>::registerMethodWithSignature(String name, Function&& func) {
|
void LuaMethods<T>::registerMethodWithSignature(String name, Function&& func) {
|
||||||
if (!m_methods.insert(name, LuaDetail::wrapMethodWithSignature<Return, Args...>(forward<Function>(move(func))))
|
if (!m_methods.insert(name, LuaDetail::wrapMethodWithSignature<Return, Args...>(forward<Function>(move(func))))
|
||||||
.second)
|
.second)
|
||||||
throw LuaException::format("Lua method '%s' was registered twice", name);
|
throw LuaException::format("Lua method '{}' was registered twice", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -1766,7 +1766,7 @@ Ret LuaContext::invokePath(String const& key, Args const&... args) const {
|
|||||||
auto p = getPath(key);
|
auto p = getPath(key);
|
||||||
if (auto f = p.ptr<LuaFunction>())
|
if (auto f = p.ptr<LuaFunction>())
|
||||||
return f->invoke<Ret>(args...);
|
return f->invoke<Ret>(args...);
|
||||||
throw LuaException::format("invokePath called on path '%s' which is not function type", key);
|
throw LuaException::format("invokePath called on path '{}' which is not function type", key);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -1867,14 +1867,14 @@ template <typename T>
|
|||||||
T LuaEngine::luaTo(LuaValue&& v) {
|
T LuaEngine::luaTo(LuaValue&& v) {
|
||||||
if (auto res = luaMaybeTo<T>(move(v)))
|
if (auto res = luaMaybeTo<T>(move(v)))
|
||||||
return res.take();
|
return res.take();
|
||||||
throw LuaConversionException::format("Error converting LuaValue to type '%s'", typeid(T).name());
|
throw LuaConversionException::format("Error converting LuaValue to type '{}'", typeid(T).name());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T LuaEngine::luaTo(LuaValue const& v) {
|
T LuaEngine::luaTo(LuaValue const& v) {
|
||||||
if (auto res = luaMaybeTo<T>(v))
|
if (auto res = luaMaybeTo<T>(v))
|
||||||
return res.take();
|
return res.take();
|
||||||
throw LuaConversionException::format("Error converting LuaValue to type '%s'", typeid(T).name());
|
throw LuaConversionException::format("Error converting LuaValue to type '{}'", typeid(T).name());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
@ -2089,7 +2089,7 @@ template <typename T>
|
|||||||
T* LuaEngine::getUserData(int handleIndex) {
|
T* LuaEngine::getUserData(int handleIndex) {
|
||||||
int typeRef = m_registeredUserDataTypes.value(typeid(T), LUA_NOREF);
|
int typeRef = m_registeredUserDataTypes.value(typeid(T), LUA_NOREF);
|
||||||
if (typeRef == LUA_NOREF)
|
if (typeRef == LUA_NOREF)
|
||||||
throw LuaException::format("Cannot convert userdata type of %s, not registered", typeid(T).name());
|
throw LuaException::format("Cannot convert userdata type of {}, not registered", typeid(T).name());
|
||||||
|
|
||||||
lua_checkstack(m_state, 3);
|
lua_checkstack(m_state, 3);
|
||||||
|
|
||||||
@ -2103,7 +2103,7 @@ T* LuaEngine::getUserData(int handleIndex) {
|
|||||||
lua_rawgeti(m_state, LUA_REGISTRYINDEX, typeRef);
|
lua_rawgeti(m_state, LUA_REGISTRYINDEX, typeRef);
|
||||||
if (!lua_rawequal(m_state, -1, -2)) {
|
if (!lua_rawequal(m_state, -1, -2)) {
|
||||||
lua_pop(m_state, 3);
|
lua_pop(m_state, 3);
|
||||||
throw LuaException::format("Improper conversion from userdata to type %s", typeid(T).name());
|
throw LuaException::format("Improper conversion from userdata to type {}", typeid(T).name());
|
||||||
}
|
}
|
||||||
|
|
||||||
lua_pop(m_state, 3);
|
lua_pop(m_state, 3);
|
||||||
|
@ -163,7 +163,7 @@ template <typename BaseMap>
|
|||||||
auto MapMixin<BaseMap>::take(key_type const& k) -> mapped_type {
|
auto MapMixin<BaseMap>::take(key_type const& k) -> mapped_type {
|
||||||
if (auto v = maybeTake(k))
|
if (auto v = maybeTake(k))
|
||||||
return v.take();
|
return v.take();
|
||||||
throw MapException(strf("Key '%s' not found in Map::take()", outputAny(k)));
|
throw MapException(strf("Key '{}' not found in Map::take()", outputAny(k)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BaseMap>
|
template <typename BaseMap>
|
||||||
@ -182,7 +182,7 @@ template <typename BaseMap>
|
|||||||
auto MapMixin<BaseMap>::get(key_type const& k) -> mapped_type& {
|
auto MapMixin<BaseMap>::get(key_type const& k) -> mapped_type& {
|
||||||
iterator i = Base::find(k);
|
iterator i = Base::find(k);
|
||||||
if (i == Base::end())
|
if (i == Base::end())
|
||||||
throw MapException(strf("Key '%s' not found in Map::get()", outputAny(k)));
|
throw MapException(strf("Key '{}' not found in Map::get()", outputAny(k)));
|
||||||
return i->second;
|
return i->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ template <typename BaseMap>
|
|||||||
auto MapMixin<BaseMap>::get(key_type const& k) const -> mapped_type const& {
|
auto MapMixin<BaseMap>::get(key_type const& k) const -> mapped_type const& {
|
||||||
const_iterator i = Base::find(k);
|
const_iterator i = Base::find(k);
|
||||||
if (i == Base::end())
|
if (i == Base::end())
|
||||||
throw MapException(strf("Key '%s' not found in Map::get()", outputAny(k)));
|
throw MapException(strf("Key '{}' not found in Map::get()", outputAny(k)));
|
||||||
return i->second;
|
return i->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ auto MapMixin<BaseMap>::keyOf(mapped_type const& v) const -> key_type {
|
|||||||
if (i->second == v)
|
if (i->second == v)
|
||||||
return i->first;
|
return i->first;
|
||||||
}
|
}
|
||||||
throw MapException(strf("Value '%s' not found in Map::keyOf()", outputAny(v)));
|
throw MapException(strf("Value '{}' not found in Map::keyOf()", outputAny(v)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BaseMap>
|
template <typename BaseMap>
|
||||||
@ -267,7 +267,7 @@ template <typename BaseMap>
|
|||||||
auto MapMixin<BaseMap>::add(key_type k, mapped_type v) -> mapped_type& {
|
auto MapMixin<BaseMap>::add(key_type k, mapped_type v) -> mapped_type& {
|
||||||
auto pair = Base::insert(value_type(move(k), move(v)));
|
auto pair = Base::insert(value_type(move(k), move(v)));
|
||||||
if (!pair.second)
|
if (!pair.second)
|
||||||
throw MapException(strf("Entry with key '%s' already present.", outputAny(k)));
|
throw MapException(strf("Entry with key '{}' already present.", outputAny(k)));
|
||||||
else
|
else
|
||||||
return pair.first->second;
|
return pair.first->second;
|
||||||
}
|
}
|
||||||
|
@ -291,7 +291,7 @@ template <typename Element, size_t Rank>
|
|||||||
Element const& MultiArray<Element, Rank>::at(IndexArray const& index) const {
|
Element const& MultiArray<Element, Rank>::at(IndexArray const& index) const {
|
||||||
for (size_t i = Rank; i != 0; --i) {
|
for (size_t i = Rank; i != 0; --i) {
|
||||||
if (index[i - 1] >= m_shape[i - 1])
|
if (index[i - 1] >= m_shape[i - 1])
|
||||||
throw MultiArrayException(strf("Out of bounds on MultiArray::at(%s)", index));
|
throw MultiArrayException(strf("Out of bounds on MultiArray::at({})", index));
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_data[storageIndex(index)];
|
return m_data[storageIndex(index)];
|
||||||
@ -301,7 +301,7 @@ template <typename Element, size_t Rank>
|
|||||||
Element& MultiArray<Element, Rank>::at(IndexArray const& index) {
|
Element& MultiArray<Element, Rank>::at(IndexArray const& index) {
|
||||||
for (size_t i = Rank; i != 0; --i) {
|
for (size_t i = Rank; i != 0; --i) {
|
||||||
if (index[i - 1] >= m_shape[i - 1])
|
if (index[i - 1] >= m_shape[i - 1])
|
||||||
throw MultiArrayException(strf("Out of bounds on MultiArray::at(%s)", index));
|
throw MultiArrayException(strf("Out of bounds on MultiArray::at({})", index));
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_data[storageIndex(index)];
|
return m_data[storageIndex(index)];
|
||||||
@ -323,7 +323,7 @@ template <typename Element, size_t Rank>
|
|||||||
void MultiArray<Element, Rank>::set(IndexArray const& index, Element element) {
|
void MultiArray<Element, Rank>::set(IndexArray const& index, Element element) {
|
||||||
for (size_t i = Rank; i != 0; --i) {
|
for (size_t i = Rank; i != 0; --i) {
|
||||||
if (index[i - 1] >= m_shape[i - 1])
|
if (index[i - 1] >= m_shape[i - 1])
|
||||||
throw MultiArrayException(strf("Out of bounds on MultiArray::set(%s)", index));
|
throw MultiArrayException(strf("Out of bounds on MultiArray::set({})", index));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_data[storageIndex(index)] = move(element);
|
m_data[storageIndex(index)] = move(element);
|
||||||
|
@ -266,7 +266,7 @@ auto NetElementMapWrapper<BaseMap>::insert(key_type k, mapped_type v) -> pair<co
|
|||||||
template <typename BaseMap>
|
template <typename BaseMap>
|
||||||
void NetElementMapWrapper<BaseMap>::add(key_type k, mapped_type v) {
|
void NetElementMapWrapper<BaseMap>::add(key_type k, mapped_type v) {
|
||||||
if (!insert(value_type(move(k), move(v))).second)
|
if (!insert(value_type(move(k), move(v))).second)
|
||||||
throw MapException::format("Entry with key '%s' already present.", outputAny(k));
|
throw MapException::format("Entry with key '{}' already present.", outputAny(k));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename BaseMap>
|
template <typename BaseMap>
|
||||||
@ -321,7 +321,7 @@ template <typename BaseMap>
|
|||||||
auto NetElementMapWrapper<BaseMap>::take(key_type const& k) -> mapped_type {
|
auto NetElementMapWrapper<BaseMap>::take(key_type const& k) -> mapped_type {
|
||||||
auto i = BaseMap::find(k);
|
auto i = BaseMap::find(k);
|
||||||
if (i == BaseMap::end())
|
if (i == BaseMap::end())
|
||||||
throw MapException::format("Key '%s' not found in Map::take()", outputAny(k));
|
throw MapException::format("Key '{}' not found in Map::take()", outputAny(k));
|
||||||
auto m = move(i->second);
|
auto m = move(i->second);
|
||||||
erase(i);
|
erase(i);
|
||||||
return m;
|
return m;
|
||||||
|
@ -57,7 +57,7 @@ inline String netErrorString() {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
#else
|
#else
|
||||||
return strf("%s - %s", errno, strerror(errno));
|
return strf("{} - {}", errno, strerror(errno));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ struct SocketImpl {
|
|||||||
int ret = ::setsockopt(socketDesc, level, optname, optval, len);
|
int ret = ::setsockopt(socketDesc, level, optname, optval, len);
|
||||||
#endif
|
#endif
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw NetworkException(strf("setSockOpt failed to set %d, %d: %s", level, optname, netErrorString()));
|
throw NetworkException(strf("setSockOpt failed to set {}, {}: {}", level, optname, netErrorString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STAR_SYSTEM_FAMILY_WINDOWS
|
#ifdef STAR_SYSTEM_FAMILY_WINDOWS
|
||||||
|
@ -17,12 +17,12 @@ void OptionParser::setAdditionalHelp(String help) {
|
|||||||
|
|
||||||
void OptionParser::addSwitch(String const& flag, String description) {
|
void OptionParser::addSwitch(String const& flag, String description) {
|
||||||
if (!m_options.insert(flag, Switch{flag, move(description)}).second)
|
if (!m_options.insert(flag, Switch{flag, move(description)}).second)
|
||||||
throw OptionParserException::format("Duplicate switch '-%s' added", flag);
|
throw OptionParserException::format("Duplicate switch '-{}' added", flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionParser::addParameter(String const& flag, String argument, RequirementMode requirementMode, String description) {
|
void OptionParser::addParameter(String const& flag, String argument, RequirementMode requirementMode, String description) {
|
||||||
if (!m_options.insert(flag, Parameter{flag, move(argument), requirementMode, move(description)}).second)
|
if (!m_options.insert(flag, Parameter{flag, move(argument), requirementMode, move(description)}).second)
|
||||||
throw OptionParserException::format("Duplicate flag '-%s' added", flag);
|
throw OptionParserException::format("Duplicate flag '-{}' added", flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionParser::addArgument(String argument, RequirementMode requirementMode, String description) {
|
void OptionParser::addArgument(String argument, RequirementMode requirementMode, String description) {
|
||||||
@ -46,7 +46,7 @@ pair<OptionParser::Options, StringList> OptionParser::parseOptions(StringList co
|
|||||||
String flag = arg.substr(1);
|
String flag = arg.substr(1);
|
||||||
auto option = m_options.maybe(flag);
|
auto option = m_options.maybe(flag);
|
||||||
if (!option) {
|
if (!option) {
|
||||||
errors.append(strf("No such option '-%s'", flag));
|
errors.append(strf("No such option '-{}'", flag));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,12 +55,12 @@ pair<OptionParser::Options, StringList> OptionParser::parseOptions(StringList co
|
|||||||
} else {
|
} else {
|
||||||
auto const& parameter = option->get<Parameter>();
|
auto const& parameter = option->get<Parameter>();
|
||||||
if (!it.hasNext()) {
|
if (!it.hasNext()) {
|
||||||
errors.append(strf("Option '-%s' must be followed by an argument", flag));
|
errors.append(strf("Option '-{}' must be followed by an argument", flag));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String val = it.next();
|
String val = it.next();
|
||||||
if (parameter.requirementMode != Multiple && result.parameters.contains(flag)) {
|
if (parameter.requirementMode != Multiple && result.parameters.contains(flag)) {
|
||||||
errors.append(strf("Option with argument '-%s' specified multiple times", flag));
|
errors.append(strf("Option with argument '-{}' specified multiple times", flag));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
result.parameters[move(flag)].append(move(val));
|
result.parameters[move(flag)].append(move(val));
|
||||||
@ -75,7 +75,7 @@ pair<OptionParser::Options, StringList> OptionParser::parseOptions(StringList co
|
|||||||
if (pair.second.is<Parameter>()) {
|
if (pair.second.is<Parameter>()) {
|
||||||
auto const& na = pair.second.get<Parameter>();
|
auto const& na = pair.second.get<Parameter>();
|
||||||
if (na.requirementMode == Required && !result.parameters.contains(pair.first))
|
if (na.requirementMode == Required && !result.parameters.contains(pair.first))
|
||||||
errors.append(strf("Missing required flag with argument '-%s'", pair.first));
|
errors.append(strf("Missing required flag with argument '-{}'", pair.first));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,72 +91,72 @@ pair<OptionParser::Options, StringList> OptionParser::parseOptions(StringList co
|
|||||||
}
|
}
|
||||||
if (result.arguments.size() < minimumArguments)
|
if (result.arguments.size() < minimumArguments)
|
||||||
errors.append(strf(
|
errors.append(strf(
|
||||||
"Too few positional arguments given, expected at least %s got %s", minimumArguments, result.arguments.size()));
|
"Too few positional arguments given, expected at least {} got {}", minimumArguments, result.arguments.size()));
|
||||||
if (result.arguments.size() > maximumArguments)
|
if (result.arguments.size() > maximumArguments)
|
||||||
errors.append(strf(
|
errors.append(strf(
|
||||||
"Too many positional arguments given, expected at most %s got %s", maximumArguments, result.arguments.size()));
|
"Too many positional arguments given, expected at most {} got {}", maximumArguments, result.arguments.size()));
|
||||||
|
|
||||||
return {move(result), move(errors)};
|
return {move(result), move(errors)};
|
||||||
}
|
}
|
||||||
|
|
||||||
void OptionParser::printHelp(std::ostream& os) const {
|
void OptionParser::printHelp(std::ostream& os) const {
|
||||||
if (!m_commandName.empty() && !m_summary.empty())
|
if (!m_commandName.empty() && !m_summary.empty())
|
||||||
format(os, "%s: %s\n\n", m_commandName, m_summary);
|
format(os, "{}: {}\n\n", m_commandName, m_summary);
|
||||||
else if (!m_commandName.empty())
|
else if (!m_commandName.empty())
|
||||||
format(os, "%s:\n\n", m_commandName);
|
format(os, "{}:\n\n", m_commandName);
|
||||||
else if (!m_summary.empty())
|
else if (!m_summary.empty())
|
||||||
format(os, "%s\n\n", m_summary);
|
format(os, "{}\n\n", m_summary);
|
||||||
|
|
||||||
String cmdLineText;
|
String cmdLineText;
|
||||||
|
|
||||||
for (auto const& p : m_options) {
|
for (auto const& p : m_options) {
|
||||||
if (p.second.is<Switch>()) {
|
if (p.second.is<Switch>()) {
|
||||||
cmdLineText += strf(" [-%s]", p.first);
|
cmdLineText += strf(" [-{}]", p.first);
|
||||||
} else {
|
} else {
|
||||||
auto const& parameter = p.second.get<Parameter>();
|
auto const& parameter = p.second.get<Parameter>();
|
||||||
if (parameter.requirementMode == Optional)
|
if (parameter.requirementMode == Optional)
|
||||||
cmdLineText += strf(" [-%s <%s>]", parameter.flag, parameter.argument);
|
cmdLineText += strf(" [-{} <{}>]", parameter.flag, parameter.argument);
|
||||||
else if (parameter.requirementMode == Required)
|
else if (parameter.requirementMode == Required)
|
||||||
cmdLineText += strf(" -%s <%s>", parameter.flag, parameter.argument);
|
cmdLineText += strf(" -{} <{}>", parameter.flag, parameter.argument);
|
||||||
else if (parameter.requirementMode == Multiple)
|
else if (parameter.requirementMode == Multiple)
|
||||||
cmdLineText += strf(" [-%s <%s>]...", parameter.flag, parameter.argument);
|
cmdLineText += strf(" [-{} <{}>]...", parameter.flag, parameter.argument);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto const& p : m_arguments) {
|
for (auto const& p : m_arguments) {
|
||||||
if (p.requirementMode == Optional)
|
if (p.requirementMode == Optional)
|
||||||
cmdLineText += strf(" [<%s>]", p.argumentName);
|
cmdLineText += strf(" [<{}>]", p.argumentName);
|
||||||
else if (p.requirementMode == Required)
|
else if (p.requirementMode == Required)
|
||||||
cmdLineText += strf(" <%s>", p.argumentName);
|
cmdLineText += strf(" <{}>", p.argumentName);
|
||||||
else
|
else
|
||||||
cmdLineText += strf(" [<%s>...]", p.argumentName);
|
cmdLineText += strf(" [<{}>...]", p.argumentName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_commandName.empty())
|
if (m_commandName.empty())
|
||||||
format(os, "Command Line Usage:%s\n", cmdLineText);
|
format(os, "Command Line Usage:{}\n", cmdLineText);
|
||||||
else
|
else
|
||||||
format(os, "Command Line Usage: %s%s\n", m_commandName, cmdLineText);
|
format(os, "Command Line Usage: {}{}\n", m_commandName, cmdLineText);
|
||||||
|
|
||||||
for (auto const& p : m_options) {
|
for (auto const& p : m_options) {
|
||||||
if (p.second.is<Switch>()) {
|
if (p.second.is<Switch>()) {
|
||||||
auto const& sw = p.second.get<Switch>();
|
auto const& sw = p.second.get<Switch>();
|
||||||
if (!sw.description.empty())
|
if (!sw.description.empty())
|
||||||
format(os, " -%s\t- %s\n", sw.flag, sw.description);
|
format(os, " -{}\t- {}\n", sw.flag, sw.description);
|
||||||
}
|
}
|
||||||
if (p.second.is<Parameter>()) {
|
if (p.second.is<Parameter>()) {
|
||||||
auto const& parameter = p.second.get<Parameter>();
|
auto const& parameter = p.second.get<Parameter>();
|
||||||
if (!parameter.description.empty())
|
if (!parameter.description.empty())
|
||||||
format(os, " -%s <%s>\t- %s\n", parameter.flag, parameter.argument, parameter.description);
|
format(os, " -{} <{}>\t- {}\n", parameter.flag, parameter.argument, parameter.description);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto const& p : m_arguments) {
|
for (auto const& p : m_arguments) {
|
||||||
if (!p.description.empty())
|
if (!p.description.empty())
|
||||||
format(os, " <%s>\t- %s\n", p.argumentName, p.description);
|
format(os, " <{}>\t- {}\n", p.argumentName, p.description);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_additionalHelp.empty())
|
if (!m_additionalHelp.empty())
|
||||||
format(os, "\n%s\n", m_additionalHelp);
|
format(os, "\n{}\n", m_additionalHelp);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,7 @@ template <template <typename...> class Map, typename Key, typename Value, typena
|
|||||||
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::get(key_type const& k) -> mapped_type& {
|
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::get(key_type const& k) -> mapped_type& {
|
||||||
auto i = m_map.find(k);
|
auto i = m_map.find(k);
|
||||||
if (i == m_map.end())
|
if (i == m_map.end())
|
||||||
throw MapException(strf("Key '%s' not found in OrderedMap::get()", outputAny(k)));
|
throw MapException(strf("Key '{}' not found in OrderedMap::get()", outputAny(k)));
|
||||||
|
|
||||||
return i->second->second;
|
return i->second->second;
|
||||||
}
|
}
|
||||||
@ -308,7 +308,7 @@ auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::keyOf(mapped_typ
|
|||||||
if (i->second == v)
|
if (i->second == v)
|
||||||
return i->first;
|
return i->first;
|
||||||
}
|
}
|
||||||
throw MapException(strf("Value '%s' not found in OrderedMap::keyOf()", outputAny(v)));
|
throw MapException(strf("Value '{}' not found in OrderedMap::keyOf()", outputAny(v)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <template <typename...> class Map, typename Key, typename Value, typename Allocator, typename... MapArgs>
|
template <template <typename...> class Map, typename Key, typename Value, typename Allocator, typename... MapArgs>
|
||||||
@ -359,7 +359,7 @@ template <template <typename...> class Map, typename Key, typename Value, typena
|
|||||||
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::add(key_type k, mapped_type v) -> mapped_type& {
|
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::add(key_type k, mapped_type v) -> mapped_type& {
|
||||||
auto pair = insert(value_type(move(k), move(v)));
|
auto pair = insert(value_type(move(k), move(v)));
|
||||||
if (!pair.second)
|
if (!pair.second)
|
||||||
throw MapException(strf("Entry with key '%s' already present.", outputAny(k)));
|
throw MapException(strf("Entry with key '{}' already present.", outputAny(k)));
|
||||||
else
|
else
|
||||||
return pair.first->second;
|
return pair.first->second;
|
||||||
}
|
}
|
||||||
@ -405,7 +405,7 @@ auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::take(key_type co
|
|||||||
m_order.erase(i->second);
|
m_order.erase(i->second);
|
||||||
return v;
|
return v;
|
||||||
} else {
|
} else {
|
||||||
throw MapException(strf("Key '%s' not found in OrderedMap::take()", outputAny(k)));
|
throw MapException(strf("Key '{}' not found in OrderedMap::take()", outputAny(k)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,7 +509,7 @@ auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::indexOf(key_type
|
|||||||
template <template <typename...> class Map, typename Key, typename Value, typename Allocator, typename... MapArgs>
|
template <template <typename...> class Map, typename Key, typename Value, typename Allocator, typename... MapArgs>
|
||||||
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::keyAt(size_t i) const -> key_type const& {
|
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::keyAt(size_t i) const -> key_type const& {
|
||||||
if (i >= size())
|
if (i >= size())
|
||||||
throw MapException(strf("index %s out of range in OrderedMap::at()", i));
|
throw MapException(strf("index {} out of range in OrderedMap::at()", i));
|
||||||
|
|
||||||
auto it = begin();
|
auto it = begin();
|
||||||
std::advance(it, i);
|
std::advance(it, i);
|
||||||
@ -524,7 +524,7 @@ auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::valueAt(size_t i
|
|||||||
template <template <typename...> class Map, typename Key, typename Value, typename Allocator, typename... MapArgs>
|
template <template <typename...> class Map, typename Key, typename Value, typename Allocator, typename... MapArgs>
|
||||||
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::valueAt(size_t i) -> mapped_type& {
|
auto OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::valueAt(size_t i) -> mapped_type& {
|
||||||
if (i >= size())
|
if (i >= size())
|
||||||
throw MapException(strf("index %s out of range in OrderedMap::valueAt()", i));
|
throw MapException(strf("index {} out of range in OrderedMap::valueAt()", i));
|
||||||
|
|
||||||
auto it = m_order.begin();
|
auto it = m_order.begin();
|
||||||
std::advance(it, i);
|
std::advance(it, i);
|
||||||
@ -612,7 +612,7 @@ template <template <typename...> class Map, typename Key, typename Value, typena
|
|||||||
void OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::toBack(key_type const& k) {
|
void OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::toBack(key_type const& k) {
|
||||||
auto i = m_map.find(k);
|
auto i = m_map.find(k);
|
||||||
if (i == m_map.end())
|
if (i == m_map.end())
|
||||||
throw MapException(strf("Key not found in OrderedMap::toBack('%s')", outputAny(k)));
|
throw MapException(strf("Key not found in OrderedMap::toBack('{}')", outputAny(k)));
|
||||||
|
|
||||||
toBack(i->second);
|
toBack(i->second);
|
||||||
}
|
}
|
||||||
@ -621,7 +621,7 @@ template <template <typename...> class Map, typename Key, typename Value, typena
|
|||||||
void OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::toFront(key_type const& k) {
|
void OrderedMapWrapper<Map, Key, Value, Allocator, MapArgs...>::toFront(key_type const& k) {
|
||||||
auto i = m_map.find(k);
|
auto i = m_map.find(k);
|
||||||
if (i == m_map.end())
|
if (i == m_map.end())
|
||||||
throw MapException(strf("Key not found in OrderedMap::toFront('%s')", outputAny(k)));
|
throw MapException(strf("Key not found in OrderedMap::toFront('{}')", outputAny(k)));
|
||||||
|
|
||||||
toFront(i->second);
|
toFront(i->second);
|
||||||
}
|
}
|
||||||
|
@ -59,19 +59,19 @@ struct SignalHandlerImpl {
|
|||||||
else if (modeFlag == 8)
|
else if (modeFlag == 8)
|
||||||
mode = "Execute";
|
mode = "Execute";
|
||||||
else
|
else
|
||||||
mode = strf("Mode(%s)", modeFlag);
|
mode = strf("Mode({})", modeFlag);
|
||||||
g_sehMessage = strf("Access violation detected at %s (%s of address %s)",
|
g_sehMessage = strf("Access violation detected at {} ({} of address {})",
|
||||||
ExceptionInfo->ExceptionRecord->ExceptionAddress,
|
ExceptionInfo->ExceptionRecord->ExceptionAddress,
|
||||||
mode,
|
mode,
|
||||||
(PVOID)ExceptionInfo->ExceptionRecord->ExceptionInformation[1]);
|
(PVOID)ExceptionInfo->ExceptionRecord->ExceptionInformation[1]);
|
||||||
} else {
|
} else {
|
||||||
g_sehMessage = msg;
|
g_sehMessage = msg;
|
||||||
g_sehMessage = strf("%s (%p @ %s)",
|
g_sehMessage = strf("{} (%p @ {})",
|
||||||
g_sehMessage,
|
g_sehMessage,
|
||||||
ExceptionInfo->ExceptionRecord->ExceptionCode,
|
ExceptionInfo->ExceptionRecord->ExceptionCode,
|
||||||
ExceptionInfo->ExceptionRecord->ExceptionAddress);
|
ExceptionInfo->ExceptionRecord->ExceptionAddress);
|
||||||
for (DWORD i = 0; i < ExceptionInfo->ExceptionRecord->NumberParameters; i++)
|
for (DWORD i = 0; i < ExceptionInfo->ExceptionRecord->NumberParameters; i++)
|
||||||
g_sehMessage = strf("%s [%s]", g_sehMessage, (PVOID)ExceptionInfo->ExceptionRecord->ExceptionInformation[i]);
|
g_sehMessage = strf("{} [{}]", g_sehMessage, (PVOID)ExceptionInfo->ExceptionRecord->ExceptionInformation[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup a hijack into our own trampoline as if the failure actually was a
|
// setup a hijack into our own trampoline as if the failure actually was a
|
||||||
|
@ -209,7 +209,7 @@ void SmallVector<Element, MaxStackSize>::reserve(size_t newCapacity) {
|
|||||||
newCapacity = max(oldCapacity * 2, newCapacity);
|
newCapacity = max(oldCapacity * 2, newCapacity);
|
||||||
auto newMem = (Element*)Star::malloc(newCapacity * sizeof(Element));
|
auto newMem = (Element*)Star::malloc(newCapacity * sizeof(Element));
|
||||||
if (!newMem)
|
if (!newMem)
|
||||||
throw MemoryException::format("Could not set new SmallVector capacity %s\n", newCapacity);
|
throw MemoryException::format("Could not set new SmallVector capacity {}\n", newCapacity);
|
||||||
|
|
||||||
size_t size = m_end - m_begin;
|
size_t size = m_end - m_begin;
|
||||||
auto oldMem = m_begin;
|
auto oldMem = m_begin;
|
||||||
@ -238,14 +238,14 @@ void SmallVector<Element, MaxStackSize>::reserve(size_t newCapacity) {
|
|||||||
template <typename Element, size_t MaxStackSize>
|
template <typename Element, size_t MaxStackSize>
|
||||||
auto SmallVector<Element, MaxStackSize>::at(size_t i) -> reference {
|
auto SmallVector<Element, MaxStackSize>::at(size_t i) -> reference {
|
||||||
if (i >= size())
|
if (i >= size())
|
||||||
throw OutOfRangeException::format("out of range in SmallVector::at(%s)", i);
|
throw OutOfRangeException::format("out of range in SmallVector::at({})", i);
|
||||||
return m_begin[i];
|
return m_begin[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Element, size_t MaxStackSize>
|
template <typename Element, size_t MaxStackSize>
|
||||||
auto SmallVector<Element, MaxStackSize>::at(size_t i) const -> const_reference {
|
auto SmallVector<Element, MaxStackSize>::at(size_t i) const -> const_reference {
|
||||||
if (i >= size())
|
if (i >= size())
|
||||||
throw OutOfRangeException::format("out of range in SmallVector::at(%s)", i);
|
throw OutOfRangeException::format("out of range in SmallVector::at({})", i);
|
||||||
return m_begin[i];
|
return m_begin[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ Maybe<SocketPollResult> Socket::poll(SocketPollQuery const& query, unsigned time
|
|||||||
ret = ::select(0, &readfs, &writefs, &exceptfs, &time);
|
ret = ::select(0, &readfs, &writefs, &exceptfs, &time);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw NetworkException::format("Error during call to select, '%s'", netErrorString());
|
throw NetworkException::format("Error during call to select, '{}'", netErrorString());
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
return {};
|
return {};
|
||||||
@ -82,7 +82,7 @@ Maybe<SocketPollResult> Socket::poll(SocketPollQuery const& query, unsigned time
|
|||||||
ret = ::poll(pollfds.get(), query.size(), timeout);
|
ret = ::poll(pollfds.get(), query.size(), timeout);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
throw NetworkException::format("Error during call to poll, '%s'", netErrorString());
|
throw NetworkException::format("Error during call to poll, '{}'", netErrorString());
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
return {};
|
return {};
|
||||||
@ -127,18 +127,18 @@ void Socket::bind(HostAddressWithPort const& addressWithPort) {
|
|||||||
m_localAddress = addressWithPort;
|
m_localAddress = addressWithPort;
|
||||||
setNativeFromAddress(m_localAddress, &sockAddr, &sockAddrLen);
|
setNativeFromAddress(m_localAddress, &sockAddr, &sockAddrLen);
|
||||||
if (::bind(m_impl->socketDesc, (struct sockaddr*)&sockAddr, sockAddrLen) < 0)
|
if (::bind(m_impl->socketDesc, (struct sockaddr*)&sockAddr, sockAddrLen) < 0)
|
||||||
throw NetworkException(strf("Cannot bind socket to %s: %s", m_localAddress, netErrorString()));
|
throw NetworkException(strf("Cannot bind socket to {}: {}", m_localAddress, netErrorString()));
|
||||||
|
|
||||||
m_socketMode = SocketMode::Bound;
|
m_socketMode = SocketMode::Bound;
|
||||||
|
|
||||||
Logger::debug("bind %s (%d)", addressWithPort, m_impl->socketDesc);
|
Logger::debug("bind {} ({})", addressWithPort, m_impl->socketDesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::listen(int backlog) {
|
void Socket::listen(int backlog) {
|
||||||
WriteLocker locker(m_mutex);
|
WriteLocker locker(m_mutex);
|
||||||
|
|
||||||
if (::listen(m_impl->socketDesc, backlog) != 0)
|
if (::listen(m_impl->socketDesc, backlog) != 0)
|
||||||
throw NetworkException(strf("Could not listen on socket: '%s'", netErrorString()));
|
throw NetworkException(strf("Could not listen on socket: '{}'", netErrorString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::setTimeout(unsigned timeout) {
|
void Socket::setTimeout(unsigned timeout) {
|
||||||
@ -168,14 +168,14 @@ void Socket::setNonBlocking(bool nonBlocking) {
|
|||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
unsigned long mode = nonBlocking ? 1 : 0;
|
unsigned long mode = nonBlocking ? 1 : 0;
|
||||||
if (ioctlsocket(m_impl->socketDesc, FIONBIO, &mode) != 0)
|
if (ioctlsocket(m_impl->socketDesc, FIONBIO, &mode) != 0)
|
||||||
throw NetworkException::format("Cannot set socket non-blocking mode: %s", netErrorString());
|
throw NetworkException::format("Cannot set socket non-blocking mode: {}", netErrorString());
|
||||||
#else
|
#else
|
||||||
int flags = fcntl(m_impl->socketDesc, F_GETFL, 0);
|
int flags = fcntl(m_impl->socketDesc, F_GETFL, 0);
|
||||||
if (flags < 0)
|
if (flags < 0)
|
||||||
throw NetworkException::format("fcntl failure getting socket flags: %s", netErrorString());
|
throw NetworkException::format("fcntl failure getting socket flags: {}", netErrorString());
|
||||||
flags = nonBlocking ? (flags | O_NONBLOCK) : (flags & ~O_NONBLOCK);
|
flags = nonBlocking ? (flags | O_NONBLOCK) : (flags & ~O_NONBLOCK);
|
||||||
if (fcntl(m_impl->socketDesc, F_SETFL, flags) != 0)
|
if (fcntl(m_impl->socketDesc, F_SETFL, flags) != 0)
|
||||||
throw NetworkException::format("fcntl failure setting non-blocking mode: %s", netErrorString());
|
throw NetworkException::format("fcntl failure setting non-blocking mode: {}", netErrorString());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ Socket::Socket(SocketType type, NetworkMode networkMode)
|
|||||||
m_impl->socketDesc = ::socket(AF_INET6, type == SocketType::Tcp ? SOCK_STREAM : SOCK_DGRAM, 0);
|
m_impl->socketDesc = ::socket(AF_INET6, type == SocketType::Tcp ? SOCK_STREAM : SOCK_DGRAM, 0);
|
||||||
|
|
||||||
if (invalidSocketDescriptor(m_impl->socketDesc))
|
if (invalidSocketDescriptor(m_impl->socketDesc))
|
||||||
throw NetworkException(strf("cannot create socket: %s", netErrorString()));
|
throw NetworkException(strf("cannot create socket: {}", netErrorString()));
|
||||||
|
|
||||||
m_socketMode = SocketMode::Shutdown;
|
m_socketMode = SocketMode::Shutdown;
|
||||||
setTimeout(60000);
|
setTimeout(60000);
|
||||||
@ -231,7 +231,7 @@ Socket::Socket(NetworkMode networkMode, SocketImplPtr impl, SocketMode socketMod
|
|||||||
|
|
||||||
void Socket::checkOpen(char const* methodName) const {
|
void Socket::checkOpen(char const* methodName) const {
|
||||||
if (m_socketMode == SocketMode::Closed)
|
if (m_socketMode == SocketMode::Closed)
|
||||||
throw SocketClosedException::format("Socket not open in %s", methodName);
|
throw SocketClosedException::format("Socket not open in {}", methodName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Socket::doShutdown() {
|
void Socket::doShutdown() {
|
||||||
|
@ -188,7 +188,7 @@ bool StaticVector<Element, MaxSize>::empty() const {
|
|||||||
template <typename Element, size_t MaxSize>
|
template <typename Element, size_t MaxSize>
|
||||||
void StaticVector<Element, MaxSize>::resize(size_t size, Element const& e) {
|
void StaticVector<Element, MaxSize>::resize(size_t size, Element const& e) {
|
||||||
if (size > MaxSize)
|
if (size > MaxSize)
|
||||||
throw StaticVectorSizeException::format("StaticVector::resize(%s) out of range %s", m_size + size, MaxSize);
|
throw StaticVectorSizeException::format("StaticVector::resize({}) out of range {}", m_size + size, MaxSize);
|
||||||
|
|
||||||
for (size_t i = m_size; i > size; --i)
|
for (size_t i = m_size; i > size; --i)
|
||||||
pop_back();
|
pop_back();
|
||||||
@ -199,14 +199,14 @@ void StaticVector<Element, MaxSize>::resize(size_t size, Element const& e) {
|
|||||||
template <typename Element, size_t MaxSize>
|
template <typename Element, size_t MaxSize>
|
||||||
auto StaticVector<Element, MaxSize>::at(size_t i) -> reference {
|
auto StaticVector<Element, MaxSize>::at(size_t i) -> reference {
|
||||||
if (i >= m_size)
|
if (i >= m_size)
|
||||||
throw OutOfRangeException::format("out of range in StaticVector::at(%s)", i);
|
throw OutOfRangeException::format("out of range in StaticVector::at({})", i);
|
||||||
return ptr()[i];
|
return ptr()[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Element, size_t MaxSize>
|
template <typename Element, size_t MaxSize>
|
||||||
auto StaticVector<Element, MaxSize>::at(size_t i) const -> const_reference {
|
auto StaticVector<Element, MaxSize>::at(size_t i) const -> const_reference {
|
||||||
if (i >= m_size)
|
if (i >= m_size)
|
||||||
throw OutOfRangeException::format("out of range in StaticVector::at(%s)", i);
|
throw OutOfRangeException::format("out of range in StaticVector::at({})", i);
|
||||||
return ptr()[i];
|
return ptr()[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,7 +329,7 @@ template <typename Element, size_t MaxSize>
|
|||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
void StaticVector<Element, MaxSize>::emplace_back(Args&&... args) {
|
void StaticVector<Element, MaxSize>::emplace_back(Args&&... args) {
|
||||||
if (m_size + 1 > MaxSize)
|
if (m_size + 1 > MaxSize)
|
||||||
throw StaticVectorSizeException::format("StaticVector::emplace_back would extend StaticVector beyond size %s", MaxSize);
|
throw StaticVectorSizeException::format("StaticVector::emplace_back would extend StaticVector beyond size {}", MaxSize);
|
||||||
|
|
||||||
m_size += 1;
|
m_size += 1;
|
||||||
new (ptr() + m_size - 1) Element(forward<Args>(args)...);
|
new (ptr() + m_size - 1) Element(forward<Args>(args)...);
|
||||||
|
@ -187,7 +187,7 @@ bool CaseInsensitiveStringCompare::operator()(String const& lhs, String const& r
|
|||||||
|
|
||||||
String::Char String::at(size_t i) const {
|
String::Char String::at(size_t i) const {
|
||||||
if (i > size())
|
if (i > size())
|
||||||
throw OutOfRangeException(strf("Out of range in String::at(%s)", i));
|
throw OutOfRangeException(strf("Out of range in String::at({})", i));
|
||||||
return operator[](i);
|
return operator[](i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -744,7 +744,7 @@ bool String::equalsIgnoreCase(String const& s) const {
|
|||||||
String String::substr(size_t position, size_t n) const {
|
String String::substr(size_t position, size_t n) const {
|
||||||
auto len = size();
|
auto len = size();
|
||||||
if (position > len)
|
if (position > len)
|
||||||
throw OutOfRangeException(strf("out of range in String::substr(%s, %s)", position, n));
|
throw OutOfRangeException(strf("out of range in String::substr({}, {})", position, n));
|
||||||
|
|
||||||
if (position == 0 && n >= len)
|
if (position == 0 && n >= len)
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -388,7 +388,7 @@ String String::lookupTags(Lookup&& lookup) const {
|
|||||||
auto substrInto = [](std::string const& ref, size_t position, size_t n, std::string& result) {
|
auto substrInto = [](std::string const& ref, size_t position, size_t n, std::string& result) {
|
||||||
auto len = ref.size();
|
auto len = ref.size();
|
||||||
if (position > len)
|
if (position > len)
|
||||||
throw OutOfRangeException(strf("out of range in substrInto: %s", position));
|
throw OutOfRangeException(strf("out of range in substrInto: {}", position));
|
||||||
|
|
||||||
auto it = ref.begin();
|
auto it = ref.begin();
|
||||||
std::advance(it, position);
|
std::advance(it, position);
|
||||||
|
@ -78,7 +78,7 @@ StringView::Char StringView::operator[](size_t index) const {
|
|||||||
|
|
||||||
StringView::Char StringView::at(size_t i) const {
|
StringView::Char StringView::at(size_t i) const {
|
||||||
if (i > size())
|
if (i > size())
|
||||||
throw OutOfRangeException(strf("Out of range in StringView::at(%s)", i));
|
throw OutOfRangeException(strf("Out of range in StringView::at({})", i));
|
||||||
return operator[](i);
|
return operator[](i);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,7 +340,7 @@ bool StringView::equalsIgnoreCase(StringView s) const {
|
|||||||
StringView StringView::substr(size_t position, size_t n) const {
|
StringView StringView::substr(size_t position, size_t n) const {
|
||||||
auto len = size();
|
auto len = size();
|
||||||
if (position > len)
|
if (position > len)
|
||||||
throw OutOfRangeException(strf("out of range in StringView::substr(%s, %s)", position, n));
|
throw OutOfRangeException(strf("out of range in StringView::substr({}, {})", position, n));
|
||||||
|
|
||||||
if (position == 0 && n >= len)
|
if (position == 0 && n >= len)
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -31,7 +31,7 @@ TcpSocketPtr TcpSocket::accept() {
|
|||||||
if (invalidSocketDescriptor(socketDesc)) {
|
if (invalidSocketDescriptor(socketDesc)) {
|
||||||
if (netErrorInterrupt())
|
if (netErrorInterrupt())
|
||||||
return {};
|
return {};
|
||||||
throw NetworkException(strf("Cannot accept connection: %s", netErrorString()));
|
throw NetworkException(strf("Cannot accept connection: {}", netErrorString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto socketImpl = make_shared<SocketImpl>();
|
auto socketImpl = make_shared<SocketImpl>();
|
||||||
@ -47,7 +47,7 @@ TcpSocketPtr TcpSocket::accept() {
|
|||||||
|
|
||||||
sockPtr->m_localAddress = m_localAddress;
|
sockPtr->m_localAddress = m_localAddress;
|
||||||
setAddressFromNative(sockPtr->m_remoteAddress, m_localAddress.address().mode(), &sockAddr);
|
setAddressFromNative(sockPtr->m_remoteAddress, m_localAddress.address().mode(), &sockAddr);
|
||||||
Logger::debug("accept from %s (%d)", sockPtr->m_remoteAddress, sockPtr->m_impl->socketDesc);
|
Logger::debug("accept from {} ({})", sockPtr->m_remoteAddress, sockPtr->m_impl->socketDesc);
|
||||||
|
|
||||||
return sockPtr;
|
return sockPtr;
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ size_t TcpSocket::receive(char* data, size_t size) {
|
|||||||
} else if (netErrorInterrupt()) {
|
} else if (netErrorInterrupt()) {
|
||||||
r = 0;
|
r = 0;
|
||||||
} else {
|
} else {
|
||||||
throw NetworkException(strf("tcp recv error: %s", netErrorString()));
|
throw NetworkException(strf("tcp recv error: {}", netErrorString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ size_t TcpSocket::send(char const* data, size_t size) {
|
|||||||
} else if (netErrorInterrupt()) {
|
} else if (netErrorInterrupt()) {
|
||||||
w = 0;
|
w = 0;
|
||||||
} else {
|
} else {
|
||||||
throw NetworkException(strf("tcp send error: %s", netErrorString()));
|
throw NetworkException(strf("tcp send error: {}", netErrorString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ void TcpSocket::connect(HostAddressWithPort const& addressWithPort) {
|
|||||||
socklen_t sockAddrLen;
|
socklen_t sockAddrLen;
|
||||||
setNativeFromAddress(addressWithPort, &sockAddr, &sockAddrLen);
|
setNativeFromAddress(addressWithPort, &sockAddr, &sockAddrLen);
|
||||||
if (::connect(m_impl->socketDesc, (struct sockaddr*)&sockAddr, sockAddrLen) < 0)
|
if (::connect(m_impl->socketDesc, (struct sockaddr*)&sockAddr, sockAddrLen) < 0)
|
||||||
throw NetworkException(strf("cannot connect to %s: %s", addressWithPort, netErrorString()));
|
throw NetworkException(strf("cannot connect to {}: {}", addressWithPort, netErrorString()));
|
||||||
|
|
||||||
#if defined STAR_SYSTEM_MACOS || defined STAR_SYSTEM_FREEBSD
|
#if defined STAR_SYSTEM_MACOS || defined STAR_SYSTEM_FREEBSD
|
||||||
// Don't generate sigpipe
|
// Don't generate sigpipe
|
||||||
@ -161,7 +161,7 @@ TcpServer::TcpServer(HostAddressWithPort const& address) : m_hostAddress(address
|
|||||||
m_hostAddress = address;
|
m_hostAddress = address;
|
||||||
m_listenSocket = TcpSocket::listen(address);
|
m_listenSocket = TcpSocket::listen(address);
|
||||||
m_listenSocket->setNonBlocking(true);
|
m_listenSocket->setNonBlocking(true);
|
||||||
Logger::debug("TcpServer listening on: %s", address);
|
Logger::debug("TcpServer listening on: {}", address);
|
||||||
}
|
}
|
||||||
|
|
||||||
TcpServer::TcpServer(uint16_t port) : TcpServer(HostAddressWithPort("*", port)) {}
|
TcpServer::TcpServer(uint16_t port) : TcpServer(HostAddressWithPort("*", port)) {}
|
||||||
@ -201,7 +201,7 @@ void TcpServer::setAcceptCallback(AcceptCallback callback, unsigned timeout) {
|
|||||||
try {
|
try {
|
||||||
conn = accept(timeout);
|
conn = accept(timeout);
|
||||||
} catch (NetworkException const& e) {
|
} catch (NetworkException const& e) {
|
||||||
Logger::error("TcpServer caught exception accepting connection %s", outputException(e, false));
|
Logger::error("TcpServer caught exception accepting connection {}", outputException(e, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (conn)
|
if (conn)
|
||||||
@ -211,7 +211,7 @@ void TcpServer::setAcceptCallback(AcceptCallback callback, unsigned timeout) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
Logger::error("TcpServer will close, listener thread caught exception: %s", outputException(e, true));
|
Logger::error("TcpServer will close, listener thread caught exception: {}", outputException(e, true));
|
||||||
m_listenSocket->close();
|
m_listenSocket->close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -31,21 +31,21 @@ struct ThreadImpl {
|
|||||||
#ifdef STAR_SYSTEM_MACOS
|
#ifdef STAR_SYSTEM_MACOS
|
||||||
// ensure the name is under the max allowed
|
// ensure the name is under the max allowed
|
||||||
char tname[MAX_THREAD_NAMELEN];
|
char tname[MAX_THREAD_NAMELEN];
|
||||||
snprintf(tname, sizeof(tname), "%s", ptr->name.utf8Ptr());
|
snprintf(tname, sizeof(tname), "{}", ptr->name.utf8Ptr());
|
||||||
|
|
||||||
pthread_setname_np(tname);
|
pthread_setname_np(tname);
|
||||||
#endif
|
#endif
|
||||||
ptr->function();
|
ptr->function();
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
if (ptr->name.empty())
|
if (ptr->name.empty())
|
||||||
Logger::error("Exception caught in Thread: %s", outputException(e, true));
|
Logger::error("Exception caught in Thread: {}", outputException(e, true));
|
||||||
else
|
else
|
||||||
Logger::error("Exception caught in Thread %s: %s", ptr->name, outputException(e, true));
|
Logger::error("Exception caught in Thread {}: {}", ptr->name, outputException(e, true));
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
if (ptr->name.empty())
|
if (ptr->name.empty())
|
||||||
Logger::error("Unknown exception caught in Thread");
|
Logger::error("Unknown exception caught in Thread");
|
||||||
else
|
else
|
||||||
Logger::error("Unknown exception caught in Thread %s", ptr->name);
|
Logger::error("Unknown exception caught in Thread {}", ptr->name);
|
||||||
}
|
}
|
||||||
ptr->stopped = true;
|
ptr->stopped = true;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -65,12 +65,12 @@ struct ThreadImpl {
|
|||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
stopped = true;
|
stopped = true;
|
||||||
joined = true;
|
joined = true;
|
||||||
throw StarException(strf("Failed to create thread, error %s", ret));
|
throw StarException(strf("Failed to create thread, error {}", ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensure the name is under the max allowed
|
// ensure the name is under the max allowed
|
||||||
char tname[MAX_THREAD_NAMELEN];
|
char tname[MAX_THREAD_NAMELEN];
|
||||||
snprintf(tname, sizeof(tname), "%s", name.utf8Ptr());
|
snprintf(tname, sizeof(tname), "{}", name.utf8Ptr());
|
||||||
|
|
||||||
#ifdef STAR_SYSTEM_FREEBSD
|
#ifdef STAR_SYSTEM_FREEBSD
|
||||||
pthread_set_name_np(pthread, tname);
|
pthread_set_name_np(pthread, tname);
|
||||||
@ -86,7 +86,7 @@ struct ThreadImpl {
|
|||||||
return false;
|
return false;
|
||||||
int ret = pthread_join(pthread, NULL);
|
int ret = pthread_join(pthread, NULL);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
throw StarException(strf("Failed to join thread, error %s", ret));
|
throw StarException(strf("Failed to join thread, error {}", ret));
|
||||||
joined = true;
|
joined = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -242,7 +242,7 @@ void Thread::yield() {
|
|||||||
unsigned Thread::numberOfProcessors() {
|
unsigned Thread::numberOfProcessors() {
|
||||||
long nprocs = sysconf(_SC_NPROCESSORS_ONLN);
|
long nprocs = sysconf(_SC_NPROCESSORS_ONLN);
|
||||||
if (nprocs < 1)
|
if (nprocs < 1)
|
||||||
throw StarException(strf("Could not determine number of CPUs online: %s\n", strerror(errno)));
|
throw StarException(strf("Could not determine number of CPUs online: {}\n", strerror(errno)));
|
||||||
return nprocs;
|
return nprocs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,14 +49,14 @@ struct ThreadImpl {
|
|||||||
ptr->function();
|
ptr->function();
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
if (ptr->name.empty())
|
if (ptr->name.empty())
|
||||||
Logger::error("Exception caught in Thread: %s", outputException(e, true));
|
Logger::error("Exception caught in Thread: {}", outputException(e, true));
|
||||||
else
|
else
|
||||||
Logger::error("Exception caught in Thread %s: %s", ptr->name, outputException(e, true));
|
Logger::error("Exception caught in Thread {}: {}", ptr->name, outputException(e, true));
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
if (ptr->name.empty())
|
if (ptr->name.empty())
|
||||||
Logger::error("Unknown exception caught in Thread");
|
Logger::error("Unknown exception caught in Thread");
|
||||||
else
|
else
|
||||||
Logger::error("Unknown exception caught in Thread %s", ptr->name);
|
Logger::error("Unknown exception caught in Thread {}", ptr->name);
|
||||||
}
|
}
|
||||||
ptr->stopped = true;
|
ptr->stopped = true;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -28,19 +28,19 @@ String Time::printDuration(double time) {
|
|||||||
|
|
||||||
if (time >= 3600) {
|
if (time >= 3600) {
|
||||||
int numHours = (int)time / 3600;
|
int numHours = (int)time / 3600;
|
||||||
hours = strf("%d hour%s", numHours, numHours == 1 ? "" : "s");
|
hours = strf("{} hour{}", numHours, numHours == 1 ? "" : "s");
|
||||||
}
|
}
|
||||||
if (time >= 60) {
|
if (time >= 60) {
|
||||||
int numMinutes = (int)(time / 60) % 60;
|
int numMinutes = (int)(time / 60) % 60;
|
||||||
minutes = strf("%s minute%s", numMinutes, numMinutes == 1 ? "" : "s");
|
minutes = strf("{} minute{}", numMinutes, numMinutes == 1 ? "" : "s");
|
||||||
}
|
}
|
||||||
if (time >= 1) {
|
if (time >= 1) {
|
||||||
int numSeconds = (int)time % 60;
|
int numSeconds = (int)time % 60;
|
||||||
seconds = strf("%s second%s", numSeconds, numSeconds == 1 ? "" : "s");
|
seconds = strf("{} second{}", numSeconds, numSeconds == 1 ? "" : "s");
|
||||||
}
|
}
|
||||||
|
|
||||||
int numMilliseconds = round(time * 1000);
|
int numMilliseconds = round(time * 1000);
|
||||||
milliseconds = strf("%s millisecond%s", numMilliseconds, numMilliseconds == 1 ? "" : "s");
|
milliseconds = strf("{} millisecond{}", numMilliseconds, numMilliseconds == 1 ? "" : "s");
|
||||||
|
|
||||||
return String::joinWith(", ", hours, minutes, seconds, milliseconds);
|
return String::joinWith(", ", hours, minutes, seconds, milliseconds);
|
||||||
}
|
}
|
||||||
|
@ -18,13 +18,13 @@ String Time::printDateAndTime(int64_t epochTicks, String format) {
|
|||||||
localtime_r(&requestedTime, &ptm);
|
localtime_r(&requestedTime, &ptm);
|
||||||
|
|
||||||
return format.replaceTags(StringMap<String>{
|
return format.replaceTags(StringMap<String>{
|
||||||
{"year", strf("%04d", ptm.tm_year + 1900)},
|
{"year", strf("{:04d}", ptm.tm_year + 1900)},
|
||||||
{"month", strf("%02d", ptm.tm_mon + 1)},
|
{"month", strf("{:02d}", ptm.tm_mon + 1)},
|
||||||
{"day", strf("%02d", ptm.tm_mday)},
|
{"day", strf("{:02d}", ptm.tm_mday)},
|
||||||
{"hours", strf("%02d", ptm.tm_hour)},
|
{"hours", strf("{:02d}", ptm.tm_hour)},
|
||||||
{"minutes", strf("%02d", ptm.tm_min)},
|
{"minutes", strf("{:02d}", ptm.tm_min)},
|
||||||
{"seconds", strf("%02d", ptm.tm_sec)},
|
{"seconds", strf("{:02d}", ptm.tm_sec)},
|
||||||
{"millis", strf("%03d", (epochTicks % epochTickFrequency()) / (epochTickFrequency() / 1000))}
|
{"millis", strf("{:03d}", (epochTicks % epochTickFrequency()) / (epochTickFrequency() / 1000))}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,13 +14,13 @@ String Time::printDateAndTime(int64_t epochTicks, String format) {
|
|||||||
ptm = localtime(&requestedTime);
|
ptm = localtime(&requestedTime);
|
||||||
|
|
||||||
return format.replaceTags(StringMap<String>{
|
return format.replaceTags(StringMap<String>{
|
||||||
{"year", strf("%04d", ptm->tm_year + 1900)},
|
{"year", strf("{:04d}", ptm->tm_year + 1900)},
|
||||||
{"month", strf("%02d", ptm->tm_mon + 1)},
|
{"month", strf("{:02d}", ptm->tm_mon + 1)},
|
||||||
{"day", strf("%02d", ptm->tm_mday)},
|
{"day", strf("{:02d}", ptm->tm_mday)},
|
||||||
{"hours", strf("%02d", ptm->tm_hour)},
|
{"hours", strf("{:02d}", ptm->tm_hour)},
|
||||||
{"minutes", strf("%02d", ptm->tm_min)},
|
{"minutes", strf("{:02d}", ptm->tm_min)},
|
||||||
{"seconds", strf("%02d", ptm->tm_sec)},
|
{"seconds", strf("{:02d}", ptm->tm_sec)},
|
||||||
{"millis", strf("%03d", (epochTicks % epochTickFrequency()) / (epochTickFrequency() / 1000))},
|
{"millis", strf("{:03d}", (epochTicks % epochTickFrequency()) / (epochTickFrequency() / 1000))},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ size_t UdpSocket::receive(HostAddressWithPort* address, char* data, size_t datas
|
|||||||
else if (netErrorInterrupt())
|
else if (netErrorInterrupt())
|
||||||
len = 0;
|
len = 0;
|
||||||
else
|
else
|
||||||
throw NetworkException(strf("udp recv error: %s", netErrorString()));
|
throw NetworkException(strf("udp recv error: {}", netErrorString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (address)
|
if (address)
|
||||||
@ -47,7 +47,7 @@ size_t UdpSocket::send(HostAddressWithPort const& address, char const* data, siz
|
|||||||
else if (netErrorInterrupt())
|
else if (netErrorInterrupt())
|
||||||
len = 0;
|
len = 0;
|
||||||
else
|
else
|
||||||
throw NetworkException(strf("udp send error: %s", netErrorString()));
|
throw NetworkException(strf("udp send error: {}", netErrorString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
@ -57,7 +57,7 @@ UdpServer::UdpServer(HostAddressWithPort const& address)
|
|||||||
: m_hostAddress(address), m_listenSocket(make_shared<UdpSocket>(m_hostAddress.address().mode())) {
|
: m_hostAddress(address), m_listenSocket(make_shared<UdpSocket>(m_hostAddress.address().mode())) {
|
||||||
m_listenSocket->setNonBlocking(true);
|
m_listenSocket->setNonBlocking(true);
|
||||||
m_listenSocket->bind(m_hostAddress);
|
m_listenSocket->bind(m_hostAddress);
|
||||||
Logger::debug("UdpServer listening on: %s", m_hostAddress);
|
Logger::debug("UdpServer listening on: {}", m_hostAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
UdpServer::~UdpServer() {
|
UdpServer::~UdpServer() {
|
||||||
|
@ -12,7 +12,7 @@ void throwMissingUtf8End() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void throwInvalidUtf32CodePoint(Utf32Type val) {
|
void throwInvalidUtf32CodePoint(Utf32Type val) {
|
||||||
throw UnicodeException::format("Invalid UTF-32 code point %s encountered while trying to encode UTF-8", (int32_t)val);
|
throw UnicodeException::format("Invalid UTF-32 code point {} encountered while trying to encode UTF-8", (int32_t)val);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t utf8Length(const Utf8Type* utf8, size_t remain) {
|
size_t utf8Length(const Utf8Type* utf8, size_t remain) {
|
||||||
|
@ -9,7 +9,7 @@ Uuid::Uuid() : Uuid(Random::randBytes(UuidSize)) {}
|
|||||||
|
|
||||||
Uuid::Uuid(ByteArray const& bytes) {
|
Uuid::Uuid(ByteArray const& bytes) {
|
||||||
if (bytes.size() != UuidSize)
|
if (bytes.size() != UuidSize)
|
||||||
throw UuidException(strf("Size mismatch in reading Uuid from ByteArray: %s vs %s", bytes.size(), UuidSize));
|
throw UuidException(strf("Size mismatch in reading Uuid from ByteArray: {} vs {}", bytes.size(), UuidSize));
|
||||||
|
|
||||||
bytes.copyTo(m_data.ptr(), UuidSize);
|
bytes.copyTo(m_data.ptr(), UuidSize);
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,7 @@ WorkerPoolHandle WorkerPool::addWork(function<void()> work) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
WorkerPool::WorkerThread::WorkerThread(WorkerPool* parent)
|
WorkerPool::WorkerThread::WorkerThread(WorkerPool* parent)
|
||||||
: Thread(strf("WorkerThread for WorkerPool '%s'", parent->m_name)),
|
: Thread(strf("WorkerThread for WorkerPool '{}'", parent->m_name)),
|
||||||
parent(parent),
|
parent(parent),
|
||||||
shouldStop(false),
|
shouldStop(false),
|
||||||
waiting(false) {
|
waiting(false) {
|
||||||
|
@ -31,15 +31,15 @@ ActionBar::ActionBar(MainInterfacePaneManager* paneManager, PlayerPtr player) {
|
|||||||
GuiReader reader;
|
GuiReader reader;
|
||||||
|
|
||||||
for (uint8_t i = 0; i < m_player->inventory()->customBarIndexes(); ++i) {
|
for (uint8_t i = 0; i < m_player->inventory()->customBarIndexes(); ++i) {
|
||||||
reader.registerCallback(strf("customBar%sL", i + 1), bind(&ActionBar::customBarClick, this, i, true));
|
reader.registerCallback(strf("customBar{}L", i + 1), bind(&ActionBar::customBarClick, this, i, true));
|
||||||
reader.registerCallback(strf("customBar%sR", i + 1), bind(&ActionBar::customBarClick, this, i, false));
|
reader.registerCallback(strf("customBar{}R", i + 1), bind(&ActionBar::customBarClick, this, i, false));
|
||||||
|
|
||||||
reader.registerCallback(strf("customBar%sL.right", i + 1), bind(&ActionBar::customBarClickRight, this, i, true));
|
reader.registerCallback(strf("customBar{}L.right", i + 1), bind(&ActionBar::customBarClickRight, this, i, true));
|
||||||
reader.registerCallback(strf("customBar%sR.right", i + 1), bind(&ActionBar::customBarClickRight, this, i, false));
|
reader.registerCallback(strf("customBar{}R.right", i + 1), bind(&ActionBar::customBarClickRight, this, i, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint8_t i = 0; i < EssentialItemCount; ++i)
|
for (uint8_t i = 0; i < EssentialItemCount; ++i)
|
||||||
reader.registerCallback(strf("essentialBar%s", i + 1), bind(&ActionBar::essentialBarClick, this, i));
|
reader.registerCallback(strf("essentialBar{}", i + 1), bind(&ActionBar::essentialBarClick, this, i));
|
||||||
|
|
||||||
reader.registerCallback("pickupToActionBar", [=](Widget* widget) {
|
reader.registerCallback("pickupToActionBar", [=](Widget* widget) {
|
||||||
auto button = as<ButtonWidget>(widget);
|
auto button = as<ButtonWidget>(widget);
|
||||||
@ -53,10 +53,10 @@ ActionBar::ActionBar(MainInterfacePaneManager* paneManager, PlayerPtr player) {
|
|||||||
reader.construct(m_config.get("paneLayout"), this);
|
reader.construct(m_config.get("paneLayout"), this);
|
||||||
|
|
||||||
for (uint8_t i = 0; i < m_player->inventory()->customBarIndexes(); ++i) {
|
for (uint8_t i = 0; i < m_player->inventory()->customBarIndexes(); ++i) {
|
||||||
auto customBarLeft = fetchChild<ItemSlotWidget>(strf("customBar%sL", i + 1));
|
auto customBarLeft = fetchChild<ItemSlotWidget>(strf("customBar{}L", i + 1));
|
||||||
auto customBarRight = fetchChild<ItemSlotWidget>(strf("customBar%sR", i + 1));
|
auto customBarRight = fetchChild<ItemSlotWidget>(strf("customBar{}R", i + 1));
|
||||||
auto customBarLeftOverlay = fetchChild<ImageWidget>(strf("customBar%sLOverlay", i + 1));
|
auto customBarLeftOverlay = fetchChild<ImageWidget>(strf("customBar{}LOverlay", i + 1));
|
||||||
auto customBarRightOverlay = fetchChild<ImageWidget>(strf("customBar%sROverlay", i + 1));
|
auto customBarRightOverlay = fetchChild<ImageWidget>(strf("customBar{}ROverlay", i + 1));
|
||||||
|
|
||||||
TextPositioning countPosition = {jsonToVec2F(m_config.get("countMidAnchor")), HorizontalAnchor::HMidAnchor};
|
TextPositioning countPosition = {jsonToVec2F(m_config.get("countMidAnchor")), HorizontalAnchor::HMidAnchor};
|
||||||
customBarLeft->setCountPosition(countPosition);
|
customBarLeft->setCountPosition(countPosition);
|
||||||
@ -69,7 +69,7 @@ ActionBar::ActionBar(MainInterfacePaneManager* paneManager, PlayerPtr player) {
|
|||||||
m_customSelectedWidget = fetchChild<ImageWidget>("customSelect");
|
m_customSelectedWidget = fetchChild<ImageWidget>("customSelect");
|
||||||
|
|
||||||
for (uint8_t i = 0; i < EssentialItemCount; ++i)
|
for (uint8_t i = 0; i < EssentialItemCount; ++i)
|
||||||
m_essentialBarWidgets.append(fetchChild<ItemSlotWidget>(strf("essentialBar%s", i + 1)));
|
m_essentialBarWidgets.append(fetchChild<ItemSlotWidget>(strf("essentialBar{}", i + 1)));
|
||||||
m_essentialSelectedWidget = fetchChild<ImageWidget>("essentialSelect");
|
m_essentialSelectedWidget = fetchChild<ImageWidget>("essentialSelect");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ void EditBookmarkDialog::show() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto assets = Root::singleton().assets();
|
auto assets = Root::singleton().assets();
|
||||||
fetchChild<ImageWidget>("imgIcon")->setImage(strf("/interface/bookmarks/icons/%s.png", m_bookmark.icon));
|
fetchChild<ImageWidget>("imgIcon")->setImage(strf("/interface/bookmarks/icons/{}.png", m_bookmark.icon));
|
||||||
|
|
||||||
fetchChild<LabelWidget>("lblPlanetName")->setText(m_bookmark.targetName);
|
fetchChild<LabelWidget>("lblPlanetName")->setText(m_bookmark.targetName);
|
||||||
fetchChild<TextBoxWidget>("name")->setText(m_bookmark.bookmarkName, false);
|
fetchChild<TextBoxWidget>("name")->setText(m_bookmark.bookmarkName, false);
|
||||||
@ -75,7 +75,7 @@ void EditBookmarkDialog::close() {
|
|||||||
void setupBookmarkEntry(WidgetPtr const& entry, TeleportBookmark const& bookmark) {
|
void setupBookmarkEntry(WidgetPtr const& entry, TeleportBookmark const& bookmark) {
|
||||||
entry->fetchChild<LabelWidget>("name")->setText(bookmark.bookmarkName);
|
entry->fetchChild<LabelWidget>("name")->setText(bookmark.bookmarkName);
|
||||||
entry->fetchChild<LabelWidget>("planetName")->setText(bookmark.targetName);
|
entry->fetchChild<LabelWidget>("planetName")->setText(bookmark.targetName);
|
||||||
entry->fetchChild<ImageWidget>("icon")->setImage(strf("/interface/bookmarks/icons/%s.png", bookmark.icon));
|
entry->fetchChild<ImageWidget>("icon")->setImage(strf("/interface/bookmarks/icons/{}.png", bookmark.icon));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ void CharCreationPane::createPlayer() {
|
|||||||
throw CharCreationException("The charPreview portrait has the wrong type.");
|
throw CharCreationException("The charPreview portrait has the wrong type.");
|
||||||
}
|
}
|
||||||
} catch (CharCreationException const& e) {
|
} catch (CharCreationException const& e) {
|
||||||
Logger::error("Character Preview portrait was not found in the json specification. %s", outputException(e, false));
|
Logger::error("Character Preview portrait was not found in the json specification. {}", outputException(e, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,15 +269,15 @@ void CharCreationPane::changed() {
|
|||||||
fetchChild<LabelWidget>("labelPortrait")->setText(labels[8]);
|
fetchChild<LabelWidget>("labelPortrait")->setText(labels[8]);
|
||||||
fetchChild<LabelWidget>("labelPersonality")->setText(labels[9]);
|
fetchChild<LabelWidget>("labelPersonality")->setText(labels[9]);
|
||||||
|
|
||||||
fetchChild<ButtonWidget>(strf("species.%s", m_speciesChoice))->check();
|
fetchChild<ButtonWidget>(strf("species.{}", m_speciesChoice))->check();
|
||||||
fetchChild<ButtonWidget>(strf("gender.%s", genderIdx))->check();
|
fetchChild<ButtonWidget>(strf("gender.{}", genderIdx))->check();
|
||||||
auto modeButton = fetchChild<ButtonWidget>(strf("mode.%s", m_modeChoice));
|
auto modeButton = fetchChild<ButtonWidget>(strf("mode.{}", m_modeChoice));
|
||||||
modeButton->check();
|
modeButton->check();
|
||||||
setLabel("labelMode", modeButton->data().getString("description", "fail"));
|
setLabel("labelMode", modeButton->data().getString("description", "fail"));
|
||||||
|
|
||||||
// Update the gender images for the new species
|
// Update the gender images for the new species
|
||||||
for (size_t i = 0; i < species.genderOptions.size(); i++)
|
for (size_t i = 0; i < species.genderOptions.size(); i++)
|
||||||
fetchChild<ButtonWidget>(strf("gender.%s", i))->setOverlayImage(species.genderOptions[i].image);
|
fetchChild<ButtonWidget>(strf("gender.{}", i))->setOverlayImage(species.genderOptions[i].image);
|
||||||
|
|
||||||
for (auto const& nameDefPair : root.speciesDatabase()->allSpecies()) {
|
for (auto const& nameDefPair : root.speciesDatabase()->allSpecies()) {
|
||||||
String name;
|
String name;
|
||||||
@ -286,7 +286,7 @@ void CharCreationPane::changed() {
|
|||||||
// NOTE: Probably not hot enough to matter, but this contains and indexOf makes this loop
|
// NOTE: Probably not hot enough to matter, but this contains and indexOf makes this loop
|
||||||
// O(n^2). This is less than ideal.
|
// O(n^2). This is less than ideal.
|
||||||
if (m_speciesList.contains(name)) {
|
if (m_speciesList.contains(name)) {
|
||||||
auto bw = fetchChild<ButtonWidget>(strf("species.%s", m_speciesList.indexOf(name)));
|
auto bw = fetchChild<ButtonWidget>(strf("species.{}", m_speciesList.indexOf(name)));
|
||||||
if (bw)
|
if (bw)
|
||||||
bw->setOverlayImage(def->options().genderOptions[genderIdx].characterImage);
|
bw->setOverlayImage(def->options().genderOptions[genderIdx].characterImage);
|
||||||
}
|
}
|
||||||
|
@ -183,7 +183,7 @@ void Chat::addMessages(List<ChatReceivedMessage> const& messages, bool showPane)
|
|||||||
guiContext.setFontSize(m_fontSize);
|
guiContext.setFontSize(m_fontSize);
|
||||||
StringList lines;
|
StringList lines;
|
||||||
if (message.fromNick != "" && message.portrait == "")
|
if (message.fromNick != "" && message.portrait == "")
|
||||||
lines = guiContext.wrapInterfaceText(strf("<%s> %s", message.fromNick, message.text), wrapWidth);
|
lines = guiContext.wrapInterfaceText(strf("<{}> {}", message.fromNick, message.text), wrapWidth);
|
||||||
else
|
else
|
||||||
lines = guiContext.wrapInterfaceText(message.text, wrapWidth);
|
lines = guiContext.wrapInterfaceText(message.text, wrapWidth);
|
||||||
|
|
||||||
@ -196,9 +196,9 @@ void Chat::addMessages(List<ChatReceivedMessage> const& messages, bool showPane)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (message.fromNick != "")
|
if (message.fromNick != "")
|
||||||
Logger::info("Chat: <%s> %s", message.fromNick, message.text);
|
Logger::info("Chat: <{}> {}", message.fromNick, message.text);
|
||||||
else
|
else
|
||||||
Logger::info("Chat: %s", message.text);
|
Logger::info("Chat: {}", message.text);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showPane) {
|
if (showPane) {
|
||||||
|
@ -189,7 +189,7 @@ void Cinematic::render() {
|
|||||||
m_completable = true;
|
m_completable = true;
|
||||||
if (!values.alpha)
|
if (!values.alpha)
|
||||||
continue;
|
continue;
|
||||||
auto frame = strf("%s", ((int)values.frame) % panel->animationFrames);
|
auto frame = strf("{}", ((int)values.frame) % panel->animationFrames);
|
||||||
auto alphaColor = Color::rgbaf(1.0f, 1.0f, 1.0f, values.alpha);
|
auto alphaColor = Color::rgbaf(1.0f, 1.0f, 1.0f, values.alpha);
|
||||||
for (auto const& d : panel->drawables) {
|
for (auto const& d : panel->drawables) {
|
||||||
Drawable drawable = Drawable(d.set("image", d.getString("image").replaceTags(StringMap<String>{{"species", playerSpecies}, {"frame", frame}})));
|
Drawable drawable = Drawable(d.set("image", d.getString("image").replaceTags(StringMap<String>{{"species", playerSpecies}, {"frame", frame}})));
|
||||||
|
@ -92,11 +92,11 @@ StringList ClientCommandProcessor::handleCommand(String const& commandLine) {
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
} catch (ShellParsingException const& e) {
|
} catch (ShellParsingException const& e) {
|
||||||
Logger::error("Shell parsing exception: %s", outputException(e, false));
|
Logger::error("Shell parsing exception: {}", outputException(e, false));
|
||||||
return {"Shell parsing exception"};
|
return {"Shell parsing exception"};
|
||||||
} catch (std::exception const& e) {
|
} catch (std::exception const& e) {
|
||||||
Logger::error("Exception caught handling client command %s: %s", commandLine, outputException(e, true));
|
Logger::error("Exception caught handling client command {}: {}", commandLine, outputException(e, true));
|
||||||
return {strf("Exception caught handling client command %s", commandLine)};
|
return {strf("Exception caught handling client command {}", commandLine)};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ String ClientCommandProcessor::reload() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::whoami() {
|
String ClientCommandProcessor::whoami() {
|
||||||
return strf("Client: You are %s. You are %san Admin.",
|
return strf("Client: You are {}. You are {}an Admin.",
|
||||||
m_universeClient->mainPlayer()->name(), m_universeClient->mainPlayer()->isAdmin() ? "" : "not ");
|
m_universeClient->mainPlayer()->name(), m_universeClient->mainPlayer()->isAdmin() ? "" : "not ");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ String ClientCommandProcessor::gravity() {
|
|||||||
if (!adminCommandAllowed())
|
if (!adminCommandAllowed())
|
||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
return strf("%s", m_universeClient->worldClient()->gravity(m_universeClient->mainPlayer()->position()));
|
return strf("{}", m_universeClient->worldClient()->gravity(m_universeClient->mainPlayer()->position()));
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::debug() {
|
String ClientCommandProcessor::debug() {
|
||||||
@ -130,14 +130,14 @@ String ClientCommandProcessor::debug() {
|
|||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
m_debugDisplayEnabled = !m_debugDisplayEnabled;
|
m_debugDisplayEnabled = !m_debugDisplayEnabled;
|
||||||
return strf("Debug display %s", m_debugDisplayEnabled ? "enabled" : "disabled");
|
return strf("Debug display {}", m_debugDisplayEnabled ? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::boxes() {
|
String ClientCommandProcessor::boxes() {
|
||||||
if (!adminCommandAllowed())
|
if (!adminCommandAllowed())
|
||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
return strf("Geometry debug display %s",
|
return strf("Geometry debug display {}",
|
||||||
m_universeClient->worldClient()->toggleCollisionDebug()
|
m_universeClient->worldClient()->toggleCollisionDebug()
|
||||||
? "enabled" : "disabled");
|
? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
@ -146,7 +146,7 @@ String ClientCommandProcessor::fullbright() {
|
|||||||
if (!adminCommandAllowed())
|
if (!adminCommandAllowed())
|
||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
return strf("Fullbright render lighting %s",
|
return strf("Fullbright render lighting {}",
|
||||||
m_universeClient->worldClient()->toggleFullbright()
|
m_universeClient->worldClient()->toggleFullbright()
|
||||||
? "enabled" : "disabled");
|
? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
@ -156,7 +156,7 @@ String ClientCommandProcessor::setGravity(StringList const& arguments) {
|
|||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
m_universeClient->worldClient()->overrideGravity(lexicalCast<float>(arguments.at(0)));
|
m_universeClient->worldClient()->overrideGravity(lexicalCast<float>(arguments.at(0)));
|
||||||
return strf("Gravity set to %s, the change is LOCAL ONLY", arguments.at(0));
|
return strf("Gravity set to {}, the change is LOCAL ONLY", arguments.at(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::resetGravity() {
|
String ClientCommandProcessor::resetGravity() {
|
||||||
@ -172,13 +172,13 @@ String ClientCommandProcessor::fixedCamera() {
|
|||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
m_fixedCameraEnabled = !m_fixedCameraEnabled;
|
m_fixedCameraEnabled = !m_fixedCameraEnabled;
|
||||||
return strf("Fixed camera %s", m_fixedCameraEnabled ? "enabled" : "disabled");
|
return strf("Fixed camera {}", m_fixedCameraEnabled ? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::monochromeLighting() {
|
String ClientCommandProcessor::monochromeLighting() {
|
||||||
bool monochrome = !Root::singleton().configuration()->get("monochromeLighting").toBool();
|
bool monochrome = !Root::singleton().configuration()->get("monochromeLighting").toBool();
|
||||||
Root::singleton().configuration()->set("monochromeLighting", monochrome);
|
Root::singleton().configuration()->set("monochromeLighting", monochrome);
|
||||||
return strf("Monochrome lighting %s", monochrome ? "enabled" : "disabled");
|
return strf("Monochrome lighting {}", monochrome ? "enabled" : "disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::radioMessage(StringList const& arguments) {
|
String ClientCommandProcessor::radioMessage(StringList const& arguments) {
|
||||||
@ -222,7 +222,7 @@ String ClientCommandProcessor::completeQuest(StringList const& arguments) {
|
|||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
m_universeClient->questManager()->getQuest(arguments.at(0))->complete();
|
m_universeClient->questManager()->getQuest(arguments.at(0))->complete();
|
||||||
return strf("Quest %s complete", arguments.at(0));
|
return strf("Quest {} complete", arguments.at(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::failQuest(StringList const& arguments) {
|
String ClientCommandProcessor::failQuest(StringList const& arguments) {
|
||||||
@ -230,7 +230,7 @@ String ClientCommandProcessor::failQuest(StringList const& arguments) {
|
|||||||
return "You must be an admin to use this command.";
|
return "You must be an admin to use this command.";
|
||||||
|
|
||||||
m_universeClient->questManager()->getQuest(arguments.at(0))->fail();
|
m_universeClient->questManager()->getQuest(arguments.at(0))->fail();
|
||||||
return strf("Quest %s failed", arguments.at(0));
|
return strf("Quest {} failed", arguments.at(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::previewNewQuest(StringList const& arguments) {
|
String ClientCommandProcessor::previewNewQuest(StringList const& arguments) {
|
||||||
@ -269,12 +269,12 @@ String ClientCommandProcessor::clearScannedObjects() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::playTime() {
|
String ClientCommandProcessor::playTime() {
|
||||||
return strf("Total play time: %s", Time::printDuration(m_universeClient->mainPlayer()->log()->playTime()));
|
return strf("Total play time: {}", Time::printDuration(m_universeClient->mainPlayer()->log()->playTime()));
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::deathCount() {
|
String ClientCommandProcessor::deathCount() {
|
||||||
auto deaths = m_universeClient->mainPlayer()->log()->deathCount();
|
auto deaths = m_universeClient->mainPlayer()->log()->deathCount();
|
||||||
return strf("Total deaths: %s%s", deaths, deaths == 0 ? ". Well done!" : "");
|
return strf("Total deaths: {}{}", deaths, deaths == 0 ? ". Well done!" : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::cinema(StringList const& arguments) {
|
String ClientCommandProcessor::cinema(StringList const& arguments) {
|
||||||
@ -284,7 +284,7 @@ String ClientCommandProcessor::cinema(StringList const& arguments) {
|
|||||||
m_cinematicOverlay->load(Root::singleton().assets()->json(arguments.at(0)));
|
m_cinematicOverlay->load(Root::singleton().assets()->json(arguments.at(0)));
|
||||||
if (arguments.size() > 1)
|
if (arguments.size() > 1)
|
||||||
m_cinematicOverlay->setTime(lexicalCast<float>(arguments.at(1)));
|
m_cinematicOverlay->setTime(lexicalCast<float>(arguments.at(1)));
|
||||||
return strf("Started cinematic %s at %s", arguments.at(0), arguments.size() > 1 ? arguments.at(1) : "beginning");
|
return strf("Started cinematic {} at {}", arguments.at(0), arguments.size() > 1 ? arguments.at(1) : "beginning");
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::suicide() {
|
String ClientCommandProcessor::suicide() {
|
||||||
@ -315,7 +315,7 @@ String ClientCommandProcessor::statistic(StringList const& arguments) {
|
|||||||
|
|
||||||
StringList values;
|
StringList values;
|
||||||
for (String const& statName : arguments) {
|
for (String const& statName : arguments) {
|
||||||
values.append(strf("%s = %s", statName, m_universeClient->statistics()->stat(statName)));
|
values.append(strf("{} = {}", statName, m_universeClient->statistics()->stat(statName)));
|
||||||
}
|
}
|
||||||
return values.join("\n");
|
return values.join("\n");
|
||||||
}
|
}
|
||||||
@ -331,9 +331,9 @@ String ClientCommandProcessor::giveEssentialItem(StringList const& arguments) {
|
|||||||
auto item = Root::singleton().itemDatabase()->item(ItemDescriptor(arguments.at(0)));
|
auto item = Root::singleton().itemDatabase()->item(ItemDescriptor(arguments.at(0)));
|
||||||
auto slot = EssentialItemNames.getLeft(arguments.at(1));
|
auto slot = EssentialItemNames.getLeft(arguments.at(1));
|
||||||
m_universeClient->mainPlayer()->inventory()->setEssentialItem(slot, item);
|
m_universeClient->mainPlayer()->inventory()->setEssentialItem(slot, item);
|
||||||
return strf("Put %s in player slot %s", item->name(), arguments.at(1));
|
return strf("Put {} in player slot {}", item->name(), arguments.at(1));
|
||||||
} catch (MapException const& e) {
|
} catch (MapException const& e) {
|
||||||
return strf("Invalid essential item slot %s.", arguments.at(1));
|
return strf("Invalid essential item slot {}.", arguments.at(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,7 +345,7 @@ String ClientCommandProcessor::makeTechAvailable(StringList const& arguments) {
|
|||||||
return "Not enouch arguments to /maketechavailable";
|
return "Not enouch arguments to /maketechavailable";
|
||||||
|
|
||||||
m_universeClient->mainPlayer()->techs()->makeAvailable(arguments.at(0));
|
m_universeClient->mainPlayer()->techs()->makeAvailable(arguments.at(0));
|
||||||
return strf("Added %s to player's visible techs", arguments.at(0));
|
return strf("Added {} to player's visible techs", arguments.at(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::enableTech(StringList const& arguments) {
|
String ClientCommandProcessor::enableTech(StringList const& arguments) {
|
||||||
@ -357,7 +357,7 @@ String ClientCommandProcessor::enableTech(StringList const& arguments) {
|
|||||||
|
|
||||||
m_universeClient->mainPlayer()->techs()->makeAvailable(arguments.at(0));
|
m_universeClient->mainPlayer()->techs()->makeAvailable(arguments.at(0));
|
||||||
m_universeClient->mainPlayer()->techs()->enable(arguments.at(0));
|
m_universeClient->mainPlayer()->techs()->enable(arguments.at(0));
|
||||||
return strf("Player tech %s enabled", arguments.at(0));
|
return strf("Player tech {} enabled", arguments.at(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
String ClientCommandProcessor::upgradeShip(StringList const& arguments) {
|
String ClientCommandProcessor::upgradeShip(StringList const& arguments) {
|
||||||
|
@ -126,7 +126,7 @@ void CodexInterface::setupPageText() {
|
|||||||
if (m_currentCodex) {
|
if (m_currentCodex) {
|
||||||
m_pageContent->setText(m_currentCodex->page(m_currentPage));
|
m_pageContent->setText(m_currentCodex->page(m_currentPage));
|
||||||
m_pageLabelWidget->show();
|
m_pageLabelWidget->show();
|
||||||
m_pageNumberWidget->setText(strf("%d of %d", m_currentPage + 1, m_currentCodex->pageCount()));
|
m_pageNumberWidget->setText(strf("{} of {}", m_currentPage + 1, m_currentCodex->pageCount()));
|
||||||
m_titleLabel->setText(m_currentCodex->title());
|
m_titleLabel->setText(m_currentCodex->title());
|
||||||
m_nextPageButton->setEnabled(m_currentPage < m_currentCodex->pageCount() - 1);
|
m_nextPageButton->setEnabled(m_currentPage < m_currentCodex->pageCount() - 1);
|
||||||
m_prevPageButton->setEnabled(m_currentPage > 0);
|
m_prevPageButton->setEnabled(m_currentPage > 0);
|
||||||
|
@ -129,7 +129,7 @@ ContainerPane::ContainerPane(WorldClientPtr worldClient, PlayerPtr player, Conta
|
|||||||
m_reader.construct(guiConfig.get("gui"), this);
|
m_reader.construct(guiConfig.get("gui"), this);
|
||||||
|
|
||||||
if (auto countWidget = fetchChild<LabelWidget>("count"))
|
if (auto countWidget = fetchChild<LabelWidget>("count"))
|
||||||
countWidget->setText(countWidget->text().replace("<slots>", strf("%s", container->containerSize())));
|
countWidget->setText(countWidget->text().replace("<slots>", strf("{}", container->containerSize())));
|
||||||
|
|
||||||
m_itemBag = make_shared<ItemBag>(container->containerSize());
|
m_itemBag = make_shared<ItemBag>(container->containerSize());
|
||||||
auto items = container->containerItems();
|
auto items = container->containerItems();
|
||||||
|
@ -294,7 +294,7 @@ void CraftingPane::update() {
|
|||||||
updateCraftButtons();
|
updateCraftButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
setLabel("lblPlayerMoney", strf("%s", (int)m_player->currency("money")));
|
setLabel("lblPlayerMoney", strf("{}", (int)m_player->currency("money")));
|
||||||
|
|
||||||
Pane::update();
|
Pane::update();
|
||||||
}
|
}
|
||||||
@ -405,7 +405,7 @@ void CraftingPane::setupWidget(WidgetPtr const& widget, ItemRecipe const& recipe
|
|||||||
|
|
||||||
String name = item->friendlyName();
|
String name = item->friendlyName();
|
||||||
if (recipe.output.count() > 1)
|
if (recipe.output.count() > 1)
|
||||||
name = strf("%s (x%s)", name, recipe.output.count());
|
name = strf("{} (x{})", name, recipe.output.count());
|
||||||
|
|
||||||
auto itemName = widget->fetchChild<LabelWidget>("itemName");
|
auto itemName = widget->fetchChild<LabelWidget>("itemName");
|
||||||
auto notcraftableoverlay = widget->fetchChild<ImageWidget>("notcraftableoverlay");
|
auto notcraftableoverlay = widget->fetchChild<ImageWidget>("notcraftableoverlay");
|
||||||
@ -421,7 +421,7 @@ void CraftingPane::setupWidget(WidgetPtr const& widget, ItemRecipe const& recipe
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (price > 0) {
|
if (price > 0) {
|
||||||
widget->setLabel("priceLabel", strf("%s", price));
|
widget->setLabel("priceLabel", strf("{}", price));
|
||||||
if (auto icon = widget->fetchChild<ImageWidget>("moneyIcon"))
|
if (auto icon = widget->fetchChild<ImageWidget>("moneyIcon"))
|
||||||
icon->setVisibility(true);
|
icon->setVisibility(true);
|
||||||
} else {
|
} else {
|
||||||
@ -463,7 +463,7 @@ PanePtr CraftingPane::setupTooltip(ItemRecipe const& recipe) {
|
|||||||
auto widget = guiList->addItem();
|
auto widget = guiList->addItem();
|
||||||
widget->fetchChild<LabelWidget>("itemName")->setText(item->friendlyName());
|
widget->fetchChild<LabelWidget>("itemName")->setText(item->friendlyName());
|
||||||
auto countWidget = widget->fetchChild<LabelWidget>("count");
|
auto countWidget = widget->fetchChild<LabelWidget>("count");
|
||||||
countWidget->setText(strf("%s/%s", availableCount, requiredCount));
|
countWidget->setText(strf("{}/{}", availableCount, requiredCount));
|
||||||
if (availableCount < requiredCount)
|
if (availableCount < requiredCount)
|
||||||
countWidget->setColor(Color::Red);
|
countWidget->setColor(Color::Red);
|
||||||
else
|
else
|
||||||
@ -616,7 +616,7 @@ void CraftingPane::countTextChanged() {
|
|||||||
|
|
||||||
void CraftingPane::countChanged() {
|
void CraftingPane::countChanged() {
|
||||||
if (m_textBox)
|
if (m_textBox)
|
||||||
m_textBox->setText(strf("x%s", m_count), false);
|
m_textBox->setText(strf("x{}", m_count), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ItemRecipe> CraftingPane::determineRecipes() {
|
List<ItemRecipe> CraftingPane::determineRecipes() {
|
||||||
|
@ -148,7 +148,7 @@ void GraphicsMenu::syncGui() {
|
|||||||
} else {
|
} else {
|
||||||
resSlider->setVal(m_resList.size() - 1);
|
resSlider->setVal(m_resList.size() - 1);
|
||||||
}
|
}
|
||||||
fetchChild<LabelWidget>("resValueLabel")->setText(strf("%dx%d", res[0], res[1]));
|
fetchChild<LabelWidget>("resValueLabel")->setText(strf("{}x{}", res[0], res[1]));
|
||||||
|
|
||||||
auto zoomSlider = fetchChild<SliderBarWidget>("zoomSlider");
|
auto zoomSlider = fetchChild<SliderBarWidget>("zoomSlider");
|
||||||
auto zoomIt = std::lower_bound(m_zoomList.begin(), m_zoomList.end(), m_localChanges.get("zoomLevel").toFloat());
|
auto zoomIt = std::lower_bound(m_zoomList.begin(), m_zoomList.end(), m_localChanges.get("zoomLevel").toFloat());
|
||||||
@ -159,7 +159,7 @@ void GraphicsMenu::syncGui() {
|
|||||||
} else {
|
} else {
|
||||||
zoomSlider->setVal(m_zoomList.size() - 1);
|
zoomSlider->setVal(m_zoomList.size() - 1);
|
||||||
}
|
}
|
||||||
fetchChild<LabelWidget>("zoomValueLabel")->setText(strf("%dx", m_localChanges.get("zoomLevel").toInt()));
|
fetchChild<LabelWidget>("zoomValueLabel")->setText(strf("{}x", m_localChanges.get("zoomLevel").toInt()));
|
||||||
|
|
||||||
|
|
||||||
fetchChild<ButtonWidget>("speechBubbleCheckbox")->setChecked(m_localChanges.get("speechBubbles").toBool());
|
fetchChild<ButtonWidget>("speechBubbleCheckbox")->setChecked(m_localChanges.get("speechBubbles").toBool());
|
||||||
|
@ -87,7 +87,7 @@ InventoryPane::InventoryPane(MainInterface* parent, PlayerPtr player, ContainerI
|
|||||||
for (auto name : bagOrder) {
|
for (auto name : bagOrder) {
|
||||||
auto itemGrid = itemBagConfig.get(name).getString("itemGrid");
|
auto itemGrid = itemBagConfig.get(name).getString("itemGrid");
|
||||||
invWindowReader.registerCallback(itemGrid, bind(leftClickCallback, name, _1));
|
invWindowReader.registerCallback(itemGrid, bind(leftClickCallback, name, _1));
|
||||||
invWindowReader.registerCallback(strf("%s.right", itemGrid), bind(bagGridCallback, name, _1));
|
invWindowReader.registerCallback(strf("{}.right", itemGrid), bind(bagGridCallback, name, _1));
|
||||||
}
|
}
|
||||||
|
|
||||||
invWindowReader.registerCallback("close", [=](Widget*) {
|
invWindowReader.registerCallback("close", [=](Widget*) {
|
||||||
@ -195,7 +195,7 @@ PanePtr InventoryPane::createTooltip(Vec2I const& screenPosition) {
|
|||||||
|
|
||||||
auto techDatabase = Root::singleton().techDatabase();
|
auto techDatabase = Root::singleton().techDatabase();
|
||||||
for (auto const& p : TechTypeNames) {
|
for (auto const& p : TechTypeNames) {
|
||||||
if (auto techIcon = fetchChild<ImageWidget>(strf("tech%s", p.second))) {
|
if (auto techIcon = fetchChild<ImageWidget>(strf("tech{}", p.second))) {
|
||||||
if (techIcon->screenBoundRect().contains(screenPosition)) {
|
if (techIcon->screenBoundRect().contains(screenPosition)) {
|
||||||
if (auto techModule = m_player->techs()->equippedTechs().maybe(p.first))
|
if (auto techModule = m_player->techs()->equippedTechs().maybe(p.first))
|
||||||
return SimpleTooltipBuilder::buildTooltip(techDatabase->tech(*techModule).description);
|
return SimpleTooltipBuilder::buildTooltip(techDatabase->tech(*techModule).description);
|
||||||
@ -277,7 +277,7 @@ void InventoryPane::update() {
|
|||||||
|
|
||||||
auto techDatabase = Root::singleton().techDatabase();
|
auto techDatabase = Root::singleton().techDatabase();
|
||||||
for (auto const& p : TechTypeNames) {
|
for (auto const& p : TechTypeNames) {
|
||||||
if (auto techIcon = fetchChild<ImageWidget>(strf("tech%s", p.second))) {
|
if (auto techIcon = fetchChild<ImageWidget>(strf("tech{}", p.second))) {
|
||||||
if (auto techModule = m_player->techs()->equippedTechs().maybe(p.first))
|
if (auto techModule = m_player->techs()->equippedTechs().maybe(p.first))
|
||||||
techIcon->setImage(techDatabase->tech(*techModule).icon);
|
techIcon->setImage(techDatabase->tech(*techModule).icon);
|
||||||
else
|
else
|
||||||
@ -315,25 +315,25 @@ void InventoryPane::update() {
|
|||||||
techOverlay->setVisibility(m_player->techOverridden());
|
techOverlay->setVisibility(m_player->techOverridden());
|
||||||
|
|
||||||
auto healthLabel = fetchChild<LabelWidget>("healthtext");
|
auto healthLabel = fetchChild<LabelWidget>("healthtext");
|
||||||
healthLabel->setText(strf("%d", m_player->maxHealth()));
|
healthLabel->setText(strf("{}", m_player->maxHealth()));
|
||||||
auto energyLabel = fetchChild<LabelWidget>("energytext");
|
auto energyLabel = fetchChild<LabelWidget>("energytext");
|
||||||
energyLabel->setText(strf("%d", m_player->maxEnergy()));
|
energyLabel->setText(strf("{}", m_player->maxEnergy()));
|
||||||
auto weaponLabel = fetchChild<LabelWidget>("weapontext");
|
auto weaponLabel = fetchChild<LabelWidget>("weapontext");
|
||||||
weaponLabel->setText(strf("%d%%", ceil(m_player->powerMultiplier() * 100)));
|
weaponLabel->setText(strf("{}%", ceil(m_player->powerMultiplier() * 100)));
|
||||||
auto defenseLabel = fetchChild<LabelWidget>("defensetext");
|
auto defenseLabel = fetchChild<LabelWidget>("defensetext");
|
||||||
if (m_player->protection() == 0)
|
if (m_player->protection() == 0)
|
||||||
defenseLabel->setText("--");
|
defenseLabel->setText("--");
|
||||||
else
|
else
|
||||||
defenseLabel->setText(strf("%d", ceil(m_player->protection())));
|
defenseLabel->setText(strf("{}", ceil(m_player->protection())));
|
||||||
|
|
||||||
auto moneyLabel = fetchChild<LabelWidget>("lblMoney");
|
auto moneyLabel = fetchChild<LabelWidget>("lblMoney");
|
||||||
moneyLabel->setText(strf("%d", m_player->currency("money")));
|
moneyLabel->setText(strf("{}", m_player->currency("money")));
|
||||||
|
|
||||||
if (m_player->currency("essence") > 0) {
|
if (m_player->currency("essence") > 0) {
|
||||||
fetchChild<ImageWidget>("imgEssenceIcon")->show();
|
fetchChild<ImageWidget>("imgEssenceIcon")->show();
|
||||||
auto essenceLabel = fetchChild<LabelWidget>("lblEssence");
|
auto essenceLabel = fetchChild<LabelWidget>("lblEssence");
|
||||||
essenceLabel->show();
|
essenceLabel->show();
|
||||||
essenceLabel->setText(strf("%d", m_player->currency("essence")));
|
essenceLabel->setText(strf("{}", m_player->currency("essence")));
|
||||||
} else {
|
} else {
|
||||||
fetchChild<ImageWidget>("imgEssenceIcon")->hide();
|
fetchChild<ImageWidget>("imgEssenceIcon")->hide();
|
||||||
fetchChild<LabelWidget>("lblEssence")->hide();
|
fetchChild<LabelWidget>("lblEssence")->hide();
|
||||||
@ -357,14 +357,14 @@ void InventoryPane::update() {
|
|||||||
|
|
||||||
auto attackLabel = fetchChild<LabelWidget>("companionAttackStat");
|
auto attackLabel = fetchChild<LabelWidget>("companionAttackStat");
|
||||||
if (auto attack = pet->stat("attack")) {
|
if (auto attack = pet->stat("attack")) {
|
||||||
attackLabel->setText(strf("%.0f", *attack));
|
attackLabel->setText(strf("{:.0f}", *attack));
|
||||||
} else {
|
} else {
|
||||||
attackLabel->setText("");
|
attackLabel->setText("");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto defenseLabel = fetchChild<LabelWidget>("companionDefenseStat");
|
auto defenseLabel = fetchChild<LabelWidget>("companionDefenseStat");
|
||||||
if (auto defense = pet->stat("defense")) {
|
if (auto defense = pet->stat("defense")) {
|
||||||
defenseLabel->setText(strf("%.0f", *defense));
|
defenseLabel->setText(strf("{:.0f}", *defense));
|
||||||
} else {
|
} else {
|
||||||
defenseLabel->setText("");
|
defenseLabel->setText("");
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ void ItemTooltipBuilder::buildItemDescriptionInner(
|
|||||||
container->fetchChild<ItemSlotWidget>("icon")->setItem(item);
|
container->fetchChild<ItemSlotWidget>("icon")->setItem(item);
|
||||||
|
|
||||||
container->setLabel("nameLabel", item->name());
|
container->setLabel("nameLabel", item->name());
|
||||||
container->setLabel("countLabel", strf("%s", item->count()));
|
container->setLabel("countLabel", strf("{}", item->count()));
|
||||||
|
|
||||||
container->setLabel("rarityLabel", RarityNames.getRight(item->rarity()).titleCase());
|
container->setLabel("rarityLabel", RarityNames.getRight(item->rarity()).titleCase());
|
||||||
|
|
||||||
@ -90,8 +90,8 @@ void ItemTooltipBuilder::buildItemDescriptionInner(
|
|||||||
else
|
else
|
||||||
container->setLabel("handednessLabel", "1-Handed");
|
container->setLabel("handednessLabel", "1-Handed");
|
||||||
|
|
||||||
container->setLabel("countLabel", strf("%s", item->instanceValue("fuelAmount", 0).toUInt() * item->count()));
|
container->setLabel("countLabel", strf("{}", item->instanceValue("fuelAmount", 0).toUInt() * item->count()));
|
||||||
container->setLabel("priceLabel", strf("%s", (int)item->price()));
|
container->setLabel("priceLabel", strf("{}", (int)item->price()));
|
||||||
|
|
||||||
if (auto objectItem = as<ObjectItem>(item)) {
|
if (auto objectItem = as<ObjectItem>(item)) {
|
||||||
try {
|
try {
|
||||||
@ -103,13 +103,13 @@ void ItemTooltipBuilder::buildItemDescriptionInner(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (objectItem->tooltipKind() == "container")
|
if (objectItem->tooltipKind() == "container")
|
||||||
container->setLabel("slotCountLabel", strf("Holds %s Items", objectItem->instanceValue("slotCount")));
|
container->setLabel("slotCountLabel", strf("Holds {} Items", objectItem->instanceValue("slotCount")));
|
||||||
|
|
||||||
title = object->shortDescription();
|
title = object->shortDescription();
|
||||||
subTitle = categoryDisplayName(object->category());
|
subTitle = categoryDisplayName(object->category());
|
||||||
description = object->description();
|
description = object->description();
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
Logger::error("Failed to instantiate object for object item tooltip. %s", outputException(e, false));
|
Logger::error("Failed to instantiate object for object item tooltip. {}", outputException(e, false));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (container->containsChild("objectImage")) {
|
if (container->containsChild("objectImage")) {
|
||||||
@ -137,9 +137,9 @@ void ItemTooltipBuilder::buildItemDescriptionInner(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (auto fireable = as<FireableItem>(item)) {
|
if (auto fireable = as<FireableItem>(item)) {
|
||||||
container->setLabel("cooldownTimeLabel", strf("%.2f", fireable->cooldownTime()));
|
container->setLabel("cooldownTimeLabel", strf("{:.2f}", fireable->cooldownTime()));
|
||||||
container->setLabel("windupTimeLabel", strf("%.2f", fireable->windupTime()));
|
container->setLabel("windupTimeLabel", strf("{:.2f}", fireable->windupTime()));
|
||||||
container->setLabel("speedLabel", strf("%.2f", 1.0f / (fireable->cooldownTime() + fireable->windupTime())));
|
container->setLabel("speedLabel", strf("{:.2f}", 1.0f / (fireable->cooldownTime() + fireable->windupTime())));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (container->containsChild("largeImage")) {
|
if (container->containsChild("largeImage")) {
|
||||||
@ -198,21 +198,21 @@ void ItemTooltipBuilder::describePersistentEffect(
|
|||||||
auto listItem = container->addItem();
|
auto listItem = container->addItem();
|
||||||
listItem->fetchChild<ImageWidget>("statusImage")
|
listItem->fetchChild<ImageWidget>("statusImage")
|
||||||
->setImage(statsConfig.get(baseMultiplier->statName).getString("icon"));
|
->setImage(statsConfig.get(baseMultiplier->statName).getString("icon"));
|
||||||
listItem->setLabel("statusLabel", strf("%s%%", (baseMultiplier->baseMultiplier - 1) * 100));
|
listItem->setLabel("statusLabel", strf("{}%", (baseMultiplier->baseMultiplier - 1) * 100));
|
||||||
}
|
}
|
||||||
} else if (auto valueModifier = modifierEffect->ptr<StatValueModifier>()) {
|
} else if (auto valueModifier = modifierEffect->ptr<StatValueModifier>()) {
|
||||||
if (statsConfig.contains(valueModifier->statName)) {
|
if (statsConfig.contains(valueModifier->statName)) {
|
||||||
auto listItem = container->addItem();
|
auto listItem = container->addItem();
|
||||||
listItem->fetchChild<ImageWidget>("statusImage")
|
listItem->fetchChild<ImageWidget>("statusImage")
|
||||||
->setImage(statsConfig.get(valueModifier->statName).getString("icon"));
|
->setImage(statsConfig.get(valueModifier->statName).getString("icon"));
|
||||||
listItem->setLabel("statusLabel", strf("%s%s", valueModifier->value < 0 ? "-" : "", valueModifier->value));
|
listItem->setLabel("statusLabel", strf("{}{}", valueModifier->value < 0 ? "-" : "", valueModifier->value));
|
||||||
}
|
}
|
||||||
} else if (auto effectiveMultiplier = modifierEffect->ptr<StatEffectiveMultiplier>()) {
|
} else if (auto effectiveMultiplier = modifierEffect->ptr<StatEffectiveMultiplier>()) {
|
||||||
if (statsConfig.contains(effectiveMultiplier->statName)) {
|
if (statsConfig.contains(effectiveMultiplier->statName)) {
|
||||||
auto listItem = container->addItem();
|
auto listItem = container->addItem();
|
||||||
listItem->fetchChild<ImageWidget>("statusImage")
|
listItem->fetchChild<ImageWidget>("statusImage")
|
||||||
->setImage(statsConfig.get(effectiveMultiplier->statName).getString("icon"));
|
->setImage(statsConfig.get(effectiveMultiplier->statName).getString("icon"));
|
||||||
listItem->setLabel("statusLabel", strf("%s%%", (effectiveMultiplier->effectiveMultiplier - 1) * 100));
|
listItem->setLabel("statusLabel", strf("{}%", (effectiveMultiplier->effectiveMultiplier - 1) * 100));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ void KeybindingsMenu::buildListsFromConfig() {
|
|||||||
for (auto const& bindingEntry : bindings.get(actionString).iterateArray())
|
for (auto const& bindingEntry : bindings.get(actionString).iterateArray())
|
||||||
inputDesc.append(inputDescriptorFromJson(bindingEntry));
|
inputDesc.append(inputDescriptorFromJson(bindingEntry));
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
Logger::warn("Could not load keybinding for %s. %s\n", actionString, e.what());
|
Logger::warn("Could not load keybinding for {}. {}\n", actionString, e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
m_childToAction.insert({newListMember->fetchChild<ButtonWidget>("boundKeys").get(), action});
|
m_childToAction.insert({newListMember->fetchChild<ButtonWidget>("boundKeys").get(), action});
|
||||||
|
@ -681,7 +681,7 @@ void MainInterface::update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_messageOverflow++;
|
m_messageOverflow++;
|
||||||
m_overflowMessage->message = m_config->overflowMessageText.replace("<count>", strf("%s", m_messageOverflow));
|
m_overflowMessage->message = m_config->overflowMessageText.replace("<count>", strf("{}", m_messageOverflow));
|
||||||
m_overflowMessage->cooldown = m_config->messageTime;
|
m_overflowMessage->cooldown = m_config->messageTime;
|
||||||
if (auto oldest = m_messages.sorted([](GuiMessagePtr a, GuiMessagePtr b) { return a->cooldown < b->cooldown; }).maybeFirst())
|
if (auto oldest = m_messages.sorted([](GuiMessagePtr a, GuiMessagePtr b) { return a->cooldown < b->cooldown; }).maybeFirst())
|
||||||
m_overflowMessage->cooldown = oldest.value()->cooldown;
|
m_overflowMessage->cooldown = oldest.value()->cooldown;
|
||||||
@ -862,11 +862,11 @@ void MainInterface::queueItemPickupText(ItemPtr const& item) {
|
|||||||
auto countMessPair = m_itemDropMessages.get(descriptor.singular());
|
auto countMessPair = m_itemDropMessages.get(descriptor.singular());
|
||||||
auto newCount = item->count() + countMessPair.first;
|
auto newCount = item->count() + countMessPair.first;
|
||||||
auto message = countMessPair.second;
|
auto message = countMessPair.second;
|
||||||
message->message = strf("%s - %s", item->friendlyName(), newCount);
|
message->message = strf("{} - {}", item->friendlyName(), newCount);
|
||||||
message->cooldown = m_config->messageTime;
|
message->cooldown = m_config->messageTime;
|
||||||
m_itemDropMessages[descriptor.singular()] = {newCount, message};
|
m_itemDropMessages[descriptor.singular()] = {newCount, message};
|
||||||
} else {
|
} else {
|
||||||
auto message = make_shared<GuiMessage>(strf("%s - %s", item->friendlyName(), item->count()), m_config->messageTime);
|
auto message = make_shared<GuiMessage>(strf("{} - {}", item->friendlyName(), item->count()), m_config->messageTime);
|
||||||
m_messages.append(message);
|
m_messages.append(message);
|
||||||
m_itemDropMessages[descriptor.singular()] = {item->count(), message};
|
m_itemDropMessages[descriptor.singular()] = {item->count(), message};
|
||||||
}
|
}
|
||||||
@ -929,7 +929,7 @@ PanePtr MainInterface::createEscapeDialog() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
escapeDialogReader.construct(assets->json("/interface.config:escapeDialog"), escapeDialogPtr);
|
escapeDialogReader.construct(assets->json("/interface.config:escapeDialog"), escapeDialogPtr);
|
||||||
escapeDialog->fetchChild<LabelWidget>("lblversion")->setText(strf("Starbound - %s (%s)", StarVersionString, StarArchitectureString));
|
escapeDialog->fetchChild<LabelWidget>("lblversion")->setText(strf("Starbound - {} ({})", StarVersionString, StarArchitectureString));
|
||||||
return escapeDialog;
|
return escapeDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1268,7 +1268,7 @@ void MainInterface::renderDebug() {
|
|||||||
int counter = 0;
|
int counter = 0;
|
||||||
for (auto const& pair : logMapValues) {
|
for (auto const& pair : logMapValues) {
|
||||||
TextPositioning positioning = {Vec2F(m_config->debugOffset[0], windowHeight() - m_config->debugOffset[1] - m_config->fontSize * interfaceScale() * counter)};
|
TextPositioning positioning = {Vec2F(m_config->debugOffset[0], windowHeight() - m_config->debugOffset[1] - m_config->fontSize * interfaceScale() * counter)};
|
||||||
m_debugTextRect.combine(m_guiContext->determineTextSize(strf("%s: %s", pair.first, pair.second), positioning).padded(m_config->debugBackgroundPad));
|
m_debugTextRect.combine(m_guiContext->determineTextSize(strf("{}: {}", pair.first, pair.second), positioning).padded(m_config->debugBackgroundPad));
|
||||||
++counter;
|
++counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1281,7 +1281,7 @@ void MainInterface::renderDebug() {
|
|||||||
counter = 0;
|
counter = 0;
|
||||||
for (auto const& pair : logMapValues) {
|
for (auto const& pair : logMapValues) {
|
||||||
TextPositioning positioning = {Vec2F(m_config->debugOffset[0], windowHeight() - m_config->debugOffset[1] - m_config->fontSize * interfaceScale() * counter)};
|
TextPositioning positioning = {Vec2F(m_config->debugOffset[0], windowHeight() - m_config->debugOffset[1] - m_config->fontSize * interfaceScale() * counter)};
|
||||||
m_guiContext->renderText(strf("%s: %s", pair.first, pair.second), positioning);
|
m_guiContext->renderText(strf("{}: {}", pair.first, pair.second), positioning);
|
||||||
++counter;
|
++counter;
|
||||||
}
|
}
|
||||||
m_guiContext->setFontColor(Vec4B::filled(255));
|
m_guiContext->setFontColor(Vec4B::filled(255));
|
||||||
|
@ -236,13 +236,13 @@ void MerchantPane::setupWidget(WidgetPtr const& widget, Json const& itemConfig)
|
|||||||
|
|
||||||
String name = item->friendlyName();
|
String name = item->friendlyName();
|
||||||
if (item->count() > 1)
|
if (item->count() > 1)
|
||||||
name = strf("%s (x%s)", name, item->count());
|
name = strf("{} (x{})", name, item->count());
|
||||||
|
|
||||||
auto itemName = widget->fetchChild<LabelWidget>("itemName");
|
auto itemName = widget->fetchChild<LabelWidget>("itemName");
|
||||||
itemName->setText(name);
|
itemName->setText(name);
|
||||||
|
|
||||||
unsigned price = ceil(itemConfig.getInt("price", item->price()) * m_buyFactor);
|
unsigned price = ceil(itemConfig.getInt("price", item->price()) * m_buyFactor);
|
||||||
widget->setLabel("priceLabel", strf("%s", price));
|
widget->setLabel("priceLabel", strf("{}", price));
|
||||||
widget->setData(price);
|
widget->setData(price);
|
||||||
|
|
||||||
bool unavailable = price > m_player->currency("money");
|
bool unavailable = price > m_player->currency("money");
|
||||||
@ -287,7 +287,7 @@ void MerchantPane::updateBuyTotal() {
|
|||||||
else
|
else
|
||||||
m_buyTotal = 0;
|
m_buyTotal = 0;
|
||||||
|
|
||||||
m_buyTotalLabel->setText(strf("%s", m_buyTotal));
|
m_buyTotalLabel->setText(strf("{}", m_buyTotal));
|
||||||
|
|
||||||
if (m_selectedIndex != NPos && m_buyCount > 0)
|
if (m_selectedIndex != NPos && m_buyCount > 0)
|
||||||
m_buyButton->enable();
|
m_buyButton->enable();
|
||||||
@ -332,7 +332,7 @@ void MerchantPane::updateSellTotal() {
|
|||||||
if (item)
|
if (item)
|
||||||
m_sellTotal += round(item->price() * m_sellFactor);
|
m_sellTotal += round(item->price() * m_sellFactor);
|
||||||
}
|
}
|
||||||
m_sellTotalLabel->setText(strf("%s", m_sellTotal));
|
m_sellTotalLabel->setText(strf("{}", m_sellTotal));
|
||||||
if (m_sellTotal > 0)
|
if (m_sellTotal > 0)
|
||||||
m_sellButton->enable();
|
m_sellButton->enable();
|
||||||
else
|
else
|
||||||
@ -366,7 +366,7 @@ int MerchantPane::maxBuyCount() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MerchantPane::countChanged() {
|
void MerchantPane::countChanged() {
|
||||||
m_countTextBox->setText(strf("x%s", m_buyCount));
|
m_countTextBox->setText(strf("x{}", m_buyCount));
|
||||||
updateBuyTotal();
|
updateBuyTotal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ void QuestLogInterface::fetchData() {
|
|||||||
else if (filter.equalsIgnoreCase("completed"))
|
else if (filter.equalsIgnoreCase("completed"))
|
||||||
showQuests(m_manager->listCompletedQuests());
|
showQuests(m_manager->listCompletedQuests());
|
||||||
else
|
else
|
||||||
throw StarException(strf("Unknown quest filter '%s'", filter));
|
throw StarException(strf("Unknown quest filter '{}'", filter));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuestLogInterface::showQuests(List<QuestPtr> quests) {
|
void QuestLogInterface::showQuests(List<QuestPtr> quests) {
|
||||||
@ -422,7 +422,7 @@ QuestCompleteInterface::QuestCompleteInterface(QuestPtr const& quest, PlayerPtr
|
|||||||
commonSetup(config, m_quest->completionText(), "QuestComplete");
|
commonSetup(config, m_quest->completionText(), "QuestComplete");
|
||||||
|
|
||||||
if (auto moneyLabel = fetchChild<LabelWidget>("lblMoneyAmount"))
|
if (auto moneyLabel = fetchChild<LabelWidget>("lblMoneyAmount"))
|
||||||
moneyLabel->setText(strf("%s", m_quest->money()));
|
moneyLabel->setText(strf("{}", m_quest->money()));
|
||||||
disableScissoring();
|
disableScissoring();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ void RadioMessagePopup::update() {
|
|||||||
|
|
||||||
if (m_popupStage == PopupStage::AnimateIn) {
|
if (m_popupStage == PopupStage::AnimateIn) {
|
||||||
int frame = floor((1.0f - m_stageTimer.percent()) * m_animateInFrames);
|
int frame = floor((1.0f - m_stageTimer.percent()) * m_animateInFrames);
|
||||||
setBG("", strf("%s:%s", m_animateInImage, frame), "");
|
setBG("", strf("{}:{}", m_animateInImage, frame), "");
|
||||||
} else if (m_popupStage == PopupStage::ScrollText) {
|
} else if (m_popupStage == PopupStage::ScrollText) {
|
||||||
int frame =
|
int frame =
|
||||||
int((m_stageTimer.timer / m_message.portraitSpeed) * m_message.portraitFrames) % m_message.portraitFrames;
|
int((m_stageTimer.timer / m_message.portraitSpeed) * m_message.portraitFrames) % m_message.portraitFrames;
|
||||||
@ -62,7 +62,7 @@ void RadioMessagePopup::update() {
|
|||||||
// you're cool, just stay cool, cool person
|
// you're cool, just stay cool, cool person
|
||||||
} else if (m_popupStage == PopupStage::AnimateOut) {
|
} else if (m_popupStage == PopupStage::AnimateOut) {
|
||||||
int frame = floor((1.0f - m_stageTimer.percent()) * m_animateOutFrames);
|
int frame = floor((1.0f - m_stageTimer.percent()) * m_animateOutFrames);
|
||||||
setBG("", strf("%s:%s", m_animateOutImage, frame), "");
|
setBG("", strf("{}:{}", m_animateOutImage, frame), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_slideTimer = min(m_slideTimer + WorldTimestep, m_slideTime);
|
m_slideTimer = min(m_slideTimer + WorldTimestep, m_slideTime);
|
||||||
@ -128,7 +128,7 @@ void RadioMessagePopup::enterStage(PopupStage newStage) {
|
|||||||
if (m_popupStage == PopupStage::Hidden) {
|
if (m_popupStage == PopupStage::Hidden) {
|
||||||
m_portraitImage->hide();
|
m_portraitImage->hide();
|
||||||
m_messageLabel->hide();
|
m_messageLabel->hide();
|
||||||
setBG("", strf("%s:0", m_animateInImage), "");
|
setBG("", strf("{}:0", m_animateInImage), "");
|
||||||
} else if (m_popupStage == PopupStage::AnimateIn) {
|
} else if (m_popupStage == PopupStage::AnimateIn) {
|
||||||
m_stageTimer = GameTimer(m_animateInTime);
|
m_stageTimer = GameTimer(m_animateInTime);
|
||||||
m_portraitImage->hide();
|
m_portraitImage->hide();
|
||||||
|
@ -179,7 +179,7 @@ LuaCallbacks ScriptPane::makePaneCallbacks() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
callbacks.registerCallback("addWidget", [this](Json const& newWidgetConfig, Maybe<String> const& newWidgetName) {
|
callbacks.registerCallback("addWidget", [this](Json const& newWidgetConfig, Maybe<String> const& newWidgetName) {
|
||||||
String name = newWidgetName.value(strf("%d", Random::randu64()));
|
String name = newWidgetName.value(strf("{}", Random::randu64()));
|
||||||
WidgetPtr newWidget = m_reader.makeSingle(name, newWidgetConfig);
|
WidgetPtr newWidget = m_reader.makeSingle(name, newWidgetConfig);
|
||||||
this->addChild(name, newWidget);
|
this->addChild(name, newWidget);
|
||||||
});
|
});
|
||||||
|
@ -159,7 +159,7 @@ void TeamBar::buildTeamBar() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String cellName = strf("%s", controlIndex);
|
String cellName = strf("{}", controlIndex);
|
||||||
WidgetPtr cell = list->fetchChild(cellName);
|
WidgetPtr cell = list->fetchChild(cellName);
|
||||||
|
|
||||||
if (!cell) {
|
if (!cell) {
|
||||||
@ -231,7 +231,7 @@ void TeamBar::buildTeamBar() {
|
|||||||
noInviteImage->setVisibility(!couldInvite);
|
noInviteImage->setVisibility(!couldInvite);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
String cellName = strf("%s", controlIndex);
|
String cellName = strf("{}", controlIndex);
|
||||||
WidgetPtr cell = list->fetchChild(cellName);
|
WidgetPtr cell = list->fetchChild(cellName);
|
||||||
if (!cell)
|
if (!cell)
|
||||||
break;
|
break;
|
||||||
|
@ -57,7 +57,7 @@ TeleportDialog::TeleportDialog(UniverseClientPtr client,
|
|||||||
entry->fetchChild<LabelWidget>("planetName")->setText(dest.getString("planetName", ""));
|
entry->fetchChild<LabelWidget>("planetName")->setText(dest.getString("planetName", ""));
|
||||||
if (dest.contains("icon"))
|
if (dest.contains("icon"))
|
||||||
entry->fetchChild<ImageWidget>("icon")->setImage(
|
entry->fetchChild<ImageWidget>("icon")->setImage(
|
||||||
strf("/interface/bookmarks/icons/%s.png", dest.getString("icon")));
|
strf("/interface/bookmarks/icons/{}.png", dest.getString("icon")));
|
||||||
entry->fetchChild<ButtonWidget>("editButton")->hide();
|
entry->fetchChild<ButtonWidget>("editButton")->hide();
|
||||||
|
|
||||||
if (dest.getBool("mission", false)) {
|
if (dest.getBool("mission", false)) {
|
||||||
|
@ -180,7 +180,7 @@ LuaCallbacks LuaBindings::makeWidgetCallbacks(Widget* parentWidget, GuiReader* r
|
|||||||
|
|
||||||
callbacks.registerCallback("addChild", [parentWidget, reader](String const& widgetName, Json const& newChildConfig, Maybe<String> const& newChildName) {
|
callbacks.registerCallback("addChild", [parentWidget, reader](String const& widgetName, Json const& newChildConfig, Maybe<String> const& newChildName) {
|
||||||
if (auto widget = parentWidget->fetchChild<Widget>(widgetName)) {
|
if (auto widget = parentWidget->fetchChild<Widget>(widgetName)) {
|
||||||
String name = newChildName.value(strf("%d", Random::randu64()));
|
String name = newChildName.value(strf("{}", Random::randu64()));
|
||||||
WidgetPtr newChild = reader->makeSingle(name, newChildConfig);
|
WidgetPtr newChild = reader->makeSingle(name, newChildConfig);
|
||||||
widget->addChild(name, newChild);
|
widget->addChild(name, newChild);
|
||||||
}
|
}
|
||||||
|
@ -1084,10 +1084,10 @@ void ActorMovementController::doSetAnchorState(Maybe<EntityAnchorState> anchorSt
|
|||||||
if (anchorState) {
|
if (anchorState) {
|
||||||
auto anchorableEntity = as<AnchorableEntity>(world()->entity(anchorState->entityId));
|
auto anchorableEntity = as<AnchorableEntity>(world()->entity(anchorState->entityId));
|
||||||
if (!anchorableEntity)
|
if (!anchorableEntity)
|
||||||
throw ActorMovementControllerException::format("No such anchorable entity id %s in ActorMovementController::setAnchorState", anchorState->entityId);
|
throw ActorMovementControllerException::format("No such anchorable entity id {} in ActorMovementController::setAnchorState", anchorState->entityId);
|
||||||
entityAnchor = anchorableEntity->anchor(anchorState->positionIndex);
|
entityAnchor = anchorableEntity->anchor(anchorState->positionIndex);
|
||||||
if (!entityAnchor)
|
if (!entityAnchor)
|
||||||
throw ActorMovementControllerException::format("Anchor position %s is disabled ActorMovementController::setAnchorState", anchorState->positionIndex);
|
throw ActorMovementControllerException::format("Anchor position {} is disabled ActorMovementController::setAnchorState", anchorState->positionIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!entityAnchor && m_entityAnchor && m_entityAnchor->exitBottomPosition) {
|
if (!entityAnchor && m_entityAnchor && m_entityAnchor->exitBottomPosition) {
|
||||||
@ -1327,7 +1327,7 @@ Maybe<bool> PathController::move(ActorMovementController& movementController, Ac
|
|||||||
m_edgeIndex++;
|
m_edgeIndex++;
|
||||||
if (m_edgeIndex < m_path->size()) {
|
if (m_edgeIndex < m_path->size()) {
|
||||||
if (!validateEdge(movementController, m_path->at(m_edgeIndex))) {
|
if (!validateEdge(movementController, m_path->at(m_edgeIndex))) {
|
||||||
// Logger::info("Path invalidated on %s %s %s", ActionNames.getRight(nextEdge.action), nextEdge.source.position, nextEdge.target.position);
|
// Logger::info("Path invalidated on {} {} {}", ActionNames.getRight(nextEdge.action), nextEdge.source.position, nextEdge.target.position);
|
||||||
reset();
|
reset();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -1351,7 +1351,7 @@ Maybe<bool> PathController::move(ActorMovementController& movementController, Ac
|
|||||||
// Vec2F velocity = debugEdge.source.velocity.orMaybe(debugEdge.target.velocity).value({ 0.0, 0.0 });
|
// Vec2F velocity = debugEdge.source.velocity.orMaybe(debugEdge.target.velocity).value({ 0.0, 0.0 });
|
||||||
// SpatialLogger::logPoint("world", debugEdge.source.position, Color::Yellow.toRgba());
|
// SpatialLogger::logPoint("world", debugEdge.source.position, Color::Yellow.toRgba());
|
||||||
// SpatialLogger::logLine("world", debugEdge.source.position, debugEdge.target.position, Color::Yellow.toRgba());
|
// SpatialLogger::logLine("world", debugEdge.source.position, debugEdge.target.position, Color::Yellow.toRgba());
|
||||||
// SpatialLogger::logText("world", strf("%s %s", ActionNames.getRight(debugEdge.action), curVelocity), debugEdge.source.position, Color::Yellow.toRgba());
|
// SpatialLogger::logText("world", strf("{} {}", ActionNames.getRight(debugEdge.action), curVelocity), debugEdge.source.position, Color::Yellow.toRgba());
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ AiSpeech AiDatabase::noMissionsSpeech() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String AiDatabase::portraitImage(String const& species, String const& frame) const {
|
String AiDatabase::portraitImage(String const& species, String const& frame) const {
|
||||||
return strf("/ai/%s:%s", m_speciesParameters.get(species).portraitFrames, frame);
|
return strf("/ai/{}:{}", m_speciesParameters.get(species).portraitFrames, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
Animation AiDatabase::animation(String const& species, String const& animationName) const {
|
Animation AiDatabase::animation(String const& species, String const& animationName) const {
|
||||||
|
@ -92,7 +92,7 @@ NodeParameterValue replaceBehaviorTag(NodeParameterValue const& parameter, Strin
|
|||||||
if (auto replace = treeParameters.maybe(treeKey)) {
|
if (auto replace = treeParameters.maybe(treeKey)) {
|
||||||
return *replace;
|
return *replace;
|
||||||
} else {
|
} else {
|
||||||
throw StarException(strf("No parameter specified for tag '%s'", key));
|
throw StarException(strf("No parameter specified for tag '{}'", key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,7 +110,7 @@ Maybe<String> replaceOutputBehaviorTag(Maybe<String> const& output, StringMap<No
|
|||||||
else
|
else
|
||||||
return {};
|
return {};
|
||||||
} else {
|
} else {
|
||||||
throw StarException(strf("No parameter specified for tag '%s'", *out));
|
throw StarException(strf("No parameter specified for tag '{}'", *out));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ BehaviorDatabase::BehaviorDatabase() {
|
|||||||
m_nodeOutput.set(node.first, output);
|
m_nodeOutput.set(node.first, output);
|
||||||
}
|
}
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
throw StarException(strf("Could not load nodes file \'%s\'", file), e);
|
throw StarException(strf("Could not load nodes file \'{}\'", file), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,11 +182,11 @@ BehaviorDatabase::BehaviorDatabase() {
|
|||||||
auto name = config.getString("name");
|
auto name = config.getString("name");
|
||||||
|
|
||||||
if (m_configs.contains(name))
|
if (m_configs.contains(name))
|
||||||
throw StarException(strf("Duplicate behavior tree \'%s\'", name));
|
throw StarException(strf("Duplicate behavior tree \'{}\'", name));
|
||||||
|
|
||||||
m_configs[name] = config;
|
m_configs[name] = config;
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
throw StarException(strf("Could not load behavior file \'%s\'", file), e);
|
throw StarException(strf("Could not load behavior file \'{}\'", file), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,7 +198,7 @@ BehaviorDatabase::BehaviorDatabase() {
|
|||||||
|
|
||||||
BehaviorTreeConstPtr BehaviorDatabase::behaviorTree(String const& name) const {
|
BehaviorTreeConstPtr BehaviorDatabase::behaviorTree(String const& name) const {
|
||||||
if (!m_behaviors.contains(name))
|
if (!m_behaviors.contains(name))
|
||||||
throw StarException(strf("No such behavior tree \'%s\'", name));
|
throw StarException(strf("No such behavior tree \'{}\'", name));
|
||||||
|
|
||||||
return m_behaviors.get(name);
|
return m_behaviors.get(name);
|
||||||
}
|
}
|
||||||
@ -219,7 +219,7 @@ BehaviorTreeConstPtr BehaviorDatabase::buildTree(Json const& config, StringMap<N
|
|||||||
|
|
||||||
Json BehaviorDatabase::behaviorConfig(String const& name) const {
|
Json BehaviorDatabase::behaviorConfig(String const& name) const {
|
||||||
if (!m_configs.contains(name))
|
if (!m_configs.contains(name))
|
||||||
throw StarException(strf("No such behavior tree \'%s\'", name));
|
throw StarException(strf("No such behavior tree \'{}\'", name));
|
||||||
|
|
||||||
return m_configs.get(name);
|
return m_configs.get(name);
|
||||||
}
|
}
|
||||||
@ -246,7 +246,7 @@ CompositeNode BehaviorDatabase::compositeNode(Json const& config, StringMap<Node
|
|||||||
return RandomizeNode(children);
|
return RandomizeNode(children);
|
||||||
|
|
||||||
// above statement needs to be exhaustive
|
// above statement needs to be exhaustive
|
||||||
throw StarException(strf("Composite node type '%s' could not be created from JSON", CompositeTypeNames.getRight(type)));
|
throw StarException(strf("Composite node type '{}' could not be created from JSON", CompositeTypeNames.getRight(type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
BehaviorNodeConstPtr BehaviorDatabase::behaviorNode(Json const& json, StringMap<NodeParameterValue> const& treeParameters, BehaviorTree& tree) const {
|
BehaviorNodeConstPtr BehaviorDatabase::behaviorNode(Json const& json, StringMap<NodeParameterValue> const& treeParameters, BehaviorTree& tree) const {
|
||||||
@ -292,7 +292,7 @@ BehaviorNodeConstPtr BehaviorDatabase::behaviorNode(Json const& json, StringMap<
|
|||||||
}
|
}
|
||||||
|
|
||||||
// above statement must be exhaustive
|
// above statement must be exhaustive
|
||||||
throw StarException(strf("Behavior node type '%s' could not be created from JSON", BehaviorNodeTypeNames.getRight(type)));
|
throw StarException(strf("Behavior node type '{}' could not be created from JSON", BehaviorNodeTypeNames.getRight(type)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ LuaTable Blackboard::parameters(StringMap<NodeParameter> const& parameters, uint
|
|||||||
// dumb special case for allowing a vec2 of blackboard number keys
|
// dumb special case for allowing a vec2 of blackboard number keys
|
||||||
if (p.second.first == NodeParameterType::Vec2) {
|
if (p.second.first == NodeParameterType::Vec2) {
|
||||||
if (value.type() != Json::Type::Array)
|
if (value.type() != Json::Type::Array)
|
||||||
throw StarException(strf("Vec2 parameter not of array type for key %s", p.first, value));
|
throw StarException(strf("Vec2 parameter not of array type for key {}", p.first, value));
|
||||||
JsonArray vector = value.toArray();
|
JsonArray vector = value.toArray();
|
||||||
LuaTable luaVector = m_luaContext.engine().createTable();
|
LuaTable luaVector = m_luaContext.engine().createTable();
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
@ -210,7 +210,7 @@ NodeStatus BehaviorState::runAction(ActionNode const& node, NodeState& state) {
|
|||||||
try {
|
try {
|
||||||
result = thread.resume<ActionReturn>(parameters, blackboardPtr(), id, m_lastDt).value(ActionReturn(NodeStatus::Invalid, LuaNil));
|
result = thread.resume<ActionReturn>(parameters, blackboardPtr(), id, m_lastDt).value(ActionReturn(NodeStatus::Invalid, LuaNil));
|
||||||
} catch (LuaException const& e) {
|
} catch (LuaException const& e) {
|
||||||
throw StarException(strf("Lua Exception caught running action node %s in behavior %s: %s", node.name, m_tree->name, outputException(e, false)));
|
throw StarException(strf("Lua Exception caught running action node {} in behavior {}: {}", node.name, m_tree->name, outputException(e, false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto status = get<0>(result);
|
auto status = get<0>(result);
|
||||||
@ -222,7 +222,7 @@ NodeStatus BehaviorState::runAction(ActionNode const& node, NodeState& state) {
|
|||||||
try {
|
try {
|
||||||
result = thread.resume<ActionReturn>(m_lastDt).value(ActionReturn(NodeStatus::Invalid, LuaNil));
|
result = thread.resume<ActionReturn>(m_lastDt).value(ActionReturn(NodeStatus::Invalid, LuaNil));
|
||||||
} catch (LuaException const& e) {
|
} catch (LuaException const& e) {
|
||||||
throw StarException(strf("Lua Exception caught resuming action node %s in behavior %s: %s", node.name, m_tree->name, outputException(e, false)));
|
throw StarException(strf("Lua Exception caught resuming action node {} in behavior {}: {}", node.name, m_tree->name, outputException(e, false)));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto status = get<0>(result);
|
auto status = get<0>(result);
|
||||||
@ -246,7 +246,7 @@ NodeStatus BehaviorState::runDecorator(DecoratorNode const& node, NodeState& sta
|
|||||||
try {
|
try {
|
||||||
status = thread.resume<NodeStatus>(parameters, blackboardPtr(), id).value(NodeStatus::Invalid);
|
status = thread.resume<NodeStatus>(parameters, blackboardPtr(), id).value(NodeStatus::Invalid);
|
||||||
} catch (LuaException const& e) {
|
} catch (LuaException const& e) {
|
||||||
throw StarException(strf("Lua Exception caught initializing decorator node %s in behavior %s: %s", node.name, m_tree->name, outputException(e, false)));
|
throw StarException(strf("Lua Exception caught initializing decorator node {} in behavior {}: {}", node.name, m_tree->name, outputException(e, false)));
|
||||||
}
|
}
|
||||||
if (status == NodeStatus::Success || status == NodeStatus::Failure)
|
if (status == NodeStatus::Success || status == NodeStatus::Failure)
|
||||||
return status;
|
return status;
|
||||||
@ -262,7 +262,7 @@ NodeStatus BehaviorState::runDecorator(DecoratorNode const& node, NodeState& sta
|
|||||||
try {
|
try {
|
||||||
status = decorator.thread.resume<NodeStatus>(childStatus).value(NodeStatus::Invalid);
|
status = decorator.thread.resume<NodeStatus>(childStatus).value(NodeStatus::Invalid);
|
||||||
} catch (LuaException const& e) {
|
} catch (LuaException const& e) {
|
||||||
throw StarException(strf("Lua Exception caught resuming decorator node %s in behavior %s: %s", node.name, m_tree->name, outputException(e, false)));
|
throw StarException(strf("Lua Exception caught resuming decorator node {} in behavior {}: {}", node.name, m_tree->name, outputException(e, false)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return NodeStatus::Running;
|
return NodeStatus::Running;
|
||||||
@ -287,7 +287,7 @@ NodeStatus BehaviorState::runComposite(CompositeNode const& node, NodeState& sta
|
|||||||
else if (node.is<RandomizeNode>())
|
else if (node.is<RandomizeNode>())
|
||||||
status = runRandomize(node.get<RandomizeNode>(), state);
|
status = runRandomize(node.get<RandomizeNode>(), state);
|
||||||
else
|
else
|
||||||
throw StarException(strf("Unable to run composite node type with variant type index %s", node.typeIndex()));
|
throw StarException(strf("Unable to run composite node type with variant type index {}", node.typeIndex()));
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ BiomeDatabase::BiomeDatabase() {
|
|||||||
|
|
||||||
auto name = parameters.getString("name");
|
auto name = parameters.getString("name");
|
||||||
if (map.contains(name))
|
if (map.contains(name))
|
||||||
throw BiomeException(strf("Duplicate %s generator name '%s'", type, name));
|
throw BiomeException(strf("Duplicate {} generator name '{}'", type, name));
|
||||||
map[name] = {path, name, parameters};
|
map[name] = {path, name, parameters};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -125,20 +125,20 @@ StringList BiomeDatabase::weatherNames() const {
|
|||||||
|
|
||||||
WeatherType BiomeDatabase::weatherType(String const& name) const {
|
WeatherType BiomeDatabase::weatherType(String const& name) const {
|
||||||
if (!m_weathers.contains(name))
|
if (!m_weathers.contains(name))
|
||||||
throw BiomeException(strf("No such weather type '%s'", name));
|
throw BiomeException(strf("No such weather type '{}'", name));
|
||||||
|
|
||||||
auto config = m_weathers.get(name);
|
auto config = m_weathers.get(name);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return WeatherType(config.parameters, config.path);
|
return WeatherType(config.parameters, config.path);
|
||||||
} catch (MapException const& e) {
|
} catch (MapException const& e) {
|
||||||
throw BiomeException(strf("Required key not found in weather config %s", config.path), e);
|
throw BiomeException(strf("Required key not found in weather config {}", config.path), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BiomePtr BiomeDatabase::createBiome(String const& biomeName, uint64_t seed, float verticalMidPoint, float threatLevel) const {
|
BiomePtr BiomeDatabase::createBiome(String const& biomeName, uint64_t seed, float verticalMidPoint, float threatLevel) const {
|
||||||
if (!m_biomes.contains(biomeName))
|
if (!m_biomes.contains(biomeName))
|
||||||
throw BiomeException(strf("No such biome '%s'", biomeName));
|
throw BiomeException(strf("No such biome '{}'", biomeName));
|
||||||
|
|
||||||
auto& root = Root::singleton();
|
auto& root = Root::singleton();
|
||||||
auto materialDatabase = root.materialDatabase();
|
auto materialDatabase = root.materialDatabase();
|
||||||
@ -183,7 +183,7 @@ BiomePtr BiomeDatabase::createBiome(String const& biomeName, uint64_t seed, floa
|
|||||||
|
|
||||||
return biome;
|
return biome;
|
||||||
} catch (std::exception const& cause) {
|
} catch (std::exception const& cause) {
|
||||||
throw BiomeException(strf("Failed to parse biome: '%s'", biomeName), cause);
|
throw BiomeException(strf("Failed to parse biome: '{}'", biomeName), cause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ BiomeItem variantToBiomeItem(Json const& store) {
|
|||||||
} else if (type == "microDungeon") {
|
} else if (type == "microDungeon") {
|
||||||
return MicroDungeonNames(jsonToStringSet(store.get(1)));
|
return MicroDungeonNames(jsonToStringSet(store.get(1)));
|
||||||
} else {
|
} else {
|
||||||
throw BiomeException(strf("Unrecognized biome item type '%s'", type));
|
throw BiomeException(strf("Unrecognized biome item type '{}'", type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ Maybe<BiomeItem> BiomeItemDistribution::createItem(Json const& config, RandomSou
|
|||||||
return BiomeItem{MicroDungeonNames(jsonToStringSet(config.get("microdungeons", JsonArray())))};
|
return BiomeItem{MicroDungeonNames(jsonToStringSet(config.get("microdungeons", JsonArray())))};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw BiomeException(strf("No such item type '%s' in item distribution", type));
|
throw BiomeException(strf("No such item type '{}' in item distribution", type));
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
|
@ -31,11 +31,11 @@ CelestialCoordinate::CelestialCoordinate(Json const& variant) : CelestialCoordin
|
|||||||
m_satelliteOrbitNumber = lexicalCast<int>(plist.at(4));
|
m_satelliteOrbitNumber = lexicalCast<int>(plist.at(4));
|
||||||
|
|
||||||
if (m_planetaryOrbitNumber <= 0)
|
if (m_planetaryOrbitNumber <= 0)
|
||||||
throw CelestialException(strf("Planetary body number out of range in '%s'", id));
|
throw CelestialException(strf("Planetary body number out of range in '{}'", id));
|
||||||
if (m_satelliteOrbitNumber < 0)
|
if (m_satelliteOrbitNumber < 0)
|
||||||
throw CelestialException(strf("Satellite body number out of range in '%s'", id));
|
throw CelestialException(strf("Satellite body number out of range in '{}'", id));
|
||||||
} catch (StarException const& e) {
|
} catch (StarException const& e) {
|
||||||
throw CelestialException(strf("Error parsing CelestialCoordinate from '%s'", id), e);
|
throw CelestialException(strf("Error parsing CelestialCoordinate from '{}'", id), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (variant.isType(Json::Type::Object)) {
|
} else if (variant.isType(Json::Type::Object)) {
|
||||||
@ -44,7 +44,7 @@ CelestialCoordinate::CelestialCoordinate(Json const& variant) : CelestialCoordin
|
|||||||
m_satelliteOrbitNumber = variant.getInt("satellite", 0);
|
m_satelliteOrbitNumber = variant.getInt("satellite", 0);
|
||||||
} else if (!variant.isNull()) {
|
} else if (!variant.isNull()) {
|
||||||
throw CelestialException(
|
throw CelestialException(
|
||||||
strf("Improper variant type %s trying to convert to SystemCoordinate", variant.typeName()));
|
strf("Improper variant type {} trying to convert to SystemCoordinate", variant.typeName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,12 +153,12 @@ std::ostream& operator<<(std::ostream& os, CelestialCoordinate const& coord) {
|
|||||||
if (coord.isNull()) {
|
if (coord.isNull()) {
|
||||||
os << "null";
|
os << "null";
|
||||||
} else {
|
} else {
|
||||||
format(os, "%s:%s:%s", coord.m_location[0], coord.m_location[1], coord.m_location[2]);
|
format(os, "{}:{}:{}", coord.m_location[0], coord.m_location[1], coord.m_location[2]);
|
||||||
|
|
||||||
if (coord.m_planetaryOrbitNumber) {
|
if (coord.m_planetaryOrbitNumber) {
|
||||||
format(os, ":%s", coord.m_planetaryOrbitNumber);
|
format(os, ":{}", coord.m_planetaryOrbitNumber);
|
||||||
if (coord.m_satelliteOrbitNumber)
|
if (coord.m_satelliteOrbitNumber)
|
||||||
format(os, ":%s", coord.m_satelliteOrbitNumber);
|
format(os, ":{}", coord.m_satelliteOrbitNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user