openmohaa/code/gamespy/GP/gpiKeys.c

197 lines
5.6 KiB
C
Raw Permalink Normal View History

2023-02-04 21:00:01 +01:00
#include "gpi.h"
void gpiStatusInfoKeyFree(void *element)
{
GPIKey *aKey = (GPIKey *)element;
freeclear(aKey->keyName);
freeclear(aKey->keyValue);
}
GPResult gpiStatusInfoKeysInit(GPConnection * connection)
{
GPIConnection * iconnection = (GPIConnection*)*connection;
iconnection->extendedInfoKeys = ArrayNew(sizeof(GPIKey), GPI_INITIAL_NUM_KEYS, gpiStatusInfoKeyFree);
if(!iconnection->extendedInfoKeys)
Error(connection, GP_MEMORY_ERROR, "Out of memory.");
return GP_NO_ERROR;
}
void gpiStatusInfoKeysDestroy(GPConnection * connection)
{
GPIConnection * iconnection = (GPIConnection*)*connection;
if (iconnection->extendedInfoKeys)
{
ArrayFree(iconnection->extendedInfoKeys);
iconnection->extendedInfoKeys = NULL;
}
}
int gpiStatusInfoKeyCompFunc(const void *elem1, const void *elem2)
{
GPIKey *key1 = (GPIKey *)elem1,
*key2 = (GPIKey *)elem2;
return strcmp(key1->keyName, key2->keyName);
}
GPResult gpiStatusInfoAddKey(GPConnection *connection, DArray keys, const char *theKeyName, const char *theKeyValue)
{
GPIKey aKey;
GS_ASSERT(keys);
GS_ASSERT(theKeyName);
GS_ASSERT(theKeyValue);
if (!theKeyName)
Error(connection, GP_PARAMETER_ERROR, "Invalid key name");
if (!theKeyValue)
Error(connection, GP_PARAMETER_ERROR, "Invalid key value");
aKey.keyName = goastrdup(theKeyName);
aKey.keyValue = goastrdup(theKeyValue);
ArrayInsertSorted(keys, &aKey, gpiStatusInfoKeyCompFunc);
return GP_NO_ERROR;
}
GPResult gpiStatusInfoDelKey(GPConnection *connection, DArray keys, const char *keyName)
{
GPIKey aKey;
int anIndex;
GS_ASSERT(keys);
GS_ASSERT(keyName);
if (!keyName)
Error(connection, GP_PARAMETER_ERROR, "Invalid key name");
aKey.keyName = goastrdup(keyName);
anIndex = ArraySearch(keys, &aKey, gpiStatusInfoKeyCompFunc, 0, 1);
if (anIndex != NOT_FOUND)
{
ArrayDeleteAt(keys, anIndex);
}
freeclear(aKey.keyName);
return GP_NO_ERROR;
}
GPResult gpiStatusInfoSetKey(GPConnection *connection, DArray keys, const char *keyName, const char *newKeyValue)
{
GPIKey aKey;
int anIndex;
GS_ASSERT(keys);
GS_ASSERT(keyName);
if (!keyName)
Error(connection, GP_PARAMETER_ERROR, "Invalid key name");
aKey.keyName = goastrdup(keyName);
anIndex = ArraySearch(keys, &aKey, gpiStatusInfoKeyCompFunc, 0, 1);
if (anIndex != NOT_FOUND)
{
GPIKey *aKeyFound = (GPIKey *)ArrayNth(keys, anIndex);
gsifree(aKeyFound->keyValue);
aKeyFound->keyValue = goastrdup(newKeyValue);
}
freeclear(aKey.keyName);
return GP_NO_ERROR;
}
GPResult gpiStatusInfoGetKey(GPConnection *connection, DArray keys, const char *keyName, char **keyValue)
{
GPIKey aKey;
int anIndex;
GS_ASSERT(keys);
GS_ASSERT(keyName);
if (!keyName)
Error(connection, GP_PARAMETER_ERROR, "Invalid key name");
aKey.keyName = goastrdup(keyName);
anIndex = ArraySearch(keys, &aKey, gpiStatusInfoKeyCompFunc, 0, 1);
if (anIndex != NOT_FOUND)
{
GPIKey *aKeyFound = (GPIKey *)ArrayNth(keys, anIndex);
*keyValue = goastrdup(aKeyFound->keyValue);
}
freeclear(aKey.keyName);
return GP_NO_ERROR;
}
GPResult gpiStatusInfoCheckKey(GPConnection *connection, DArray keys, const char *keyName, char **keyValue)
{
GPIKey aKey;
int anIndex;
GS_ASSERT(keys);
GS_ASSERT(keyName);
if (!keyName)
Error(connection, GP_PARAMETER_ERROR, "Invalid key name");
aKey.keyName = goastrdup(keyName);
anIndex = ArraySearch(keys, &aKey, gpiStatusInfoKeyCompFunc, 0, 1);
if (anIndex != NOT_FOUND)
{
GPIKey *aKeyFound = (GPIKey *)ArrayNth(keys, anIndex);
*keyValue = aKeyFound->keyValue;
}
freeclear(aKey.keyName);
return GP_NO_ERROR;
}
GPResult gpiSaveKeysToBuffer(GPConnection *connection, char **buffer)
{
GPIConnection *iconnection = (GPIConnection *)*connection;
char *tempPoint;
int sizeKeys = 0, i, bytesWritten;
int base64KeyNameLen, base64KeyValLen;
int aLength = ArrayLength(iconnection->extendedInfoKeys);
char keysHeader[64];
sprintf(keysHeader, "\\keys\\%d", aLength);
// figure out the size of the buffer to allocate
// by adding up the key value pairs with backslashes
for (i = 0; i < aLength; i++)
{
GPIKey *aKey = (GPIKey *)ArrayNth(iconnection->extendedInfoKeys, i);
if (strlen(aKey->keyName) % 3 != 0)
base64KeyNameLen = (int)(strlen(aKey->keyName) * 4 / 3) + (int)(4 - (strlen(aKey->keyName) % 3));
else
base64KeyNameLen = (int)(strlen(aKey->keyName) * 4 / 3);
if (strlen(aKey->keyValue) % 3 != 0)
base64KeyValLen= (int)(strlen(aKey->keyValue) * 4 / 3) + (int)(4 - (strlen(aKey->keyValue) % 3));
else
base64KeyValLen = (int)(strlen(aKey->keyValue) * 4 / 3);
sizeKeys += 1 + base64KeyNameLen + 1 + base64KeyValLen;
}
*buffer = (char *)gsimalloc(strlen(keysHeader) + (size_t)sizeKeys + 1);
if (*buffer == NULL)
{
gsDebugFormat(GSIDebugCat_GP, GSIDebugType_Memory, GSIDebugLevel_HotError, "gpiSaveKeysToBuffer: buffer Out of memory.");
Error(connection, GP_MEMORY_ERROR, "Out of memory.");
}
bytesWritten = sprintf(*buffer, keysHeader);
tempPoint = *buffer + bytesWritten;
for (i = 0; i < aLength; i++)
{
GPIKey *aKey = (GPIKey *)ArrayNth(iconnection->extendedInfoKeys, i);
strcat(tempPoint, "\\");
tempPoint++;
B64Encode(aKey->keyName, tempPoint, (int)strlen(aKey->keyName), 2);
if (strlen(aKey->keyName) % 3 != 0)
tempPoint+= (int)(strlen(aKey->keyName) * 4 / 3) + (4 - (strlen(aKey->keyName) % 3));
else
tempPoint+= (int)(strlen(aKey->keyName) * 4 / 3);
strcat(tempPoint, "\\");
tempPoint++;
B64Encode(aKey->keyValue, tempPoint, (int)strlen(aKey->keyValue), 2);
if (strlen(aKey->keyValue) % 3 != 0)
tempPoint+= (int)(strlen(aKey->keyValue) * 4 / 3) + (4 - (strlen(aKey->keyValue) % 3));
else
tempPoint+= (int)(strlen(aKey->keyValue) * 4 / 3);
}
return GP_NO_ERROR;
}