callExtension: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(wip)
(wip)
Line 17: Line 17:
Each error will have entry in .rpt file with more details.
Each error will have entry in .rpt file with more details.
<br><br>
<br><br>
<spoiler show="show_message">spoiler_text</spoiler>
 
|= Description
|= Description
____________________________________________________________________________________________
____________________________________________________________________________________________
Line 43: Line 43:
|x1= <code>_return = "myExtension" [[callExtension]] "stringToBeParsed";</code>|= EXAMPLE1  
|x1= <code>_return = "myExtension" [[callExtension]] "stringToBeParsed";</code>|= EXAMPLE1  


|x2= <code>_result = "text_extension" callExtension ["fnc1", [[getUnitLoadout]] [[player]]];</code>
"test_extension" source code:
<syntaxhighlight lang=cpp>
#include <string>
#include <vector>
#include <iterator>
#include <sstream>
extern "C"
{
//--- STRING callExtension STRING
__declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function);
//--- STRING callExtension ARRAY
__declspec (dllexport) int __stdcall RVExtensionArgs(char *output, int outputSize, const char *function, const char **args, int argsCnt);
}
//--- name callExtension function
void __stdcall RVExtension(char *output, int outputSize, const char *function)
{
std::string str = function;
strncpy_s(output, outputSize, ("Input Was: " + str).c_str(), _TRUNCATE);
}
//--- name callExtension [function, args]
int __stdcall RVExtensionArgs(char *output, int outputSize, const char *function, const char **args, int argsCnt)
{
if (strcmp(function, "fnc1") == 0)
{
//--- Manually assemble output array
int i = 0;
std::string str = "[";
//--- Each argument can be accessed via args[n]
if (argsCnt > 0)
str += args[i++];
while (i < argsCnt)
{
str += ",";
str += args[i++];
}
str += "]";
//--- Extension result
strncpy_s(output, outputSize, str.c_str(), _TRUNCATE);
//--- Extension return code
return 100;
}
else if (strcmp(function, "fnc2") == 0)
{
//--- Parse args into vector
std::vector<std::string> vec(args, std::next(args, argsCnt));
std::ostringstream oss;
if (!vec.empty())
{
//--- Assemble output array
std::copy(vec.begin(), vec.end() - 1, std::ostream_iterator<std::string>(oss, ","));
oss << vec.back();
}
//--- Extension result
strncpy_s(output, outputSize, ("[" + oss.str() + "]").c_str(), _TRUNCATE);
//--- Extension return code
return 200;
}
else
{
strncpy_s(output, outputSize, "Avaliable Functions: fnc1, fnc2", outputSize - 1);
return -1;
}
}
</syntaxhighlight>|=
____________________________________________________________________________________________
____________________________________________________________________________________________



Revision as of 23:37, 25 January 2017

Hover & click on the images for description

Description

Description:
Calls custom .dll also known as Extension.

Since Arma 3 v1.67 it is possible to pass array of arguments to extension.
Possible error codes:
  • 101: SYNTAX_ERROR_WRONG_PARAMS_SIZE
  • 102: SYNTAX_ERROR_WRONG_PARAMS_TYPE
  • 201: PARAMS_ERROR_TOO_MANY_ARGS
  • 301: EXECUTION_WARNING_TAKES_TOO_LONG
Each error will have entry in .rpt file with more details.

Groups:
Uncategorised

Syntax

Syntax:
extension callExtension function
Parameters:
extension: String - extension name
function: String - data send to the extension
Return Value:
String - data sent back from extension

Alternative Syntax

Syntax:
extension callExtension [command, arguments]         (Since Arma 3 v1.67)
Parameters:
extension: String - extension name
[command, arguments]: Array - callExtension params
command: String - extension command
arguments: Array - command arguments. Could be array of anything but each element will be converted to String automatically.
Return Value:
Array - in format [result, returnCode, errorCode], where:
  • result: String - data sent back from extension. It is up to extension maker what it is.
  • returnCode: Number - integer return from extension method. It is up to extension maker to define it.
  • errorCode: Number - error code in case of command error (see description). 0 means no errors.

Examples

Example 1:
_return = "myExtension" callExtension "stringToBeParsed";
Example 2:
_result = "text_extension" callExtension ["fnc1", getUnitLoadout player]; "test_extension" source code:
#include <string>
#include <vector>
#include <iterator>
#include <sstream>

extern "C"
{
	//--- STRING callExtension STRING
	__declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function);
	//--- STRING callExtension ARRAY
	__declspec (dllexport) int __stdcall RVExtensionArgs(char *output, int outputSize, const char *function, const char **args, int argsCnt);
}

//--- name callExtension function
void __stdcall RVExtension(char *output, int outputSize, const char *function)
{
	std::string str = function;
	strncpy_s(output, outputSize, ("Input Was: " + str).c_str(), _TRUNCATE);
}

//--- name callExtension [function, args]
int __stdcall RVExtensionArgs(char *output, int outputSize, const char *function, const char **args, int argsCnt)
{
	if (strcmp(function, "fnc1") == 0)
	{
		//--- Manually assemble output array
		int i = 0;
		std::string str = "[";

		//--- Each argument can be accessed via args[n]
		if (argsCnt > 0)
			str += args[i++];

		while (i < argsCnt)
		{
			str += ",";
			str += args[i++];
		}

		str += "]";

		//--- Extension result
		strncpy_s(output, outputSize, str.c_str(), _TRUNCATE);

		//--- Extension return code
		return 100;
	}

	else if (strcmp(function, "fnc2") == 0)
	{
		//--- Parse args into vector
		std::vector<std::string> vec(args, std::next(args, argsCnt));

		std::ostringstream oss;
		if (!vec.empty())
		{
			//--- Assemble output array
			std::copy(vec.begin(), vec.end() - 1, std::ostream_iterator<std::string>(oss, ","));
			oss << vec.back();
		}

		//--- Extension result
		strncpy_s(output, outputSize, ("[" + oss.str() + "]").c_str(), _TRUNCATE);

		//--- Extension return code
		return 200;
	}

	else
	{
		strncpy_s(output, outputSize, "Avaliable Functions: fnc1, fnc2", outputSize - 1);
		return -1;
	}
}

Additional Information

See also:
callcompileparseSimpleArrayExtensions

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note

Notes

Bottom Section