Skip to content

Commit

Permalink
fix generation of instance-unique MAC address when using an external …
Browse files Browse the repository at this point in the history
…firmware
  • Loading branch information
Arisotura committed Apr 9, 2024
1 parent 6e26559 commit 968bd26
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 54 deletions.
110 changes: 57 additions & 53 deletions src/frontend/qt_sdl/ROMManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -642,7 +642,7 @@ Firmware GenerateFirmware(int type) noexcept
}
}

CustomizeFirmware(firmware);
CustomizeFirmware(firmware, true);

// If we don't have Wi-fi settings to load,
// then the defaults will have already been populated by the constructor.
Expand Down Expand Up @@ -681,10 +681,7 @@ std::optional<Firmware> LoadFirmware(int type) noexcept
return std::nullopt;
}

if (Config::FirmwareOverrideSettings)
{
CustomizeFirmware(firmware);
}
CustomizeFirmware(firmware, Config::FirmwareOverrideSettings);

return firmware;
}
Expand Down Expand Up @@ -1120,54 +1117,59 @@ bool ParseMacAddress(void* data)
return false;
}

void CustomizeFirmware(Firmware& firmware) noexcept
void CustomizeFirmware(Firmware& firmware, bool overridesettings) noexcept
{
auto& currentData = firmware.GetEffectiveUserData();
if (overridesettings)
{
auto &currentData = firmware.GetEffectiveUserData();

// setting up username
std::string orig_username = Config::FirmwareUsername;
if (!orig_username.empty())
{ // If the frontend defines a username, take it. If not, leave the existing one.
std::u16string username = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(orig_username);
size_t usernameLength = std::min(username.length(), (size_t) 10);
currentData.NameLength = usernameLength;
memcpy(currentData.Nickname, username.data(), usernameLength * sizeof(char16_t));
}
// setting up username
std::string orig_username = Config::FirmwareUsername;
if (!orig_username.empty())
{ // If the frontend defines a username, take it. If not, leave the existing one.
std::u16string username = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(
orig_username);
size_t usernameLength = std::min(username.length(), (size_t) 10);
currentData.NameLength = usernameLength;
memcpy(currentData.Nickname, username.data(), usernameLength * sizeof(char16_t));
}

auto language = static_cast<Firmware::Language>(Config::FirmwareLanguage);
if (language != Firmware::Language::Reserved)
{ // If the frontend specifies a language (rather than using the existing value)...
currentData.Settings &= ~Firmware::Language::Reserved; // ..clear the existing language...
currentData.Settings |= language; // ...and set the new one.
}
auto language = static_cast<Firmware::Language>(Config::FirmwareLanguage);
if (language != Firmware::Language::Reserved)
{ // If the frontend specifies a language (rather than using the existing value)...
currentData.Settings &= ~Firmware::Language::Reserved; // ..clear the existing language...
currentData.Settings |= language; // ...and set the new one.
}

// setting up color
u8 favoritecolor = Config::FirmwareFavouriteColour;
if (favoritecolor != 0xFF)
{
currentData.FavoriteColor = favoritecolor;
}
// setting up color
u8 favoritecolor = Config::FirmwareFavouriteColour;
if (favoritecolor != 0xFF)
{
currentData.FavoriteColor = favoritecolor;
}

u8 birthmonth = Config::FirmwareBirthdayMonth;
if (birthmonth != 0)
{ // If the frontend specifies a birth month (rather than using the existing value)...
currentData.BirthdayMonth = birthmonth;
}
u8 birthmonth = Config::FirmwareBirthdayMonth;
if (birthmonth != 0)
{ // If the frontend specifies a birth month (rather than using the existing value)...
currentData.BirthdayMonth = birthmonth;
}

u8 birthday = Config::FirmwareBirthdayDay;
if (birthday != 0)
{ // If the frontend specifies a birthday (rather than using the existing value)...
currentData.BirthdayDay = birthday;
}
u8 birthday = Config::FirmwareBirthdayDay;
if (birthday != 0)
{ // If the frontend specifies a birthday (rather than using the existing value)...
currentData.BirthdayDay = birthday;
}

// setup message
std::string orig_message = Config::FirmwareMessage;
if (!orig_message.empty())
{
std::u16string message = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(orig_message);
size_t messageLength = std::min(message.length(), (size_t) 26);
currentData.MessageLength = messageLength;
memcpy(currentData.Message, message.data(), messageLength * sizeof(char16_t));
// setup message
std::string orig_message = Config::FirmwareMessage;
if (!orig_message.empty())
{
std::u16string message = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(
orig_message);
size_t messageLength = std::min(message.length(), (size_t) 26);
currentData.MessageLength = messageLength;
memcpy(currentData.Message, message.data(), messageLength * sizeof(char16_t));
}
}

MacAddress mac;
Expand All @@ -1176,14 +1178,16 @@ void CustomizeFirmware(Firmware& firmware) noexcept

memcpy(&mac, header.MacAddr.data(), sizeof(MacAddress));


MacAddress configuredMac;
rep = ParseMacAddress(&configuredMac);
rep &= (configuredMac != MacAddress());

if (rep)
if (overridesettings)
{
mac = configuredMac;
MacAddress configuredMac;
rep = ParseMacAddress(&configuredMac);
rep &= (configuredMac != MacAddress());

if (rep)
{
mac = configuredMac;
}
}

int inst = Platform::InstanceID();
Expand Down
2 changes: 1 addition & 1 deletion src/frontend/qt_sdl/ROMManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ std::optional<FATStorageArgs> GetDSiSDCardArgs() noexcept;
std::optional<FATStorage> LoadDSiSDCard() noexcept;
std::optional<FATStorageArgs> GetDLDISDCardArgs() noexcept;
std::optional<FATStorage> LoadDLDISDCard() noexcept;
void CustomizeFirmware(Firmware& firmware) noexcept;
void CustomizeFirmware(Firmware& firmware, bool overridesettings) noexcept;
Firmware GenerateFirmware(int type) noexcept;
/// Loads and customizes a firmware image based on the values in Config
std::optional<Firmware> LoadFirmware(int type) noexcept;
Expand Down

0 comments on commit 968bd26

Please sign in to comment.