diff --git a/Telegram/SourceFiles/countries/countries_instance.cpp b/Telegram/SourceFiles/countries/countries_instance.cpp index 0a7844179..ba159016d 100644 --- a/Telegram/SourceFiles/countries/countries_instance.cpp +++ b/Telegram/SourceFiles/countries/countries_instance.cpp @@ -254,7 +254,7 @@ const std::array FallbackList = { { CountriesInstance::CountriesInstance() { } -const std::vector &CountriesInstance::list() { +const std::vector &CountriesInstance::list() const { if (_list.empty()) { _list = (FallbackList | ranges::to_vector); } @@ -268,7 +268,7 @@ void CountriesInstance::setList(std::vector &&infos) { _updated.fire({}); } -const CountriesInstance::Map &CountriesInstance::byCode() { +const CountriesInstance::Map &CountriesInstance::byCode() const { if (_byCode.empty()) { _byCode.reserve(list().size()); for (const auto &entry : list()) { @@ -280,7 +280,7 @@ const CountriesInstance::Map &CountriesInstance::byCode() { return _byCode; } -const CountriesInstance::Map &CountriesInstance::byISO2() { +const CountriesInstance::Map &CountriesInstance::byISO2() const { if (_byISO2.empty()) { _byISO2.reserve(list().size()); for (const auto &entry : list()) { @@ -290,7 +290,7 @@ const CountriesInstance::Map &CountriesInstance::byISO2() { return _byISO2; } -QString CountriesInstance::validPhoneCode(QString fullCode) { +QString CountriesInstance::validPhoneCode(QString fullCode) const { const auto &listByCode = byCode(); while (fullCode.length()) { const auto i = listByCode.constFind(fullCode); @@ -302,20 +302,34 @@ QString CountriesInstance::validPhoneCode(QString fullCode) { return QString(); } -QString CountriesInstance::countryNameByISO2(const QString &iso) { +QString CountriesInstance::countryNameByISO2(const QString &iso) const { const auto &listByISO2 = byISO2(); const auto i = listByISO2.constFind(iso); return (i != listByISO2.cend()) ? (*i)->name : QString(); } -QString CountriesInstance::countryISO2ByPhone(const QString &phone) { +QString CountriesInstance::countryISO2ByPhone(const QString &phone) const { const auto &listByCode = byCode(); const auto code = validPhoneCode(phone); const auto i = listByCode.find(code); return (i != listByCode.cend()) ? (*i)->iso2 : QString(); } -FormatResult CountriesInstance::format(FormatArgs args) { +QString CountriesInstance::flagEmojiByISO2(const QString &iso) const { + if (iso.size() != 2 + || iso.front() < 'A' + || iso.front() > 'Z' + || iso.back() < 'A' + || iso.back() > 'Z') { + return QString(); + } + auto result = QString(4, QChar(0xD83C)); + result[1] = QChar(iso.front().unicode() - 'A' + 0xDDE6); + result[3] = QChar(iso.back().unicode() - 'A' + 0xDDE6); + return result; +} + +FormatResult CountriesInstance::format(FormatArgs args) const { // Ported from TDLib. if (args.phone.isEmpty()) { return FormatResult(); diff --git a/Telegram/SourceFiles/countries/countries_instance.h b/Telegram/SourceFiles/countries/countries_instance.h index d8d7562e8..b7993930c 100644 --- a/Telegram/SourceFiles/countries/countries_instance.h +++ b/Telegram/SourceFiles/countries/countries_instance.h @@ -43,25 +43,26 @@ public: using Map = QHash; CountriesInstance(); - [[nodiscard]] const std::vector &list(); + [[nodiscard]] const std::vector &list() const; void setList(std::vector &&infos); - [[nodiscard]] const Map &byCode(); - [[nodiscard]] const Map &byISO2(); + [[nodiscard]] const Map &byCode() const; + [[nodiscard]] const Map &byISO2() const; - [[nodiscard]] QString validPhoneCode(QString fullCode); - [[nodiscard]] QString countryNameByISO2(const QString &iso); - [[nodiscard]] QString countryISO2ByPhone(const QString &phone); + [[nodiscard]] QString validPhoneCode(QString fullCode) const; + [[nodiscard]] QString countryNameByISO2(const QString &iso) const; + [[nodiscard]] QString countryISO2ByPhone(const QString &phone) const; + [[nodiscard]] QString flagEmojiByISO2(const QString &iso) const; - [[nodiscard]] FormatResult format(FormatArgs args); + [[nodiscard]] FormatResult format(FormatArgs args) const; [[nodiscard]] rpl::producer<> updated() const; private: - std::vector _list; + mutable std::vector _list; - Map _byCode; - Map _byISO2; + mutable Map _byCode; + mutable Map _byISO2; rpl::event_stream<> _updated;