diff -r 7fdc9a71d314 -r 8ad140f3dd41 hti/PC_Tools/HTIGateway/ServicePlugins/HtiStif/HtiStif.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hti/PC_Tools/HTIGateway/ServicePlugins/HtiStif/HtiStif.cpp Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,1047 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +*/ +#include "HtiStifH.h" +#include "HtiPlugin.h" +#include "HtiSoapHandlerInterface.h" +#include "../../htigateway/inc/DllModule.h" + + +#include +#include + + +//********************************************************************************** +// CONSTANTS +// +//********************************************************************************** + +// commands +const BYTE CMD_STIF_OPEN = 0x01; +const BYTE CMD_STIF_CLOSE = 0x02; +const BYTE CMD_STIF_LOAD_MODULE = 0x03; +const BYTE CMD_STIF_UNLOAD_MODULE = 0x04; +const BYTE CMD_STIF_LIST_CASES = 0x05; +const BYTE CMD_STIF_START_CASE = 0x06; +const BYTE CMD_STIF_CANCEL_CASE = 0x07; +const BYTE CMD_STIF_PAUSE_CASE = 0x08; +const BYTE CMD_STIF_RESUME_CASE = 0x09; +const BYTE CMD_STIF_ADD_CASE_FILE = 0x0A; +const BYTE CMD_STIF_REMOVE_CASE_FILE = 0x0B; +const BYTE CMD_STIF_CASE_MESSAGE = 0x0C; +const BYTE CMD_STIF_SET_DEVICEID = 0x0D; +const BYTE CMD_STIF_TEST_COMPLETED = 0x0E; +const BYTE CMD_STIF_ATS_MESSAGE = 0x0F; +const BYTE CMD_STIF_SET_ATTRIBUTE = 0x10; + +// timeouts +const int TIMEOUT_10_SECONDS = 10000; + +// soap-action for this plugin +const char soapAction[] = "HtiStif"; + +// error codes for handle_received_message() +#define HTI_RECV_ASYNC_CALL_SERVICED 1 +#define HTI_RECV_OK 0 +#define HTI_RECV_GEN_ERROR -1 +#define HTI_RECV_ERROR_MESSAGE -2 +#define HTI_RECV_TIMEOUT -3 +#define HTI_RECV_ASYNC_CALL_SERVICE_ERROR -4 +#define HTI_RECV_ROUGUE_MESSAGE -5 +#define HTI_RECV_UNKOWN_MESSAGE -6 + +//********************************************************************************** +// FORWARD DECLARATIONS +// +//********************************************************************************** + +class HtiStifMsg; +class HtiStifClients; +class HtiStifSenderDll; +//class HtiStifResults + +//int GetParameters(char* in, int inLen, char** parameters, int &size); +int handle_received_message(HtiSoapHandlerInterface* handler, BOOL isSoapCallActive); +void SetSoapFaultFromReceivedHtiError(struct soap *soap, BYTE *receivedMsgBody, int receivedMsgBodyLen); + + +//********************************************************************************** +// GLOBAL VARIABLES +// +//********************************************************************************** +//HtiStifResults g_testCaseResults; +HtiStifSenderDll *g_HtiStifSenderDll; +HtiStifClients *g_HtiStifClients; + +//********************************************************************************** +// HELPER FUNCTIONS/CLASSES +// +//********************************************************************************** + +//********************************************************************************** +// HtiStifMsg +//********************************************************************************** +class HtiStifMsg +{ +public: + HtiStifMsg(BYTE command); + + BYTE* GetMsgBody() { return msgBody; }; + int GetMsgLen() { return msgBodyLen; }; + + void AddString(char* string); + void AddIntAsString(int value); + void AddByte(BYTE byte); + void AddParameterSeparator(); + + int CheckResponseCommandCode(struct soap *soap, BYTE commandCode); + + int SendReceiveMsg(struct soap *soap, int timeout); + +private: + void IncBodySize(int size); + BYTE *msgBody; // NOTE: deleted when sent or by gateway when received + int msgBodyLen; +}; + +HtiStifMsg::HtiStifMsg(BYTE command) +{ + msgBody = new BYTE[1]; + msgBody[0] = command; + msgBodyLen = 1; +} + +void HtiStifMsg::IncBodySize(int size) +{ + BYTE *newMsgBody = new BYTE[msgBodyLen+size]; + memcpy(newMsgBody, msgBody, msgBodyLen); + delete msgBody; + msgBody = newMsgBody; + msgBodyLen += size; +} + +void HtiStifMsg::AddString(char* string) +{ + int stringLen = (int) strlen(string); + int writePos = msgBodyLen; + IncBodySize(stringLen); + memcpy(msgBody+writePos, string, stringLen); +} + +void HtiStifMsg::AddIntAsString(int value) +{ + char buf[50]; + _itoa(value, buf, 10); + AddString(buf); +} + +void HtiStifMsg::AddByte(BYTE byte) +{ + int writePos = msgBodyLen; + IncBodySize(1); + msgBody[writePos] = byte; +} + +void HtiStifMsg::AddParameterSeparator() +{ + AddByte('|'); +} + +int HtiStifMsg::SendReceiveMsg(struct soap* soap, int timeout) +{ + //dump(msgBody, msgBodyLen); + + BYTE commandCode = msgBody[0]; + + // Send the message to symbian side + HtiSoapHandlerInterface* handler = static_cast(soap->user); + handler->SendHtiMessage(HTI_STIF_UID, msgBody, msgBodyLen); + + // Clean these up for received HTI message + delete msgBody; + msgBody = NULL; + msgBodyLen = 0; + + while(1) + { + if (handler->WaitForHtiMessage(timeout)) + { + int err = handle_received_message(handler, TRUE); + + // NOTE: this will be destroyed by gateway + msgBody = (BYTE*) handler->ReceivedHtiMessageBody(); + msgBodyLen = handler->ReceivedHtiMessageBodySize(); + + // Received a HTI initiated msg + // Start waiting again + if( (err == HTI_RECV_ASYNC_CALL_SERVICED) || + (err == HTI_RECV_ASYNC_CALL_SERVICE_ERROR) ) + { + continue; + } + + if( err == HTI_RECV_ERROR_MESSAGE ) + SetSoapFaultFromReceivedHtiError(soap, msgBody, msgBodyLen); + + return err; + } + else + { + // timeout + soap->error = soap_receiver_fault(soap, "HtiGateway", "No response from symbian side"); + return HTI_RECV_TIMEOUT; + } + } +} + +int HtiStifMsg::CheckResponseCommandCode(struct soap *soap, BYTE commandCode) +{ + int result = SOAP_OK; + + if( msgBody[0] != commandCode ) + { + char msg[] = "incorrect response CommandCode (expected 0x%x, got 0x%x)"; + int msgLen = _scprintf(msg, commandCode, msgBody[0])+1; // +1 for nul char + char *buf = new char[msgLen]; + sprintf(buf, msg, commandCode, msgBody[0]); + soap->error = soap_receiver_fault(soap, "HtiError", buf); + delete buf; + result = SOAP_FAULT; + } + + return result; +} + +//********************************************************************************** +// HtiStifClients +//********************************************************************************** +class HtiStifClients +{ +public: + HtiStifClients() {m_size = 0; m_clients = NULL;}; + ~HtiStifClients(); + int Add(char* host); + int Remove(char* host); + int NrOfClients() {return m_size;}; + const char* Get(int index) {return m_clients[index];}; +private: + int m_size; + char **m_clients; +}; + +HtiStifClients::~HtiStifClients() +{ + for(int i=0; i(soap->user); + handler->SendSoapFaultFromReceivedHtiError(); + return; + } + + // Get error codes + int frameworkErrorCode = *((BYTE*)(receivedMsgBody + 1)); + int serviceErrorCode = *((DWORD*)(receivedMsgBody + 2)); + + // Get error description + // NOTE: first byte is skipped because it contains the command code + int serviceErrorDescLen = receivedMsgBodyLen - 11; + char* serviceErrorDesc = new char[receivedMsgBodyLen - 11 + 1]; + memcpy(serviceErrorDesc, receivedMsgBody+11, serviceErrorDescLen); + serviceErrorDesc[serviceErrorDescLen] = 0x0; + + // Fill the xml struct + std::stringstream s; + s<<""; + s<"; + s<"; + s<"; + s<<""; + + soap->error = soap_receiver_fault(soap, "HtiError", s.str().c_str() ); + + delete serviceErrorDesc; +} + +//********************************************************************************** +// handle_received_message +//********************************************************************************** +int handle_received_message(HtiSoapHandlerInterface* handler, BOOL isSoapCallActive) +{ + if(handler->IsReceivedHtiError()) + return HTI_RECV_ERROR_MESSAGE; + + // Get message + BYTE *msgBody = (BYTE*) handler->ReceivedHtiMessageBody(); + int msgBodyLen = handler->ReceivedHtiMessageBodySize(); + + switch(msgBody[0]) + { + // Initiated by SOAP + case CMD_STIF_OPEN: + case CMD_STIF_CLOSE: + case CMD_STIF_LOAD_MODULE: + case CMD_STIF_UNLOAD_MODULE: + case CMD_STIF_LIST_CASES: + case CMD_STIF_START_CASE: + case CMD_STIF_CANCEL_CASE: + case CMD_STIF_PAUSE_CASE: + case CMD_STIF_RESUME_CASE: + case CMD_STIF_ADD_CASE_FILE: + case CMD_STIF_REMOVE_CASE_FILE: + case CMD_STIF_CASE_MESSAGE: + case CMD_STIF_SET_DEVICEID: + case CMD_STIF_SET_ATTRIBUTE: + if(isSoapCallActive) + return HTI_RECV_OK; + else + { + printf("HtiStif: Received a known but unexpected message (command code 0x%x)\n", msgBody[0]); + return HTI_RECV_ROUGUE_MESSAGE; + } + break; + + // Initiated by HTI + case CMD_STIF_TEST_COMPLETED: + { + // Make copy of parameters + char *params = new char[msgBodyLen]; + memcpy(params, msgBody+1, msgBodyLen-1); + params[msgBodyLen-1] = 0x0; // add nul to make strtok easier + + // Get data from params + char *testCaseId = strtok(params, "|"); + char *testResult = strtok(NULL, "|"); + char *testExecutionResult = strtok(NULL, "|"); + char *resultDescription = strtok(NULL, "|"); + + // Check if all is there + if( !testCaseId || !testResult || !testExecutionResult) + { + printf("HtiStif: Received incomplete testcase result\n" ); + delete params; + return HTI_RECV_ASYNC_CALL_SERVICE_ERROR; + } + + // Get soap env + struct soap soap; + soap_init(&soap); + soap.namespaces = namespaces; + + // Fill HtiStifResult + struct ns1__HtiStifResult result; + result.caseId = atoi(testCaseId); + result.caseResult = atoi(testResult); + result.executionResult = atoi(testExecutionResult); + if(resultDescription) + { + result.resultDescription = (char*) soap_malloc( &soap, strlen(resultDescription)+1 ); + strcpy(result.resultDescription, resultDescription); + } + else + result.resultDescription = NULL; + + delete params; // not needed anymore + + // Send the HtiStifResult to registered clients + for(int i=0; iNrOfClients(); i++) + { + if(g_HtiStifSenderDll->soap_send_ns1__stifResult(&soap, g_HtiStifClients->Get(i), soapAction, result, NULL) != SOAP_OK) + printf("HtiStif: error sending stifResult to %s\n", g_HtiStifClients->Get(i) ); + } + soap_destroy(&soap); + soap_end(&soap); + soap_done(&soap); + + return HTI_RECV_ASYNC_CALL_SERVICED; + } + break; + + case CMD_STIF_ATS_MESSAGE: + { + // Get soap env + struct soap soap; + soap_init(&soap); + soap.namespaces = namespaces; + + // Get message + // NOTE: messages are in string format so they don't have nul-characters + // This might change in the future and then xsd__string will no do for this task. + char* msg = (char*) soap_malloc(&soap, msgBodyLen); + memcpy(msg, msgBody+1, msgBodyLen-1); + msg[msgBodyLen-1] = 0x0; // add nul + + // Send the HtiStifResult to registered clients + for(int i=0; iNrOfClients(); i++) + { + if(g_HtiStifSenderDll->soap_send_ns1__stifMessage(&soap, g_HtiStifClients->Get(i), soapAction, msg, NULL) != SOAP_OK) + printf("HtiStif: error sending stifMessage to %s\n", g_HtiStifClients->Get(i) ); + } + soap_destroy(&soap); + soap_end(&soap); + soap_done(&soap); + + return HTI_RECV_ASYNC_CALL_SERVICED; + } + break; + + + default: + printf("HtiStif: Received an unkown message (command code 0x%x, sync call active %d)\n", msgBody[0], isSoapCallActive); + return HTI_RECV_UNKOWN_MESSAGE; + break; + } + + // Should never come here + return HTI_RECV_GEN_ERROR; +} + + + +//********************************************************************************** +// SOAP FUNCTIONS +// +//********************************************************************************** + +//********************************************************************************** +// ns1__openStif() +//********************************************************************************** +int ns1__openStif(struct soap* soap, char *iniFile, struct ns1__openStifResponse *out) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_OPEN); + if(iniFile != NULL) + { + if(strlen(iniFile) != 0) + msg.AddString(iniFile); + } + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_OPEN) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__closeStif() +//********************************************************************************** +int ns1__closeStif(struct soap* soap, void *_, struct ns1__closeStifResponse *out) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_CLOSE); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_CLOSE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + + +//********************************************************************************** +// ns1__loadStifTestModule() +//********************************************************************************** +int ns1__loadStifTestModule(struct soap* soap, char *moduleName, char *iniFile, char *&moduleNameLoaded) +{ + // Parameter check + if(check_mandatory_string_parameter(soap, moduleName, "moduleName")) + return SOAP_FAULT; + + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_LOAD_MODULE); + msg.AddString(moduleName); + if(iniFile != NULL) + { + if(strlen(iniFile) != 0) + { + msg.AddParameterSeparator(); + msg.AddString(iniFile); + } + } + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check CommandCode + if( msg.CheckResponseCommandCode(soap, CMD_STIF_LOAD_MODULE) ) + return SOAP_FAULT; + + int moduleNameLoadedLen = msg.GetMsgLen()-1; // remaining msgBody + moduleNameLoaded = (char*) soap_malloc(soap, moduleNameLoadedLen+1); // +1 for nul char + memcpy(moduleNameLoaded, msg.GetMsgBody()+1, moduleNameLoadedLen); + moduleNameLoaded[moduleNameLoadedLen] = 0x0; // add nul char + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__unloadStifTestModule() +//********************************************************************************** +int ns1__unloadStifTestModule(struct soap* soap, char *moduleName, char *&moduleNameUnloaded) +{ + // Parameter check + if(check_mandatory_string_parameter(soap, moduleName, "moduleName")) + return SOAP_FAULT; + + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_UNLOAD_MODULE); + msg.AddString(moduleName); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check CommandCode + if( msg.CheckResponseCommandCode(soap, CMD_STIF_UNLOAD_MODULE) ) + return SOAP_FAULT; + + int moduleNameUnloadedLen = msg.GetMsgLen()-1; // remaining msgBody + moduleNameUnloaded = (char*) soap_malloc(soap, moduleNameUnloadedLen+1); // +1 for nul char + memcpy(moduleNameUnloaded, msg.GetMsgBody()+1, moduleNameUnloadedLen); + moduleNameUnloaded[moduleNameUnloadedLen] = 0x0; // add nul char + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__listStifTestCases() +//********************************************************************************** +int ns1__listStifTestCases(struct soap* soap, char *moduleName, struct ArrayOfTestCases *testCases) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_LIST_CASES); + if(moduleName != NULL) + { + if(strlen(moduleName) != 0) + msg.AddString(moduleName); + } + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check CommandCode + if( msg.CheckResponseCommandCode(soap, CMD_STIF_LIST_CASES) ) + return SOAP_FAULT; + + // No testcases found + if(msg.GetMsgLen() <= 1) + return SOAP_OK; + + // make a copy of the list + char* testCaseTitleList = new char[msg.GetMsgLen()]; + memcpy(testCaseTitleList, msg.GetMsgBody()+1, msg.GetMsgLen()); + testCaseTitleList[msg.GetMsgLen()-1] = 0x0; //add nul to make life easier + + // Get number of testcases + char* testcase = strtok( testCaseTitleList, "|" ); + + // Only one testcase ? + if(testcase == NULL) + { + testCases->__size = 1; + testCases->__ptr = (char**) soap_malloc(soap, sizeof(char**)); + testCases->__ptr[0] = (char*) soap_malloc(soap, msg.GetMsgLen()); + memcpy(testCases->__ptr[0], testCaseTitleList, msg.GetMsgLen()); // (remember we added nul) + delete testCaseTitleList; + return SOAP_OK; + } + + // ..no! we have at least two + while(testcase != NULL) + { + testCases->__size++; + testcase = strtok( NULL, "|" ); // continue with testCaseTitleList + } + + // Now that we know the number of testcases title we can alloc soap space for + // pointers and copy testcase titles to soap space. + testCases->__ptr = (char**) soap_malloc(soap, sizeof(char**)*testCases->__size); + + // reset testCaseTitleList from previous strtok + memcpy(testCaseTitleList, msg.GetMsgBody()+1, msg.GetMsgLen()); + testCaseTitleList[msg.GetMsgLen()-1] = 0x0; //add nul to make life easier + + int i = 0; + testcase = strtok( testCaseTitleList, "|" ); + while(testcase != NULL) + { + int testCaseLen = (int) strlen(testcase); + testCases->__ptr[i] = (char*) soap_malloc(soap, testCaseLen+1); + memcpy(testCases->__ptr[i], testcase, testCaseLen); + testCases->__ptr[i][testCaseLen] = 0x0; // add nul char + i++; + testcase = strtok( NULL, "|" ); + } + delete testCaseTitleList; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__startStifTestCase() +//********************************************************************************** +int ns1__startStifTestCase(struct soap* soap, char *moduleName, int testCaseIndex, int &testCaseId) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_START_CASE); + + if(moduleName != NULL) + { + if(strlen(moduleName) != 0) + { + msg.AddString(moduleName); + msg.AddParameterSeparator(); + } + } + msg.AddIntAsString(testCaseIndex); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_START_CASE) ) + return SOAP_FAULT; + + // Get testCaseId + char* tmp = new char[msg.GetMsgLen()]; + memcpy(tmp, msg.GetMsgBody()+1, msg.GetMsgLen()-1); + tmp[msg.GetMsgLen()-1] = 0x0; // add nul + testCaseId = atoi(tmp); + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__cancelStifTestCase() +//********************************************************************************** +int ns1__cancelStifTestCase(struct soap* soap, int testCaseId, struct ns1__cancelStifTestCaseResponse *out) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_CANCEL_CASE); + msg.AddIntAsString(testCaseId); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_CANCEL_CASE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__pauseStifTestCase() +//********************************************************************************** +int ns1__pauseStifTestCase(struct soap* soap, int testCaseId, struct ns1__pauseStifTestCaseResponse *out) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_PAUSE_CASE); + msg.AddIntAsString(testCaseId); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_PAUSE_CASE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__resumeStifTestCase() +//********************************************************************************** +int ns1__resumeStifTestCase(struct soap* soap, int testCaseId, struct ns1__resumeStifTestCaseResponse *out) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_RESUME_CASE); + msg.AddIntAsString(testCaseId); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_RESUME_CASE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__addStifTestCaseFile() +//********************************************************************************** +int ns1__addStifTestCaseFile(struct soap* soap, char *moduleName, char *testCaseFile, struct ns1__addStifTestCaseFileResponse *out) +{ + // Parameter check + if( check_mandatory_string_parameter(soap, moduleName, "moduleName") || + check_mandatory_string_parameter(soap, testCaseFile, "testCaseFile") ) + return SOAP_FAULT; + + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_ADD_CASE_FILE); + msg.AddString(moduleName); + msg.AddParameterSeparator(); + msg.AddString(testCaseFile); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_ADD_CASE_FILE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__removeStifTestCaseFile() +//********************************************************************************** +int ns1__removeStifTestCaseFile(struct soap* soap, char *moduleName, char *testCaseFile, struct ns1__removeStifTestCaseFileResponse *out) +{ + // Parameter check + if( check_mandatory_string_parameter(soap, moduleName, "moduleName") || + check_mandatory_string_parameter(soap, testCaseFile, "testCaseFile") ) + return SOAP_FAULT; + + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_REMOVE_CASE_FILE); + msg.AddString(moduleName); + msg.AddParameterSeparator(); + msg.AddString(testCaseFile); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_REMOVE_CASE_FILE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__setDeviceId() +//********************************************************************************** +int ns1__setDeviceId(struct soap* soap, int deviceId, struct ns1__setDeviceIdResponse *out) +{ + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_SET_DEVICEID); + msg.AddIntAsString(deviceId); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_SET_DEVICEID) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__queryStifTestCaseResult() +//********************************************************************************** +int ns1__queryStifTestCaseResult(struct soap* soap, int testCaseId, queryStifTestCaseResultResponse &r) +{ + soap->error = soap_receiver_fault(soap, "HtiGateway", "queryStifTestCaseResult: not supported"); + return SOAP_FAULT; +} + +//********************************************************************************** +// ns1__runStifTestCase() +//********************************************************************************** +int ns1__runStifTestCase(struct soap* soap, char *moduleName, int testCaseIndex, struct runStifTestCaseResponse &r) +{ + soap->error = soap_receiver_fault(soap, "HtiGateway", "runStifTestCase: not supported"); + return SOAP_FAULT; +} + +//********************************************************************************** +// ns1__register() +//********************************************************************************** +int ns1__register(struct soap* soap, char *host, struct ns1__registerResponse *out) +{ + if(check_mandatory_string_parameter(soap, host, "host")) + return SOAP_FAULT; + + if(g_HtiStifClients->Add(host) != 0) + { + soap->error = soap_receiver_fault(soap, "HtiGateway", "register: host already registered"); + return SOAP_FAULT; + } + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__deregister() +//********************************************************************************** +int ns1__deregister(struct soap* soap, char *host, struct ns1__deregisterResponse *out) +{ + if(check_mandatory_string_parameter(soap, host, "host")) + return SOAP_FAULT; + + if(g_HtiStifClients->Remove(host) != 0) + { + soap->error = soap_receiver_fault(soap, "HtiGateway", "deregister: did not find host"); + return SOAP_FAULT; + } + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__stifMessage() +//********************************************************************************** +int ns1__stifMessage(struct soap* soap, char *message, struct ns1__stifMessageResponse *out) +{ + // Parameter check + if( check_mandatory_string_parameter(soap, message, "message") ) + return SOAP_FAULT; + + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_CASE_MESSAGE); + msg.AddString(message); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_CASE_MESSAGE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + +//********************************************************************************** +// ns1__setAttribute() +//********************************************************************************** +int ns1__setAttribute(struct soap* soap, + char *attribute, + char *value, + struct ns1__SetAttributeResponse *out) +{ + // Parameter check + if( check_mandatory_string_parameter(soap, attribute, "attribute") || + check_mandatory_string_parameter(soap, value, "value") ) + return SOAP_FAULT; + + // Assemble HTI message + HtiStifMsg msg(CMD_STIF_SET_ATTRIBUTE); + msg.AddString(attribute); + msg.AddParameterSeparator(); + msg.AddString(value); + + // Send msg and receive response + if( msg.SendReceiveMsg(soap, TIMEOUT_10_SECONDS) != ERROR_SUCCESS ) + return SOAP_FAULT; + + // Check response command code + if( msg.CheckResponseCommandCode(soap, CMD_STIF_SET_ATTRIBUTE) ) + return SOAP_FAULT; + + return SOAP_OK; +} + + +//********************************************************************************** +// EXPORTED FUNCTIONS +// +//********************************************************************************** + +//********************************************************************************** +// DllMain +//********************************************************************************** +BOOL WINAPI DllMain( + HINSTANCE hinstDLL, // handle to DLL module + DWORD fdwReason, // reason for calling function + LPVOID lpReserved ) // reserved +{ + switch( fdwReason ) + { + case DLL_PROCESS_ATTACH: + + g_HtiStifClients = new HtiStifClients; + + // Load HtiStifSender + g_HtiStifSenderDll = new HtiStifSenderDll; + if( g_HtiStifSenderDll->Init("serviceplugins/HtiStifSender.dll") != TRUE) + { + printf("HtiStif: could not load HtiStifSender.dll"); + return FALSE; + } + + // Check exported functions + if( !g_HtiStifSenderDll->soap_send_ns1__stifMessage ) + { + printf("HtiStif: HtiStifSender.dll - exported function soap_send_ns1__stifMessage() not found"); + return FALSE; + } + + if( !g_HtiStifSenderDll->soap_send_ns1__stifResult ) + { + printf("HtiStif: HtiStifSender.dll - exported function soap_send_ns1__stifResult() not found"); + return FALSE; + } + break; + + case DLL_PROCESS_DETACH: + + // Delete HtiStifSender + delete g_HtiStifSenderDll; + + delete g_HtiStifClients; + + break; + } + return TRUE; +} + +//********************************************************************************** +// hti_serve +//********************************************************************************** +int hti_serve(HtiSoapHandlerInterface* handler) +{ + return handle_received_message(handler, FALSE); +} + + + +