diff --git a/SpeckleConnector/Connector.vcxproj b/SpeckleConnector/Connector.vcxproj index b00b5d6..b23699d 100644 --- a/SpeckleConnector/Connector.vcxproj +++ b/SpeckleConnector/Connector.vcxproj @@ -113,6 +113,7 @@ + @@ -140,6 +141,7 @@ + diff --git a/SpeckleConnector/Connector.vcxproj.filters b/SpeckleConnector/Connector.vcxproj.filters index 70ab169..5ce1529 100644 --- a/SpeckleConnector/Connector.vcxproj.filters +++ b/SpeckleConnector/Connector.vcxproj.filters @@ -143,6 +143,9 @@ Connector\Interface\Browser\Bridge\Test\Arg + + Connector\Interface\Browser\Bridge\Test + @@ -223,5 +226,8 @@ Connector\Interface\Browser\Bridge\Test\Arg + + Connector\Interface\Browser\Bridge\Test + \ No newline at end of file diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/Arg/ComplexType.cpp b/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/Arg/ComplexType.cpp index 746e043..8bccce4 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/Arg/ComplexType.cpp +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/Arg/ComplexType.cpp @@ -19,7 +19,7 @@ namespace { ///Serialisation field IDs static std::array fieldID = { - Identity{"Id"}, + Identity{"id"}, Identity{"count"}, Identity{"thisIsABoolean"}, }; @@ -40,8 +40,8 @@ struct std::hash { --------------------------------------------------------------------*/ ComplexType::ComplexType() { //This is the required test values - ID = String{std::hash()(*this)} + " - I am a string"; count = static_cast(std::hash()(*this)); + ID = String{count} + " - I am a string"; } //ComplexType::ComplexType @@ -56,9 +56,9 @@ bool ComplexType::fillInventory(Inventory& inventory) const { using enum Entry::Type; inventory.merge(Inventory{ { - { fieldID[unID], unID, element }, - { fieldID[countID], countID, element }, - { fieldID[isTestID], isTestID, element }, + { fieldID[unID], unID, element, !ID.empty() }, + { fieldID[countID], countID, element, count != 0 }, + { fieldID[isTestID], isTestID, element, testBool }, }, }.withType(&typeid(ComplexType))); return true; diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/SayHi.h b/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/SayHi.h index b6e0fb5..a78bf5e 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/SayHi.h +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/SayHi.h @@ -7,7 +7,7 @@ namespace connector::interfac::browser::bridge { ///Argument for the parameters of a test message - using SayHiWrapper = speckle::interfac::browser::bridge::JSArgType; + using SayHiWrapper = speckle::interfac::browser::bridge::JSArgType; /*! JS Function class to return a test message based on sample data diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/TriggerEvent.cpp b/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/TriggerEvent.cpp index ed3d918..9fe7238 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/TriggerEvent.cpp +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Test/TriggerEvent.cpp @@ -4,6 +4,8 @@ #include "Active/Serialise/Item/Wrapper/ValueWrap.h" #include "Speckle/Interface/Browser/Bridge/BrowserBridge.h" +#include + using namespace active::serialise; using namespace active::setting; using namespace connector::interfac::browser::bridge; diff --git a/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgument.h b/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgument.h index 5cb8ffa..a424383 100644 --- a/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgument.h +++ b/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgument.h @@ -57,6 +57,12 @@ namespace speckle::interfac::browser::bridge { @return True if the argument contains an error */ bool hasError() const { return m_errorMessage.operator bool(); } + /*! + Get the number of parameters in the argument + @return The number of parameters + */ + virtual uint32_t parameterCount() const { return 1; } + /*! Get any error message relating to the arguments @return The error message (nullopt if no errors occurred) @@ -92,7 +98,7 @@ namespace speckle::interfac::browser::bridge { }; ///Definition of the argument for a JS callable method (enclosing the local function argument) - template + template class JSArgType : public BridgeArgument { public: @@ -115,6 +121,11 @@ namespace speckle::interfac::browser::bridge { */ JSArgType(const JSArgType& source) : BridgeArgument{source}, value{source.value} {} + /*! + Get the number of parameters in the argument + @return The number of parameters + */ + uint32_t parameterCount() const override { return Params; } /*! Fill an inventory with the cargo items @param inventory The inventory to receive the cargo items diff --git a/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgumentWrap.cpp b/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgumentWrap.cpp index 7fc73eb..7ab331c 100644 --- a/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgumentWrap.cpp +++ b/SpeckleLib/Speckle/Interface/Browser/Bridge/BridgeArgumentWrap.cpp @@ -5,6 +5,7 @@ #include "Active/Serialise/Package/Wrapper/ValueSettingWrap.h" #include "Active/Serialise/JSON/JSONTransport.h" #include "Active/Utility/BufferIn.h" +#include "Speckle/Utility/Exception.h" using namespace active::serialise; using namespace active::serialise::json; @@ -133,22 +134,32 @@ std::unique_ptr BridgeArgumentWrap::makeArgument(const String& m if (auto maker = m_argumentFactory.find(methodID); (maker != m_argumentFactory.end())) { if (auto result = reinterpret_cast(maker->second(methodID, requestID)); result != nullptr) { try { - //The argument is passed as an array of stringified JSON - first unpack the array - JSONTransport transport{Transport::Policy::verbose}; + //The argument is passed as an array of stringified JSON - first unpack the array + JSONTransport transport; ValueSetting args; transport.receive(ValueSettingWrap{args}, Identity{}, argument); - //Then unify the argument strings into a single JSON argument - String unifiedArgument{"{"}; - int32_t argIndex = 0; - bool isFirst = true; - for (auto& arg : args.operator std::vector()) { - if (isFirst) - isFirst = false; - else - unifiedArgument += ","; - unifiedArgument += "\"" + String{argIndex++} + "\":" + JSONTransport::convertFromJSONString(arg); + if (args.size() != result->parameterCount()) + throw Exception{"Function called with wrong number of parameters"}; + String unifiedArgument; + if (dynamic_cast(result) != nullptr) { + //Unify the argument strings into a single JSON argument + unifiedArgument = "{"; + int32_t argIndex = 0; + bool isFirst = true; + for (auto& arg : args.operator std::vector()) { + if (isFirst) + isFirst = false; + else + unifiedArgument += ","; + unifiedArgument += "\"" + String{argIndex++} + "\":" + JSONTransport::convertFromJSONString(arg); + } + unifiedArgument += "}"; + } else { + //An item can only receive a single parameter + if (args.size() > 1) + throw Exception{"Function called with wrong number of parameters"}; + unifiedArgument = args; } - unifiedArgument += "}"; //And receive the unified argument into the method argument transport.receive(std::forward(*result), Identity{}, unifiedArgument); return std::unique_ptr{result}; diff --git a/SpeckleLib/Speckle/Interface/Browser/Bridge/Functions/FunctionBinding.h b/SpeckleLib/Speckle/Interface/Browser/Bridge/Functions/FunctionBinding.h deleted file mode 100644 index ff9684f..0000000 --- a/SpeckleLib/Speckle/Interface/Browser/Bridge/Functions/FunctionBinding.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef SPECKLE_INTERFACE_BRIDGE_FUNCTION_BINDING -#define SPECKLE_INTERFACE_BRIDGE_FUNCTION_BINDING - -#include "Speckle/Interface/Browser/JSBinding.h" - -#ifdef ARCHICAD -#include "Speckle/Serialise/JSBase/JSBaseTransport.h" - -#include -#include -#else -#include "Active/Serialise/JSON/JSONTransport.h" -#endif - -namespace speckle::interfac::browser::bridge { - - ///Define the bridge binding protocols according to platform (argument/result serialisation and transport for (de)serialisation) -#ifdef ARCHICAD - //Archicad uses a proprietary JS::Base type for JS values - using PlatformBinding = JSBinding, speckle::serialise::jsbase::JSBaseTransport>; -#else - //All others will use JSON (in a String) - using PlatformBinding = JSBinding; -#endif - -} - -#endif //SPECKLE_INTERFACE_BRIDGE_FUNCTION_BINDING diff --git a/SpeckleLib/Speckle/Interface/Browser/Bridge/Functions/GetCallResult.cpp b/SpeckleLib/Speckle/Interface/Browser/Bridge/Functions/GetCallResult.cpp index d8a7f10..464e9b2 100644 --- a/SpeckleLib/Speckle/Interface/Browser/Bridge/Functions/GetCallResult.cpp +++ b/SpeckleLib/Speckle/Interface/Browser/Bridge/Functions/GetCallResult.cpp @@ -38,12 +38,8 @@ std::unique_ptr GetCallResult::getResult(WrappedResultArg& arg if (!hasBridge()) return nullptr; //Retrieve the requested result -<<<<<<< Updated upstream using namespace json; - auto result = m_bridge.releaseResult(argument); -======= auto result = getBridge()->releaseResult(argument); ->>>>>>> Stashed changes auto item = dynamic_cast(result.get()); if (!item) return nullptr; diff --git a/SpeckleLib/SpeckleLib17.vcxproj b/SpeckleLib/SpeckleLib17.vcxproj index e18fa3f..bb63d76 100644 --- a/SpeckleLib/SpeckleLib17.vcxproj +++ b/SpeckleLib/SpeckleLib17.vcxproj @@ -27,17 +27,17 @@ + + + + + - + - - - - - @@ -57,13 +57,13 @@ + + - - diff --git a/SpeckleLib/SpeckleLib17.vcxproj.filters b/SpeckleLib/SpeckleLib17.vcxproj.filters index dc5655b..17b945d 100644 --- a/SpeckleLib/SpeckleLib17.vcxproj.filters +++ b/SpeckleLib/SpeckleLib17.vcxproj.filters @@ -106,19 +106,7 @@ Speckle\Interface\Browser\Bridge - - Speckle\Interface\Browser\Bridge - - - Speckle\Interface\Browser\Bridge - - - Speckle\Interface\Browser\Bridge - - - Speckle\Interface\Browser\Bridge - - + Speckle\Interface\Browser\Bridge\Functions @@ -145,7 +133,19 @@ Speckle\Interface\Browser\Bridge\Functions - + + Speckle\Interface\Browser\Bridge + + + Speckle\Interface\Browser\Bridge + + + Speckle\Interface\Browser\Bridge + + + Speckle\Interface\Browser\Bridge + + Speckle\Interface\Browser\Bridge @@ -171,12 +171,6 @@ Speckle\Interface\Browser\Bridge - - Speckle\Interface\Browser\Bridge - - - Speckle\Interface\Browser\Bridge - Speckle\Interface\Browser\Bridge\Functions @@ -198,6 +192,12 @@ Speckle\Interface\Browser\Bridge\Functions + + Speckle\Interface\Browser\Bridge + + + Speckle\Interface\Browser\Bridge +