Previous: RFC 3986 Home: Next: Finicky

QR Code

A QR code is a machine-readable two-dimensional barcode. They might contain data for a identifier or a URL to a website.

This example shows how to construct and modify URLs to consume a third party API to generate QR Codes.

/*
    This example shows how to construct and modify
    URLs to consume a third party API to
    generate QR Codes.
    https://developers.google.com/chart/infographics/docs/qr_codes
*/

#include <boost/url/url.hpp>
#include <boost/core/detail/string_view.hpp>
#include <boost/url/parse.hpp>
#include <iostream>

namespace urls = boost::urls;
namespace core = boost::core;

int main(int argc, char** argv)
{
    if (argc < 2) {
        std::cout << argv[0] << "\n";
        std::cout << "Usage: qrcode <data> <width> <height> <output encoding> <error correction> <border>\n"
                     "options:\n"
                     "    <data>:             The data to encode (required)\n"
                     "    <width>:            Image width (default: 100)\n"
                     "    <height>:           Image height (default: width)\n"
                     "    <output encoding>:  UTF-8, Shift_JIS, ISO-8859-1 (default: utf8)\n"
                     "    <error correction>: percentage of error correction (default: 7)\n"
                     "    <margin>:           border width (default: 4)\n"
                     "examples:\n"
                     "qrcode \"Hello world\"\n";
        return EXIT_FAILURE;
    }

    urls::url u =
        urls::parse_uri(
            "https://chart.googleapis.com/chart?cht=qr").value();
    auto ps = u.params();

    // Data
    ps.append({"chl", argv[1]});

    // Size
    std::size_t width = argc < 3 ? 100 : std::stoll(argv[2]);
    std::size_t height = argc < 4 ? width : std::stoll(argv[3]);
    ps.append({"chs", std::to_string(width) + "x" + std::to_string(height)});

    // Encoding
    if (argc >= 5)
    {
         core::string_view output_encoding =
            core::string_view(argv[3]) == "Shift_JIS" ||
            core::string_view(argv[3]) == "ISO-8859-1" ?
                argv[4] : "UTF-8";
         ps.append({"choe", output_encoding});
    }

    // Error
    if (argc >= 6)
    {
        std::size_t err = std::stoll(argv[5]);
        std::string chld;
        if (err < 11)
            chld = "L";
        else if (err < 20)
            chld = "M";
        else if (err < 27)
            chld = "Q";
        else
            chld = "H";
        std::size_t margin = argc < 7 ? 4 : std::stoll(argv[6]);
        chld += "|";
        chld += std::to_string(margin);
        ps.append({"chld", chld});
    }

    std::cout << u << '\n';

    return EXIT_SUCCESS;
}