/* ******************************************************************* * Function: int DecodeAndSendCommand (XString commandString, char separator, const CKBehaviorContext& behaviorContext) * * Description : Decodes the string message passed in into the separate parameters for the command and * sets the output parameter valuess of the corresponding GBLWaitForCommand BB. * * Paramters : * * commandString r command string * separator r parameter separator * behaviorContext r behavior context * * Returns : * 0 on success, otherwise error * ******************************************************************* */ int CGBLCommandController::InvokeCommand (XString commandString, const CKBehaviorContext& behaviorContext) { int returnValue = 0; // 0 indicates success int separatorPos = 0; //position for string separator char separator = CGBLCommandController::commandSeparator; if (strlen (commandString.Str()) <=0) { returnValue = -1; } else { separatorPos = commandString.Find(separator, separatorPos); int commandID = atoi ( (commandString.Substring (0, separatorPos)).Str() ); CKBehavior* targetBB = CGBLCommandController::GetTargetCommand (commandID, behaviorContext); if (targetBB == NULL ) { returnValue = -1; } else if (! (targetBB->IsInputActive(0)) ) { returnValue = -1; } else { int argumentCount = targetBB->GetOutputParameterCount(); int separatorCount = 0; for (unsigned int k=0; k < strlen (commandString.Str()); k++) { if (commandString.Str()[k] == separator) { separatorCount++; } } if ( separatorCount != (argumentCount + 1 ) ) { returnValue = -1; } else { int prevPos = separatorPos+1; for(int i = 0; i < argumentCount ; i++) { separatorPos = commandString.Find(separator, prevPos); if (separatorPos == prevPos) { CKParameterOut* targetParam = targetBB->GetOutputParameter(i); targetParam->SetStringValue (""); } else { XString insert = (commandString.Substring (prevPos, separatorPos-prevPos)).Str(); CKParameterOut* targetParam = targetBB->GetOutputParameter(i); targetParam->SetStringValue (insert.Str()); } prevPos = separatorPos+1; } targetBB->ActivateOutput(0); } } } return returnValue; }
/* ******************************************************************* * Function: int BehaviourFunction() * * Description : * * Paramters : * CKBehaviorContext& r The virtools behaviour context * * Returns : One of the many virtools return values * ******************************************************************* */ int CGBLLOStringBuilder::BehaviourFunction(const CKBehaviorContext& behContext) { CKBehavior* beh = behContext.Behavior; CKBeObject* beObject = beh->GetTarget(); CKBOOL error = FALSE; XString outString = NULL; // error check to ensure virtools is working ok if (!beObject) { error = TRUE; CKParameterOut *parameterOutError = beh->GetOutputParameter(EGBLStringBuilderParamOutputs::eParamGetError); TGBLError::SetTGBLError(parameterOutError,CGBLCOError::EGBLCOErrorType::GBLCO_FATAL,LOI_ERROR_NO_BEHAVIOUR_STATE,LOI_ERROR_NO_BEHAVIOUR_DESC); beh->SetOutputParameterValue(eParamGetError, parameterOutError); beh->ActivateOutput(eBehOutputError, TRUE); } int lengthOfSource = 0; int lengthOfInsert = 0; int insertPosition = 0; if (!error) { // Reset On input, if active if (beh->IsInputActive(eBehInputOn)) { beh->ActivateInput(eBehInputOn, FALSE); } // get the BB params into variables to work with XString sourceString = NULL; sourceString = (CKSTRING)(beh->GetInputParameterReadDataPtr(eParamSetSourceString)); XString insertString = NULL; insertString = (CKSTRING)(beh->GetInputParameterReadDataPtr(eParamSetInsertString)); beh->GetInputParameterValue(eParamSetInsertPosition,&insertPosition); lengthOfSource = strlen(sourceString.Str()); lengthOfInsert = strlen(insertString.Str()); // Simple bounds checking and error recovery if (insertPosition<0) { insertPosition=0; } if (insertPosition>lengthOfSource) { outString = sourceString; outString += insertString; } else { // a little more error checking and simple recovery // deal with the special cases first if (lengthOfSource<=0) { // an empty source outString = insertString; } else if (insertPosition == 0) { outString = insertString; outString += sourceString; } else { // build up the new string XString start = NULL; XString end = NULL; start = sourceString.Substring(0,insertPosition); end = sourceString.Substring(insertPosition,lengthOfSource); outString = start ; outString += insertString; outString += end; } } } if (!error) { int newCartPos = insertPosition+lengthOfInsert; beh->SetOutputParameterValue(eParamGetCarretPosition,&newCartPos); beh->SetOutputParameterValue(eParamGetNewText, outString.CStr(), outString.Length() + 1); beh->ActivateOutput(eBehOutputDone, TRUE); } return CKBR_OK; }