/* * * ProLinga-Run * * Copyright (C) 2002-2009 Xobas Software. * All rights reserved. * * This file is part of ProLinga-Run. * * ProLinga-Run is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProLinga-Run is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProLinga-Run. If not, see . * * More information is available at the following addresses: * * Website : http://www.prolinga.org * * Email : prolinga-list@prolinga.org * * */ #include "RunCommon.h" #include #include #include //#include #include "DocMgmt.hpp" #include "RunExec.hpp" #include "LogicCommands.hpp" #include "DataRef.hpp" #include "Logic.hpp" #include "RepositoryCommand.hpp" /* Stack with pointers to Local Variable Lists */ extern LocalDicPtr ldicPtr; extern ParameterStackPtr pstackPtr; extern DataReturnStackPtr dstackPtr; extern BiAppnPtr biAppnPtr; /* Current/Active Local Variable List */ DataDictionaryPtr dicPtr = NULL; /* Current/Active Parameter List */ ParameterPtr paramPtr = NULL; /* Current/Active Data Return List */ DataReturnPtr dataPtr = NULL; /* Command : CALL */ /* Syntax : [ ret_value = ] CALL logic_name [ argument ...] [ RETURNING ret_value [ ret_value ...] ] */ void CmdCall(const char **argList, int argHits, bool isMainThread, bool idleEvent) { xmlDocPtr doc = NULL, docVal = NULL; xmlXPathContextPtr ctxVal; xmlXPathObjectPtr resVal; int i, j, dataReturnNumber = 0, status; char tmpValue[255], *logicName, *returnStatus, returnRef[255]; char *dataRefName, *dataRefValue, *errorStart, *errorEnd; const char *errorList[5]; ParameterPtr paramLocalPtr = NULL; /* Get Logic Name */ logicName = getDataRef(argList[1], isMainThread, tmpValue, false); /* Get Parameters */ /* One of the parameters can be a local variable so we need to get to that value before we stack it */ paramLocalPtr = paramLocalPtr->createList(); j = 0; for (i = 2; i <= argHits; i++) { if (strcmp(argList[i], "RETURNING") == 0) break; /* Get Value data reference */ getDataRef(argList[i], isMainThread, returnRef, false); /* Put Value */ paramLocalPtr->putValue(¶mLocalPtr, j, returnRef); /* Raise counter */ j++; } /* Prepare parameter list */ paramPtr = paramPtr->createList(); pstackPtr->push(&pstackPtr, paramPtr); /* Prepare data return list */ dataPtr = dataPtr->createList(); dstackPtr->push(&dstackPtr, dataPtr); /* Prepare logic variable list */ dicPtr = dicPtr->createList(); ldicPtr->push(&ldicPtr, dicPtr); /* Set Parameters in current list */ j = 0; for (i = 2; i <= argHits; i++) { if (strcmp(argList[i], "RETURNING") == 0) break; /* Put Value */ paramPtr->putValue(¶mPtr, j, paramLocalPtr->getValue(paramLocalPtr, j)); /* Raise counter */ j++; } /* Delete local parameter list */ paramPtr->deleteList(¶mLocalPtr); /* Get Data Return dataReference Values */ if ( (i <= argHits ) && (strcmp(argList[i], "RETURNING") == 0) ) { i++; dataReturnNumber = 0; for (j = i; j <= argHits; j++) { /* Put Dataref Name */ dataPtr->putDataRefName(&dataPtr, dataReturnNumber, argList[j]); //printf("Returning : %s\n", argList[j]); /* Raise counter */ dataReturnNumber++; } } /* Load Validated Logic */ docVal = RC_Get(biAppnPtr->getAppn(), "RunControl", logicName); /* Init Xpath */ // xmlXPathInit(); /* Create XPath environment */ ctxVal = xmlXPathNewContext(docVal); /* Check status */ resVal = xmlXPathEval((const xmlChar *)"/ProLinga/Repository/Command/@Status", ctxVal); returnStatus = (char *)xmlXPathCastToString(resVal); if ( strcmp(returnStatus, "Ok") != 0) { errorStart = new char[7]; strncpy(errorStart, "Logic [", 7); errorEnd = new char[17]; strncpy(errorEnd, "] does not exist.", 17); errorList[1] = errorStart; errorList[2] = logicName; errorList[3] = errorEnd; CmdError(errorList, 3, isMainThread, NULL, idleEvent); delete errorStart; delete errorEnd; return; /* Old situation. To be removed when all transformed */ // printf("Non transformed logic : %s\n", logicName); // // strcpy(fileName, "./"); // strcat(fileName, tmpValue); // //strcat(fileName, argList[1]); // strcat(fileName,".xml"); // // /* Load run document */ // status = RunOpen(fileName, &doc); // if (status != 0) return; } else { //printf("Transformed logic : %s\n", logicName); status = RunLoad(docVal, &doc); if (status != 0) return; } /* Run statements */ status = RunExec(&doc, idleEvent); /* Clean up local dictionaries */ dicPtr->deleteList(&dicPtr); ldicPtr->pop(&ldicPtr); dicPtr = ldicPtr->getValue(ldicPtr); /* Assign returning values to data references */ if (dataReturnNumber > 0 ) { for (i = 0; i < dataReturnNumber; i++) { /* Get Data Reference Name */ dataRefName = dataPtr->getDataRefName(dataPtr, i); /* Get Data Reference Value */ dataRefValue = dataPtr->getDataRefValue(dataPtr, i); /* Assign value to data reference */ if (dataRefValue == NULL) putDataRef(dataRefName, NULL, 0, isMainThread); else putDataRef(dataRefName, dataRefValue, 0, isMainThread); } } /* Cleanup */ RunCleanup(&doc); xmlFreeDoc(docVal); paramPtr->deleteList(¶mPtr); pstackPtr->pop(&pstackPtr); paramPtr = pstackPtr->getValue(pstackPtr); dataPtr->deleteList(&dataPtr); dstackPtr->pop(&dstackPtr); dataPtr = dstackPtr->getValue(dstackPtr); }