// Rage headers #include "script\wrapper.h" #include "parser\manager.h" // Game headers #include "debug\BugstarIntegration.h" #include "script\script.h" #include "script\script_helper.h" SCRIPT_OPTIMISATIONS() namespace xml_commands { //Check if the XML file can be loaded bool CommandLoadXmlFile (const char *pFileName ) { bool bXmlFileLoaded = false; USE_DEBUG_MEMORY(); if (!CTheScripts::GetXmlTree()) { INIT_PARSER; ASSET.PushFolder("common:/data/script/XML/"); CTheScripts::SetXmlTree(PARSER.LoadTree(pFileName, "xml")); //PARSE the file if (CTheScripts::GetXmlTree()) { CTheScripts::SetCurrentXmlTreeNode(CTheScripts::GetXmlTree()->GetRoot()); //sets the current Node to the root bXmlFileLoaded = true; } else { scriptAssertf(0, "%s:%s", CTheScripts::GetCurrentScriptNameAndProgramCounter(), "LOAD_XML_FILE - Failed to load XML file"); } ASSET.PopFolder(); } else { scriptAssertf(0, "%s:%s", CTheScripts::GetCurrentScriptNameAndProgramCounter(), "LOAD_XML_FILE - XML file already loaded"); } return bXmlFileLoaded; } //delete loaded xml file void CommandDeleteXmlFile () { if (CTheScripts::GetXmlTree()) { delete CTheScripts::GetXmlTree(); CTheScripts::SetXmlTree(NULL); CTheScripts::SetCurrentXmlTreeNode(NULL); } } //Gets a pointer to the next node in a ParTree //it searches the tree: //1)get child, if no child //2)get sibling, if no sibling //3)get parent then sibling parTreeNode* GetNextNode (parTreeNode * pCurrentNode) { parTreeNode* pNode = pCurrentNode; parTreeNode* pNodeCurrent = pCurrentNode; //this is always points to a valid node const int GetChildNode = 0; const int GetSiblingNode = 1; const int GetParentNode = 2; int NodeType = GetChildNode; bool bGettingNode = true; while (bGettingNode) { switch (NodeType) { case GetChildNode: pNode = pNodeCurrent -> GetChild(); if(pNode) { bGettingNode = false; //found a child break; } else { NodeType = GetSiblingNode; } case GetSiblingNode: pNode = pNodeCurrent -> GetSibling(); if (pNode) { bGettingNode = false; //found a sibling break; } else NodeType = GetParentNode; case GetParentNode: if (pNodeCurrent != CTheScripts::GetXmlTree()->GetRoot()) //not trying to get the parent of the root node { pNode = pNodeCurrent -> GetParent(); //this should always point to a valid node within the tree if (pNode) { if (pNode == CTheScripts::GetXmlTree()->GetRoot() ) // the pointer is back to the root { bGettingNode = false; break; //back at the root } else { NodeType = GetSiblingNode; //go get a sibling node, its not the root node } pNodeCurrent = pNode; //update pNodeCurrent to the new node } else scriptAssertf (0, "Has grabbed a null parent node" ); } else { pNode = pNodeCurrent; bGettingNode = false; break; } } } return pNode; } //Updates the static current node pointer to point to the next node in the tree void CommandGetNextNode() { CTheScripts::SetCurrentXmlTreeNode(GetNextNode(CTheScripts::GetCurrentXmlTreeNode())); } //Counts the total number of nodes in a tree int CommandGetTotalNumberOfNodes () { int NumberOfNodes = 0; parTreeNode * TempRoot = CTheScripts::GetXmlTree()->GetRoot(); parTreeNode * TempNode = NULL; while (TempNode != CTheScripts::GetXmlTree()->GetRoot()) //ensures it counts at least once for the root node { NumberOfNodes++; TempNode = GetNextNode (TempRoot); TempRoot = TempNode; } return NumberOfNodes; } //Returns the name of the node const char *GetNodeName () { parElement& CurrentElement = CTheScripts::GetCurrentXmlTreeNode()->GetElement(); return CurrentElement.GetName(); } //Returns the number of attributes for a given node int GetNumberOfNodeAttributes () { int iNumberofAttributes= 0; parElement& CurrentElement = CTheScripts::GetCurrentXmlTreeNode()->GetElement(); atArray& ElementAttributeArray = CurrentElement.GetAttributes(); iNumberofAttributes = ElementAttributeArray.GetCount(); return iNumberofAttributes; } //Returns name of the attribute const char * GetAttributeName(int AttributeIndex) { int iNumberofAttributes= 0; const char *AttributeName = NULL; parElement& CurrentElement = CTheScripts::GetCurrentXmlTreeNode()->GetElement(); atArray& ElementAttributeArray = CurrentElement.GetAttributes(); iNumberofAttributes = ElementAttributeArray.GetCount(); if (AttributeIndex <= iNumberofAttributes -1) AttributeName = ElementAttributeArray[AttributeIndex].GetName(); else Assertf(0, "Attribute does not exist cannot return a value"); return AttributeName; } //Returns the int value of given attribute int GetAttributeIntValue (int AttributeIndex) { int iNumberofAttributes= 0; int iAttributeValue = 0; parElement& CurrentElement = CTheScripts::GetCurrentXmlTreeNode()->GetElement(); atArray& ElementAttributeArray = CurrentElement.GetAttributes(); iNumberofAttributes = ElementAttributeArray.GetCount(); if (AttributeIndex <= iNumberofAttributes -1) //check that the script is checking for a valid index { iAttributeValue = ElementAttributeArray[AttributeIndex].FindIntValue(); //can take an int or string as an argument } else scriptAssertf(0, "Attribute does not exist cannot return a value"); return iAttributeValue; } //Returns the float of given attribute float GetAttributeFloatValue (int AttributeIndex) { int iNumberofAttributes= 0; float fAttributeValue = 0; parElement& CurrentElement = CTheScripts::GetCurrentXmlTreeNode()->GetElement(); atArray& ElementAttributeArray = CurrentElement.GetAttributes(); iNumberofAttributes = ElementAttributeArray.GetCount(); if (AttributeIndex <= iNumberofAttributes -1) { fAttributeValue = ElementAttributeArray[AttributeIndex].FindFloatValue(); //can take an float or string as an argument } else scriptAssertf(0, "Attribute does not exist cannot return a value"); return fAttributeValue; } //Returns the bool of given attribute bool GetAttributeBoolValue (int AttributeIndex) { int iNumberofAttributes= 0; bool bAttributeValue = 0; parElement& CurrentElement = CTheScripts::GetCurrentXmlTreeNode()->GetElement(); atArray& ElementAttributeArray = CurrentElement.GetAttributes(); iNumberofAttributes = ElementAttributeArray.GetCount(); if (AttributeIndex <= iNumberofAttributes -1) { bAttributeValue = ElementAttributeArray[AttributeIndex].FindBoolValue(); //can take an bool or string as an argument } else scriptAssertf(0, "Attribute does not exist cannot return a value"); return bAttributeValue; } //Returns the string of given attribute const char * GetAttributeStringValue (int AttributeIndex) { int iNumberofAttributes= 0; const char *AttributeName = NULL; parElement& CurrentElement = CTheScripts::GetCurrentXmlTreeNode()->GetElement(); atArray& ElementAttributeArray = CurrentElement.GetAttributes(); iNumberofAttributes = ElementAttributeArray.GetCount(); if (AttributeIndex <= iNumberofAttributes -1) AttributeName = ElementAttributeArray[AttributeIndex].GetStringValue(); else scriptAssertf(0, "Attribute does not exist cannot return a value"); return AttributeName; } //Checks the tree for a node with the same name. Its stops searching if the search gets back to the root node. bool CommandGotoXmlNode (const char* NodeName) { int iNumberOfNodes = CommandGetTotalNumberOfNodes (); bool bFoundNamedNode = false; parTreeNode* pTreeNode = CTheScripts::GetCurrentXmlTreeNode(); for (int i=0; iGetRoot()) { if (StringEquals(pTreeNode->GetElement().GetName(), NodeName)) { CTheScripts::SetCurrentXmlTreeNode(pTreeNode); bFoundNamedNode = true; break; } } else { //found the root node, check that we weren't searching for it and break the search if (StringEquals(pTreeNode->GetElement().GetName(), NodeName)) { CTheScripts::SetCurrentXmlTreeNode(pTreeNode); bFoundNamedNode = true; } break; } } return bFoundNamedNode; } const char* CommandGetStringFromXmlNode() { parTreeNode* pTreeNode = CTheScripts::GetCurrentXmlTreeNode(); if(pTreeNode) { return pTreeNode->GetData(); } return NULL; } #if !__FINAL #if BUGSTAR_INTEGRATION_ACTIVE class CBugstarQueryOp : public CScriptOp { public: void Init() { Assertf(m_query == NULL, "Cannot initialise a bugstar query while one is running"); m_queryString = BUGSTAR_GTA_PROJECT_PATH; } void AppendString(const char* pString) { Assertf(m_query == NULL, "Cannot initialise a bugstar query while one is running"); m_queryString += pString; } void Start() { Assertf(m_query == NULL, "Cannot start a bugstar query while one is running"); m_query = CBugstarIntegration::CreateHttpQuery(); scriptVerifyf(m_query->Init(m_queryString.c_str(), 30), "START_BUGSTAR_QUERY: Bugstar query initialisation failed"); m_queryString.Clear(); CTheScripts::GetScriptOpList().AddOp(this); } bool Pending() { return m_query?m_query->Pending():false; } bool Succeeded() { Assertf(m_query, "There is no bugstar query currently running"); bool rt = m_query->Succeeded(); if(!rt) m_query->WriteBufferToFile("restError.html"); return rt; } fwHttpQuery* GetQuery() { return m_query; } void Flush() { if(m_query) { while(m_query->Pending()) sysIpcSleep(100); delete m_query; } m_query = NULL; CTheScripts::GetScriptOpList().RemoveOp(this); } private: atString m_queryString; fwHttpQuery* m_query; } g_BugstarQueryOp; #endif //BUGSTAR_INTEGRATION_ACTIVE #if BUGSTAR_INTEGRATION_ACTIVE void StartBugstarQuery(const char* pQuery) #else void StartBugstarQuery(const char* ) #endif //BUGSTAR_INTEGRATION_ACTIVE { #if BUGSTAR_INTEGRATION_ACTIVE g_BugstarQueryOp.Init(); g_BugstarQueryOp.AppendString(pQuery); g_BugstarQueryOp.Start(); #endif } void CommandStartBugstarQueryAppend() { #if BUGSTAR_INTEGRATION_ACTIVE g_BugstarQueryOp.Init(); #endif } #if BUGSTAR_INTEGRATION_ACTIVE void CommandAddBugstarQueryString(const char* pQueryStringToAppend) #else void CommandAddBugstarQueryString(const char* ) #endif // BUGSTAR_INTEGRATION_ACTIVE { #if BUGSTAR_INTEGRATION_ACTIVE g_BugstarQueryOp.AppendString(pQueryStringToAppend); #endif } void CommandStopBugstarQueryAppend() { #if BUGSTAR_INTEGRATION_ACTIVE g_BugstarQueryOp.Start(); #endif } bool IsBugstarQueryPending() { #if BUGSTAR_INTEGRATION_ACTIVE return g_BugstarQueryOp.Pending(); #else return false; #endif } bool IsBugstarQuerySuccessful() { #if BUGSTAR_INTEGRATION_ACTIVE return g_BugstarQueryOp.Succeeded(); #else return false; #endif } bool CreateXmlFromBugstarQuery() { #if BUGSTAR_INTEGRATION_ACTIVE scriptAssertf(g_BugstarQueryOp.GetQuery(), "CREATE_XML_FROM_BUGSTAR_QUERY: There is no active Bugstar query"); bool bXmlFileLoaded = false; if (!CTheScripts::GetXmlTree()) { CTheScripts::SetXmlTree(g_BugstarQueryOp.GetQuery()->CreateTree()); if (CTheScripts::GetXmlTree()) { CTheScripts::SetCurrentXmlTreeNode(CTheScripts::GetXmlTree()->GetRoot()); //sets the current Node to the root bXmlFileLoaded = true; } else { scriptAssertf(0, "%s:%s", CTheScripts::GetCurrentScriptNameAndProgramCounter(), "CREATE_XML_FROM_BUGSTAR_QUERY - Failed to create XML from bugstar request"); } } else { scriptAssertf(0, "%s:%s", CTheScripts::GetCurrentScriptNameAndProgramCounter(), "CREATE_XML_FROM_BUGSTAR_QUERY - XML file already loaded"); } return bXmlFileLoaded; #else return false; #endif } void EndBugstarQuery() { #if BUGSTAR_INTEGRATION_ACTIVE g_BugstarQueryOp.Flush(); #endif } #endif //!__FINAL void SetupScriptCommands() { SCR_REGISTER_UNUSED(LOAD_XML_FILE,0x7308c3e9c183d6c0, CommandLoadXmlFile ); SCR_REGISTER_UNUSED(DELETE_XML_FILE,0x0bd0e389aee58784, CommandDeleteXmlFile ); SCR_REGISTER_UNUSED(GET_NUMBER_OF_XML_NODES,0x5fad86215aac9ea2, CommandGetTotalNumberOfNodes ); SCR_REGISTER_UNUSED(GET_NEXT_XML_NODE,0x21079b91ee2d85f2, CommandGetNextNode ); SCR_REGISTER_UNUSED(GET_XML_NODE_NAME,0xf9963e233c5e633e, GetNodeName ); SCR_REGISTER_UNUSED(GET_NUMBER_OF_XML_NODE_ATTRIBUTES,0x41f2cfe090a1a1db, GetNumberOfNodeAttributes); SCR_REGISTER_UNUSED(GET_XML_NODE_ATTRIBUTE_NAME,0x8a56188e381d0998, GetAttributeName); SCR_REGISTER_UNUSED(GET_INT_FROM_XML_NODE_ATTRIBUTE,0x6bad273237de4c31, GetAttributeIntValue); SCR_REGISTER_UNUSED(GET_FLOAT_FROM_XML_NODE_ATTRIBUTE,0x14765a123105f84a, GetAttributeFloatValue); SCR_REGISTER_UNUSED(GET_BOOL_FROM_XML_NODE_ATTRIBUTE,0x6306cd55f1405357, GetAttributeBoolValue); SCR_REGISTER_UNUSED(GET_STRING_FROM_XML_NODE_ATTRIBUTE,0xcf604d18b5efa5d9, GetAttributeStringValue); SCR_REGISTER_UNUSED(GET_XML_NAMED_NODE,0x17e1549cfee24ed6, CommandGotoXmlNode); SCR_REGISTER_UNUSED(GET_STRING_FROM_XML_NODE,0x587b900010500f5b,CommandGetStringFromXmlNode); SCR_REGISTER_UNUSED(START_BUGSTAR_QUERY,0x0e1e1bbdc37a34dd, StartBugstarQuery ); SCR_REGISTER_UNUSED(START_BUGSTAR_QUERY_APPEND,0xb45235d37b79e86b, CommandStartBugstarQueryAppend); SCR_REGISTER_UNUSED(ADD_BUGSTAR_QUERY_STRING,0x09a683fe4e043ff3, CommandAddBugstarQueryString); SCR_REGISTER_UNUSED(STOP_BUGSTAR_QUERY_APPEND,0x76d2065d217e0ef4, CommandStopBugstarQueryAppend); SCR_REGISTER_UNUSED(IS_BUGSTAR_QUERY_PENDING,0x4ebd295719063987, IsBugstarQueryPending ); SCR_REGISTER_UNUSED(IS_BUGSTAR_QUERY_SUCCESSFUL,0xed5ea3222ddbfb65, IsBugstarQuerySuccessful ); SCR_REGISTER_UNUSED(END_BUGSTAR_QUERY,0xf7417c99b0730709, EndBugstarQuery ); SCR_REGISTER_UNUSED(CREATE_XML_FROM_BUGSTAR_QUERY,0xc128000fc02572f2, CreateXmlFromBugstarQuery ); } } // namespace xml_commands