Skip to content
Snippets Groups Projects
Select Git revision
  • 46910037569a1fbab950c0d8ff5acc0068f6b045
  • master default protected
  • release/201811
  • release/201812
  • release/201901
  • release/201902
  • release/201903
  • release/201904
  • release/201905
  • release/201906
  • release/201908
  • release/201912
  • release/202001
  • release/202005
  • release/windows-test/201910
  • release/201808
  • wip/smartlist_refacto
  • wip/patches_poly_2017/JimmyHamel/MathieuGirouxHuppe
18 results

RingD.cpp

Blame
    • Andreas Traczyk's avatar
      46910037
      contacts: implement account specific contact lists · 46910037
      Andreas Traczyk authored
      - Implements contacts and their respective conversations being
        associated to individual accounts. Prior to this patch, contacts
        were per profile, and stored only an associated account ID for
        conversation history sorting.
      
      - Incoming messages for unselected accounts will trigger visual
        notifications, and the total number of unread messages per
        account is reported in the account selection interface panel.
        Incoming calls for unselected accounts will appear at the top
        of every account's contact list for the duration of the call.
      
      Change-Id: I219ab7b1b2656e5021388fd54e36b21dc81dcd90
      Tuleap: #1538
      46910037
      History
      contacts: implement account specific contact lists
      Andreas Traczyk authored
      - Implements contacts and their respective conversations being
        associated to individual accounts. Prior to this patch, contacts
        were per profile, and stored only an associated account ID for
        conversation history sorting.
      
      - Incoming messages for unselected accounts will trigger visual
        notifications, and the total number of unread messages per
        account is reported in the account selection interface panel.
        Incoming calls for unselected accounts will appear at the top
        of every account's contact list for the duration of the call.
      
      Change-Id: I219ab7b1b2656e5021388fd54e36b21dc81dcd90
      Tuleap: #1538
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    string_utils.cpp 4.44 KiB
    /*
     *  Copyright (C) 2004-2020 Savoir-faire Linux Inc.
     *
     *  Author: Tristan Matthews <tristan.matthews@savoirfairelinux.com>
     *  Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
     *
     *  This program is free software; you can redistribute it and/or modify
     *  it under the terms of the GNU General Public License as published by
     *  the Free Software Foundation; either version 3 of the License, or
     *  (at your option) any later version.
     *
     *  This program is distributed in the hope that it will be useful,
     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     *  GNU General Public License for more details.
     *
     *  You should have received a copy of the GNU General Public License
     *  along with this program; if not, write to the Free Software
     *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
     */
    
    #include "string_utils.h"
    
    #include <sstream>
    #include <cctype>
    #include <algorithm>
    #include <ostream>
    #include <iomanip>
    #include <stdexcept>
    #include <ios>
    #include <charconv>
    #include <string_view>
    #ifdef _WIN32
    #include <windows.h>
    #include <oleauto.h>
    #endif
    
    #include <ciso646> // fix windows compiler bug
    
    namespace jami {
    
    #ifdef _WIN32
    std::wstring
    to_wstring(const std::string& str, int codePage)
    {
        int srcLength = (int) str.length();
        int requiredSize = MultiByteToWideChar(codePage, 0, str.c_str(), srcLength, nullptr, 0);
        if (!requiredSize) {
            throw std::runtime_error("Can't convert string to wstring");
        }
        std::wstring result((size_t) requiredSize, 0);
        if (!MultiByteToWideChar(codePage, 0, str.c_str(), srcLength, &(*result.begin()), requiredSize)) {
            throw std::runtime_error("Can't convert string to wstring");
        }
        return result;
    }
    
    std::string
    to_string(const std::wstring& wstr, int codePage)
    {
        int srcLength = (int) wstr.length();
        int requiredSize = WideCharToMultiByte(codePage, 0, wstr.c_str(), srcLength, nullptr, 0, 0, 0);
        if (!requiredSize) {
            throw std::runtime_error("Can't convert wstring to string");
        }
        std::string result((size_t) requiredSize, 0);
        if (!WideCharToMultiByte(
                codePage, 0, wstr.c_str(), srcLength, &(*result.begin()), requiredSize, 0, 0)) {
            throw std::runtime_error("Can't convert wstring to string");
        }
        return result;
    }
    #endif
    
    std::string
    to_string(double value)
    {
        char buf[64];
        int len = snprintf(buf, sizeof(buf), "%-.*G", 16, value);
        if (len <= 0)
            throw std::invalid_argument {"can't parse double"};
        return {buf, (size_t) len};
    }
    
    std::string
    to_hex_string(uint64_t id)
    {
        std::ostringstream ss;
        ss << std::hex << std::setfill('0') << std::setw(16) << id;
        return ss.str();
    }
    
    uint64_t
    from_hex_string(const std::string& str)
    {
        std::istringstream ss(str);
        ss >> std::hex;
        uint64_t id;
        if (!(ss >> id))
            throw std::invalid_argument("Can't parse id: " + str);
        return id;
    }
    
    std::string_view
    trim(std::string_view s)
    {
        auto wsfront = std::find_if_not(s.cbegin(), s.cend(), [](int c) { return std::isspace(c); });
        return std::string_view(&*wsfront, std::find_if_not(s.rbegin(),
                                            std::string_view::const_reverse_iterator(wsfront),
                                            [](int c) { return std::isspace(c); })
                               .base() - wsfront);
    }
    
    std::vector<unsigned>
    split_string_to_unsigned(const std::string& str, char delim)
    {
        std::vector<unsigned> output;
        for (auto first = str.data(), second = str.data(), last = first + str.size(); second != last && first != last; first = second + 1) {
            second = std::find(first, last, delim);
            if (first != second) {
                unsigned result;
                auto [p, ec] = std::from_chars(first, second, result);
                if (ec ==  std::errc())
                    output.emplace_back(result);
            }
        }
        return output;
    }
    
    void
    string_replace(std::string& str, const std::string& from, const std::string& to)
    {
        size_t start_pos = 0;
        while ((start_pos = str.find(from, start_pos)) != std::string::npos) {
            str.replace(start_pos, from.length(), to);
            start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
        }
    }
    
    std::string_view
    string_remove_suffix(std::string_view str, char separator)
    {
        auto it = str.find(separator);
        if (it != std::string_view::npos)
            str = str.substr(0, it);
        return str;
    }
    
    } // namespace jami