3 #include "stg_client.h"
 
  16     pthread_mutex_t mutex;
 
  21     static bool callback(void* data, const RESULT& result, bool status)
 
  23         Response& resp = *static_cast<Response*>(data);
 
  24         pthread_mutex_lock(&resp.mutex);
 
  28         pthread_cond_signal(&resp.cond);
 
  29         pthread_mutex_unlock(&resp.mutex);
 
  34 STG_PAIR* toSTGPairs(const PAIRS& source)
 
  36     STG_PAIR * pairs = new STG_PAIR[source.size() + 1];
 
  37     for (size_t pos = 0; pos < source.size(); ++pos) {
 
  38         bzero(pairs[pos].key, sizeof(STG_PAIR::key));
 
  39         bzero(pairs[pos].value, sizeof(STG_PAIR::value));
 
  40         strncpy(pairs[pos].key, source[pos].first.c_str(), sizeof(STG_PAIR::key));
 
  41         strncpy(pairs[pos].value, source[pos].second.c_str(), sizeof(STG_PAIR::value));
 
  43     bzero(pairs[source.size()].key, sizeof(STG_PAIR::key));
 
  44     bzero(pairs[source.size()].value, sizeof(STG_PAIR::value));
 
  49 PAIRS fromSTGPairs(const STG_PAIR* pairs)
 
  51     const STG_PAIR* pair = pairs;
 
  54     while (!emptyPair(pair)) {
 
  55         res.push_back(std::pair<std::string, std::string>(pair->key, pair->value));
 
  62 STG_RESULT toResult(const RESULT& source)
 
  65     result.modify = toSTGPairs(source.modify);
 
  66     result.reply = toSTGPairs(source.reply);
 
  70 STG_RESULT emptyResult()
 
  72     STG_RESULT result = {NULL, NULL};
 
  76 std::string toString(const char* value)
 
  84 STG_RESULT stgRequest(STG_CLIENT::TYPE type, const char* userName, const char* password, const STG_PAIR* pairs)
 
  86     STG_CLIENT* client = STG_CLIENT::get();
 
  88         RadLog("Client is not configured.");
 
  92         client->request(type, toString(userName), toString(password), fromSTGPairs(pairs));
 
  93         pthread_mutex_lock(&response.mutex);
 
  94         while (!response.done)
 
  95             pthread_cond_wait(&response.cond, &response.mutex);
 
  96         pthread_mutex_unlock(&response.mutex);
 
  99         return toResult(response.result);
 
 100     } catch (const STG_CLIENT::Error& ex) {
 
 101         RadLog("Error: '%s'.", ex.what());
 
 102         return emptyResult();
 
 108 int stgInstantiateImpl(const char* address)
 
 110     pthread_mutex_init(&response.mutex, NULL);
 
 111     pthread_cond_init(&response.cond, NULL);
 
 112     response.done = false;
 
 114     if (STG_CLIENT::configure(toString(address), &Response::callback, &response))
 
 120 STG_RESULT stgAuthorizeImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 
 122     return stgRequest(STG_CLIENT::AUTHORIZE, userName, password, pairs);
 
 125 STG_RESULT stgAuthenticateImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 
 127     return stgRequest(STG_CLIENT::AUTHENTICATE, userName, password, pairs);
 
 130 STG_RESULT stgPostAuthImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 
 132     return stgRequest(STG_CLIENT::POST_AUTH, userName, password, pairs);
 
 135 STG_RESULT stgPreAcctImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 
 137     return stgRequest(STG_CLIENT::PRE_ACCT, userName, password, pairs);
 
 140 STG_RESULT stgAccountingImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 
 142     return stgRequest(STG_CLIENT::ACCOUNT, userName, password, pairs);