openmohaa/code/gamespy/sake/sakeRequestModify.c

291 lines
11 KiB
C
Raw Permalink Normal View History

2023-02-04 21:00:01 +01:00
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#include "sakeRequestInternal.h"
#include "sakeRequest.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
static SAKEStartRequestResult SAKE_CALL sakeiValidateRequestFields(SAKEField *fields, int numFields)
{
int i;
for(i = 0 ; i < numFields ; i++)
{
if(!fields[i].mName || !fields[i].mName[0])
return SAKEStartRequestResult_BAD_FIELD_NAME;
if((fields[i].mType >= SAKEFieldType_NUM_FIELD_TYPES))
return SAKEStartRequestResult_BAD_FIELD_TYPE;
if(fields[i].mType == SAKEFieldType_ASCII_STRING)
{
if(!fields[i].mValue.mAsciiString)
return SAKEStartRequestResult_BAD_FIELD_VALUE;
}
if(fields[i].mType == SAKEFieldType_UNICODE_STRING)
{
if(!fields[i].mValue.mUnicodeString)
return SAKEStartRequestResult_BAD_FIELD_VALUE;
}
if(fields[i].mType == SAKEFieldType_BINARY_DATA)
{
if(fields[i].mValue.mBinaryData.mLength < 0)
return SAKEStartRequestResult_BAD_FIELD_VALUE;
if(!fields[i].mValue.mBinaryData.mValue && (fields[i].mValue.mBinaryData.mLength > 0))
return SAKEStartRequestResult_BAD_FIELD_VALUE;
}
}
return SAKEStartRequestResult_SUCCESS;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
static void SAKE_CALL sakeiFillSoapRequestFieldValues(SAKERequest request, SAKEField *fields, int numFields)
{
int i;
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "values");
for(i = 0 ; i < numFields ; i++)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "RecordField");
gsXmlWriteStringElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "name", fields[i].mName);
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value");
// fill-in the type-specific value struct based on the type
if(fields[i].mType == SAKEFieldType_BYTE)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "byteValue");
gsXmlWriteIntElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", fields[i].mValue.mByte);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "byteValue");
}
else if(fields[i].mType == SAKEFieldType_SHORT)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "shortValue");
gsXmlWriteIntElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", fields[i].mValue.mShort);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "shortValue");
}
else if(fields[i].mType == SAKEFieldType_INT)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "intValue");
gsXmlWriteIntElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", (gsi_u32)fields[i].mValue.mInt);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "intValue");
}
else if (fields[i].mType == SAKEFieldType_INT64)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "int64Value");
gsXmlWriteInt64Element(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", fields[i].mValue.mInt64);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "int64Value");
}
else if(fields[i].mType == SAKEFieldType_FLOAT)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "floatValue");
gsXmlWriteFloatElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", fields[i].mValue.mFloat);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "floatValue");
}
else if(fields[i].mType == SAKEFieldType_ASCII_STRING)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "asciiStringValue");
gsXmlWriteStringElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", fields[i].mValue.mAsciiString);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "asciiStringValue");
}
else if(fields[i].mType == SAKEFieldType_UNICODE_STRING)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "unicodeStringValue");
gsXmlWriteUnicodeStringElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", fields[i].mValue.mUnicodeString);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "unicodeStringValue");
}
else if(fields[i].mType == SAKEFieldType_BOOLEAN)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "booleanValue");
gsXmlWriteIntElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", (gsi_u32)(gsi_is_false(fields[i].mValue.mBoolean)?0:1));
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "booleanValue");
}
else if(fields[i].mType == SAKEFieldType_DATE_AND_TIME)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "dateAndTimeValue");
gsXmlWriteDateTimeElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value", fields[i].mValue.mDateAndTime);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "dateAndTimeValue");
}
else if(fields[i].mType == SAKEFieldType_BINARY_DATA)
{
gsXmlWriteOpenTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "binaryDataValue");
gsXmlWriteBase64BinaryElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value",
fields[i].mValue.mBinaryData.mValue, fields[i].mValue.mBinaryData.mLength);
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "binaryDataValue");
}
else
{
// a type isn't being handled
GS_FAIL_STR("Unhandled field type");
}
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "value");
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "RecordField");
}
gsXmlWriteCloseTag(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "values");
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Create Record
static SAKEStartRequestResult SAKE_CALL sakeiCreateRecordValidateInput(SAKERequest request)
{
SAKECreateRecordInput *input = (SAKECreateRecordInput *)request->mInput;
// check the tableid
if(!input->mTableId)
return SAKEStartRequestResult_BAD_TABLEID;
// check the num fields
if(input->mNumFields < 0)
return SAKEStartRequestResult_BAD_NUM_FIELDS;
// check for NULL fields
if(!input->mFields && (input->mNumFields > 0))
return SAKEStartRequestResult_BAD_FIELDS;
// check the fields
return sakeiValidateRequestFields(input->mFields, input->mNumFields);
}
static SAKEStartRequestResult SAKE_CALL sakeiCreateRecordFillSoapRequest(SAKERequest request)
{
SAKECreateRecordInput *input = (SAKECreateRecordInput *)request->mInput;
// write the table id
gsXmlWriteStringElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "tableid", input->mTableId);
// fill in the field values
sakeiFillSoapRequestFieldValues(request, input->mFields, input->mNumFields);
return SAKEStartRequestResult_SUCCESS;
}
static SAKERequestResult sakeiCreateRecordProcessSoapResponse(SAKERequest request)
{
SAKECreateRecordOutput *output = (SAKECreateRecordOutput *)request->mOutput;
if(gsi_is_false(gsXmlReadChildAsInt(request->mSoapResponse, "recordid", &output->mRecordId)))
{
return SAKERequestResult_MALFORMED_RESPONSE;
}
return SAKERequestResult_SUCCESS;
}
SAKEStartRequestResult SAKE_CALL sakeiStartCreateRecordRequest(SAKERequest request)
{
static SAKEIRequestInfo info =
{
sizeof(SAKECreateRecordOutput),
SAKEI_FUNC_NAME_STRINGS("CreateRecord"),
sakeiCreateRecordValidateInput,
sakeiCreateRecordFillSoapRequest,
sakeiCreateRecordProcessSoapResponse
};
return sakeiStartRequest(request, &info);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Update Record
static SAKEStartRequestResult SAKE_CALL sakeiUpdateRecordValidateInput(SAKERequest request)
{
SAKEUpdateRecordInput *input = (SAKEUpdateRecordInput *)request->mInput;
// check the tableid
if(!input->mTableId)
return SAKEStartRequestResult_BAD_TABLEID;
// check the num fields
if(input->mNumFields <= 0)
return SAKEStartRequestResult_BAD_NUM_FIELDS;
// check for NULL fields
if(!input->mFields)
return SAKEStartRequestResult_BAD_FIELDS;
// check the fields
return sakeiValidateRequestFields(input->mFields, input->mNumFields);
}
static SAKEStartRequestResult SAKE_CALL sakeiUpdateRecordFillSoapRequest(SAKERequest request)
{
SAKEUpdateRecordInput *input = (SAKEUpdateRecordInput *)request->mInput;
// write the table id
gsXmlWriteStringElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "tableid", input->mTableId);
// write the recordid
gsXmlWriteIntElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "recordid", (gsi_u32)input->mRecordId);
// fill in the field values
sakeiFillSoapRequestFieldValues(request, input->mFields, input->mNumFields);
return SAKEStartRequestResult_SUCCESS;
}
SAKEStartRequestResult SAKE_CALL sakeiStartUpdateRecordRequest(SAKERequest request)
{
static SAKEIRequestInfo info =
{
0,
SAKEI_FUNC_NAME_STRINGS("UpdateRecord"),
sakeiUpdateRecordValidateInput,
sakeiUpdateRecordFillSoapRequest,
NULL
};
return sakeiStartRequest(request, &info);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Delete Record
static SAKEStartRequestResult SAKE_CALL sakeiDeleteRecordValidateInput(SAKERequest request)
{
SAKEDeleteRecordInput *input = (SAKEDeleteRecordInput *)request->mInput;
// check the tableid
if(!input->mTableId)
return SAKEStartRequestResult_BAD_TABLEID;
return SAKEStartRequestResult_SUCCESS;
}
static SAKEStartRequestResult SAKE_CALL sakeiDeleteRecordFillSoapRequest(SAKERequest request)
{
SAKEDeleteRecordInput *input = (SAKEDeleteRecordInput *)request->mInput;
// write the table id
gsXmlWriteStringElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "tableid", input->mTableId);
// write the recordid
gsXmlWriteIntElement(request->mSoapRequest, GSI_SAKE_SERVICE_NAMESPACE, "recordid", (gsi_u32)input->mRecordId);
return SAKEStartRequestResult_SUCCESS;
}
SAKEStartRequestResult SAKE_CALL sakeiStartDeleteRecordRequest(SAKERequest request)
{
static SAKEIRequestInfo info =
{
0,
SAKEI_FUNC_NAME_STRINGS("DeleteRecord"),
sakeiDeleteRecordValidateInput,
sakeiDeleteRecordFillSoapRequest,
NULL
};
return sakeiStartRequest(request, &info);
}