]> git.stg.codes - stg.git/blobdiff - projects/rlm_stg/iface.cpp
Some fixes in C-C++ bridge in rlm_stg.
[stg.git] / projects / rlm_stg / iface.cpp
index a74f32594136bc65f37084535e91e5887b680721..40a96f729490f75b0bdaaa9c1ddf748e78ab57c6 100644 (file)
 #include "iface.h"
 
-#include "thriftclient.h"
+#include "stg_client.h"
 
-int stgInstantiateImpl(const char * server, uint16_t port, const char * password)
+namespace
 {
-    if (STG_CLIENT_ST::Get().Configure(server, port, password))
+
+STG_PAIR* toPairs(const PAIRS& source)
+{
+    STG_PAIR * pairs = new STG_PAIR[source.size() + 1];
+    for (size_t pos = 0; pos < source.size(); ++pos) {
+        bzero(pairs[pos].key, sizeof(STG_PAIR::key));
+        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[sources.size()].key, sizeof(STG_PAIR::key));
+    bzero(pairs[sources.size()].value, sizeof(STG_PAIR::value));
+
+    return pairs;
+}
+
+}
+
+int stgInstantiateImpl(const char* server, uint16_t port, const char* password)
+{
+    if (STG_CLIENT::configure(server, port, password))
         return 1;
 
     return 0;
 }
 
-const STG_PAIR * stgAuthorizeImpl(const char * userName, const char * serviceType)
+const STG_PAIR* stgAuthorizeImpl(const char* userName, const char* serviceType)
 {
-    return STG_CLIENT_ST::Get().Authorize(userName, serviceType);
+    STG_CLIENT* client = STG_CLIENT::get();
+    if (client == NULL) {
+        // TODO: log "Not configured"
+        return NULL;
+    }
+    return toPairs(client->authorize(userName, serviceType));
 }
 
-const STG_PAIR * stgAuthenticateImpl(const char * userName, const char * serviceType)
+const STG_PAIR* stgAuthenticateImpl(const char* userName, const char* serviceType)
 {
-    return STG_CLIENT_ST::Get().Authenticate(userName, serviceType);
+    STG_CLIENT* client = STG_CLIENT::get();
+    if (client == NULL) {
+        // TODO: log "Not configured"
+        return NULL;
+    }
+    return toPairs(client->authenticate(userName, serviceType));
 }
 
-const STG_PAIR * stgPostAuthImpl(const char * userName, const char * serviceType)
+const STG_PAIR* stgPostAuthImpl(const char* userName, const char* serviceType)
 {
-    return STG_CLIENT_ST::Get().PostAuth(userName, serviceType);
+    STG_CLIENT* client = STG_CLIENT::get();
+    if (client == NULL) {
+        // TODO: log "Not configured"
+        return NULL;
+    }
+    return toPairs(client->postAuth(userName, serviceType));
 }
 
-/*const STG_PAIR * stgPreAcctImpl(const char * userName, const char * serviceType)
+const STG_PAIR* stgPreAcctImpl(const char* userName, const char* serviceType)
 {
-    return STG_CLIENT_ST::Get().PreAcct(userName, serviceType);
-}*/
+    STG_CLIENT* client = STG_CLIENT::get();
+    if (client == NULL) {
+        // TODO: log "Not configured"
+        return NULL;
+    }
+    return toPairs(client->preAcct(userName, serviceType));
+}
+
+const STG_PAIR* stgAccountingImpl(const char* userName, const char* serviceType, const char* statusType, const char* sessionId)
+{
+    STG_CLIENT* client = STG_CLIENT::get();
+    if (client == NULL) {
+        // TODO: log "Not configured"
+        return NULL;
+    }
+    return toPairs(client->account(userName, serviceType, statusType, sessionId));
+}
+
+int countValuePairs(const VALUE_PAIR* pairs)
+{
+    unsigned count = 0;
+    while (pairs != NULL) {
+        ++count;
+        pairs = pairs->next;
+    }
+    return count;
+}
 
-const STG_PAIR * stgAccountingImpl(const char * userName, const char * serviceType, const char * statusType, const char * sessionId)
+STG_PAIR* fromValuePairs(const VALUE_PAIR* pairs)
 {
-    return STG_CLIENT_ST::Get().Account(userName, serviceType, statusType, sessionId);
+    unsigned size = countValuePairs(pairs);
+    STG_PAIR* res = new STG_PAIR[size + 1];
+    size_t pos = 0;
+    while (pairs != NULL) {
+        bzero(res[pos].key, sizeof(STG_PAIR::key));
+        bzero(res[pos].value, sizeof(STG_PAIR::value));
+        strncpy(res[pos].key, pairs->name, sizeof(STG_PAIR::key));
+        strncpy(res[pos].value, pairs->data.strvalue, sizeof(STG_PAIR::value));
+        ++pos;
+        pairs = pairs->next;
+    }
+    bzero(res[pos].key, sizeof(STG_PAIR::key));
+    bzero(res[pos].value, sizeof(STG_PAIR::value));
+    return res;
 }
 
-void deletePairs(const STG_PAIR * pairs)
+void deletePairs(const STG_PAIR* pairs)
 {
     delete[] pairs;
 }