From ee72493e148f945b0382e6b2ea1a13952751a010 Mon Sep 17 00:00:00 2001 From: Wojciech Kula Date: Fri, 16 Dec 2016 16:44:31 +0100 Subject: [PATCH] Problem: Duplicated code Solution: set_curve_key method in options_t struct with little improvement in switch-case block --- src/options.cpp | 103 ++++++++++++++++-------------------------------- src/options.hpp | 2 + 2 files changed, 37 insertions(+), 68 deletions(-) diff --git a/src/options.cpp b/src/options.cpp index 330d7ac8..d11c6d29 100644 --- a/src/options.cpp +++ b/src/options.cpp @@ -90,6 +90,38 @@ zmq::options_t::options_t () : #endif } +int zmq::options_t::set_curve_key(uint8_t * destination, const void * optval_, size_t optvallen_) +{ + switch (optvallen_) { + + case CURVE_KEYSIZE: + memcpy (destination, optval_, optvallen_); + mechanism = ZMQ_CURVE; + return 0; + + case CURVE_KEYSIZE_Z85 + 1: + if (zmq_z85_decode (destination, (char *) optval_)) { + mechanism = ZMQ_CURVE; + return 0; + } + break; + + case CURVE_KEYSIZE_Z85: + char z85_key [CURVE_KEYSIZE_Z85 + 1]; + memcpy (z85_key, (char *) optval_, optvallen_); + z85_key [CURVE_KEYSIZE_Z85] = 0; + if (zmq_z85_decode (destination, z85_key)) { + mechanism = ZMQ_CURVE; + return 0; + } + break; + + default: + break; + } + return -1; +} + int zmq::options_t::setsockopt (int option_, const void *optval_, size_t optvallen_) { @@ -418,87 +450,22 @@ int zmq::options_t::setsockopt (int option_, const void *optval_, break; case ZMQ_CURVE_PUBLICKEY: - // TODO: refactor repeated code for these three options - // into set_curve_key (destination, optval, optlen) method - // ==> set_curve_key (curve_public_key, optval_, optvallen_); - if (optvallen_ == CURVE_KEYSIZE) { - memcpy (curve_public_key, optval_, CURVE_KEYSIZE); - mechanism = ZMQ_CURVE; + if(0 == set_curve_key(curve_public_key, optval_, optvallen_)) { return 0; } - else - if (optvallen_ == CURVE_KEYSIZE_Z85 + 1) { - if (zmq_z85_decode (curve_public_key, (char *) optval_)) { - mechanism = ZMQ_CURVE; - return 0; - } - } - else - // Deprecated, not symmetrical with zmq_getsockopt - if (optvallen_ == CURVE_KEYSIZE_Z85) { - char z85_key [CURVE_KEYSIZE_Z85 + 1]; - memcpy (z85_key, (char *) optval_, CURVE_KEYSIZE_Z85); - z85_key [CURVE_KEYSIZE_Z85] = 0; - if (zmq_z85_decode (curve_public_key, z85_key)) { - mechanism = ZMQ_CURVE; - return 0; - } - } break; case ZMQ_CURVE_SECRETKEY: - if (optvallen_ == CURVE_KEYSIZE) { - memcpy (curve_secret_key, optval_, CURVE_KEYSIZE); - mechanism = ZMQ_CURVE; + if(0 == set_curve_key(curve_secret_key, optval_, optvallen_)) { return 0; } - else - if (optvallen_ == CURVE_KEYSIZE_Z85 + 1) { - if (zmq_z85_decode (curve_secret_key, (char *) optval_)) { - mechanism = ZMQ_CURVE; - return 0; - } - } - else - // Deprecated, not symmetrical with zmq_getsockopt - if (optvallen_ == CURVE_KEYSIZE_Z85) { - char z85_key [CURVE_KEYSIZE_Z85 + 1]; - memcpy (z85_key, (char *) optval_, CURVE_KEYSIZE_Z85); - z85_key [CURVE_KEYSIZE_Z85] = 0; - if (zmq_z85_decode (curve_secret_key, z85_key)) { - mechanism = ZMQ_CURVE; - return 0; - } - } break; case ZMQ_CURVE_SERVERKEY: - if (optvallen_ == CURVE_KEYSIZE) { - memcpy (curve_server_key, optval_, CURVE_KEYSIZE); - mechanism = ZMQ_CURVE; + if(0 == set_curve_key(curve_server_key, optval_, optvallen_)) { as_server = 0; return 0; } - else - if (optvallen_ == CURVE_KEYSIZE_Z85 + 1) { - if (zmq_z85_decode (curve_server_key, (char *) optval_)) { - mechanism = ZMQ_CURVE; - as_server = 0; - return 0; - } - } - else - // Deprecated, not symmetrical with zmq_getsockopt - if (optvallen_ == CURVE_KEYSIZE_Z85) { - char z85_key [CURVE_KEYSIZE_Z85 + 1]; - memcpy (z85_key, (char *) optval_, CURVE_KEYSIZE_Z85); - z85_key [CURVE_KEYSIZE_Z85] = 0; - if (zmq_z85_decode (curve_server_key, z85_key)) { - mechanism = ZMQ_CURVE; - as_server = 0; - return 0; - } - } break; #endif diff --git a/src/options.hpp b/src/options.hpp index e8efed61..bcf563ef 100644 --- a/src/options.hpp +++ b/src/options.hpp @@ -56,6 +56,8 @@ namespace zmq { options_t (); + int set_curve_key(uint8_t * destination, const void * optval_, size_t optvallen_); + int setsockopt (int option_, const void *optval_, size_t optvallen_); int getsockopt (int option_, void *optval_, size_t *optvallen_) const;