/**
 * Opens the Door! :)
 *
 * Parameters:
 * >szDoor
 * Path to lock device for the door.
 *
 * Returns:
 * N/A.
 */
void perco_exchange::openDoor(_In_ STLADD string_unique_ptr_t&& szDoor)
{
    ATL::CComPtr<PERCo_S20_SDK::IExchangeMain> percoXchg;
    if (SUCCEEDED(percoXchg.CoCreateInstance(__uuidof(PERCo_S20_SDK::CoExchangeMain))))
    {
        if (SUCCEEDED(percoXchg->SetConnect(PERCO_HOST, PERCO_PORT, PERCO_LOGIN, PERCO_PWD)))
        {
            BSTR szDBVersion;
            BSTR szSDKVersion;
            if (!percoXchg->CheckVersion(&szDBVersion, &szSDKVersion))
            {
                ATL::CComPtr<IXMLDOMDocument2> request = getSendCommandsRequest(std::move(szDoor));
                AtlTrace2(ATL::atlTraceGeneral, 0, "Sending the 'sendcommands' request.\r\n");
                if (request && SUCCEEDED(percoXchg->ExecuteCommand(request)))
                {
                    AtlTrace2(ATL::atlTraceGeneral, 0, "PERCo has responded to the 'sendcommands' request.\r\n");
                }
            }
            percoXchg->DisConnect();
        }
    }
    else
    {
        AtlTrace2(ATL::atlTraceCOM, 0, "'PERCo_S20_SDK::IExchangeMain' ain't registered.\r\n");
    }
}
/**
 * Gets identifiers map.
 *
 * Parameters:
 * None.
 *
 * Returns:
 * Identifiers map.
 */
perco_exchange::ids_t perco_exchange::getIdentifiers()
{
    ids_t ids;
    logger::const_ptr_t pLogger = logger::getInstance();
    ATL::CComPtr<PERCo_S20_SDK::IExchangeMain> percoXchg;
    if (SUCCEEDED(percoXchg.CoCreateInstance(__uuidof(PERCo_S20_SDK::CoExchangeMain))))
    {
        if (SUCCEEDED(percoXchg->SetConnect(PERCO_HOST, PERCO_PORT, PERCO_LOGIN, PERCO_PWD)))
        {
            BSTR szDBVersion;
            BSTR szSDKVersion;
            if (!percoXchg->CheckVersion(&szDBVersion, &szSDKVersion))
            {
                ATL::CComPtr<IXMLDOMDocument2> request = getStaffRequest();
#pragma region log
                pLogger->logNotify(logger::CategoryGeneral, IDS_EVENT_STAFF_REQUEST_SEND);
                AtlTrace2(ATL::atlTraceGeneral, 0, "Sending the 'staff' request.\r\n");
#pragma endregion log the message
                if (request && SUCCEEDED(percoXchg->GetData(request)))
                {
#pragma region log
                    pLogger->logNotify(logger::CategoryGeneral, IDS_EVENT_STAFF_REQUEST_HANDLED);
                    AtlTrace2(ATL::atlTraceGeneral, 0, "PERCo has responded to the 'staff' request.\r\n");
#pragma endregion log the message
                    ids = parseStaffResponse(request);
#pragma region log
                    CStringUtil::const_ptr_t pStringUtil = CStringUtil::getInstance();
                    LPTSTR pszFormat;
                    size_t nLength;
                    if (CStringUtil::ResourceSuccess ==
                        pStringUtil->loadString(IDS_EVENT_T_RESPOND_SIZE, &pszFormat, &nLength))
                    {
                        const STLADD regex_type regex(TEXT("(?:[^%]*)(?:%[[:digit:]]{0,2}u){1,1}(?:[^%]*)"));
                        if (std::regex_match(pszFormat, pszFormat + nLength, regex))
                        {
                            nLength += 15;
                            CMemoryManager::pointer_t pMemoryManager = CMemoryManager::getInstance();
                            LPTSTR pszText = pMemoryManager->mAllocChars<LPTSTR>(nLength);
                            if (pszText)
                            {
                                nLength = _stprintf_s(pszText, nLength, pszFormat, ids.size());
                                pLogger->log(logger::CategoryGeneral, logger::SeverityNotify, pszText, nLength);
                                pMemoryManager->free(pszText);
                            }
                        }
                        pStringUtil->freeString(pszFormat);
                    }
                    AtlTrace2(ATL::atlTraceGeneral, 0, "The respond parsed (%u entries handled).\r\n", ids.size());
#pragma endregion log the message
                }
            }
            percoXchg->DisConnect();
        }
    }
    else
    {
#pragma region log
        pLogger->logError(logger::CategoryCOM, IDS_EVENT_IEXCHANGEMAIN_AINT_REGISTERED);
        AtlTrace2(ATL::atlTraceCOM, 0, "'PERCo_S20_SDK::IExchangeMain' ain't registered.\r\n");
#pragma endregion log the message
    }
    return ids;
}