mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 13:47:58 +03:00
290 lines
11 KiB
C
290 lines
11 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#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);
|
|
}
|