diff options
| author | Robin Krahl <me@robin-krahl.de> | 2018-05-25 00:15:40 +0200 | 
|---|---|---|
| committer | Robin Krahl <me@robin-krahl.de> | 2018-05-25 00:15:40 +0200 | 
| commit | 6e44c2b11bd1be9e080f1179283c49f9bb8955a5 (patch) | |
| tree | 2394d3c79376a34e2b6b65120b3c8c1ec3a6a92a | |
| parent | 391a276ba35216337b777c65fda62561a6e9383f (diff) | |
| download | libnitrokey-6e44c2b11bd1be9e080f1179283c49f9bb8955a5.tar.gz libnitrokey-6e44c2b11bd1be9e080f1179283c49f9bb8955a5.tar.bz2 | |
Expose device model in C API
The C++ API already provides access to the model of the connected device
in NitrokeyManager::get_connected_device_model().  This patch also
exposes this information in the C API by adding NK_get_device_model.  As
there might be no device connected, the function returns a boolean
indicating the connection status and writes the model of the connected
device to a pointer passed as an argument.
| -rw-r--r-- | NK_C_API.cc | 24 | ||||
| -rw-r--r-- | NK_C_API.h | 11 | ||||
| -rw-r--r-- | unittest/test_C_API.cpp | 19 | 
3 files changed, 53 insertions, 1 deletions
| diff --git a/NK_C_API.cc b/NK_C_API.cc index 8e005b8..56340ac 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -238,6 +238,30 @@ extern "C" {  	} +	NK_C_API bool NK_get_device_model(enum NK_device_model *out) { +		if (out == nullptr) { +			return false; +		} +		auto m = NitrokeyManager::instance(); +		try { +			auto model = m->get_connected_device_model(); +			switch (model) { +				case DeviceModel::PRO: +				    *out = NK_PRO; +				    return true; +				case DeviceModel::STORAGE: +				    *out = NK_STORAGE; +				    return true; +				default: +				    /* unknown device -- should not happen */ +				    return false; +			} +		} catch (const DeviceNotConnected& e) { +			return false; +		} +        } + +  	void clear_string(std::string &s) {  		std::fill(s.begin(), s.end(), ' ');  	} @@ -90,6 +90,17 @@ extern "C" {  	NK_C_API int NK_logout();  	/** +	 * Query the model of the connected device.  If the out argument is +         * NULL or if there is no connected device, this function returns +         * false.  Otherwise it returns true and sets the target of the out +	 * pointer to the model of the connected device. +	 * +	 * @param out a pointer to write the model to +	 * @return true if a device is connected and the out argument has been set +	 */ +	NK_C_API bool NK_get_device_model(enum NK_device_model *out); + +	/**  	 * Return the debug status string. Debug purposes.  	 * @return command processing error code  	 */ diff --git a/unittest/test_C_API.cpp b/unittest/test_C_API.cpp index acfadd2..f38d0b6 100644 --- a/unittest/test_C_API.cpp +++ b/unittest/test_C_API.cpp @@ -84,4 +84,21 @@ TEST_CASE("multiple devices with ID", "[BASIC]") {    }    free (string); -}
\ No newline at end of file +} + +TEST_CASE("Get device model", "[BASIC]") { +    auto success = NK_get_device_model(nullptr); +    REQUIRE(!success); + +    NK_logout(); +    NK_device_model model = static_cast<NK_device_model>(3); +    success = NK_get_device_model(&model); +    REQUIRE(!success); + +    auto result = NK_login_auto(); +    REQUIRE(result != 0); +    success = NK_get_device_model(&model); +    REQUIRE(success); +    REQUIRE((model == NK_PRO || model == NK_STORAGE)); +    NK_logout(); +} | 
