diff --git a/cpp/QrCode.cpp b/cpp/QrCode.cpp index 5005949..842c72d 100644 --- a/cpp/QrCode.cpp +++ b/cpp/QrCode.cpp @@ -617,4 +617,8 @@ uint8_t QrCode::ReedSolomonGenerator::multiply(uint8_t x, uint8_t y) { return static_cast(z); } + +data_too_long::data_too_long(const std::string &msg) : + std::length_error(msg) {} + } diff --git a/cpp/QrCode.hpp b/cpp/QrCode.hpp index 1904844..df2fcde 100644 --- a/cpp/QrCode.hpp +++ b/cpp/QrCode.hpp @@ -348,4 +348,25 @@ class QrCode final { }; + + +/*---- Public exception class ----*/ + +/* + * Thrown when the supplied data does not fit any QR Code version. Ways to handle this exception include: + * - Decrease the error correction level if it was greater than Ecc::LOW. + * - If the encodeSegments() function was called with a maxVersion argument, then increase + * it if it was less than QrCode::MAX_VERSION. (This advice does not apply to the other + * factory functions because they search all versions up to QrCode::MAX_VERSION.) + * - Split the text data into better or optimal segments in order to reduce the number of bits required. + * - Change the text or binary data to be shorter. + * - Change the text to fit the character set of a particular segment mode (e.g. alphanumeric). + * - Propagate the error upward to the caller/user. + */ +class data_too_long : public std::length_error { + + public: explicit data_too_long(const std::string &msg); + +}; + } diff --git a/java/io/nayuki/qrcodegen/DataTooLongException.java b/java/io/nayuki/qrcodegen/DataTooLongException.java new file mode 100644 index 0000000..4baadfc --- /dev/null +++ b/java/io/nayuki/qrcodegen/DataTooLongException.java @@ -0,0 +1,55 @@ +/* + * QR Code generator library (Java) + * + * Copyright (c) Project Nayuki. (MIT License) + * https://www.nayuki.io/page/qr-code-generator-library + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * - The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * - The Software is provided "as is", without warranty of any kind, express or + * implied, including but not limited to the warranties of merchantability, + * fitness for a particular purpose and noninfringement. In no event shall the + * authors or copyright holders be liable for any claim, damages or other + * liability, whether in an action of contract, tort or otherwise, arising from, + * out of or in connection with the Software or the use or other dealings in the + * Software. + */ + +package io.nayuki.qrcodegen; + + +/** + * Thrown when the supplied data does not fit any QR Code version. Ways to handle this exception include: + * + * @see QrCode#encodeText(String, QrCode.Ecc) + * @see QrCode#encodeBinary(byte[], QrCode.Ecc) + * @see QrCode#encodeSegments(java.util.List, QrCode.Ecc) + * @see QrCode#encodeSegments(java.util.List, QrCode.Ecc, int, int, int, boolean) + */ +public class DataTooLongException extends IllegalArgumentException { + + public DataTooLongException() {} + + + public DataTooLongException(String msg) { + super(msg); + } + +} diff --git a/python/qrcodegen.py b/python/qrcodegen.py index ca9bdf4..84c22df 100644 --- a/python/qrcodegen.py +++ b/python/qrcodegen.py @@ -888,3 +888,17 @@ class _BitBuffer(list): def _get_bit(x, i): """Returns true iff the i'th bit of x is set to 1.""" return (x >> i) & 1 != 0 + + + +class DataTooLongError(ValueError): + """Raised when the supplied data does not fit any QR Code version. Ways to handle this exception include: + - Decrease the error correction level if it was greater than Ecc.LOW. + - If the encode_segments() function was called with a maxversion argument, then increase + it if it was less than QrCode.MAX_VERSION. (This advice does not apply to the other + factory functions because they search all versions up to QrCode.MAX_VERSION.) + - Split the text data into better or optimal segments in order to reduce the number of bits required. + - Change the text or binary data to be shorter. + - Change the text to fit the character set of a particular segment mode (e.g. alphanumeric). + - Propagate the error upward to the caller/user.""" + pass diff --git a/rust/src/lib.rs b/rust/src/lib.rs index b2753a3..8f863ac 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1220,6 +1220,34 @@ impl BitBuffer { /*---- Miscellaneous values ----*/ +/// The error type when the supplied data does not fit any QR Code version. +/// +/// Ways to handle this exception include: +/// +/// - Decrease the error correction level if it was greater than `QrCodeEcc::Low`. +/// - If the `encode_segments_advanced()` function was called, then increase the maxversion +/// argument if it was less than `QrCode_MAX_VERSION`. (This advice does not apply to the +/// other factory functions because they search all versions up to `QrCode_MAX_VERSION`.) +/// - Split the text data into better or optimal segments in order to reduce the number of bits required. +/// - Change the text or binary data to be shorter. +/// - Change the text to fit the character set of a particular segment mode (e.g. alphanumeric). +/// - Propagate the error upward to the caller/user. +#[derive(Debug, Clone)] +pub struct DataTooLong(String); + +impl std::error::Error for DataTooLong { + fn description(&self) -> &str { + &self.0 + } +} + +impl std::fmt::Display for DataTooLong { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.write_str(&self.0) + } +} + + /// A number between 1 and 40 (inclusive). #[derive(Copy, Clone)] pub struct Version(u8);