#include "iface.h"
#include "stg_client.h"
+#include "radlog.h"
#include <cstring>
namespace
{
+struct Response
+{
+ bool done;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
+ RESULT result;
+ bool status;
+
+ static bool callback(void* data, const RESULT& result, bool status)
+ {
+ Response& resp = *static_cast<Response*>(data);
+ pthread_mutex_lock(&resp.mutex);
+ resp.result = result;
+ resp.status = status;
+ resp.done = true;
+ pthread_cond_signal(&resp.cond);
+ pthread_mutex_unlock(&resp.mutex);
+ return true;
+ }
+} response;
+
STG_PAIR* toSTGPairs(const PAIRS& source)
{
STG_PAIR * pairs = new STG_PAIR[source.size() + 1];
bzero(pairs[pos].value, sizeof(STG_PAIR::value));
strncpy(pairs[pos].key, source[pos].first.c_str(), sizeof(STG_PAIR::key));
strncpy(pairs[pos].value, source[pos].second.c_str(), sizeof(STG_PAIR::value));
- ++pos;
}
bzero(pairs[source.size()].key, sizeof(STG_PAIR::key));
bzero(pairs[source.size()].value, sizeof(STG_PAIR::value));
{
STG_CLIENT* client = STG_CLIENT::get();
if (client == NULL) {
- // TODO: log "Not configured"
+ RadLog("Client is not configured.");
return emptyResult();
}
try {
- return toResult(client->request(type, toString(userName), toString(password), fromSTGPairs(pairs)));
+ if (!client->connected())
+ {
+ if (!STG_CLIENT::reconnect())
+ return emptyResult();
+ client = STG_CLIENT::get();
+ }
+ response.done = false;
+ client->request(type, toString(userName), toString(password), fromSTGPairs(pairs));
+ pthread_mutex_lock(&response.mutex);
+ while (!response.done)
+ pthread_cond_wait(&response.cond, &response.mutex);
+ pthread_mutex_unlock(&response.mutex);
+ if (!response.status)
+ return emptyResult();
+ return toResult(response.result);
} catch (const STG_CLIENT::Error& ex) {
- // TODO: log error
+ RadLog("Error: '%s'.", ex.what());
return emptyResult();
}
}
int stgInstantiateImpl(const char* address)
{
- if (STG_CLIENT::configure(toString(address)))
+ pthread_mutex_init(&response.mutex, NULL);
+ pthread_cond_init(&response.cond, NULL);
+ response.done = false;
+
+ if (STG_CLIENT::configure(toString(address), &Response::callback, &response))
return 1;
return 0;