}
};
-template <typename A, typename B>
-void cb_worker(std::shared_ptr<GenericClientRequest> request, A &callbacks, B cred)
+template <typename Request>
+void cb_worker(std::shared_ptr<Request> request, const typename Request::Callbacks &callbacks)
{
static constexpr const char *REQUEST_KIND_PREFIX =
- std::is_same_v<B, wauthn_pubkey_credential_attestation_s*> ? "MC: " : "GA: ";
+ std::is_same_v<typename Request::Callbacks, wauthn_mc_callbacks_s> ? "MC: " : "GA: ";
int ret = try_catch([&]() -> int {
- if (callbacks->qrcode_callback == nullptr)
+ typename Request::PubKeyCred *cred = nullptr;
+ if (callbacks.qrcode_callback == nullptr)
LogDebug(REQUEST_KIND_PREFIX << "There is no qrcode_callback");
- else{ //callbacks->qrcode_callback != nullptr
+ else{ //callbacks.qrcode_callback != nullptr
std::string qr_code;
if (request->Recv(qr_code).Failed())
LogError(REQUEST_KIND_PREFIX << "Error on receive qrcode");
LogDebug(REQUEST_KIND_PREFIX << "Received qr_contents: " << qr_code);
- callbacks->qrcode_callback(qr_code.c_str(), callbacks->user_data);
+ callbacks.qrcode_callback(qr_code.c_str(), callbacks.user_data);
}
request->Recv(&cred);
- callbacks->response_callback(cred, wauthn_error_e(request->GetStatus()),
- callbacks->user_data);
+ callbacks.response_callback(cred, wauthn_error_e(request->GetStatus()),
+ callbacks.user_data);
if(request->Failed())
{
LogError(REQUEST_KIND_PREFIX << "Error on receive response: " << request->GetStatus());
while (request->Recv(&linked_data).Incompleted())
{
LogLinkedDevice(REQUEST_KIND_PREFIX, "[linked_data_callback]", linked_data);
- callbacks->linked_data_callback(linked_data, wauthn_error_e(request->GetStatus()),
- callbacks->user_data);
+ callbacks.linked_data_callback(linked_data, wauthn_error_e(request->GetStatus()),
+ callbacks.user_data);
LogDebug(REQUEST_KIND_PREFIX << "More update linked_data can be received. Waiting to recv()");
}
LogLinkedDevice(REQUEST_KIND_PREFIX, "[linked_data_callback]", linked_data);
LogDebug(REQUEST_KIND_PREFIX << "There is no more updated linked_data");
- callbacks->linked_data_callback(linked_data, wauthn_error_e(request->GetStatus()),
- callbacks->user_data);
+ callbacks.linked_data_callback(linked_data, wauthn_error_e(request->GetStatus()),
+ callbacks.user_data);
return WAUTHN_ERROR_NONE;
});
if (ret != WAUTHN_ERROR_NONE)
return request->GetStatus();
LogDebug("Response: " << wauthn_error_to_string(request->GetStatus()));
- typename T::PubKeyCred *cred = nullptr;
- std::thread worker([request, callbacks, cred]{cb_worker(std::move(request), callbacks, cred);});
+ std::thread worker([request = std::move(request), callbacks = *callbacks] {
+ cb_worker(std::move(request), callbacks);
+ });
worker.detach();
return WAUTHN_ERROR_NONE;
});