config_provider::m_methods is a list of pointers to method configurations now paving the road to config_provider detemplatization
This commit is contained in:
parent
e87c0af221
commit
780b738842
@ -86,8 +86,9 @@ namespace eapserial
|
|||||||
#include <eaptypes.h> // Must include after <Windows.h>
|
#include <eaptypes.h> // Must include after <Windows.h>
|
||||||
#include <tchar.h>
|
#include <tchar.h>
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
namespace eap
|
namespace eap
|
||||||
@ -326,12 +327,6 @@ namespace eap
|
|||||||
template <class _Tmeth>
|
template <class _Tmeth>
|
||||||
class config_provider : public config
|
class config_provider : public config
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
///
|
|
||||||
/// Provider method configuration type
|
|
||||||
///
|
|
||||||
typedef _Tmeth config_method_type;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
/// Constructs configuration
|
/// Constructs configuration
|
||||||
@ -359,9 +354,10 @@ namespace eap
|
|||||||
m_lbl_alt_credential(other.m_lbl_alt_credential),
|
m_lbl_alt_credential(other.m_lbl_alt_credential),
|
||||||
m_lbl_alt_identity(other.m_lbl_alt_identity),
|
m_lbl_alt_identity(other.m_lbl_alt_identity),
|
||||||
m_lbl_alt_password(other.m_lbl_alt_password),
|
m_lbl_alt_password(other.m_lbl_alt_password),
|
||||||
m_methods(other.m_methods),
|
|
||||||
config(other)
|
config(other)
|
||||||
{
|
{
|
||||||
|
for (std::list<std::unique_ptr<_Tmeth> >::const_iterator method = other.m_methods.cbegin(), method_end = other.m_methods.cend(); method != method_end; ++method)
|
||||||
|
m_methods.push_back(std::move(std::unique_ptr<_Tmeth>(*method ? (_Tmeth*)method->get()->clone() : nullptr)));
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@ -404,7 +400,10 @@ namespace eap
|
|||||||
m_lbl_alt_credential = other.m_lbl_alt_credential;
|
m_lbl_alt_credential = other.m_lbl_alt_credential;
|
||||||
m_lbl_alt_identity = other.m_lbl_alt_identity;
|
m_lbl_alt_identity = other.m_lbl_alt_identity;
|
||||||
m_lbl_alt_password = other.m_lbl_alt_password;
|
m_lbl_alt_password = other.m_lbl_alt_password;
|
||||||
m_methods = other.m_methods;
|
|
||||||
|
m_methods.clear();
|
||||||
|
for (std::list<std::unique_ptr<_Tmeth> >::const_iterator method = other.m_methods.cbegin(), method_end = other.m_methods.cend(); method != method_end; ++method)
|
||||||
|
m_methods.push_back(std::move(std::unique_ptr<_Tmeth>(*method ? (_Tmeth*)method->get()->clone() : nullptr)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@ -549,7 +548,7 @@ namespace eap
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::list<_Tmeth>::const_iterator method = m_methods.cbegin(), method_end = m_methods.cend(); method != method_end; ++method) {
|
for (std::list<std::unique_ptr<_Tmeth> >::const_iterator method = m_methods.cbegin(), method_end = m_methods.cend(); method != method_end; ++method) {
|
||||||
// <AuthenticationMethod>
|
// <AuthenticationMethod>
|
||||||
winstd::com_obj<IXMLDOMElement> pXmlElAuthenticationMethod;
|
winstd::com_obj<IXMLDOMElement> pXmlElAuthenticationMethod;
|
||||||
if ((dwResult = eapxml::create_element(pDoc, winstd::bstr(L"AuthenticationMethod"), bstrNamespace, &pXmlElAuthenticationMethod))) {
|
if ((dwResult = eapxml::create_element(pDoc, winstd::bstr(L"AuthenticationMethod"), bstrNamespace, &pXmlElAuthenticationMethod))) {
|
||||||
@ -558,7 +557,7 @@ namespace eap
|
|||||||
}
|
}
|
||||||
|
|
||||||
// <AuthenticationMethod>/...
|
// <AuthenticationMethod>/...
|
||||||
if (!method->save(pDoc, pXmlElAuthenticationMethod, ppEapError))
|
if (!method->get()->save(pDoc, pXmlElAuthenticationMethod, ppEapError))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (FAILED(hr = pXmlElAuthenticationMethods->appendChild(pXmlElAuthenticationMethod, NULL))) {
|
if (FAILED(hr = pXmlElAuthenticationMethods->appendChild(pXmlElAuthenticationMethod, NULL))) {
|
||||||
@ -662,19 +661,19 @@ namespace eap
|
|||||||
winstd::com_obj<IXMLDOMNode> pXmlElMethod;
|
winstd::com_obj<IXMLDOMNode> pXmlElMethod;
|
||||||
pXmlListMethods->get_item(i, &pXmlElMethod);
|
pXmlListMethods->get_item(i, &pXmlElMethod);
|
||||||
|
|
||||||
_Tmeth cfg(m_module);
|
std::unique_ptr<_Tmeth> cfg(new _Tmeth(m_module));
|
||||||
|
|
||||||
// Check EAP method type (<EAPMethod>).
|
// Check EAP method type (<EAPMethod>).
|
||||||
DWORD dwMethodID;
|
DWORD dwMethodID;
|
||||||
if (eapxml::get_element_value(pXmlElMethod, winstd::bstr(L"eap-metadata:EAPMethod"), &dwMethodID) == ERROR_SUCCESS) {
|
if (eapxml::get_element_value(pXmlElMethod, winstd::bstr(L"eap-metadata:EAPMethod"), &dwMethodID) == ERROR_SUCCESS) {
|
||||||
if ((type_t)dwMethodID != cfg.get_method_id()) {
|
if ((type_t)dwMethodID != cfg->get_method_id()) {
|
||||||
// Wrong type.
|
// Wrong type.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load configuration.
|
// Load configuration.
|
||||||
if (!cfg.load(pXmlElMethod, ppEapError))
|
if (!cfg->load(pXmlElMethod, ppEapError))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Add configuration to the list.
|
// Add configuration to the list.
|
||||||
@ -751,28 +750,33 @@ namespace eap
|
|||||||
eapserial::unpack(cursor, m_lbl_alt_password );
|
eapserial::unpack(cursor, m_lbl_alt_password );
|
||||||
|
|
||||||
std::list<_Tmeth>::size_type count;
|
std::list<_Tmeth>::size_type count;
|
||||||
|
bool is_nonnull;
|
||||||
eapserial::unpack(cursor, count);
|
eapserial::unpack(cursor, count);
|
||||||
m_methods.clear();
|
m_methods.clear();
|
||||||
for (std::list<_Tmeth>::size_type i = 0; i < count; i++) {
|
for (std::list<_Tmeth>::size_type i = 0; i < count; i++) {
|
||||||
_Tmeth el(m_module);
|
eapserial::unpack(cursor, is_nonnull);
|
||||||
el.unpack(cursor);
|
if (is_nonnull) {
|
||||||
m_methods.push_back(std::move(el));
|
std::unique_ptr<_Tmeth> el(new _Tmeth(m_module));
|
||||||
|
el->unpack(cursor);
|
||||||
|
m_methods.push_back(std::move(el));
|
||||||
|
} else
|
||||||
|
m_methods.push_back(nullptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool m_read_only; ///< Is profile read-only
|
bool m_read_only; ///< Is profile read-only
|
||||||
std::wstring m_id; ///< Profile ID
|
std::wstring m_id; ///< Profile ID
|
||||||
winstd::tstring m_name; ///< Provider name
|
winstd::tstring m_name; ///< Provider name
|
||||||
winstd::tstring m_help_email; ///< Helpdesk e-mail
|
winstd::tstring m_help_email; ///< Helpdesk e-mail
|
||||||
winstd::tstring m_help_web; ///< Helpdesk website URL
|
winstd::tstring m_help_web; ///< Helpdesk website URL
|
||||||
winstd::tstring m_help_phone; ///< Helpdesk phone
|
winstd::tstring m_help_phone; ///< Helpdesk phone
|
||||||
winstd::tstring m_lbl_alt_credential; ///< Alternative label for credential prompt
|
winstd::tstring m_lbl_alt_credential; ///< Alternative label for credential prompt
|
||||||
winstd::tstring m_lbl_alt_identity; ///< Alternative label for identity prompt
|
winstd::tstring m_lbl_alt_identity; ///< Alternative label for identity prompt
|
||||||
winstd::tstring m_lbl_alt_password; ///< Alternative label for password prompt
|
winstd::tstring m_lbl_alt_password; ///< Alternative label for password prompt
|
||||||
std::list<_Tmeth> m_methods; ///< List of method configurations
|
std::list<std::unique_ptr<_Tmeth> > m_methods; ///< List of method configurations
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <sal.h>
|
#include <sal.h>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -230,6 +231,33 @@ namespace eapserial
|
|||||||
///
|
///
|
||||||
template<class _Ty, class _Ax> inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ std::list<_Ty, _Ax> &val);
|
template<class _Ty, class _Ax> inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ std::list<_Ty, _Ax> &val);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Packs a std::unique_ptr
|
||||||
|
///
|
||||||
|
/// \param[inout] cursor Memory cursor
|
||||||
|
/// \param[in] val std::unique_ptr to pack
|
||||||
|
///
|
||||||
|
template<class _Ty, class _Dx> inline void pack(_Inout_ unsigned char *&cursor, _In_ const std::unique_ptr<_Ty, _Dx> &val);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Returns packed size of a std::unique_ptr
|
||||||
|
///
|
||||||
|
/// \param[in] val std::unique_ptr to pack
|
||||||
|
///
|
||||||
|
/// \returns Size of data when packed (in bytes)
|
||||||
|
///
|
||||||
|
template<class _Ty, class _Dx> inline size_t get_pk_size(const std::unique_ptr<_Ty, _Dx> &val);
|
||||||
|
|
||||||
|
/////
|
||||||
|
///// Unpacks a std::unique_ptr
|
||||||
|
/////
|
||||||
|
///// \note Not generally unpackable, since we do not know, how to create a new instance of unique_ptr.
|
||||||
|
/////
|
||||||
|
///// \param[inout] cursor Memory cursor
|
||||||
|
///// \param[out] val std::unique_ptr to unpack to
|
||||||
|
/////
|
||||||
|
//template<class _Ty, class _Dx> inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ std::unique_ptr<_Ty, _Dx> &val);
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Packs a certificate context
|
/// Packs a certificate context
|
||||||
///
|
///
|
||||||
@ -486,6 +514,28 @@ namespace eapserial
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class _Ty, class _Dx>
|
||||||
|
inline void pack(_Inout_ unsigned char *&cursor, _In_ const std::unique_ptr<_Ty, _Dx> &val)
|
||||||
|
{
|
||||||
|
if (val) {
|
||||||
|
pack(cursor, true);
|
||||||
|
pack(cursor, *val);
|
||||||
|
} else
|
||||||
|
pack(cursor, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class _Ty, class _Dx>
|
||||||
|
inline size_t get_pk_size(const std::unique_ptr<_Ty, _Dx> &val)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
val ?
|
||||||
|
get_pk_size(true) +
|
||||||
|
get_pk_size(*val) :
|
||||||
|
get_pk_size(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void pack(_Inout_ unsigned char *&cursor, _In_ const winstd::cert_context &val)
|
inline void pack(_Inout_ unsigned char *&cursor, _In_ const winstd::cert_context &val)
|
||||||
{
|
{
|
||||||
if (val) {
|
if (val) {
|
||||||
|
@ -116,13 +116,13 @@ public:
|
|||||||
|
|
||||||
for (std::list<_Tprov>::iterator provider = m_cfg.m_providers.begin(), provider_end = m_cfg.m_providers.end(); provider != provider_end; ++provider) {
|
for (std::list<_Tprov>::iterator provider = m_cfg.m_providers.begin(), provider_end = m_cfg.m_providers.end(); provider != provider_end; ++provider) {
|
||||||
bool is_single = provider->m_methods.size() == 1;
|
bool is_single = provider->m_methods.size() == 1;
|
||||||
std::list<_Tmeth>::size_type count = 0;
|
std::list<std::unique_ptr<_Tmeth> >::size_type count = 0;
|
||||||
std::list<_Tmeth>::iterator method = provider->m_methods.begin(), method_end = provider->m_methods.end();
|
std::list<std::unique_ptr<_Tmeth> >::iterator method = provider->m_methods.begin(), method_end = provider->m_methods.end();
|
||||||
for (; method != method_end; ++method, count++)
|
for (; method != method_end; ++method, count++)
|
||||||
m_providers->AddPage(
|
m_providers->AddPage(
|
||||||
new _wxT(
|
new _wxT(
|
||||||
*provider,
|
*provider,
|
||||||
*method,
|
*method->get(),
|
||||||
provider->m_id.c_str(),
|
provider->m_id.c_str(),
|
||||||
m_providers),
|
m_providers),
|
||||||
is_single ? provider->m_id : winstd::tstring_printf(_T("%s (%u)"), provider->m_id.c_str(), count));
|
is_single ? provider->m_id : winstd::tstring_printf(_T("%s (%u)"), provider->m_id.c_str(), count));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user