Compare commits

..

1 Commits

Author SHA1 Message Date
Jedd Morgan b17d3d6d64 escape buildresAC.bat 2024-08-22 20:06:20 +01:00
159 changed files with 935 additions and 10518 deletions
+2 -7
View File
@@ -9,10 +9,8 @@ xcuserdata/
x64/
.DS_Store
.cache/
SpeckleConnector/Documentation/*
!SpeckleConnector/Documentation/Doxyfile
SpeckleLib/Documentation/*
!SpeckleLib/Documentation/Doxyfile
Documentation/*
!Documentation/Doxyfile
CMakeCache.txt
_deps/
CMakeFiles/
@@ -23,6 +21,3 @@ CMakeFiles/
XCBuildData/
**/*.xcsettings
*.log
.idea
*.mui
*.aps
+10 -57
View File
@@ -93,90 +93,43 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="Connector\Connector.cpp" />
<ClCompile Include="Connector\Database\ModelCardDatabase.cpp" />
<ClCompile Include="Connector\Database\Model\Card\ModelCardDatabase.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Account\AccountBridge.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Account\GetAccounts.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\AddModel.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\Arg\DocumentInfo.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\BaseBridge.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\DocumentInfo.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetConnectorVersion.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetDocumentInfo.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetDocumentState.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationName.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationVersion.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\ConfigBridge.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\ConnectorConfig.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetConfig.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\UpdateConfig.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\GetSendFilters.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Send.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\SendBridge.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\Arg\SayHiArg.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\GetComplexType.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\GoAway.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\SayHi.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TestBridge.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.cpp" />
<ClCompile Include="Connector\Interface\ConnectorMenu.cpp" />
<ClCompile Include="Connector\Interface\ConnectorPalette.cpp" />
<ClCompile Include="Connector\Record\Model\CardMover.cpp" />
<ClCompile Include="Connector\Record\Model\CardSetting.cpp" />
<ClCompile Include="Connector\Record\Model\Filter\DirectSelectionSendFilter.cpp" />
<ClCompile Include="Connector\Record\Model\Filter\EverythingSendFilter.cpp" />
<ClCompile Include="Connector\Record\Model\Filter\FilterMover.cpp" />
<ClCompile Include="Connector\Record\Model\Filter\SendFilter.cpp" />
<ClCompile Include="Connector\Record\Model\ModelCard.cpp" />
<ClCompile Include="Connector\Record\Model\ReceiverModelCard.cpp" />
<ClCompile Include="Connector\Record\Model\SenderModelCard.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Connector\Connector.h" />
<ClInclude Include="Connector\ConnectorResource.h" />
<ClInclude Include="Connector\Database\Identity\RecordID.h" />
<ClInclude Include="Connector\Database\ModelCardDatabase.h" />
<ClInclude Include="Connector\Database\Model\Card\ModelCardDatabase.h" />
<ClInclude Include="Connector\Event\ConnectorEventID.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Account\AccountBridge.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Account\GetAccounts.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\AddModel.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\Arg\DocumentInfo.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\BaseBridge.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\DocumentInfo.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetConnectorVersion.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetDocumentInfo.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetDocumentState.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationName.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationVersion.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\ConfigBridge.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\ConnectorConfig.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetConfig.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\UpdateConfig.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\GetSendFilters.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Send.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\SendBridge.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\Arg\SayHiArg.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\GetComplexType.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\GoAway.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\SayHi.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TestBridge.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.h" />
<ClInclude Include="Connector\Interface\ConnectorMenu.h" />
<ClInclude Include="Connector\Interface\ConnectorPalette.h" />
<ClInclude Include="Connector\Record\Model\CardMover.h" />
<ClInclude Include="Connector\Record\Model\CardSetting.h" />
<ClInclude Include="Connector\Record\Model\Filter\ArchicadEverythingFilter.h" />
<ClInclude Include="Connector\Record\Model\Filter\ArchicadSelectionFilter.h" />
<ClInclude Include="Connector\Record\Model\Filter\DirectSelectionSendFilter.h" />
<ClInclude Include="Connector\Record\Model\Filter\EverythingSendFilter.h" />
<ClInclude Include="Connector\Record\Model\Filter\FilterMover.h" />
<ClInclude Include="Connector\Record\Model\Filter\SendFilter.h" />
<ClInclude Include="Connector\Record\Model\ModelCard.h" />
<ClInclude Include="Connector\Record\Model\ReceiverModelCard.h" />
<ClInclude Include="Connector\Record\Model\SenderModelCard.h" />
<ClInclude Include="Connector\Version.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
@@ -611,7 +564,7 @@ CALL "$(ProjectDir)..\SpeckleLib\Make.win\install.bat"</Command>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>
</SDLCheck>
<PreprocessorDefinitions>TESTING_MODE;DEBUG;ARCHICAD;WIN32;_WINDOWS;WINDOWS;AddOn_EXPORTS;ACExtension;_STLP_DONT_FORCE_MSVC_LIB_NAME;_USRDLL;_WIN_EXTERNAL_;_WINDLL;_CRT_SECURE_NO_WARNINGS;_SILENCE_ALL_CXX20_DEPRECATION_WARNINGS;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ARCHICAD;WIN32;_WINDOWS;WINDOWS;AddOn_EXPORTS;ACExtension;_STLP_DONT_FORCE_MSVC_LIB_NAME;_USRDLL;_WIN_EXTERNAL_;_WINDLL;_CRT_SECURE_NO_WARNINGS;_SILENCE_ALL_CXX20_DEPRECATION_WARNINGS;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>false</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>
@@ -640,7 +593,7 @@ CALL "$(ProjectDir)..\SpeckleLib\Make.win\install.bat"</Command>
</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<TreatLinkerWarningAsErrors>false</TreatLinkerWarningAsErrors>
<AdditionalDependencies>$(HEADER_PATH_5)\Lib\ACAP_STATD.lib;$(HEADER_PATH_5)\Modules\DGGraphix\Win\DGGraphixImp.LIB;$(HEADER_PATH_5)\Modules\DGLib\Win\DGImp.lib;$(HEADER_PATH_5)\Modules\Geometry\Win\GeometryImp.LIB;$(HEADER_PATH_5)\Modules\Graphix\Win\GraphixImp.LIB;$(HEADER_PATH_5)\Modules\GSModeler\Win\GSModelerImp.LIB;$(HEADER_PATH_5)\Modules\GSRoot\Win\GSRootImp.lib;$(HEADER_PATH_5)\Modules\GXImage\Win\GXImageImp.lib;$(HEADER_PATH_5)\Modules\GXImageBase\Win\GXImageBaseImp.lib;$(HEADER_PATH_5)\Modules\GX\Win\GXImp.LIB;$(HEADER_PATH_5)\Modules\InputOutput\Win\InputOutputImp.lib;$(HEADER_PATH_5)\Modules\RS\Win\RSImp.LIB;$(HEADER_PATH_5)\Modules\TextEngine\Win\TextEngineImp.LIB;$(HEADER_PATH_5)\Modules\UCLib\Win\UCImp.lib;$(HEADER_PATH_5)\Modules\UDLib\Win\UDImp.lib;$(HEADER_PATH_5)\Modules\VBElemDialogs\Win\VBElemDialogsImp.LIB;$(HEADER_PATH_5)\Modules\VectorImage\Win\VectorImageImp.LIB;$(HEADER_PATH_5)\Modules\JavascriptEngine\Win\JavascriptEngineImp.LIB;$(HEADER_PATH_5)\Modules\JSON\Win\JSONImp.LIB;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>$(HEADER_PATH_5)\Lib\ACAP_STATD.lib;$(HEADER_PATH_5)\Modules\DGGraphix\Win\DGGraphixImp.LIB;$(HEADER_PATH_5)\Modules\DGLib\Win\DGImp.lib;$(HEADER_PATH_5)\Modules\Geometry\Win\GeometryImp.LIB;$(HEADER_PATH_5)\Modules\Graphix\Win\GraphixImp.LIB;$(HEADER_PATH_5)\Modules\GSModeler\Win\GSModelerImp.LIB;$(HEADER_PATH_5)\Modules\GSRoot\Win\GSRootImp.lib;$(HEADER_PATH_5)\Modules\GXImage\Win\GXImageImp.lib;$(HEADER_PATH_5)\Modules\GXImageBase\Win\GXImageBaseImp.lib;$(HEADER_PATH_5)\Modules\GX\Win\GXImp.LIB;$(HEADER_PATH_5)\Modules\InputOutput\Win\InputOutputImp.lib;$(HEADER_PATH_5)\Modules\RS\Win\RSImp.LIB;$(HEADER_PATH_5)\Modules\TextEngine\Win\TextEngineImp.LIB;$(HEADER_PATH_5)\Modules\UCLib\Win\UCImp.lib;$(HEADER_PATH_5)\Modules\UDLib\Win\UDImp.lib;$(HEADER_PATH_5)\Modules\VBElemDialogs\Win\VBElemDialogsImp.LIB;$(HEADER_PATH_5)\Modules\VectorImage\Win\VectorImageImp.LIB;$(HEADER_PATH_5)\Modules\JavascriptEngine\Win\JavascriptEngineImp.LIB;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreAllDefaultLibraries>
</IgnoreAllDefaultLibraries>
<IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries>
@@ -798,7 +751,7 @@ CALL "$(ProjectDir)..\SpeckleLib\Make.win\install.bat"</Command>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>
</SDLCheck>
<PreprocessorDefinitions>NDEBUG;ARCHICAD;WIN32;_WINDOWS;WINDOWS;AddOn_EXPORTS;ACExtension;_USRDLL;_WIN_EXTERNAL_;_WINDLL;_CRT_SECURE_NO_WARNINGS;_SILENCE_ALL_CXX20_DEPRECATION_WARNINGS;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>ARCHICAD;WIN32;_WINDOWS;WINDOWS;AddOn_EXPORTS;ACExtension;_USRDLL;_WIN_EXTERNAL_;_WINDLL;_CRT_SECURE_NO_WARNINGS;_SILENCE_ALL_CXX20_DEPRECATION_WARNINGS;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>
@@ -828,7 +781,7 @@ CALL "$(ProjectDir)..\SpeckleLib\Make.win\install.bat"</Command>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<TreatLinkerWarningAsErrors>false</TreatLinkerWarningAsErrors>
<AdditionalDependencies>$(HEADER_PATH_5)\Lib\ACAP_STAT.lib;$(HEADER_PATH_5)\Modules\DGGraphix\Win\DGGraphixImp.LIB;$(HEADER_PATH_5)\Modules\DGLib\Win\DGImp.lib;$(HEADER_PATH_5)\Modules\Geometry\Win\GeometryImp.LIB;$(HEADER_PATH_5)\Modules\Graphix\Win\GraphixImp.LIB;$(HEADER_PATH_5)\Modules\GSModeler\Win\GSModelerImp.LIB;$(HEADER_PATH_5)\Modules\GSRoot\Win\GSRootImp.lib;$(HEADER_PATH_5)\Modules\GXImage\Win\GXImageImp.lib;$(HEADER_PATH_5)\Modules\GXImageBase\Win\GXImageBaseImp.lib;$(HEADER_PATH_5)\Modules\GX\Win\GXImp.LIB;$(HEADER_PATH_5)\Modules\InputOutput\Win\InputOutputImp.lib;$(HEADER_PATH_5)\Modules\RS\Win\RSImp.LIB;$(HEADER_PATH_5)\Modules\TextEngine\Win\TextEngineImp.LIB;$(HEADER_PATH_5)\Modules\UCLib\Win\UCImp.lib;$(HEADER_PATH_5)\Modules\UDLib\Win\UDImp.lib;$(HEADER_PATH_5)\Modules\VBElemDialogs\Win\VBElemDialogsImp.LIB;$(HEADER_PATH_5)\Modules\VectorImage\Win\VectorImageImp.LIB;$(HEADER_PATH_5)\Modules\JavascriptEngine\Win\JavascriptEngineImp.LIB;$(HEADER_PATH_5)\Modules\JSON\Win\JSONImp.LIB;msvcrt.lib;msvcprt.lib;IPHLPAPI.lib;Wininet.lib;Dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>$(HEADER_PATH_5)\Lib\ACAP_STAT.lib;$(HEADER_PATH_5)\Modules\DGGraphix\Win\DGGraphixImp.LIB;$(HEADER_PATH_5)\Modules\DGLib\Win\DGImp.lib;$(HEADER_PATH_5)\Modules\Geometry\Win\GeometryImp.LIB;$(HEADER_PATH_5)\Modules\Graphix\Win\GraphixImp.LIB;$(HEADER_PATH_5)\Modules\GSModeler\Win\GSModelerImp.LIB;$(HEADER_PATH_5)\Modules\GSRoot\Win\GSRootImp.lib;$(HEADER_PATH_5)\Modules\GXImage\Win\GXImageImp.lib;$(HEADER_PATH_5)\Modules\GXImageBase\Win\GXImageBaseImp.lib;$(HEADER_PATH_5)\Modules\GX\Win\GXImp.LIB;$(HEADER_PATH_5)\Modules\InputOutput\Win\InputOutputImp.lib;$(HEADER_PATH_5)\Modules\RS\Win\RSImp.LIB;$(HEADER_PATH_5)\Modules\TextEngine\Win\TextEngineImp.LIB;$(HEADER_PATH_5)\Modules\UCLib\Win\UCImp.lib;$(HEADER_PATH_5)\Modules\UDLib\Win\UDImp.lib;$(HEADER_PATH_5)\Modules\VBElemDialogs\Win\VBElemDialogsImp.LIB;$(HEADER_PATH_5)\Modules\VectorImage\Win\VectorImageImp.LIB;$(HEADER_PATH_5)\Modules\JavascriptEngine\Win\JavascriptEngineImp.LIB;msvcrt.lib;msvcprt.lib;IPHLPAPI.lib;Wininet.lib;Dbghelp.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(HEADER_PATH_5)\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<IgnoreAllDefaultLibraries>
</IgnoreAllDefaultLibraries>
+20 -178
View File
@@ -32,32 +32,11 @@
<Filter Include="Connector\Database">
<UniqueIdentifier>{2f459f56-86f0-4794-b4b7-1bd7b8ee5617}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Config\Arg">
<UniqueIdentifier>{6a2f1f18-a554-4546-bba3-314d5f2ec9f9}</UniqueIdentifier>
<Filter Include="Connector\Database\Model">
<UniqueIdentifier>{2820ad4f-60d9-436e-a7a2-d019d7e0ce0c}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Base\Arg">
<UniqueIdentifier>{d74446ad-e141-48ac-9fa0-8b82279bbdbf}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Test">
<UniqueIdentifier>{9976ca16-8f99-44a2-b596-b81df82d847a}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Test\Arg">
<UniqueIdentifier>{1656a0df-aa39-4f41-860f-7b278b31784a}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Send">
<UniqueIdentifier>{2b87cf11-87cd-435f-ab24-42170c2e657e}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Database\Identity">
<UniqueIdentifier>{41395ee2-50f3-49c0-8859-23a3ad19a2fa}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Record">
<UniqueIdentifier>{a915e7ee-849f-48a9-aa7b-0ef6e358bee7}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Record\Model">
<UniqueIdentifier>{2b16c188-1d80-4d4d-830e-5c1e56ecf46e}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Record\Model\Filter">
<UniqueIdentifier>{b6d6326c-77f4-414a-bda6-e3e587c7ded2}</UniqueIdentifier>
<Filter Include="Connector\Database\Model\Card">
<UniqueIdentifier>{85935d00-16ac-466a-a614-ad9ea802bffa}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
@@ -101,6 +80,9 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\ConfigBridge.cpp">
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\ConnectorConfig.cpp">
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetConfig.cpp">
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
</ClCompile>
@@ -110,6 +92,9 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\BaseBridge.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\DocumentInfo.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetConnectorVersion.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
@@ -125,78 +110,8 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationVersion.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.cpp">
<Filter>Connector\Interface\Browser\Bridge\Config\Arg</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\Arg\DocumentInfo.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base\Arg</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\GetComplexType.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\GoAway.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\SayHi.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TestBridge.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\Arg\SayHiArg.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test\Arg</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.cpp">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\SendBridge.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Send.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\GetSendFilters.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClCompile>
<ClCompile Include="Connector\Database\ModelCardDatabase.cpp">
<Filter>Connector\Database</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\CardMover.cpp">
<Filter>Connector\Record\Model</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\CardSetting.cpp">
<Filter>Connector\Record\Model</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\ModelCard.cpp">
<Filter>Connector\Record\Model</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\ReceiverModelCard.cpp">
<Filter>Connector\Record\Model</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\SenderModelCard.cpp">
<Filter>Connector\Record\Model</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\Filter\DirectSelectionSendFilter.cpp">
<Filter>Connector\Record\Model\Filter</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\Filter\EverythingSendFilter.cpp">
<Filter>Connector\Record\Model\Filter</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\Filter\FilterMover.cpp">
<Filter>Connector\Record\Model\Filter</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Model\Filter\SendFilter.cpp">
<Filter>Connector\Record\Model\Filter</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\AddModel.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
<ClCompile Include="Connector\Database\Model\Card\ModelCardDatabase.cpp">
<Filter>Connector\Database\Model\Card</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@@ -221,6 +136,9 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\ConfigBridge.h">
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\ConnectorConfig.h">
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetConfig.h">
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
</ClInclude>
@@ -230,6 +148,9 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\BaseBridge.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\DocumentInfo.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetConnectorVersion.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
@@ -251,87 +172,8 @@
<ClInclude Include="Connector\Version.h">
<Filter>Connector</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.h">
<Filter>Connector\Interface\Browser\Bridge\Config\Arg</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\Arg\DocumentInfo.h">
<Filter>Connector\Interface\Browser\Bridge\Base\Arg</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\GetComplexType.h">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\GoAway.h">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\SayHi.h">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TestBridge.h">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\Arg\SayHiArg.h">
<Filter>Connector\Interface\Browser\Bridge\Test\Arg</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.h">
<Filter>Connector\Interface\Browser\Bridge\Test</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\SendBridge.h">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Send.h">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\GetSendFilters.h">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClInclude>
<ClInclude Include="Connector\Database\ModelCardDatabase.h">
<Filter>Connector\Database</Filter>
</ClInclude>
<ClInclude Include="Connector\Database\Identity\RecordID.h">
<Filter>Connector\Database\Identity</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\CardMover.h">
<Filter>Connector\Record\Model</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\CardSetting.h">
<Filter>Connector\Record\Model</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\ModelCard.h">
<Filter>Connector\Record\Model</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\ReceiverModelCard.h">
<Filter>Connector\Record\Model</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\SenderModelCard.h">
<Filter>Connector\Record\Model</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\Filter\ArchicadEverythingFilter.h">
<Filter>Connector\Record\Model\Filter</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\Filter\ArchicadSelectionFilter.h">
<Filter>Connector\Record\Model\Filter</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\Filter\DirectSelectionSendFilter.h">
<Filter>Connector\Record\Model\Filter</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\Filter\EverythingSendFilter.h">
<Filter>Connector\Record\Model\Filter</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\Filter\FilterMover.h">
<Filter>Connector\Record\Model\Filter</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Model\Filter\SendFilter.h">
<Filter>Connector\Record\Model\Filter</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\AddModel.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
<ClInclude Include="Connector\Database\Model\Card\ModelCardDatabase.h">
<Filter>Connector\Database\Model\Card</Filter>
</ClInclude>
</ItemGroup>
</Project>
@@ -22,13 +22,8 @@
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
210CC8832C80E6A300610F58 /* TriggerEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 210CC8812C80E6A300610F58 /* TriggerEvent.cpp */; };
213CC39C2B1101F500088049 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2151077C2AEDB9070022CD24 /* Cocoa.framework */; };
214B7A372C764BCD00D586C1 /* UpdateConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69FBD2C7630B3008B6A06 /* UpdateConfig.cpp */; };
215F082A2C947F4400CD343B /* CardMover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08262C947F4400CD343B /* CardMover.cpp */; };
215F082E2C94C5C000CD343B /* FilterMover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F082C2C94C5C000CD343B /* FilterMover.cpp */; };
215F08372C95808B00CD343B /* ReceiverModelCard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08362C95808B00CD343B /* ReceiverModelCard.cpp */; };
215F08462C9633A800CD343B /* EverythingSendFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08452C9633A800CD343B /* EverythingSendFilter.cpp */; };
219F30422C769283009834E9 /* ConfigTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 219F30402C769282009834E9 /* ConfigTests.cpp */; };
21B67CA32C769CB400FD64FC /* libActiveLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 21F69EF52C64FE91008B6A06 /* libActiveLib.a */; };
21B67CA42C769CB400FD64FC /* libArchicad27.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 21F69ECD2C64C035008B6A06 /* libArchicad27.a */; };
@@ -36,29 +31,10 @@
21B67CAD2C77329800FD64FC /* GetSourceApplicationName.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CA72C77329800FD64FC /* GetSourceApplicationName.cpp */; };
21B67CAE2C77329800FD64FC /* GetSourceApplicationVersion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CA92C77329800FD64FC /* GetSourceApplicationVersion.cpp */; };
21B67CB92C774BFA00FD64FC /* GetConnectorVersion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CB72C774BFA00FD64FC /* GetConnectorVersion.cpp */; };
21B67CBD2C77537C00FD64FC /* DocumentInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CBC2C77537C00FD64FC /* DocumentInfo.cpp */; };
21B67CC02C775A0D00FD64FC /* GetDocumentInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CBF2C775A0D00FD64FC /* GetDocumentInfo.cpp */; };
21B67CC32C77649F00FD64FC /* GetDocumentState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CC22C77649F00FD64FC /* GetDocumentState.cpp */; };
21B67CCC2C77670400FD64FC /* ModelCardDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CC72C77670400FD64FC /* ModelCardDatabase.cpp */; };
21B67CD92C78C83800FD64FC /* TestBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CD62C78C83800FD64FC /* TestBridge.cpp */; };
21B67CDC2C78C88000FD64FC /* SayHi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CDA2C78C87F00FD64FC /* SayHi.cpp */; };
21B67CE32C78D1FB00FD64FC /* SayHiArg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CE02C78D1FB00FD64FC /* SayHiArg.cpp */; };
21B67CE72C78D23B00FD64FC /* ConnectorConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CE42C78D23B00FD64FC /* ConnectorConfig.cpp */; };
21B67CEB2C78D27200FD64FC /* DocumentInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CE82C78D27200FD64FC /* DocumentInfo.cpp */; };
21B67CF12C78D38000FD64FC /* GoAway.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CF02C78D38000FD64FC /* GoAway.cpp */; };
21B67CF72C78D4DE00FD64FC /* GetComplexType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CF52C78D4DD00FD64FC /* GetComplexType.cpp */; };
21D0BD602C89BFEA0077E104 /* SendBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD5B2C89BFEA0077E104 /* SendBridge.cpp */; };
21D0BD672C89D7410077E104 /* AccountTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD642C89D7400077E104 /* AccountTests.cpp */; };
21D0BD6A2C8A0DB40077E104 /* GetIsDevMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD682C8A0DB40077E104 /* GetIsDevMode.cpp */; };
21D0BD8E2C8EE4490077E104 /* Send.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD8D2C8EE4490077E104 /* Send.cpp */; };
21D0BD972C8F13F30077E104 /* GetSendFilters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD962C8F13F30077E104 /* GetSendFilters.cpp */; };
21D0BDA82C8F33AC0077E104 /* ModelCard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDA72C8F33AC0077E104 /* ModelCard.cpp */; };
21D0BDAB2C8F363E0077E104 /* CardSetting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDAA2C8F363E0077E104 /* CardSetting.cpp */; };
21D0BDCF2C92DAC60077E104 /* AddModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDCB2C92DAC60077E104 /* AddModel.cpp */; };
21D0BDD42C935D1A0077E104 /* UpdateModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDD22C935D1A0077E104 /* UpdateModel.cpp */; };
21D0BDD72C935DAE0077E104 /* RemoveModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDD52C935DAE0077E104 /* RemoveModel.cpp */; };
21D0BDDC2C93897B0077E104 /* SenderModelCard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDDA2C93897B0077E104 /* SenderModelCard.cpp */; };
21D0BDE02C9393980077E104 /* SendFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDDD2C9393980077E104 /* SendFilter.cpp */; };
21D0BDE32C943C630077E104 /* DirectSelectionSendFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDE12C943C630077E104 /* DirectSelectionSendFilter.cpp */; };
21D1E9AD2BF14AF200957EAA /* BIMData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21D1E9152BF14AEC00957EAA /* BIMData.framework */; };
21D1E9AE2BF14AF200957EAA /* TeamworkPortalServerClient.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21D1E9162BF14AEC00957EAA /* TeamworkPortalServerClient.framework */; };
21D1E9AF2BF14AF200957EAA /* GDL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21D1E9172BF14AEC00957EAA /* GDL.framework */; };
@@ -220,6 +196,7 @@
21F69F8D2C70D7EE008B6A06 /* GetAccounts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69F8B2C70D7EE008B6A06 /* GetAccounts.cpp */; };
21F69FBB2C762EF0008B6A06 /* ConfigBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69FB42C762EF0008B6A06 /* ConfigBridge.cpp */; };
21F69FBC2C762EF0008B6A06 /* GetConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69FB62C762EF0008B6A06 /* GetConfig.cpp */; };
21F69FC22C7632B7008B6A06 /* ConnectorConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69FC02C7632B7008B6A06 /* ConnectorConfig.cpp */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -282,24 +259,11 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
210CC8812C80E6A300610F58 /* TriggerEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TriggerEvent.cpp; sourceTree = "<group>"; };
210CC8822C80E6A300610F58 /* TriggerEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TriggerEvent.h; sourceTree = "<group>"; };
213CC3A52B1101F500088049 /* Speckle Connector.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Speckle Connector.bundle"; sourceTree = BUILT_PRODUCTS_DIR; };
2151077C2AEDB9070022CD24 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
215F08262C947F4400CD343B /* CardMover.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CardMover.cpp; sourceTree = "<group>"; };
215F08292C947F4400CD343B /* CardMover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CardMover.h; sourceTree = "<group>"; };
215F082C2C94C5C000CD343B /* FilterMover.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FilterMover.cpp; sourceTree = "<group>"; };
215F082D2C94C5C000CD343B /* FilterMover.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilterMover.h; sourceTree = "<group>"; };
215F08332C95808B00CD343B /* ReceiverModelCard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReceiverModelCard.h; sourceTree = "<group>"; };
215F08362C95808B00CD343B /* ReceiverModelCard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReceiverModelCard.cpp; sourceTree = "<group>"; };
215F083D2C96270100CD343B /* RecordID.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordID.h; sourceTree = "<group>"; };
215F08412C962F5E00CD343B /* ArchicadSelectionFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArchicadSelectionFilter.h; sourceTree = "<group>"; };
215F08442C9633A800CD343B /* EverythingSendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EverythingSendFilter.h; sourceTree = "<group>"; };
215F08452C9633A800CD343B /* EverythingSendFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EverythingSendFilter.cpp; sourceTree = "<group>"; };
215F084A2C9782F100CD343B /* ArchicadEverythingFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ArchicadEverythingFilter.h; sourceTree = "<group>"; };
2161FD902BF2600C006D9527 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
219388682C4E5DE2002A0180 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
219F30352C768F0A009834E9 /* Connector-AC27-Test.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Connector-AC27-Test.bundle"; sourceTree = BUILT_PRODUCTS_DIR; };
219F30352C768F0A009834E9 /* Connector-AC27-Test.vwlibrary */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Connector-AC27-Test.vwlibrary"; sourceTree = BUILT_PRODUCTS_DIR; };
219F30402C769282009834E9 /* ConfigTests.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = ConfigTests.cpp; sourceTree = "<group>"; };
219F30432C7693B6009834E9 /* Connector-AC27-Debug.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Connector-AC27-Debug.xctestplan"; sourceTree = SOURCE_ROOT; };
21B67CA52C77329800FD64FC /* BaseBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BaseBridge.cpp; sourceTree = "<group>"; };
@@ -311,6 +275,8 @@
21B67CB72C774BFA00FD64FC /* GetConnectorVersion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetConnectorVersion.cpp; sourceTree = "<group>"; };
21B67CB82C774BFA00FD64FC /* GetConnectorVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetConnectorVersion.h; sourceTree = "<group>"; };
21B67CBA2C774C6500FD64FC /* Version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = "<group>"; };
21B67CBB2C77537C00FD64FC /* DocumentInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentInfo.h; sourceTree = "<group>"; };
21B67CBC2C77537C00FD64FC /* DocumentInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentInfo.cpp; sourceTree = "<group>"; };
21B67CBE2C775A0D00FD64FC /* GetDocumentInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetDocumentInfo.h; sourceTree = "<group>"; };
21B67CBF2C775A0D00FD64FC /* GetDocumentInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetDocumentInfo.cpp; sourceTree = "<group>"; };
21B67CC12C77649E00FD64FC /* GetDocumentState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetDocumentState.h; sourceTree = "<group>"; };
@@ -318,45 +284,6 @@
21B67CC72C77670400FD64FC /* ModelCardDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModelCardDatabase.cpp; sourceTree = "<group>"; };
21B67CC82C77670400FD64FC /* ModelCardDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModelCardDatabase.h; sourceTree = "<group>"; };
21B67CCD2C77694500FD64FC /* Connector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Connector.h; sourceTree = "<group>"; };
21B67CD62C78C83800FD64FC /* TestBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TestBridge.cpp; sourceTree = "<group>"; };
21B67CD72C78C83800FD64FC /* TestBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestBridge.h; sourceTree = "<group>"; };
21B67CDA2C78C87F00FD64FC /* SayHi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SayHi.cpp; sourceTree = "<group>"; };
21B67CDB2C78C87F00FD64FC /* SayHi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SayHi.h; sourceTree = "<group>"; };
21B67CE02C78D1FB00FD64FC /* SayHiArg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SayHiArg.cpp; sourceTree = "<group>"; };
21B67CE12C78D1FB00FD64FC /* SayHiArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SayHiArg.h; sourceTree = "<group>"; };
21B67CE42C78D23B00FD64FC /* ConnectorConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConnectorConfig.cpp; sourceTree = "<group>"; };
21B67CE52C78D23B00FD64FC /* ConnectorConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnectorConfig.h; sourceTree = "<group>"; };
21B67CE82C78D27200FD64FC /* DocumentInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentInfo.cpp; sourceTree = "<group>"; };
21B67CE92C78D27200FD64FC /* DocumentInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentInfo.h; sourceTree = "<group>"; };
21B67CEF2C78D38000FD64FC /* GoAway.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GoAway.h; sourceTree = "<group>"; };
21B67CF02C78D38000FD64FC /* GoAway.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GoAway.cpp; sourceTree = "<group>"; };
21B67CF52C78D4DD00FD64FC /* GetComplexType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetComplexType.cpp; sourceTree = "<group>"; };
21B67CF62C78D4DE00FD64FC /* GetComplexType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetComplexType.h; sourceTree = "<group>"; };
21D0BD5B2C89BFEA0077E104 /* SendBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendBridge.cpp; sourceTree = "<group>"; };
21D0BD5C2C89BFEA0077E104 /* SendBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendBridge.h; sourceTree = "<group>"; };
21D0BD642C89D7400077E104 /* AccountTests.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = AccountTests.cpp; sourceTree = "<group>"; };
21D0BD682C8A0DB40077E104 /* GetIsDevMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetIsDevMode.cpp; sourceTree = "<group>"; };
21D0BD692C8A0DB40077E104 /* GetIsDevMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetIsDevMode.h; sourceTree = "<group>"; };
21D0BD8A2C8EE4490077E104 /* Send.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Send.h; sourceTree = "<group>"; };
21D0BD8D2C8EE4490077E104 /* Send.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Send.cpp; sourceTree = "<group>"; };
21D0BD952C8F13F30077E104 /* GetSendFilters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetSendFilters.h; sourceTree = "<group>"; };
21D0BD962C8F13F30077E104 /* GetSendFilters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetSendFilters.cpp; sourceTree = "<group>"; };
21D0BDA42C8F33AC0077E104 /* ModelCard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModelCard.h; sourceTree = "<group>"; };
21D0BDA72C8F33AC0077E104 /* ModelCard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModelCard.cpp; sourceTree = "<group>"; };
21D0BDA92C8F363E0077E104 /* CardSetting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CardSetting.h; sourceTree = "<group>"; };
21D0BDAA2C8F363E0077E104 /* CardSetting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CardSetting.cpp; sourceTree = "<group>"; };
21D0BDCB2C92DAC60077E104 /* AddModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddModel.cpp; sourceTree = "<group>"; };
21D0BDCE2C92DAC60077E104 /* AddModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddModel.h; sourceTree = "<group>"; };
21D0BDD22C935D1A0077E104 /* UpdateModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UpdateModel.cpp; sourceTree = "<group>"; };
21D0BDD32C935D1A0077E104 /* UpdateModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UpdateModel.h; sourceTree = "<group>"; };
21D0BDD52C935DAE0077E104 /* RemoveModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoveModel.cpp; sourceTree = "<group>"; };
21D0BDD62C935DAE0077E104 /* RemoveModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoveModel.h; sourceTree = "<group>"; };
21D0BDDA2C93897B0077E104 /* SenderModelCard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SenderModelCard.cpp; sourceTree = "<group>"; };
21D0BDDB2C93897B0077E104 /* SenderModelCard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SenderModelCard.h; sourceTree = "<group>"; };
21D0BDDD2C9393980077E104 /* SendFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendFilter.cpp; sourceTree = "<group>"; };
21D0BDDE2C9393980077E104 /* SendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendFilter.h; sourceTree = "<group>"; };
21D0BDE12C943C630077E104 /* DirectSelectionSendFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DirectSelectionSendFilter.cpp; sourceTree = "<group>"; };
21D0BDE22C943C630077E104 /* DirectSelectionSendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectSelectionSendFilter.h; sourceTree = "<group>"; };
21D1E9152BF14AEC00957EAA /* BIMData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BIMData.framework; path = "../Archicad 27/Support/Frameworks/BIMData.framework"; sourceTree = "<group>"; };
21D1E9162BF14AEC00957EAA /* TeamworkPortalServerClient.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TeamworkPortalServerClient.framework; path = "../Archicad 27/Support/Frameworks/TeamworkPortalServerClient.framework"; sourceTree = "<group>"; };
21D1E9172BF14AEC00957EAA /* GDL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GDL.framework; path = "../Archicad 27/Support/Frameworks/GDL.framework"; sourceTree = "<group>"; };
@@ -534,6 +461,8 @@
21F69FB72C762EF0008B6A06 /* GetConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetConfig.h; sourceTree = "<group>"; };
21F69FBD2C7630B3008B6A06 /* UpdateConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UpdateConfig.cpp; sourceTree = "<group>"; };
21F69FBE2C7630B3008B6A06 /* UpdateConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UpdateConfig.h; sourceTree = "<group>"; };
21F69FC02C7632B7008B6A06 /* ConnectorConfig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConnectorConfig.cpp; sourceTree = "<group>"; };
21F69FC12C7632B7008B6A06 /* ConnectorConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnectorConfig.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -715,7 +644,7 @@
isa = PBXGroup;
children = (
213CC3A52B1101F500088049 /* Speckle Connector.bundle */,
219F30352C768F0A009834E9 /* Connector-AC27-Test.bundle */,
219F30352C768F0A009834E9 /* Connector-AC27-Test.vwlibrary */,
);
name = Products;
sourceTree = "<group>";
@@ -723,16 +652,16 @@
0867D691FE84028FC02AAC07 /* SampleObject */ = {
isa = PBXGroup;
children = (
21F69F112C677BC0008B6A06 /* Connector */,
21F69EC62C64C035008B6A06 /* SpeckleLib.xcodeproj */,
21F69EED2C64FE91008B6A06 /* ActiveLib.xcodeproj */,
21F69EC62C64C035008B6A06 /* SpeckleLib.xcodeproj */,
219388682C4E5DE2002A0180 /* CMakeLists.txt */,
219F30412C769282009834E9 /* ConnectorTests */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
213CC4E02B1107CF00088049 /* Frameworks */,
034768DDFF38A45A11DB9C8B /* Products */,
2161FD902BF2600C006D9527 /* README.md */,
21F69F112C677BC0008B6A06 /* Connector */,
219F30412C769282009834E9 /* ConnectorTests */,
81494D9D09DA5892006864FB /* Resource */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
034768DDFF38A45A11DB9C8B /* Products */,
213CC4E02B1107CF00088049 /* Frameworks */,
);
name = SampleObject;
sourceTree = "<group>";
@@ -921,18 +850,9 @@
name = Frameworks;
sourceTree = "<group>";
};
215F083E2C96270100CD343B /* Identity */ = {
isa = PBXGroup;
children = (
215F083D2C96270100CD343B /* RecordID.h */,
);
path = Identity;
sourceTree = "<group>";
};
219F30412C769282009834E9 /* ConnectorTests */ = {
isa = PBXGroup;
children = (
21D0BD642C89D7400077E104 /* AccountTests.cpp */,
219F30402C769282009834E9 /* ConfigTests.cpp */,
219F30432C7693B6009834E9 /* Connector-AC27-Debug.xctestplan */,
);
@@ -942,11 +862,10 @@
21B67CAB2C77329800FD64FC /* Base */ = {
isa = PBXGroup;
children = (
21D0BDCB2C92DAC60077E104 /* AddModel.cpp */,
21D0BDCE2C92DAC60077E104 /* AddModel.h */,
21B67CEA2C78D27200FD64FC /* Arg */,
21B67CA52C77329800FD64FC /* BaseBridge.cpp */,
21B67CA62C77329800FD64FC /* BaseBridge.h */,
21B67CBC2C77537C00FD64FC /* DocumentInfo.cpp */,
21B67CBB2C77537C00FD64FC /* DocumentInfo.h */,
21B67CB72C774BFA00FD64FC /* GetConnectorVersion.cpp */,
21B67CB82C774BFA00FD64FC /* GetConnectorVersion.h */,
21B67CBF2C775A0D00FD64FC /* GetDocumentInfo.cpp */,
@@ -957,125 +876,35 @@
21B67CA82C77329800FD64FC /* GetSourceApplicationName.h */,
21B67CA92C77329800FD64FC /* GetSourceApplicationVersion.cpp */,
21B67CAA2C77329800FD64FC /* GetSourceApplicationVersion.h */,
21D0BDD52C935DAE0077E104 /* RemoveModel.cpp */,
21D0BDD62C935DAE0077E104 /* RemoveModel.h */,
21D0BDD22C935D1A0077E104 /* UpdateModel.cpp */,
21D0BDD32C935D1A0077E104 /* UpdateModel.h */,
);
path = Base;
sourceTree = "<group>";
};
21B67CC92C77670400FD64FC /* Card */ = {
isa = PBXGroup;
children = (
21B67CC72C77670400FD64FC /* ModelCardDatabase.cpp */,
21B67CC82C77670400FD64FC /* ModelCardDatabase.h */,
);
path = Card;
sourceTree = "<group>";
};
21B67CCA2C77670400FD64FC /* Model */ = {
isa = PBXGroup;
children = (
21B67CC92C77670400FD64FC /* Card */,
);
path = Model;
sourceTree = "<group>";
};
21B67CCB2C77670400FD64FC /* Database */ = {
isa = PBXGroup;
children = (
215F083E2C96270100CD343B /* Identity */,
21B67CC72C77670400FD64FC /* ModelCardDatabase.cpp */,
21B67CC82C77670400FD64FC /* ModelCardDatabase.h */,
21B67CCA2C77670400FD64FC /* Model */,
);
path = Database;
sourceTree = "<group>";
};
21B67CD82C78C83800FD64FC /* Test */ = {
isa = PBXGroup;
children = (
21B67CE22C78D1FB00FD64FC /* Arg */,
21B67CF52C78D4DD00FD64FC /* GetComplexType.cpp */,
21B67CF62C78D4DE00FD64FC /* GetComplexType.h */,
21B67CF02C78D38000FD64FC /* GoAway.cpp */,
21B67CEF2C78D38000FD64FC /* GoAway.h */,
21B67CDA2C78C87F00FD64FC /* SayHi.cpp */,
21B67CDB2C78C87F00FD64FC /* SayHi.h */,
21B67CD62C78C83800FD64FC /* TestBridge.cpp */,
21B67CD72C78C83800FD64FC /* TestBridge.h */,
210CC8812C80E6A300610F58 /* TriggerEvent.cpp */,
210CC8822C80E6A300610F58 /* TriggerEvent.h */,
);
path = Test;
sourceTree = "<group>";
};
21B67CE22C78D1FB00FD64FC /* Arg */ = {
isa = PBXGroup;
children = (
21B67CE02C78D1FB00FD64FC /* SayHiArg.cpp */,
21B67CE12C78D1FB00FD64FC /* SayHiArg.h */,
);
path = Arg;
sourceTree = "<group>";
};
21B67CE62C78D23B00FD64FC /* Arg */ = {
isa = PBXGroup;
children = (
21B67CE42C78D23B00FD64FC /* ConnectorConfig.cpp */,
21B67CE52C78D23B00FD64FC /* ConnectorConfig.h */,
);
path = Arg;
sourceTree = "<group>";
};
21B67CEA2C78D27200FD64FC /* Arg */ = {
isa = PBXGroup;
children = (
21B67CE82C78D27200FD64FC /* DocumentInfo.cpp */,
21B67CE92C78D27200FD64FC /* DocumentInfo.h */,
);
path = Arg;
sourceTree = "<group>";
};
21D0BD5D2C89BFEA0077E104 /* Send */ = {
isa = PBXGroup;
children = (
21D0BD962C8F13F30077E104 /* GetSendFilters.cpp */,
21D0BD952C8F13F30077E104 /* GetSendFilters.h */,
21D0BD8D2C8EE4490077E104 /* Send.cpp */,
21D0BD8A2C8EE4490077E104 /* Send.h */,
21D0BD5B2C89BFEA0077E104 /* SendBridge.cpp */,
21D0BD5C2C89BFEA0077E104 /* SendBridge.h */,
);
path = Send;
sourceTree = "<group>";
};
21D0BDD82C9387E60077E104 /* Record */ = {
isa = PBXGroup;
children = (
21D0BDD92C9387F70077E104 /* Model */,
);
path = Record;
sourceTree = "<group>";
};
21D0BDD92C9387F70077E104 /* Model */ = {
isa = PBXGroup;
children = (
215F08262C947F4400CD343B /* CardMover.cpp */,
215F08292C947F4400CD343B /* CardMover.h */,
21D0BDAA2C8F363E0077E104 /* CardSetting.cpp */,
21D0BDA92C8F363E0077E104 /* CardSetting.h */,
21D0BDDF2C9393980077E104 /* Filter */,
21D0BDA72C8F33AC0077E104 /* ModelCard.cpp */,
21D0BDA42C8F33AC0077E104 /* ModelCard.h */,
215F08362C95808B00CD343B /* ReceiverModelCard.cpp */,
215F08332C95808B00CD343B /* ReceiverModelCard.h */,
21D0BDDA2C93897B0077E104 /* SenderModelCard.cpp */,
21D0BDDB2C93897B0077E104 /* SenderModelCard.h */,
);
path = Model;
sourceTree = "<group>";
};
21D0BDDF2C9393980077E104 /* Filter */ = {
isa = PBXGroup;
children = (
215F084A2C9782F100CD343B /* ArchicadEverythingFilter.h */,
215F08412C962F5E00CD343B /* ArchicadSelectionFilter.h */,
21D0BDE12C943C630077E104 /* DirectSelectionSendFilter.cpp */,
21D0BDE22C943C630077E104 /* DirectSelectionSendFilter.h */,
215F08452C9633A800CD343B /* EverythingSendFilter.cpp */,
215F08442C9633A800CD343B /* EverythingSendFilter.h */,
215F082C2C94C5C000CD343B /* FilterMover.cpp */,
215F082D2C94C5C000CD343B /* FilterMover.h */,
21D0BDDD2C9393980077E104 /* SendFilter.cpp */,
21D0BDDE2C9393980077E104 /* SendFilter.h */,
);
path = Filter;
sourceTree = "<group>";
};
21D1EA472BF14B6C00957EAA /* Archicad */ = {
isa = PBXGroup;
children = (
@@ -1135,7 +964,6 @@
21B67CCB2C77670400FD64FC /* Database */,
21F69F092C677BC0008B6A06 /* Event */,
21F69F0E2C677BC0008B6A06 /* Interface */,
21D0BDD82C9387E60077E104 /* Record */,
21B67CBA2C774C6500FD64FC /* Version.h */,
);
path = Connector;
@@ -1158,8 +986,6 @@
21F69F852C70D2C4008B6A06 /* Account */,
21B67CAB2C77329800FD64FC /* Base */,
21F69FB82C762EF0008B6A06 /* Config */,
21D0BD5D2C89BFEA0077E104 /* Send */,
21B67CD82C78C83800FD64FC /* Test */,
);
path = Bridge;
sourceTree = "<group>";
@@ -1175,13 +1001,12 @@
21F69FB82C762EF0008B6A06 /* Config */ = {
isa = PBXGroup;
children = (
21B67CE62C78D23B00FD64FC /* Arg */,
21F69FB42C762EF0008B6A06 /* ConfigBridge.cpp */,
21F69FB52C762EF0008B6A06 /* ConfigBridge.h */,
21F69FC02C7632B7008B6A06 /* ConnectorConfig.cpp */,
21F69FC12C7632B7008B6A06 /* ConnectorConfig.h */,
21F69FB62C762EF0008B6A06 /* GetConfig.cpp */,
21F69FB72C762EF0008B6A06 /* GetConfig.h */,
21D0BD682C8A0DB40077E104 /* GetIsDevMode.cpp */,
21D0BD692C8A0DB40077E104 /* GetIsDevMode.h */,
21F69FBD2C7630B3008B6A06 /* UpdateConfig.cpp */,
21F69FBE2C7630B3008B6A06 /* UpdateConfig.h */,
);
@@ -1242,7 +1067,7 @@
);
name = "Connector-AC27-Test";
productName = "Connector-AC27-Test";
productReference = 219F30352C768F0A009834E9 /* Connector-AC27-Test.bundle */;
productReference = 219F30352C768F0A009834E9 /* Connector-AC27-Test.vwlibrary */;
productType = "com.apple.product-type.bundle.unit-test";
};
/* End PBXNativeTarget section */
@@ -1365,7 +1190,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "mkdir -p \"$HEADER_PATH_6/ResourceObjects\"\npython3 \"$HEADER_PATH_5/Tools/CompileResources.py\" INT \"$HEADER_PATH_5/..\" \"$HEADER_PATH_6\" \"$SRCROOT\" \"$HEADER_PATH_6/ResourceObjects\" \"$SYMROOT/$CONFIGURATION/$PRODUCT_NAME.$WRAPPER_EXTENSION/Contents/Resources\"\npython3 \"$HEADER_PATH_5/Tools/CompileResources.py\" INT \"$HEADER_PATH_5/..\" \"$HEADER_PATH_3\" \"$HEADER_PATH_3\" \"$HEADER_PATH_6/ResourceObjects\" \"$SYMROOT/$CONFIGURATION/$PRODUCT_NAME.$WRAPPER_EXTENSION/Contents/Resources\"\ncp \"$HEADER_PATH_5/Inc/PkgInfo\" \"$SYMROOT/$CONFIGURATION/$PRODUCT_NAME.$WRAPPER_EXTENSION/Contents/PkgInfo\"\ntouch \"$HEADER_PATH_6/ResourceObjects/AddOnResources.stamp\"\n";
shellScript = "mkdir -p \"$HEADER_PATH_3/ResourceObjects\"\npython3 \"$HEADER_PATH_5/Tools/CompileResources.py\" INT \"$HEADER_PATH_5/..\" \"$HEADER_PATH_6\" \"$SRCROOT\" \"$HEADER_PATH_3/ResourceObjects\" \"$SYMROOT/$CONFIGURATION/$PRODUCT_NAME.$WRAPPER_EXTENSION/Contents/Resources\"\ncp \"$HEADER_PATH_5/Inc/PkgInfo\" \"$SYMROOT/$CONFIGURATION/$PRODUCT_NAME.$WRAPPER_EXTENSION/Contents/PkgInfo\"\ntouch \"$HEADER_PATH_3/ResourceObjects/AddOnResources.stamp\"\n";
};
213CC3A12B1101F500088049 /* Install */ = {
isa = PBXShellScriptBuildPhase;
@@ -1393,44 +1218,22 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
21D0BDAB2C8F363E0077E104 /* CardSetting.cpp in Sources */,
21B67CE32C78D1FB00FD64FC /* SayHiArg.cpp in Sources */,
215F08462C9633A800CD343B /* EverythingSendFilter.cpp in Sources */,
21B67CBD2C77537C00FD64FC /* DocumentInfo.cpp in Sources */,
21F69FC22C7632B7008B6A06 /* ConnectorConfig.cpp in Sources */,
21F69FBB2C762EF0008B6A06 /* ConfigBridge.cpp in Sources */,
21F69F8A2C70D2C4008B6A06 /* AccountBridge.cpp in Sources */,
21D0BD8E2C8EE4490077E104 /* Send.cpp in Sources */,
21D0BDCF2C92DAC60077E104 /* AddModel.cpp in Sources */,
21B67CF72C78D4DE00FD64FC /* GetComplexType.cpp in Sources */,
21D0BDDC2C93897B0077E104 /* SenderModelCard.cpp in Sources */,
21B67CAE2C77329800FD64FC /* GetSourceApplicationVersion.cpp in Sources */,
21B67CC32C77649F00FD64FC /* GetDocumentState.cpp in Sources */,
21D0BD602C89BFEA0077E104 /* SendBridge.cpp in Sources */,
21D0BD972C8F13F30077E104 /* GetSendFilters.cpp in Sources */,
21B67CAC2C77329800FD64FC /* BaseBridge.cpp in Sources */,
21D0BD6A2C8A0DB40077E104 /* GetIsDevMode.cpp in Sources */,
210CC8832C80E6A300610F58 /* TriggerEvent.cpp in Sources */,
21B67CEB2C78D27200FD64FC /* DocumentInfo.cpp in Sources */,
21B67CB92C774BFA00FD64FC /* GetConnectorVersion.cpp in Sources */,
21B67CD92C78C83800FD64FC /* TestBridge.cpp in Sources */,
214B7A372C764BCD00D586C1 /* UpdateConfig.cpp in Sources */,
21B67CC02C775A0D00FD64FC /* GetDocumentInfo.cpp in Sources */,
21D0BDD42C935D1A0077E104 /* UpdateModel.cpp in Sources */,
21B67CE72C78D23B00FD64FC /* ConnectorConfig.cpp in Sources */,
21B67CAD2C77329800FD64FC /* GetSourceApplicationName.cpp in Sources */,
21D0BDE02C9393980077E104 /* SendFilter.cpp in Sources */,
21D0BDA82C8F33AC0077E104 /* ModelCard.cpp in Sources */,
215F082A2C947F4400CD343B /* CardMover.cpp in Sources */,
215F08372C95808B00CD343B /* ReceiverModelCard.cpp in Sources */,
21D0BDD72C935DAE0077E104 /* RemoveModel.cpp in Sources */,
21B67CDC2C78C88000FD64FC /* SayHi.cpp in Sources */,
215F082E2C94C5C000CD343B /* FilterMover.cpp in Sources */,
21F69F122C677BC0008B6A06 /* ConnectorMenu.cpp in Sources */,
21F69F8D2C70D7EE008B6A06 /* GetAccounts.cpp in Sources */,
21B67CCC2C77670400FD64FC /* ModelCardDatabase.cpp in Sources */,
21F69F132C677BC0008B6A06 /* ConnectorPalette.cpp in Sources */,
21F69FBC2C762EF0008B6A06 /* GetConfig.cpp in Sources */,
21D0BDE32C943C630077E104 /* DirectSelectionSendFilter.cpp in Sources */,
21B67CF12C78D38000FD64FC /* GoAway.cpp in Sources */,
21F69F142C677BC0008B6A06 /* Connector.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1440,7 +1243,6 @@
buildActionMask = 2147483647;
files = (
219F30422C769283009834E9 /* ConfigTests.cpp in Sources */,
21D0BD672C89D7410077E104 /* AccountTests.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1531,6 +1333,7 @@
"\"$(HEADER_PATH_6)\"",
"\"$(HEADER_PATH_8)\"",
);
WRAPPER_EXTENSION = bundle;
};
name = Debug;
};
@@ -1595,6 +1398,7 @@
"\"$(HEADER_PATH_6)\"",
"\"$(HEADER_PATH_8)\"",
);
WRAPPER_EXTENSION = bundle;
};
name = Release;
};
@@ -1634,7 +1438,6 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
GCC_PREPROCESSOR_DEFINITIONS = (
TESTING_MODE,
ARCHICAD,
AddOn_EXPORTS,
"'macintosh=1'",
@@ -1705,6 +1508,7 @@
"-multiply_defined",
suppress,
);
WRAPPER_EXTENSION = bundle;
};
name = Debug;
};
@@ -1745,7 +1549,6 @@
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "";
GCC_PREPROCESSOR_DEFINITIONS = (
TESTING_MODE,
ARCHICAD,
AddOn_EXPORTS,
"'macintosh=1'",
@@ -1813,6 +1616,7 @@
"-multiply_defined",
suppress,
);
WRAPPER_EXTENSION = bundle;
};
name = Release;
};
@@ -1972,7 +1776,7 @@
OBJROOT = "";
ONLY_ACTIVE_ARCH = YES;
PLUGIN_FOLDER = "";
PRODUCT_BUNDLE_IDENTIFIER = systems.speckle.connector;
PRODUCT_BUNDLE_IDENTIFIER = net.activethread.connector;
PRODUCT_NAME = "$(BASE_NAME)";
RESOURCE_EXTENSION = "";
REZ_SEARCH_PATHS = (
@@ -1999,7 +1803,7 @@
suppress,
);
WORD_SIZE = 64;
WRAPPER_EXTENSION = bundle;
WRAPPER_EXTENSION = vwlibrary;
};
name = Debug;
};
@@ -2078,7 +1882,7 @@
NNA_WARNING_CPLUSPLUSFLAGS = "-Wno-deprecated";
OBJROOT = "";
PLUGIN_FOLDER = "";
PRODUCT_BUNDLE_IDENTIFIER = systems.speckle.connector;
PRODUCT_BUNDLE_IDENTIFIER = net.activethread.connector;
PRODUCT_NAME = "$(BASE_NAME)";
RESOURCE_EXTENSION = "";
REZ_SEARCH_PATHS = (
@@ -2101,7 +1905,7 @@
);
USE_HEADERMAP = YES;
WORD_SIZE = 64;
WRAPPER_EXTENSION = bundle;
WRAPPER_EXTENSION = vwlibrary;
};
name = Release;
};
@@ -29,7 +29,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "219F30342C768F0A009834E9"
BuildableName = "Connector-AC27-Test.bundle"
BuildableName = "Connector-AC27-Test.vwlibrary"
BlueprintName = "Connector-AC27-Test"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
@@ -20,7 +20,7 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "219F30342C768F0A009834E9"
BuildableName = "Connector-AC27-Test.bundle"
BuildableName = "Connector-AC27-Test.vwlibrary"
BlueprintName = "Connector-AC27-Test"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
+6 -62
View File
@@ -1,36 +1,25 @@
#include "Active/File/Directory.h"
#include "ConnectorResource.h"
#include "Connector/Connector.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Database/Model/Card/ModelCardDatabase.h"
#include "Interface/ConnectorMenu.h"
#include "Interface/ConnectorPalette.h"
#include "Speckle/Database/AccountDatabase.h"
#include "Speckle/Environment/Addon.h"
#include "Speckle/Utility/String.h"
using namespace active::file;
using namespace active::environment;
using namespace connector;
using namespace connector::database;
using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::utility;
namespace {
//The Speckle application data/support directory name
const char* speckleDataDirName = "Speckle";
//The account database name
const char* accountDBaseName = "Accounts.db";
///The Connector addon class
class ConnectorInstance : public ConnectorAddon {
public:
ConnectorInstance(const String& name) : ConnectorAddon{name} {
add<ConnectorMenu>();
add<ConnectorPalette>();
//The connector 'owns' the model card database, so the publisher list should only hold a weak reference
addWeak(m_modelCards.getSubscription());
add(std::make_shared<ConnectorMenu>());
add(std::make_shared<ConnectorPalette>());
}
// MARK: Functions (const)
@@ -39,34 +28,15 @@ namespace {
Get the model card database
@return The model card database
*/
const ModelCardDatabase* getModelCardDatabase() const override { return &m_modelCards; }
/*!
Get the account database
@return The account database
*/
const AccountDatabase* getAccountDatabase() const override;
const ModelCardDatabase* getModelCards() const override { return &m_modelCards; }
private:
mutable std::unique_ptr<AccountDatabase> m_account;
ModelCardDatabase m_modelCards;
};
///The active addon instance
std::unique_ptr<ConnectorAddon> m_addonInstance;
/*--------------------------------------------------------------------
Get the speckle application data directory (creating if missing)
return: The application data directory (nullopt = missing and unable to create)
--------------------------------------------------------------------*/
Directory::Option getAppDataDirectory() {
auto appData = Directory::appData();
if (!appData)
return std::nullopt;
return Directory{*appData, speckleDataDirName, true};
} //getAppDataDirectory
}
/*--------------------------------------------------------------------
@@ -78,39 +48,13 @@ ConnectorAddon::ConnectorAddon(const speckle::utility::String& name) : Addon{nam
} //ConnectorAddon::ConnectorAddon
/*--------------------------------------------------------------------
Get the account database
return: The account database
--------------------------------------------------------------------*/
const AccountDatabase* ConnectorInstance::getAccountDatabase() const {
if (!m_account) {
auto speckleDirectory = getAppDataDirectory();
if (!speckleDirectory)
return nullptr;
m_account = std::make_unique<AccountDatabase>(speckleDirectory->getPath() / accountDBaseName);
}
return m_account.get();
} //ConnectorInstance::getAccounts
/*--------------------------------------------------------------------
Get an object representing the connector instance
@return The active connector instance (nullptr if no connector is running)
--------------------------------------------------------------------*/
ConnectorAddon* connector::connector() {
return m_addonInstance.get();
} //connector::connector
#ifdef ARCHICAD
/*!
The following is the C interface for the plugin to Archicad as specified by the API
*/
#include <ACAPinc.h>
#include <APIdefs_Registration.h>
#include "ACAPinc.h"
#include "APIdefs_Registration.h"
/*--------------------------------------------------------------------
Confirm that the plugin is able to run in the current environment
+3 -9
View File
@@ -1,11 +1,10 @@
#include "Speckle/Environment/Addon.h"
#include "Speckle/Utility/String.h"
namespace speckle::database {
class AccountDatabase;
}
namespace connector::database {
class ModelCardDatabase;
}
namespace connector {
@@ -20,12 +19,7 @@ namespace connector {
Get the model card database
@return The model card database
*/
const virtual database::ModelCardDatabase* getModelCardDatabase() const = 0;
/*!
Get the account database
@return The account database
*/
const virtual speckle::database::AccountDatabase* getAccountDatabase() const = 0;
const virtual database::ModelCardDatabase* getModelCards() const = 0;
protected:
/*!
@@ -1,16 +0,0 @@
#ifndef CONNECTOR_DATABASE_ID
#define CONNECTOR_DATABASE_ID
#include "Speckle/Utility/Guid.h"
namespace connector::database {
//BIM element record identifier
using ElementID = speckle::utility::Guid;
//A list of element IDs
using ElementIDList = std::vector<ElementID>;
}
#endif //CONNECTOR_DATABASE_ID
@@ -1,28 +1,27 @@
#include "Connector/Record/Model/Filter/EverythingSendFilter.h"
#include "Connector/Database/Model/Card/ModelCardDatabase.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Active/Serialise/Package/Wrapper/ValueSettingWrap.h"
#include "Active/Setting/ValueSetting.h"
#include "Active/Utility/Concepts.h"
#include <algorithm>
#include <array>
using namespace active::serialise;
using namespace active::setting;
using namespace connector::database;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
selectedElemID,
model,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"selectedObjectIds"},
Identity{"model"},
};
}
@@ -34,15 +33,15 @@ namespace {
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool EverythingSendFilter::fillInventory(Inventory& inventory) const {
bool ModelCardDatabase::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[selectedElemID], selectedElemID, element },
{ fieldID[model], model, element },
},
}.withType(&typeid(EverythingSendFilter)));
return base::fillInventory(inventory);
} //EverythingSendFilter::fillInventory
}.withType(&typeid(ModelCardDatabase)));
return true;
} //ModelCardDatabase::fillInventory
/*--------------------------------------------------------------------
@@ -52,22 +51,21 @@ bool EverythingSendFilter::fillInventory(Inventory& inventory) const {
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique EverythingSendFilter::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(EverythingSendFilter))
return base::getCargo(item);
Cargo::Unique ModelCardDatabase::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(ModelCardDatabase))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case selectedElemID:
return std::make_unique<ContainerWrap<ElementIDList>>(m_emptyList);
case model:
return std::make_unique<CargoHold<ValueSettingWrap, ValueSetting>>(); //NB: This is a placeholder until we define the content
default:
return nullptr; //Requested an unknown index
}
} //EverythingSendFilter::getCargo
} //ModelCardDatabase::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void EverythingSendFilter::setDefault() {
m_emptyList.clear();
} //EverythingSendFilter::setDefault
void ModelCardDatabase::setDefault() {
} //ModelCardDatabase::setDefault
@@ -1,15 +1,15 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SAYHI_ARG
#define CONNECTOR_INTERFACE_BRIDGE_SAYHI_ARG
#ifndef CONNECTOR_DATABASE_MODEL_CARD_DATABASE
#define CONNECTOR_DATABASE_MODEL_CARD_DATABASE
#include "Active/Serialise/Package/Package.h"
#include "Speckle/Utility/String.h"
namespace connector::interfac::browser::bridge {
namespace connector::database {
/*!
Object for testing JS comms (with TestBridge binding)
Database of model cards relating to a specific project
*/
class SayHiArg : public active::serialise::Package {
class ModelCardDatabase : public active::serialise::Package {
public:
// MARK: - Types
@@ -21,14 +21,14 @@ namespace connector::interfac::browser::bridge {
/*!
Default constructor
*/
SayHiArg() = default;
ModelCardDatabase() {}
// MARK: - Public variables (NB: Assuming to class invariants or overrides for this data, so making public for simplicity)
///Sample parameters for testing only
speckle::utility::String name;
int32_t count = 0;
bool isHello = false;
// MARK: Functions (const)
//Implement card access when necessary
// MARK: - Serialisation
@@ -48,8 +48,10 @@ namespace connector::interfac::browser::bridge {
Set to the default package content
*/
void setDefault() override;
private:
//TODO: Model card array here - implement when necessary
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SAYHI_ARG
#endif //CONNECTOR_DATABASE_MODEL_CARD_DATABASE
@@ -1,121 +0,0 @@
#include "Connector/Database/ModelCardDatabase.h"
#include "Active/Database/Storage/Storage.h"
#include "Active/Serialise/JSON/JSONTransport.h"
#include "Connector/Record/Model/CardMover.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Database/Storage/DocumentStore/DocumentStoreEngine.h"
#include <array>
using namespace active::container;
using namespace active::database;
using namespace active::event;
using namespace active::serialise;
using namespace active::serialise::json;
using namespace connector::database;
using namespace connector::record;
using namespace speckle::database;
using namespace speckle::utility;
namespace connector::database {
///ModelCard database engine declaration
class ModelCardDatabase::Engine : public DocumentStoreEngine<ModelCard, CardMover, JSONTransport, RecordID> {
using base = DocumentStoreEngine<ModelCard, CardMover, JSONTransport, RecordID>;
using base::base;
};
///ModelCard database storage declaration
class ModelCardDatabase::Store : public Storage<ModelCard, JSONTransport,
RecordID, RecordID, RecordID, RecordID> {
using base = Storage<ModelCard, JSONTransport,
RecordID, RecordID, RecordID, RecordID>;
using base::base;
};
}
namespace {
///The document storage identifier for model cards
const char* modelCardDBaseName = "connector::database::ModelModelCardDatabase";
///The document storage identifier for model cards
const char* modelCardTableName = "models";
}
/*--------------------------------------------------------------------
Constructor
--------------------------------------------------------------------*/
ModelCardDatabase::ModelCardDatabase() {
m_engine = std::make_shared<Engine>(modelCardDBaseName,
//Schema
DBaseSchema{active::utility::String{modelCardDBaseName},
//Tables
{
//Model card table
{
modelCardTableName, 0, 0, {} //The table specifics aren't relevant in this context
}
}
}
);
m_store = std::make_shared<Store>(m_engine);
} //ModelCardDatabase::ModelCardDatabase
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
ModelCardDatabase::~ModelCardDatabase() {}
/*--------------------------------------------------------------------
Get all model cards
return: All the cards
--------------------------------------------------------------------*/
Vector<ModelCard> ModelCardDatabase::getCards() const {
return m_store->getObjects();
} //ModelCardDatabase::getCards
/*--------------------------------------------------------------------
Write a card to storage
card: The card to write
--------------------------------------------------------------------*/
void ModelCardDatabase::write(const ModelCard& card) const {
m_store->write(card);
} //ModelCardDatabase::write
/*--------------------------------------------------------------------
Erase a card
cardID: The ID of the card to erase
--------------------------------------------------------------------*/
void ModelCardDatabase::erase(const String& cardID) const {
m_store->erase(cardID);
} //ModelCardDatabase::erase
/*--------------------------------------------------------------------
Get a serialisation wrapper for the database
return: A database wrapper
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> ModelCardDatabase::wrapper() const {
return m_store->wrapper();
} //ModelCardDatabase::wrapper
/*--------------------------------------------------------------------
Get the database subscription (the content is document-based, and must react to document operations)
return: The database subscription (add weakly to publisher)
--------------------------------------------------------------------*/
std::shared_ptr<active::event::Subscriber> ModelCardDatabase::getSubscription() {
return std::dynamic_pointer_cast<Subscriber>(m_engine);
} //ModelCardDatabase::getSubscription
@@ -1,71 +0,0 @@
#ifndef CONNECTOR_DATABASE_MODEL_CARD_DATABASE
#define CONNECTOR_DATABASE_MODEL_CARD_DATABASE
#include "Connector/Record/Model/ModelCard.h"
namespace active::event {
class Subscriber;
}
namespace connector::database {
/*!
Database of model cards relating to a specific project
*/
class ModelCardDatabase {
public:
// MARK: - Constructors
/*!
Constructor
*/
ModelCardDatabase();
ModelCardDatabase(const ModelCardDatabase&) = delete;
/*!
Destructor
*/
~ModelCardDatabase();
// MARK: - Functions (const)
/*!
Get all model cards
@return All the cards
*/
active::container::Vector<record::ModelCard> getCards() const;
/*!
Write a card to storage
@param card The card to write
*/
void write(const record::ModelCard& card) const;
/*!
Erase a card
@param cardID The ID of the card to erase
*/
void erase(const speckle::utility::String& cardID) const;
/*!
Get a serialisation wrapper for the database
@return A database wrapper
*/
std::unique_ptr<active::serialise::Cargo> wrapper() const;
// MARK: - Functions (mutating)
/*!
Get the database subscription (the content is document-based, and must react to document operations)
@return The database subscription (add weakly to publisher)
*/
std::shared_ptr<active::event::Subscriber> getSubscription();
private:
class Engine;
class Store;
///Model card database storage
std::shared_ptr<Engine> m_engine;
std::shared_ptr<Store> m_store;
};
}
#endif //CONNECTOR_DATABASE_MODEL_CARD_DATABASE
@@ -2,8 +2,6 @@
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Connector.h"
#include "Speckle/Database/AccountDatabase.h"
#include "Speckle/Record/Credentials/Account.h"
using namespace active::container;
@@ -14,14 +12,14 @@ using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<ContainerWrap<Vector<Account>>, Vector<Account>>;
using WrappedValue = active::serialise::CargoHold<ContainerWrap<Vector, Account>, Vector<Account>>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetAccounts::GetAccounts() : BridgeMethod{"GetAccounts", [&]() {
GetAccounts::GetAccounts() : JSBridgeMethod{"GetAccounts", [&]() {
return run();
}} {}
@@ -31,11 +29,8 @@ GetAccounts::GetAccounts() : BridgeMethod{"GetAccounts", [&]() {
return: The accounts (empty array when none defined)
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetAccounts::run() const {
std::unique_ptr<Vector<Account>> result;
if (auto accountDBase = connector()->getAccountDatabase(); accountDBase != nullptr)
result = std::make_unique<Vector<Account>>(accountDBase->getAccounts());
else
result = std::make_unique<Vector<Account>>();
return std::make_unique<WrappedValue>(std::move(result));
std::unique_ptr<Cargo> GetAccounts::run(void) const {
Vector<Account> accounts;
///TODO: Get the accounts here - returning an empty array for testing only
return std::make_unique<WrappedValue>(accounts);
} //GetAccounts::run
@@ -1,14 +1,14 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_ACCOUNTS
#define CONNECTOR_INTERFACE_BRIDGE_GET_ACCOUNTS
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve the names of the methods supported by the bridge
*/
class GetAccounts : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
class GetAccounts : public speckle::interfac::browser::bridge::JSBridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
@@ -24,7 +24,7 @@ namespace connector::interfac::browser::bridge {
Get the accounts
@return The accounts (empty array when none defined)
*/
std::unique_ptr<active::serialise::Cargo> run() const;
std::unique_ptr<active::serialise::Cargo> run(void) const;
};
}
@@ -1,35 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Base/AddModel.h"
#include "Connector/Connector.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
using namespace active::container;
using namespace active::serialise;
using namespace connector::record;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<PackageWrap, DocumentInfo>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
AddModel::AddModel() : BridgeMethod{"AddModel", [&](const ModelCardEventWrapper& card) {
return run(card.get());
}} {}
/*--------------------------------------------------------------------
Add a model card to document storage
card: The card to add
--------------------------------------------------------------------*/
void AddModel::run(const ModelCard& card) const {
if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr)
modelCardDBase->write(card);
} //AddModel::run
@@ -1,40 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_ADD_MODEL
#define CONNECTOR_INTERFACE_BRIDGE_ADD_MODEL
#include "Active/Serialise/CargoHold.h"
#include "Connector/Record/Model/CardMover.h"
#include "Connector/Record/Model/ModelCard.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
/*!
JS Function class to add a model card to the document storage
*/
class AddModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> {
public:
// MARK: - Constructors
/*!
Default constructor
*/
AddModel();
// MARK: - Functions (const)
/*!
Add a model card to document storage
@param card The card to add
*/
void run(const connector::record::ModelCard& card) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_ADD_MODEL
@@ -1,13 +1,10 @@
#include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h"
#include "Connector/Interface/Browser/Bridge/Base/AddModel.h"
#include "Connector/Interface/Browser/Bridge/Base/GetConnectorVersion.h"
#include "Connector/Interface/Browser/Bridge/Base/GetDocumentInfo.h"
#include "Connector/Interface/Browser/Bridge/Base/GetDocumentState.h"
#include "Connector/Interface/Browser/Bridge/Base/GetSourceApplicationName.h"
#include "Connector/Interface/Browser/Bridge/Base/GetSourceApplicationVersion.h"
#include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h"
#include "Connector/Interface/Browser/Bridge/Base/UpdateModel.h"
using namespace connector::interfac::browser::bridge;
@@ -16,12 +13,9 @@ using namespace connector::interfac::browser::bridge;
--------------------------------------------------------------------*/
BaseBridge::BaseBridge() : BrowserBridge{"baseBinding"} {
//Add bridge methods
addMethod<AddModel>();
addMethod<GetConnectorVersion>();
addMethod<GetDocumentInfo>();
addMethod<GetDocumentState>();
addMethod<GetSourceApplicationName>();
addMethod<GetSourceApplicationVersion>();
addMethod<RemoveModel>();
addMethod<UpdateModel>();
} //BaseBridge::BaseBridge
@@ -1,4 +1,4 @@
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
#include "Connector/Interface/Browser/Bridge/Base/DocumentInfo.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
@@ -19,9 +19,9 @@ namespace {
///Serialisation field IDs
static std::array fieldID = {
Identity{"location"},
Identity{"name"},
Identity{"id"},
Identity{"Location"},
Identity{"Name"},
Identity{"Id"},
};
}
@@ -1,5 +1,5 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_DOCUMENT_INFO
#define CONNECTOR_INTERFACE_BRIDGE_DOCUMENT_INFO
#ifndef CONNECTOR_INTERFACE_BRIDGE_CONNECTOR_CONFIG
#define CONNECTOR_INTERFACE_BRIDGE_CONNECTOR_CONFIG
#include "Active/Serialise/Package/Package.h"
#include "Speckle/Utility/String.h"
@@ -29,12 +29,12 @@ namespace connector::interfac::browser::bridge {
// MARK: - Public variables (NB: Assuming to class invariants or overrides for this data, so making public for simplicity)
///The URL of the project file (non-teamwork) or server (teamwork)
speckle::utility::String location;
///The project location
speckle::utility::String location; //TODO: Confirm this is an address
///The project name
speckle::utility::String name;
speckle::utility::String name; //TODO: Assume project name rather than document (file) name - need to confirm
///A unique, persistent ID for the project document
speckle::utility::String ID;
speckle::utility::String ID; //TODO: should possibly be a guid - need to check
// MARK: - Serialisation
@@ -58,4 +58,4 @@ namespace connector::interfac::browser::bridge {
}
#endif //CONNECTOR_INTERFACE_BRIDGE_DOCUMENT_INFO
#endif //CONNECTOR_INTERFACE_BRIDGE_CONNECTOR_CONFIG
@@ -19,7 +19,7 @@ namespace {
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetConnectorVersion::GetConnectorVersion() : BridgeMethod{"GetConnectorVersion", [&]() {
GetConnectorVersion::GetConnectorVersion() : JSBridgeMethod{"GetConnectorVersion", [&]() {
return run();
}} {}
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_CONNECTOR_VERSION
#define CONNECTOR_INTERFACE_BRIDGE_CONNECTOR_VERSION
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
@@ -10,7 +10,7 @@ namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve the names of the methods supported by the bridge
*/
class GetConnectorVersion : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
class GetConnectorVersion : public speckle::interfac::browser::bridge::JSBridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
@@ -1,10 +1,8 @@
#include "Connector/Interface/Browser/Bridge/Base/GetDocumentInfo.h"
#include "Active/Serialise/CargoHold.h"
#include "Connector/Connector.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Utility/Guid.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Interface/Browser/Bridge/Base/DocumentInfo.h"
using namespace active::container;
using namespace active::serialise;
@@ -20,7 +18,7 @@ namespace {
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetDocumentInfo::GetDocumentInfo() : BridgeMethod{"GetDocumentInfo", [&]() {
GetDocumentInfo::GetDocumentInfo() : JSBridgeMethod{"GetDocumentInfo", [&]() {
return run();
}} {}
@@ -30,15 +28,8 @@ GetDocumentInfo::GetDocumentInfo() : BridgeMethod{"GetDocumentInfo", [&]() {
return: The document info
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetDocumentInfo::run() const {
auto docInfo = std::make_unique<DocumentInfo>();
if (auto project = connector()->getActiveProject().lock(); project) {
auto info = project->getInfo();
docInfo->name = info.name;
if (info.path)
docInfo->location = *info.path;
//TODO: No suitable project ID is currently available
docInfo->ID = Guid{true}.operator String();
}
return std::make_unique<WrappedValue>(std::move(docInfo));
std::unique_ptr<Cargo> GetDocumentInfo::run(void) const {
///TODO: Get the document info here - returning mocked values for now
DocumentInfo docInfo{"Somewhere", "Something", String{active::utility::Guid{true}.operator active::utility::String()}};
return std::make_unique<WrappedValue>(docInfo);
} //GetDocumentInfo::run
@@ -1,14 +1,14 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_DOCUMENT_INFO
#define CONNECTOR_INTERFACE_BRIDGE_GET_DOCUMENT_INFO
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve the information about the active document
*/
class GetDocumentInfo : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
class GetDocumentInfo : public speckle::interfac::browser::bridge::JSBridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
@@ -24,7 +24,7 @@ namespace connector::interfac::browser::bridge {
Get the document info
@return The document info
*/
std::unique_ptr<active::serialise::Cargo> run() const;
std::unique_ptr<active::serialise::Cargo> run(void) const;
};
}
@@ -2,21 +2,25 @@
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Connector.h"
#include "Connector/Record/Model/ModelCard.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/DocumentInfo.h"
#include "Connector/Database/Model/Card/ModelCardDatabase.h"
using namespace active::container;
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
using namespace connector::database;
using namespace connector::record;
using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<PackageWrap, ModelCardDatabase>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetDocumentState::GetDocumentState() : BridgeMethod{"GetDocumentState", [&]() {
GetDocumentState::GetDocumentState() : JSBridgeMethod{"GetDocumentState", [&]() {
return run();
}} {}
@@ -26,9 +30,8 @@ GetDocumentState::GetDocumentState() : BridgeMethod{"GetDocumentState", [&]() {
return: The document info
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetDocumentState::run() const {
if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr) {
return modelCardDBase->wrapper();
}
return nullptr;
std::unique_ptr<Cargo> GetDocumentState::run(void) const {
///TODO: Retrieve the model card database from connector()->getModelCards() in future (when implemented)
ModelCardDatabase modelCards; //This is just a temp so something can be sent back to the JS for the interim
return std::make_unique<WrappedValue>(modelCards);
} //GetDocumentState::run
@@ -1,14 +1,14 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_DOCUMENT_STATE
#define CONNECTOR_INTERFACE_BRIDGE_GET_DOCUMENT_STATE
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve the information about the active document
*/
class GetDocumentState : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
class GetDocumentState : public speckle::interfac::browser::bridge::JSBridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
@@ -24,7 +24,7 @@ namespace connector::interfac::browser::bridge {
Get the document info
@return The document info
*/
std::unique_ptr<active::serialise::Cargo> run() const;
std::unique_ptr<active::serialise::Cargo> run(void) const;
};
}
@@ -18,7 +18,7 @@ namespace {
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetSourceApplicationName::GetSourceApplicationName() : BridgeMethod{"GetSourceApplicationName", [&]() {
GetSourceApplicationName::GetSourceApplicationName() : JSBridgeMethod{"GetSourceApplicationName", [&]() {
return run();
}} {}
@@ -28,7 +28,7 @@ GetSourceApplicationName::GetSourceApplicationName() : BridgeMethod{"GetSourceAp
return: The application name
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetSourceApplicationName::run() const {
std::unique_ptr<Cargo> GetSourceApplicationName::run(void) const {
//Implement other platforms as required
#ifdef ARCHICAD
String result{"Archicad"};
@@ -1,14 +1,14 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_APP_NAME
#define CONNECTOR_INTERFACE_BRIDGE_GET_APP_NAME
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve the host application name
*/
class GetSourceApplicationName : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
class GetSourceApplicationName : public speckle::interfac::browser::bridge::JSBridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
@@ -18,7 +18,7 @@ namespace {
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetSourceApplicationVersion::GetSourceApplicationVersion() : BridgeMethod{"GetSourceApplicationVersion", [&]() {
GetSourceApplicationVersion::GetSourceApplicationVersion() : JSBridgeMethod{"GetSourceApplicationVersion", [&]() {
return run();
}} {}
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_APP_VERSION
#define CONNECTOR_INTERFACE_BRIDGE_GET_APP_VERSION
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
@@ -10,7 +10,7 @@ namespace connector::interfac::browser::bridge {
/*!
JS Function class to get the host application version
*/
class GetSourceApplicationVersion : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
class GetSourceApplicationVersion : public speckle::interfac::browser::bridge::JSBridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
@@ -1,36 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h"
#include "Connector/Connector.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
using namespace active::container;
using namespace active::serialise;
using namespace connector::database;
using namespace connector::record;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<PackageWrap, DocumentInfo>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
RemoveModel::RemoveModel() : BridgeMethod{"RemoveModel", [&](const ModelCardEventWrapper& card) {
return run(card.get());
}} {}
/*--------------------------------------------------------------------
Add a model card to document storage
card: The card to add
--------------------------------------------------------------------*/
void RemoveModel::run(const ModelCard& card) const {
if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr)
modelCardDBase->erase(card.getID());
} //RemoveModel::run
@@ -1,40 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_REMOVE_MODEL
#define CONNECTOR_INTERFACE_BRIDGE_REMOVE_MODEL
#include "Active/Serialise/CargoHold.h"
#include "Connector/Record/Model/CardMover.h"
#include "Connector/Record/Model/ModelCard.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
/*!
JS Function class to add a model card to the document storage
*/
class RemoveModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> {
public:
// MARK: - Constructors
/*!
Default constructor
*/
RemoveModel();
// MARK: - Functions (const)
/*!
Add a model card to document storage
@param card The card to add
*/
void run(const connector::record::ModelCard& card) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_REMOVE_MODEL
@@ -1,36 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Base/UpdateModel.h"
#include "Connector/Connector.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
using namespace active::container;
using namespace active::serialise;
using namespace connector::database;
using namespace connector::record;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<PackageWrap, DocumentInfo>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
UpdateModel::UpdateModel() : BridgeMethod{"UpdateModel", [&](const ModelCardEventWrapper& card) {
return run(card.get());
}} {}
/*--------------------------------------------------------------------
Add a model card to document storage
card: The card to add
--------------------------------------------------------------------*/
void UpdateModel::run(const ModelCard& card) const {
if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr)
modelCardDBase->write(card);
} //UpdateModel::run
@@ -1,40 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_UPDATE_MODEL
#define CONNECTOR_INTERFACE_BRIDGE_UPDATE_MODEL
#include "Active/Serialise/CargoHold.h"
#include "Connector/Record/Model/CardMover.h"
#include "Connector/Record/Model/ModelCard.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
/*!
JS Function class to add a model card to the document storage
*/
class UpdateModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> {
public:
// MARK: - Constructors
/*!
Default constructor
*/
UpdateModel();
// MARK: - Functions (const)
/*!
Add a model card to document storage
@param card The card to add
*/
void run(const connector::record::ModelCard& card) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_UPDATE_MODEL
@@ -2,7 +2,6 @@
#include "Connector/Interface/Browser/Bridge/Config/GetConfig.h"
#include "Connector/Interface/Browser/Bridge/Config/UpdateConfig.h"
#include "Connector/Interface/Browser/Bridge/Config/GetIsDevMode.h"
using namespace connector::interfac::browser::bridge;
@@ -13,5 +12,4 @@ ConfigBridge::ConfigBridge() : BrowserBridge{"configBinding"} {
//Add bridge methods
addMethod<GetConfig>();
addMethod<UpdateConfig>();
addMethod<GetIsDevMode>();
} //ConfigBridge::ConfigBridge
@@ -1,7 +1,6 @@
#include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h"
#include "Connector/Interface/Browser/Bridge/Config/ConnectorConfig.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include <array>
@@ -17,7 +16,7 @@ namespace {
///Serialisation field IDs
static std::array fieldID = {
Identity{"darkTheme"},
Identity{"DarkTheme"},
};
}
@@ -2,7 +2,6 @@
#define CONNECTOR_INTERFACE_BRIDGE_CONNECTOR_CONFIG
#include "Active/Serialise/Package/Package.h"
#include "Speckle/Interface/Browser/Bridge/ArgumentBase.h"
namespace connector::interfac::browser::bridge {
@@ -25,7 +24,7 @@ namespace connector::interfac::browser::bridge {
// MARK: - Public variables (NB: Assuming to class invariants or overrides for this data, so making public for simplicity)
///True if the UI renders in dark mode
///?
bool isDarkTheme = true;
// MARK: - Serialisation
@@ -1,8 +1,8 @@
#include "Connector/Interface/Browser/Bridge/Config/GetConfig.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h"
#include "Active/Serialise/Package/PackageWrap.h"
#include "Connector/Interface/Browser/Bridge/Config/ConnectorConfig.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
@@ -18,7 +18,7 @@ namespace {
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetConfig::GetConfig() : BridgeMethod{"GetConfig", [&]() {
GetConfig::GetConfig() : JSBridgeMethod{"GetConfig", [&]() {
return run();
}} {}
@@ -28,8 +28,8 @@ GetConfig::GetConfig() : BridgeMethod{"GetConfig", [&]() {
return: The settings
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetConfig::run() const {
auto config = std::make_unique<ConnectorConfig>();
///TODO: Get the data from a local SQLite database
return std::make_unique<WrappedValue>(std::move(config));
std::unique_ptr<Cargo> GetConfig::run(void) const {
ConnectorConfig config;
///TODO: Get the accounts here - returning an empty array for testing only
return std::make_unique<WrappedValue>(config);
} //GetConfig::run
@@ -1,20 +1,22 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#define CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Connector/Interface/Browser/Bridge/Config/ConnectorConfig.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve the names of the methods supported by the bridge
*/
class GetConfig : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
class GetConfig : public speckle::interfac::browser::bridge::JSBridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
/*!
Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/
GetConfig();
@@ -24,7 +26,7 @@ namespace connector::interfac::browser::bridge {
Get the configuration settings
@return The settings
*/
std::unique_ptr<active::serialise::Cargo> run() const;
std::unique_ptr<active::serialise::Cargo> run(void) const;
};
}
@@ -1,39 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Config/GetIsDevMode.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
///Return type for retrieving the current configuration
using WrappedValue = CargoHold<ValueWrap<bool>, bool>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetIsDevMode::GetIsDevMode() : BridgeMethod{"GetIsDevMode", [&]() {
return run();
}} {}
/*--------------------------------------------------------------------
Get the DEBUG mode
return: true for DEBUG, false otherwise
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetIsDevMode::run() const {
#if DEBUG
bool value = true;
#else
bool value = false;
#endif
return std::make_unique<WrappedValue>(value);
} //GetIsDevMode::run
@@ -1,32 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_IS_DEV_MODE
#define CONNECTOR_INTERFACE_BRIDGE_GET_IS_DEV_MODE
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve IsDebugMode
*/
class GetIsDevMode : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
/*!
Constructor
*/
GetIsDevMode();
// MARK: - Functions (const)
/*!
Get the DEBUG mode
@return true for DEBUG, false otherwise
*/
std::unique_ptr<active::serialise::Cargo> run() const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_GET_IS_DEV_MODE
@@ -1,7 +1,8 @@
#include "Connector/Interface/Browser/Bridge/Config/UpdateConfig.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Active/Serialise/Package/PackageWrap.h"
#include "Connector/Interface/Browser/Bridge/Config/ConnectorConfig.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
@@ -10,8 +11,8 @@ using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
UpdateConfig::UpdateConfig() : BridgeMethod{"UpdateConfig", [&](const UpdateArgs& args) {
run(args);
UpdateConfig::UpdateConfig() : JSBridgeMethod{"UpdateConfig", [&](UpdateArgs args) {
run(args.value);
}} {}
@@ -21,5 +22,5 @@ UpdateConfig::UpdateConfig() : BridgeMethod{"UpdateConfig", [&](const UpdateArgs
config: The new settings
--------------------------------------------------------------------*/
void UpdateConfig::run(const ConnectorConfig& config) const {
///TODO: Store the active configuration settings in a local SQLite database
///TODO: Store the active configuration settings here
} //UpdateConfig::run
@@ -2,8 +2,8 @@
#define CONNECTOR_INTERFACE_BRIDGE_UPDATE_CONFIG
#include "Active/Serialise/CargoHold.h"
#include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
#include "Connector/Interface/Browser/Bridge/Config/ConnectorConfig.h"
#include "Speckle/Interface/Browser/Bridge/JSBridgeMethod.h"
namespace connector::interfac::browser::bridge {
@@ -15,7 +15,7 @@ namespace connector::interfac::browser::bridge {
/*!
JS Function class to retrieve the names of the methods supported by the bridge
*/
class UpdateConfig : public speckle::interfac::browser::bridge::BridgeMethod<UpdateArgs, void> {
class UpdateConfig : public speckle::interfac::browser::bridge::JSBridgeMethod<UpdateArgs, void> {
public:
// MARK: - Constructors
@@ -1,41 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Send/GetSendFilters.h"
#include "Active/Container/Vector.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Connector/Record/Model/Filter/ArchicadEverythingFilter.h"
#include "Connector/Record/Model/Filter/FilterMover.h"
#include "Connector/Record/Model/Filter/ArchicadSelectionFilter.h"
using namespace active::container;
using namespace active::serialise;
using namespace connector::record;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<ContainerWrap<Vector<SendFilter>, FilterMover>, Vector<SendFilter>>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetSendFilters::GetSendFilters() : BridgeMethod{"GetSendFilters", [&]() {
return run();
}} {}
/*--------------------------------------------------------------------
Get the send filters
return: The send filters
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetSendFilters::run() const {
auto filters = std::make_unique<Vector<SendFilter>>();
//filters.emplace_back(ArchicadEverythingFilter{}); //TODO: Implement as required
filters->emplace_back(ArchicadSelectionFilter{});
return std::make_unique<WrappedValue>(std::move(filters));
} //GetSendFilters::run
@@ -1,36 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_SEND_FILTERS
#define CONNECTOR_INTERFACE_BRIDGE_GET_SEND_FILTERS
#include "Active/Serialise/CargoHold.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
class ConnectorConfig;
/*!
JS Function class to retrieve the send filters
*/
class GetSendFilters : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
/*!
Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/
GetSendFilters();
// MARK: - Functions (const)
/*!
Get the send filters
@return The send filters
*/
std::unique_ptr<active::serialise::Cargo> run() const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_GET_SEND_FILTERS
@@ -1,27 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Send/Send.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Speckle/Utility/Exception.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
Send::Send() : BridgeMethod{"Send", [&](const SendArgs& args) {
run(args);
}} {}
/*--------------------------------------------------------------------
Send a specified model
modelCardID: The ID of the madel to send
--------------------------------------------------------------------*/
void Send::run(const String& modelCardID) const {
///TODO: Find and send selected elements - the following is a placeholder
throw Exception{"No objects were found to convert. Please update your publish filter!"};
} //Send::run
@@ -1,43 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SEND
#define CONNECTOR_INTERFACE_BRIDGE_SEND
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
class ConnectorConfig;
///Argument parameter for a string
using StringHold = active::serialise::CargoHold<active::serialise::ValueWrap<speckle::utility::String>, speckle::utility::String>;
///Argument type for this method
using SendArgs = speckle::interfac::browser::bridge::JSArgType<StringHold>;
/*!
JS Function class to send a specified model
*/
class Send : public speckle::interfac::browser::bridge::BridgeMethod<SendArgs, void> {
public:
// MARK: - Constructors
/*!
Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/
Send();
// MARK: - Functions (const)
/*!
Send a specified model
@param modelCardID The ID of the madel to send
*/
void run(const speckle::utility::String& modelCardID) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SEND
@@ -1,15 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Send/SendBridge.h"
#include "Connector/Interface/Browser/Bridge/Send/GetSendFilters.h"
#include "Connector/Interface/Browser/Bridge/Send/Send.h"
using namespace connector::interfac::browser::bridge;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
SendBridge::SendBridge() : BrowserBridge{"sendBinding"} {
//Add bridge methods
addMethod<GetSendFilters>();
addMethod<Send>();
} //SendBridge::SendBridge
@@ -1,29 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SEND_BRIDGE
#define CONNECTOR_INTERFACE_BRIDGE_SEND_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
namespace connector::interfac::browser::bridge {
/*!
A browser bridge to support sending model data to a Speckle server
*/
class SendBridge : public speckle::interfac::browser::bridge::BrowserBridge {
public:
// MARK: - Types
using base = speckle::interfac::browser::bridge::BrowserBridge;
// MARK: - Constructors
using base::base;
/*!
Default constructor
*/
SendBridge();
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SEND_BRIDGE
@@ -1,80 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Test/Arg/SayHiArg.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include <array>
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
nameID,
countID,
isHelloID,
};
///Serialisation field IDs. NB: This structure is never exported, so we only define the incoming argument indices
static std::array fieldID = {
Identity{"0"},
Identity{"1"},
Identity{"2"},
};
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool SayHiArg::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[nameID], nameID, element },
{ fieldID[countID], countID, element },
{ fieldID[isHelloID], isHelloID, element },
},
}.withType(&typeid(SayHiArg)));
return true;
} //SayHiArg::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique SayHiArg::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(SayHiArg))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case nameID:
return std::make_unique<ValueWrap<String>>(name);
case countID:
return std::make_unique<ValueWrap<int32_t>>(count);
case isHelloID:
return std::make_unique<ValueWrap<bool>>(isHello);
default:
return nullptr; //Requested an unknown index
}
} //SayHiArg::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void SayHiArg::setDefault() {
name.clear();
count = 0;
isHello = false;
} //SayHiArg::setDefault
@@ -1,133 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Test/GetComplexType.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include <array>
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
unID,
countID,
isTestID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"id"},
Identity{"count"},
Identity{"thisIsABoolean"},
};
/*!
Object for testing Javascript communication (with TestBridge binding)
*/
class ComplexType final : public active::serialise::Package {
public:
// MARK: - Types
using base = active::serialise::Package;
// MARK: - Constructors
/*!
Default constructor
*/
ComplexType();
// MARK: - Public variables
///Sample parameters for testing only
speckle::utility::String ID;
int32_t count = 0;
bool testBool = false;
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[unID], unID, element, !ID.empty() },
{ fieldID[countID], countID, element, count != 0 },
{ fieldID[isTestID], isTestID, element, testBool },
},
}.withType(&typeid(ComplexType)));
return true;
}
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override {
if (item.ownerType != &typeid(ComplexType))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case unID:
return std::make_unique<ValueWrap<String>>(ID);
case countID:
return std::make_unique<ValueWrap<int32_t>>(count);
case isTestID:
return std::make_unique<ValueWrap<bool>>(testBool);
default:
return nullptr; //Requested an unknown index
}
}
};
///Return type for retrieving the current configuration
using WrappedValue = CargoHold<PackageWrap, ComplexType>;
}
//Hashing specialisation
template<>
struct std::hash<ComplexType> {
auto operator()(const ComplexType& obj) const {
return hash<std::string>()(obj.ID) ^ rotl(hash<int32_t>()(obj.count), 1) ^ rotl(hash<bool>()(obj.testBool), 2);
}
};
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
ComplexType::ComplexType() {
//This is the required test values
count = static_cast<int32_t>(std::hash<ComplexType>()(*this));
ID = String{count} + " - I am a string";
} //ComplexType::ComplexType
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetComplexType::GetComplexType() : BridgeMethod{"GetComplexType", [&]() {
return run();
}} {}
/*--------------------------------------------------------------------
Get the required object type
return: The required object
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetComplexType::run() const {
auto object = std::make_unique<ComplexType>();
return std::make_unique<WrappedValue>(std::move(object));
} //GetComplexType::run
@@ -1,33 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#define CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to return a specific object type
*/
class GetComplexType : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
/*!
Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/
GetComplexType();
// MARK: - Functions (const)
/*!
Get the required object type
@return The required object
*/
std::unique_ptr<active::serialise::Cargo> run() const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
@@ -1,20 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Test/GoAway.h"
using namespace connector::interfac::browser::bridge;
#include <iostream>
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GoAway::GoAway() : BridgeMethod{"GoAway", [&]() {
return run();
}} {}
/*--------------------------------------------------------------------
Write a message to the console
--------------------------------------------------------------------*/
void GoAway::run() const {
std::cout << "Okay, going away.";
} //GoAway::run
@@ -1,31 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GO_AWAY
#define CONNECTOR_INTERFACE_BRIDGE_GO_AWAY
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
/*!
JS Function class to print a fixed message to the console
*/
class GoAway : public speckle::interfac::browser::bridge::BridgeMethod<void, void> {
public:
// MARK: - Constructors
/*!
Default constructor
*/
GoAway();
// MARK: - Functions (const)
/*!
Write a message to the console
*/
void run() const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_GO_AWAY
@@ -1,38 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Test/SayHi.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
using namespace active::serialise;
using namespace active::setting;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
///Return type for the test message
using WrappedValue = CargoHold<ValueWrap<String>, String>;
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
SayHi::SayHi() : BridgeMethod{"SayHi", [&](SayHiWrapper arg) {
return run(arg);
}} {}
/*--------------------------------------------------------------------
Return a message based on sample data
arg: The sample data
return: The message based on sample data
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> SayHi::run(SayHiArg arg) const {
String result, baseGreeting{(arg.isHello ? "Hello" : "Hi") + arg.name + "!\n"};
for (auto i = arg.count; i--; )
result += baseGreeting;
return std::make_unique<WrappedValue>(result);
} //SayHi::run
@@ -1,37 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SAYHI
#define CONNECTOR_INTERFACE_BRIDGE_SAYHI
#include "Connector/Interface/Browser/Bridge/Test/Arg/SayHiArg.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
///Argument for the parameters of a test message
using SayHiWrapper = speckle::interfac::browser::bridge::JSArgType<SayHiArg, 3>;
/*!
JS Function class to return a test message based on sample data
*/
class SayHi : public speckle::interfac::browser::bridge::BridgeMethod<SayHiWrapper, active::serialise::Cargo> {
public:
// MARK: - Constructors
/*!
Default constructor
*/
SayHi();
// MARK: - Functions (const)
/*!
Return a message based on sample data
@param arg The sample data
@return The message based on sample data
*/
std::unique_ptr<active::serialise::Cargo> run(SayHiArg arg) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SAYHI
@@ -1,19 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Test/TestBridge.h"
#include "Connector/Interface/Browser/Bridge/Test/GetComplexType.h"
#include "Connector/Interface/Browser/Bridge/Test/GoAway.h"
#include "Connector/Interface/Browser/Bridge/Test/SayHi.h"
#include "Connector/Interface/Browser/Bridge/Test/TriggerEvent.h"
using namespace connector::interfac::browser::bridge;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
TestBridge::TestBridge() : BrowserBridge{"testBinding"} {
//Add bridge methods
addMethod<GetComplexType>();
addMethod<GoAway>();
addMethod<SayHi>();
addMethod<TriggerEvent>();
} //TestBridge::TestBridge
@@ -1,29 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_TEST_BRIDGE
#define CONNECTOR_INTERFACE_BRIDGE_TEST_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
namespace connector::interfac::browser::bridge {
/*!
A browser bridge to provide configuration settings
*/
class TestBridge : public speckle::interfac::browser::bridge::BrowserBridge {
public:
// MARK: - Types
using base = speckle::interfac::browser::bridge::BrowserBridge;
// MARK: - Constructors
using base::base;
/*!
Default constructor
*/
TestBridge();
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_TEST_BRIDGE
@@ -1,105 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Test/TriggerEvent.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include <array>
using namespace active::serialise;
using namespace active::setting;
using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
okID,
nameID,
countID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"isOk"},
Identity{"name"},
Identity{"count"},
};
/*!
Object for testing sending events to JS
*/
class TestObject final : public active::serialise::Package {
public:
// MARK: - Public variables
///Sample parameters for testing only
bool isOK = true;
speckle::utility::String name = "foo";
int32_t count = 42;
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[okID], okID, element },
{ fieldID[nameID], nameID, element },
{ fieldID[countID], countID, element },
},
}.withType(&typeid(TestObject)));
return true;
}
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override {
if (item.ownerType != &typeid(TestObject))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case okID:
return std::make_unique<ValueWrap<bool>>(isOK);
case nameID:
return std::make_unique<ValueWrap<String>>(name);
case countID:
return std::make_unique<ValueWrap<int32_t>>(count);
default:
return nullptr; //Requested an unknown index
}
}
};
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
TriggerEvent::TriggerEvent() : BridgeMethod{"TriggerEvent", [&](const TriggerEventWrapper& arg) {
return run(arg);
}} {}
/*--------------------------------------------------------------------
Trigger an event based on a specified name
eventName: The event name
--------------------------------------------------------------------*/
void TriggerEvent::run(const speckle::utility::String& eventName) const {
if (!hasBridge())
return;
if (eventName == "emptyTestEvent")
getBridge()->sendEvent(eventName);
else if (eventName == "testEvent")
getBridge()->sendEvent(eventName, std::make_unique<TestObject>());
} //TriggerEvent::run
@@ -1,39 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_TRIGGER_EVENT
#define CONNECTOR_INTERFACE_BRIDGE_TRIGGER_EVENT
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/CargoHold.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
///Argument parameter for a string
using StringHold = active::serialise::CargoHold<active::serialise::ValueWrap<speckle::utility::String>, speckle::utility::String>;
///Argument type for this method
using TriggerEventWrapper = speckle::interfac::browser::bridge::JSArgType<StringHold>;
/*!
JS Function class to emit specified events as directed by JS
*/
class TriggerEvent : public speckle::interfac::browser::bridge::BridgeMethod<TriggerEventWrapper, void> {
public:
// MARK: - Constructors
/*!
Default constructor
*/
TriggerEvent();
// MARK: - Functions (const)
/*!
Trigger an event based on a specified name
@param eventName The event name
*/
void run(const speckle::utility::String& eventName) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_TRIGGER_EVENT
@@ -6,8 +6,6 @@
#include "Connector/Interface/Browser/Bridge/Account/AccountBridge.h"
#include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h"
#include "Connector/Interface/Browser/Bridge/Config/ConfigBridge.h"
#include "Connector/Interface/Browser/Bridge/Send/SendBridge.h"
#include "Connector/Interface/Browser/Bridge/Test/TestBridge.h"
#include "Speckle/Environment/Addon.h"
#include "Speckle/Event/Type/MenuEvent.h"
#include "Speckle/Interface/Browser/JSPortal.h"
@@ -19,9 +17,9 @@
using namespace active::environment;
using namespace active::event;
using namespace connector;
using namespace speckle::interfac::browser;
using namespace connector::interfac::browser::bridge;
using namespace speckle::event;
//using namespace speckle::interfac::browser;
//NB: Following is placeholder from GS example code - will be refactored to better suit our purposes
@@ -37,7 +35,7 @@ namespace {
// --- Class declaration: BrowserPalette ------------------------------------------
class BrowserPalette final : public DG::Palette, public DG::PanelObserver, public JSPortal<> {
class BrowserPalette final : public DG::Palette, public DG::PanelObserver, public speckle::interfac::browser::JSPortal<> {
public:
enum SelectionModification { RemoveFromSelection, AddToSelection };
@@ -129,7 +127,7 @@ bool ConnectorPalette::start() {
--------------------------------------------------------------------*/
bool ConnectorPalette::receive(const active::event::Event& event) {
if (BrowserPalette::HasInstance() && BrowserPalette::GetInstance().IsVisible()) {
BrowserPalette::GetInstance().Hide ();
BrowserPalette::GetInstance ().Hide ();
} else {
if (!BrowserPalette::HasInstance())
BrowserPalette::CreateInstance();
@@ -163,11 +161,9 @@ BrowserPalette::BrowserPalette() :
Attach(*this);
BeginEventProcessing();
//Install required connector bridges
install<AccountBridge>();
install<BaseBridge>();
install<ConfigBridge>();
install<SendBridge>();
install<TestBridge>();
install(std::make_shared<AccountBridge>());
install(std::make_shared<BaseBridge>());
install(std::make_shared<ConfigBridge>());
InitBrowserControl();
}
@@ -205,11 +201,7 @@ void BrowserPalette::Hide() {
}
void BrowserPalette::InitBrowserControl() {
#ifdef TESTING_MODE
browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/test");
#else
browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/");
#endif
}
@@ -1,58 +0,0 @@
/*!
Copyright 2024 Ralph Wessel and Hugh Wessel
Distributed under the MIT License (See accompanying file LICENSE.txt or copy at https://opensource.org/license/mit/)
*/
#include "Connector/Record/Model/CardMover.h"
#include "Connector/Record/Model/ReceiverModelCard.h"
#include "Connector/Record/Model/SenderModelCard.h"
using namespace connector::record;
namespace {
///The tag used to identify a Speckle type name value
const char* attributeTag = "typeDiscriminator";
///Identity for a ReceiverModelCard
const char* receiverCardTypeName = "ReceiverModelCard";
///Identity for a SenderModelCard
const char* senderCardTypeName = "SenderModelCard";
/*--------------------------------------------------------------------
Ensure the handler is populated
handler: The card handler to validate
return: A reference to the handler
--------------------------------------------------------------------*/
std::shared_ptr<active::serialise::Handler>& validateHandler(std::shared_ptr<active::serialise::Handler>& handler) {
if (!handler->empty())
return handler;
handler->add<ReceiverModelCard>(receiverCardTypeName);
handler->add<SenderModelCard>(senderCardTypeName);
return handler;
} //CardMover::validateHandler
}
///The handler for model card packages
std::shared_ptr<active::serialise::Handler> CardMover::m_handler = std::make_shared<active::serialise::Handler>(attributeTag);
/*--------------------------------------------------------------------
Constructor (for deserialisation)
handler: A package handler to reconstruct incoming packages
--------------------------------------------------------------------*/
CardMover::CardMover() : Mover{validateHandler(m_handler)} {
} //CardMover::CardMover
/*--------------------------------------------------------------------
Constructor (for serialisation)
outgoing: An outgoing package
--------------------------------------------------------------------*/
CardMover::CardMover(const active::serialise::Package& outgoing) : Mover{outgoing, validateHandler(m_handler)} {
} //CardMover::CardMover
@@ -1,36 +0,0 @@
#ifndef CONNECTOR_MODEL_CARD_MOVER
#define CONNECTOR_MODEL_CARD_MOVER
#include "Active/Serialise/Package/Wrapper/Mover.h"
namespace connector::record {
/*!
Wrapper to box/unbox objects during (de)serialisation, including reading/writing a specified attribute to determine object type
Note that a derived class could also define the package handler, allowing the wrapper to be created via a default constructor that is
automatically bound to a set of internally defined object types
*/
class CardMover : public active::serialise::Mover {
public:
// MARK: - Constructors
/*!
Default constructor
*/
CardMover();
/*!
Constructor (for serialisation)
@param outgoing An outgoing package
*/
CardMover(const active::serialise::Package& outgoing);
private:
///The handler for model card packages
static std::shared_ptr<active::serialise::Handler> m_handler;
};
}
#endif //CONNECTOR_MODEL_CARD_MOVER
@@ -1,94 +0,0 @@
#include "Connector/Record/Model/CardSetting.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Item/Wrapper/AnyValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include <array>
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
idID,
titleID,
typeID,
valueID,
enumID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"id"},
Identity{"title"},
Identity{"type"},
Identity{"value"},
Identity{"enum"},
};
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool CardSetting::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[idID], idID, element },
{ fieldID[titleID], titleID, element },
{ fieldID[typeID], typeID, element },
{ fieldID[valueID], valueID, element },
{ fieldID[enumID], enumID, element },
},
}.withType(&typeid(CardSetting)));
return true;
} //CardSetting::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique CardSetting::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(CardSetting))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case idID:
return std::make_unique<ValueWrap<String>>(m_ID);
case titleID:
return std::make_unique<ValueWrap<String>>(m_title);
case typeID:
return std::make_unique<ValueWrap<String>>(m_type);
case valueID:
return std::make_unique<AnyValueWrap>(*m_value);
case enumID:
return std::make_unique<ContainerWrap<std::vector<speckle::utility::String>>>(m_enum);
default:
return nullptr; //Requested an unknown index
}
} //CardSetting::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void CardSetting::setDefault() {
m_ID.clear();
m_title.clear();
m_type.clear();
m_value->setDefault();
m_enum.clear();
} //CardSetting::setDefault
@@ -1,107 +0,0 @@
#ifndef CONNECTOR_RECORD_CARD_SETTING
#define CONNECTOR_RECORD_CARD_SETTING
#include "Active/Serialise/Package/Package.h"
#include "Active/Setting/ValueSetting.h"
#include "Active/Setting/Values/StringValue.h"
#include "Active/Utility/Cloner.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
namespace connector::record {
/*!
A setting attached to a model card, capturing rendering/view states of the model at the time of sending, e.g. level of detail (LoD)
*/
class CardSetting : public active::serialise::Package, public active::utility::Cloner {
public:
// MARK: - Types
using base = active::serialise::Package;
// MARK: - Constructors
/*!
Default constructor
*/
CardSetting() {}
/*!
Copy constructor
@param source The object to copy
*/
CardSetting(const CardSetting& source) :
m_title{source.m_title}, m_type{source.m_type}, m_value{clone(*source.m_value)}, m_enum{source.m_enum} {}
/*!
Destructor
*/
~CardSetting() {}
/*!
Record cloning
@return A clone of this record
*/
virtual CardSetting* clonePtr() const override { return new CardSetting(*this); };
// MARK: - Functions (const)
/*!
Get the setting ID
@return The setting ID
*/
const speckle::utility::String& getID() const { return m_ID; }
/*!
Get the setting title
@return The setting title
*/
const speckle::utility::String& getTitle() const { return m_title; }
/*!
Get the setting type
@return The setting type
*/
const speckle::utility::String& getType() const { return m_type; }
/*!
Get the setting value
@return The setting value
*/
const active::setting::Value& getValue() const { return *m_value; }
/*!
Get the options for the value, i.e. possible values it can hold
@return Possible setting values
*/
std::vector<speckle::utility::String> getEnum() const { return m_enum; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///A unique ID for the setting
speckle::utility::String m_ID = {active::utility::Guid{true}.operator active::utility::String()};
///The model ID
speckle::utility::String m_title;
///The project ID
speckle::utility::String m_type;
///The setting value
active::setting::Value::Unique m_value = std::make_unique<active::setting::StringValue>();
///Possible values for the setting (as strings)
std::vector<speckle::utility::String> m_enum;
};
}
#endif //CONNECTOR_RECORD_CARD_SETTING
@@ -1,38 +0,0 @@
#ifndef CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER
#define CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER
#include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/EverythingSendFilter.h"
namespace connector::record {
/*!
A send filter consisting of a list of selected Archicad element IDs
*/
class ArchicadEverythingFilter : public EverythingSendFilter {
public:
// MARK: - Types
using base = EverythingSendFilter;
// MARK: - Constructors
/*!
Default constructor
@param sum A summary
@param isDef True if this is the default filter
*/
ArchicadEverythingFilter(const speckle::utility::String& sum = {}, bool isDef = false) : base{sum, isDef} {}
/*!
Record cloning
@return A clone of this record
*/
ArchicadEverythingFilter* clonePtr() const override { return new ArchicadEverythingFilter(*this); };
// MARK: - Functions (const)
};
}
#endif //CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER
@@ -1,38 +0,0 @@
#ifndef CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER
#define CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER
#include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/DirectSelectionSendFilter.h"
namespace connector::record {
/*!
A send filter consisting of a list of selected Archicad element IDs
*/
class ArchicadSelectionFilter : public DirectSelectionSendFilter {
public:
// MARK: - Types
using base = DirectSelectionSendFilter;
// MARK: - Constructors
/*!
Default constructor
@param sum A summary
@param isDef True if this is the default filter
*/
ArchicadSelectionFilter(const speckle::utility::String& sum = {}, bool isDef = false) : base{sum, isDef} {}
/*!
Record cloning
@return A clone of this record
*/
ArchicadSelectionFilter* clonePtr() const override { return new ArchicadSelectionFilter(*this); };
// MARK: - Functions (const)
};
}
#endif //CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER
@@ -1,71 +0,0 @@
#include "Connector/Record/Model/Filter/DirectSelectionSendFilter.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include <algorithm>
#include <array>
using namespace active::serialise;
using namespace connector::database;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
selectedElemID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"selectedObjectIds"},
};
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool DirectSelectionSendFilter::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[selectedElemID], selectedElemID, element },
},
}.withType(&typeid(DirectSelectionSendFilter)));
return base::fillInventory(inventory);
} //DirectSelectionSendFilter::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique DirectSelectionSendFilter::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(DirectSelectionSendFilter))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case selectedElemID:
return std::make_unique<ContainerWrap<ElementIDList>>(m_selectedElements);
default:
return nullptr; //Requested an unknown index
}
} //DirectSelectionSendFilter::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void DirectSelectionSendFilter::setDefault() {
m_selectedElements.clear();
} //DirectSelectionSendFilter::setDefault
@@ -1,67 +0,0 @@
#ifndef CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER
#define CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER
#include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
namespace connector::record {
/*!
A send filter consisting of a list of selected element IDs
*/
class DirectSelectionSendFilter : public SendFilter {
public:
// MARK: - Types
using base = SendFilter;
// MARK: - Constructors
/*!
Default constructor
@param sum A summary
@param isDef True if this is the default filter
*/
DirectSelectionSendFilter(const speckle::utility::String& sum = {}, bool isDef = false) : base{"Selection", sum, isDef} {}
/*!
Record cloning
@return A clone of this record
*/
DirectSelectionSendFilter* clonePtr() const override { return new DirectSelectionSendFilter(*this); };
// MARK: - Functions (const)
/*!
Get the filtered element IDs
@return The filter elements
*/
const database::ElementIDList& getElementIDs() const override { return m_selectedElements; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///A list of selected element IDs
database::ElementIDList m_selectedElements;
};
}
#endif //CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER
@@ -1,73 +0,0 @@
#ifndef CONNECTOR_RECORD_EVERYTHING_SEND_FILTER
#define CONNECTOR_RECORD_EVERYTHING_SEND_FILTER
#include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
namespace connector::record {
/*!
A send filter consisting of a list of selected element IDs
*/
class EverythingSendFilter : public SendFilter {
public:
// MARK: - Types
using base = SendFilter;
// MARK: - Constructors
/*!
Default constructor
@param sum A summary
@param isDef True if this is the default filter
*/
EverythingSendFilter(const speckle::utility::String& sum = {}, bool isDef = false) : base{"Everything", sum, isDef} {}
/*!
Record cloning
@return A clone of this record
*/
EverythingSendFilter* clonePtr() const override { return new EverythingSendFilter(*this); };
// MARK: - Functions (const)
/*!
Get the filtered element IDs
@return The filter elements
*/
const database::ElementIDList& getElementIDs() const override { return m_emptyList; }
/*!
Determine if the filter has expired because an element in the selection has changed
@param changed The list of changed element IDs
@return True if the one of the changed elements is in the selection
*/
virtual bool checkExpiry(const database::ElementIDList& changed) const override { return true; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///Enables a const empty list to be returned
database::ElementIDList m_emptyList;
};
}
#endif //CONNECTOR_RECORD_EVERYTHING_SEND_FILTER
@@ -1,69 +0,0 @@
/*!
Copyright 2024 Ralph Wessel and Hugh Wessel
Distributed under the MIT License (See accompanying file LICENSE.txt or copy at https://opensource.org/license/mit/)
*/
#include "Connector/Record/Model/Filter/FilterMover.h"
#include "Connector/Record/Model/Filter/ArchicadEverythingFilter.h"
#include "Connector/Record/Model/Filter/ArchicadSelectionFilter.h"
using namespace active::serialise;
using namespace active::utility;
using namespace connector::record;
namespace {
///The tag used to identify a Speckle type name value
const char* attributeTag = "typeDiscriminator";
///Identity for selecting everything
const char* ArchicadEverythingTypeName = "ArchicadEverythingFilter";
///Identity for a selection filter
const char* ArchicadSelectionTypeName = "ArchicadSelectionFilter";
/*--------------------------------------------------------------------
Ensure the handler is populated
handler: The filter handler to validate
return: A reference to the handler
--------------------------------------------------------------------*/
std::shared_ptr<active::serialise::Handler>& validateHandler(std::shared_ptr<active::serialise::Handler>& handler) {
if (!handler->empty())
return handler;
handler->add<ArchicadEverythingFilter>(ArchicadEverythingTypeName);
handler->add<ArchicadSelectionFilter>(ArchicadSelectionTypeName);
return handler;
} //validateHandler
}
///The handler for model card packages
std::shared_ptr<active::serialise::Handler> FilterMover::m_handler = std::make_shared<active::serialise::Handler>(attributeTag);
/*--------------------------------------------------------------------
Constructor (for deserialisation)
handler: A package handler to reconstruct incoming packages
--------------------------------------------------------------------*/
FilterMover::FilterMover() : Mover{validateHandler(m_handler)} {
} //FilterMover::FilterMover
/*--------------------------------------------------------------------
Constructor (for serialisation)
outgoing: An outgoing package
--------------------------------------------------------------------*/
FilterMover::FilterMover(const active::serialise::Package& outgoing) : Mover{outgoing, validateHandler(m_handler)} {
} //FilterMover::FilterMover
/*--------------------------------------------------------------------
Constructor (when it will be used for serialisation only on an existing object)
package: A reference to the member variable
--------------------------------------------------------------------*/
FilterMover::FilterMover(active::serialise::PackageUniqueWrap&& package) : Mover{std::move(package), validateHandler(m_handler)} {
} //FilterMover::FilterMover
@@ -1,46 +0,0 @@
#ifndef CONNECTOR_MODEL_SEND_FILTER_MOVER
#define CONNECTOR_MODEL_SEND_FILTER_MOVER
#include "Active/Serialise/Package/Wrapper/Mover.h"
namespace connector::record {
/*!
Wrapper to box/unbox objects during (de)serialisation, including reading/writing a specified attribute to determine object type
Note that a derived class could also define the package handler, allowing the wrapper to be created via a default constructor that is
automatically bound to a set of internally defined object types
*/
class FilterMover : public active::serialise::Mover {
public:
// MARK: - Constructors
/*!
Default constructor (primarily for a list of polymorphic objects)
*/
FilterMover();
/*!
Constructor (when it will be used for serialisation only on an existing object)
@param package A reference to the member variable
*/
FilterMover(const Package& package);
/*!
Constructor (for serialisation or deserialisation of a polymorphic member variable held in a unique pointer)
@param package A reference to the member variable
*/
FilterMover(const Package::Unique& package);
/*!
Constructor (when it will be used for serialisation only on an existing object)
@param package A reference to the member variable
*/
FilterMover(active::serialise::PackageUniqueWrap&& package);
private:
///The handler for model filter packages
static std::shared_ptr<active::serialise::Handler> m_handler;
};
}
#endif //CONNECTOR_MODEL_SEND_FILTER_MOVER
@@ -1,98 +0,0 @@
#include "Connector/Record/Model/Filter/SendFilter.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include <array>
using namespace active::serialise;
using namespace connector::database;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
nameID,
summaryID,
defaultID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"name"},
Identity{"summary"},
Identity{"isDefault"},
};
}
/*--------------------------------------------------------------------
Determine if the filter has expired because an element in the selection has changed
changed: The list of changed element IDs
return: True if the one of the changed elements is in the selection
--------------------------------------------------------------------*/
bool SendFilter::checkExpiry(const ElementIDList& changed) const {
ElementIDList intersect;
ElementIDList mine{getElementIDs()}, theirs{changed};
std::sort(mine.begin(), mine.end());
std::sort(theirs.begin(), theirs.end());
std::set_intersection (mine.begin(), mine.end(), theirs.begin(), theirs.end(), std::back_inserter(intersect));
return !intersect.empty();
} //SendFilter::checkExpiry
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool SendFilter::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[nameID], nameID, element },
{ fieldID[summaryID], summaryID, element, !m_summary.empty() },
{ fieldID[defaultID], defaultID, element, m_isDefault },
},
}.withType(&typeid(SendFilter)));
return true;
} //SendFilter::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique SendFilter::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(SendFilter))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case nameID:
return std::make_unique<ValueWrap<String>>(m_name);
case summaryID:
return std::make_unique<ValueWrap<String>>(m_summary);
case defaultID:
return std::make_unique<ValueWrap<bool>>(m_isDefault);
default:
return nullptr; //Requested an unknown index
}
} //SendFilter::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void SendFilter::setDefault() {
m_name.clear();
m_summary.clear();
m_isDefault = false;
} //SendFilter::setDefault
@@ -1,100 +0,0 @@
#ifndef CONNECTOR_RECORD_SEND_FILTER
#define CONNECTOR_RECORD_SEND_FILTER
#include "Active/Serialise/Package/Package.h"
#include "Active/Utility/Cloner.h"
#include "Connector/Database/Identity/RecordID.h"
#include "Speckle/Utility/String.h"
namespace connector::record {
/*!
Base class for element filters applied when a model is sent to a Speckle server
*/
class SendFilter : public active::serialise::Package, public active::utility::Cloner {
public:
// MARK: - Types
using base = active::serialise::Package;
// MARK: - Constructors
/*!
Default constructor
@param nm The filter name
@param sum A summary
@param isDef True if this is the default filter
*/
SendFilter(const speckle::utility::String& nm = {}, const speckle::utility::String& sum = {}, bool isDef = false) :
m_name{nm}, m_summary{sum}, m_isDefault{isDef} {}
/*!
Destructor
*/
virtual ~SendFilter() {}
/*!
Object cloning
@return A clone of this object
*/
virtual SendFilter* clonePtr() const override = 0;
// MARK: - Functions (const)
/*!
Get the filter name
@return The filter name
*/
const speckle::utility::String& getName() const { return m_name; };
/*!
Get a summary description of the filter function, e.g. "All selected elements"
@return The filter summary description
*/
const speckle::utility::String& getSummary() const { return m_name; };
/*!
Determine if this is the default filter for model sends
@return True if this is the default filter
*/
bool isDefault() const { return m_isDefault; };
/*!
Get the filtered element IDs
@return The filter elements
*/
virtual const database::ElementIDList& getElementIDs() const = 0;
/*!
Determine if the filter has expired because an element in the selection has changed
@param changed The list of changed element IDs
@return True if the one of the changed elements is in the selection
*/
virtual bool checkExpiry(const database::ElementIDList& changed) const;
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///The filter name
speckle::utility::String m_name;
///A summary
speckle::utility::String m_summary;
///True if this is the default filter
bool m_isDefault = false;
};
}
#endif //CONNECTOR_RECORD_SEND_FILTER
@@ -1,106 +0,0 @@
#include "Connector/Record/Model/ModelCard.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include <array>
using namespace active::container;
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
modelID,
projectID,
accountID,
serverURLID,
settingsID,
expiredID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"modelId"},
Identity{"projectId"},
Identity{"accountId"},
Identity{"serverUrl"},
Identity{"settings"},
Identity{"expired"},
};
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool ModelCard::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[modelID], modelID, element },
{ fieldID[projectID], projectID, element },
{ fieldID[accountID], accountID, element },
{ fieldID[serverURLID], serverURLID, element },
{ fieldID[settingsID], settingsID, element },
{ fieldID[expiredID], expiredID, element },
},
}.withType(&typeid(ModelCard)));
//This class has a unique serialisation tag for the record ID - override the base class ID
inventory.merge(Inventory{
{
{ Identity{"modelCardId"}, active::database::record::FieldIndex::idIndex, element },
},
}.withType(&typeid(base::base)));
return true;
} //ModelCard::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique ModelCard::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(ModelCard))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case modelID:
return std::make_unique<ValueWrap<String>>(m_modelID);
case projectID:
return std::make_unique<ValueWrap<String>>(m_projectID);
case accountID:
return std::make_unique<ValueWrap<String>>(m_accountID);
case serverURLID:
return std::make_unique<ValueWrap<String>>(m_serverURL);
case settingsID:
return std::make_unique<ContainerWrap<Vector<CardSetting>>>(m_settings);
case expiredID:
return std::make_unique<ValueWrap<bool>>(m_isExpired);
default:
return nullptr; //Requested an unknown index
}
} //ModelCard::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void ModelCard::setDefault() {
base::setDefault();
m_modelID.clear();
m_projectID.clear();
m_accountID.clear();
m_serverURL.clear();
m_settings.clear();
} //ModelCard::setDefault
@@ -1,117 +0,0 @@
#ifndef CONNECTOR_RECORD_MODEL_CARD
#define CONNECTOR_RECORD_MODEL_CARD
#include "Active/Container/Vector.h"
#include "Active/Serialise/Package/Package.h"
#include "Active/Utility/Cloner.h"
#include "Connector/Record/Model/CardSetting.h"
#include "Speckle/Utility/String.h"
#include "Speckle/Database/Content/Record.h"
namespace connector::record {
/*!
A connector send filter
*/
class ModelCard : public speckle::database::Record {
public:
// MARK: - Types
using base = speckle::database::Record;
//List of card settings
using SettingList = active::container::Vector<connector::record::CardSetting>;
// MARK: - Constructors
/*!
Default constructor
*/
ModelCard() {}
/*!
Constructor
@param modelID The model ID
@param projectID The project ID
@param accountID The account ID
@param serverURL The server URL
@param settings Any BIM host-related settings relevant to the appearance/rendering of the model, e.g. LoD, if properties included etc
*/
ModelCard(const speckle::database::RecordID& modelID, const speckle::database::RecordID& projectID,
const speckle::database::RecordID& accountID, const speckle::utility::String& serverURL,
const SettingList& settings) :
m_modelID(modelID), m_projectID(projectID), m_accountID(accountID), m_serverURL(serverURL), m_settings(settings) {}
/*!
Destructor
*/
virtual ~ModelCard() {}
/*!
Record cloning
@return A clone of this record
*/
virtual ModelCard* clonePtr() const override { return new ModelCard(*this); };
// MARK: - Functions (const)
/*!
Get the model ID
@return The model ID
*/
const speckle::utility::String& getModelID() const { return m_modelID; }
/*!
Get the setting type
@return The setting type
*/
const speckle::utility::String& getProjectID() const { return m_projectID; }
/*!
Get the setting type
@return The setting type
*/
const speckle::utility::String& getAccountID() const { return m_accountID; }
/*!
Get the setting type
@return The setting type
*/
const speckle::utility::String& getServerURL() const { return m_serverURL; }
/*!
Get the card settings
@return The card settings
*/
const SettingList& getSettings() const { return m_settings; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///The model ID
speckle::database::RecordID m_modelID;
///The project ID
speckle::database::RecordID m_projectID;
///The user account ID
speckle::database::RecordID m_accountID;
///The server URL
speckle::utility::String m_serverURL;
///Settings for the model rendering, e.g. level of detail (LoD)
SettingList m_settings;
///True if the card has expired
bool m_isExpired = false;
};
}
#endif //CONNECTOR_RECORD_MODEL_CARD
@@ -1,102 +0,0 @@
#include "Connector/Record/Model/ReceiverModelCard.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include <array>
using namespace active::serialise;
using namespace connector::database;
using namespace connector::record;
using namespace speckle::database;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
projectNameID,
modelNameID,
selectedVersionID,
latestVersionID,
warningDismissedID,
bakedObjectsID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"projectName"},
Identity{"modelName"},
Identity{"selectedVersionID"},
Identity{"latestVersionID"},
Identity{"hasDismissedUpdateWarning"},
Identity{"bakedObjectIds"},
};
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool ReceiverModelCard::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[projectNameID], projectNameID, element },
{ fieldID[modelNameID], modelNameID, element },
{ fieldID[selectedVersionID], selectedVersionID, element },
{ fieldID[latestVersionID], latestVersionID, element },
{ fieldID[warningDismissedID], warningDismissedID, element },
{ fieldID[bakedObjectsID], bakedObjectsID, element },
},
}.withType(&typeid(ReceiverModelCard)));
return base::fillInventory(inventory);
} //ReceiverModelCard::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique ReceiverModelCard::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(ReceiverModelCard))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case projectNameID:
return std::make_unique<StringWrap>(m_projectName);
case modelNameID:
return std::make_unique<StringWrap>(m_modelName);
case selectedVersionID:
return std::make_unique<ValueWrap<RecordID>>(m_selectedVersionID);
case latestVersionID:
return std::make_unique<ValueWrap<RecordID>>(m_latestVersionID);
case warningDismissedID:
return std::make_unique<BoolWrap>(m_hasDismissedUpdateWarning);
case bakedObjectsID:
return std::make_unique<ContainerWrap<ElementIDList>>(m_bakedObjectIDs);
default:
return nullptr; //Requested an unknown index
}
} //ReceiverModelCard::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void ReceiverModelCard::setDefault() {
base::setDefault();
m_projectName.clear();
m_modelName.clear();
m_selectedVersionID.clear();
m_latestVersionID.clear();
m_hasDismissedUpdateWarning = false;
m_bakedObjectIDs.clear();
} //ReceiverModelCard::setDefault
@@ -1,119 +0,0 @@
#ifndef CONNECTOR_RECORD_RECEIVER_MODEL_CARD
#define CONNECTOR_RECORD_RECEIVER_MODEL_CARD
#include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/ModelCard.h"
namespace connector::record {
class SendFilter;
/*!
A connector model send card - carries information about what was sent with the model
*/
class ReceiverModelCard : public connector::record::ModelCard {
public:
// MARK: - Types
using base = connector::record::ModelCard;
// MARK: - Constructors
/*!
Default constructor
*/
ReceiverModelCard() {}
/*!
Constructor
@param projectName The project name
@param modelName The model name
@param selectedVersion The selected version ID
@param latestVersion The latest version ID
@param hasDimissedWarning True if the user has already dismissed an alert to update
@param bakedObjects The IDs of objects accepted in the receive
*/
ReceiverModelCard(const speckle::database::RecordID& projectID, const speckle::utility::String& projectName,
const speckle::database::RecordID& modelID, const speckle::utility::String& modelName,
const speckle::database::RecordID& selectedVersion, const speckle::database::RecordID& latestVersion,
const speckle::database::RecordID& accountID, const speckle::utility::String& serverURL,
bool hasDimissedWarning, database::ElementIDList&& bakedObjects, const SettingList& settings) :
ModelCard{modelID, projectID, accountID, serverURL, settings},
m_projectName{projectName}, m_modelName{modelName}, m_selectedVersionID{selectedVersion}, m_latestVersionID{latestVersion},
m_hasDismissedUpdateWarning{hasDimissedWarning}, m_bakedObjectIDs{bakedObjects} {}
/*!
Record cloning
@return A clone of this record
*/
virtual ReceiverModelCard* clonePtr() const override { return new ReceiverModelCard(*this); };
// MARK: - Functions (const)
/*!
Get the project name
@return The project name
*/
const speckle::utility::String& getProjectName() const { return m_projectName; }
/*!
Get the model name
@return The model name
*/
const speckle::utility::String& getModelName() const { return m_modelName; }
/*!
Get the selected version ID
@return The selected version ID
*/
const speckle::database::RecordID& getSelectedVersionID() const { return m_selectedVersionID; }
/*!
Get the latest version ID
@return The latest version ID
*/
const speckle::database::RecordID& getLatestVersionID() const { return m_latestVersionID; }
/*!
Determine if the user has already dismissed an alert to update
@return True if the user has already dismissed an alert to update
*/
bool hasDismissedUpdateWarning() const { return m_hasDismissedUpdateWarning; }
/*!
Get the IDs of objects accepted in the receive
@return The accepted object IDs
*/
const database::ElementIDList& getBakedObjectIDs() const { return m_bakedObjectIDs; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///The received project name
speckle::utility::String m_projectName;
///The received model name
speckle::utility::String m_modelName;
///The ID of the version selected in the receive
speckle::database::RecordID m_selectedVersionID;
///The ID of the latest version
speckle::database::RecordID m_latestVersionID;
///True if the user has already dismissed an alert to update
bool m_hasDismissedUpdateWarning = false;
///IDs of objects accepted in the receive
database::ElementIDList m_bakedObjectIDs;
};
}
#endif //CONNECTOR_RECORD_RECEIVER_MODEL_CARD
@@ -1,108 +0,0 @@
#include "Connector/Record/Model/SenderModelCard.h"
#include "Active/Serialise/Package/Wrapper/PackageUniqueWrap.h"
#include "Connector/Record/Model/Filter/FilterMover.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
#include <array>
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
sendFilterID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"sendFilter"},
};
}
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
SenderModelCard::SenderModelCard() {
} //SenderModelCard::SenderModelCard
/*--------------------------------------------------------------------
Constructor
filter: The filter applied when the model was sent
--------------------------------------------------------------------*/
SenderModelCard::SenderModelCard(const SendFilter& filter, const speckle::database::RecordID& modelID, const speckle::database::RecordID& projectID,
const speckle::database::RecordID& accountID, const speckle::utility::String& serverURL, const SettingList& settings) :
ModelCard{modelID, projectID, accountID, serverURL, settings}, m_filter(clone(filter))
{
} //SenderModelCard::SenderModelCard
/*--------------------------------------------------------------------
Copy constructor
source: The object to copy
--------------------------------------------------------------------*/
SenderModelCard::SenderModelCard(const SenderModelCard& source) : ModelCard{source} {
m_filter = (source.m_filter) ? clone(*source.m_filter) : nullptr;
} //SenderModelCard::SenderModelCard
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
SenderModelCard::~SenderModelCard() {
} //SenderModelCard::~SenderModelCard
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool SenderModelCard::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[sendFilterID], sendFilterID, element },
},
}.withType(&typeid(SenderModelCard)));
return base::fillInventory(inventory);
} //SenderModelCard::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique SenderModelCard::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(SenderModelCard))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case sendFilterID:
return std::make_unique<FilterMover>(PackageUniqueWrap{m_filter});
default:
return nullptr; //Requested an unknown index
}
} //SenderModelCard::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void SenderModelCard::setDefault() {
base::setDefault();
m_filter->setDefault();
} //SenderModelCard::setDefault
@@ -1,81 +0,0 @@
#ifndef CONNECTOR_RECORD_SENDER_MODEL_CARD
#define CONNECTOR_RECORD_SENDER_MODEL_CARD
#include "Connector/Record/Model/ModelCard.h"
namespace connector::record {
class SendFilter;
/*!
A connector model send card - carries information about what was sent with the model
*/
class SenderModelCard : public connector::record::ModelCard {
public:
// MARK: - Types
using base = connector::record::ModelCard;
// MARK: - Constructors
/*!
Default constructor
*/
SenderModelCard();
/*!
Constructor
@param filter The filter applied when the model was sent
*/
SenderModelCard(const SendFilter& filter, const speckle::database::RecordID& modelID, const speckle::database::RecordID& projectID,
const speckle::database::RecordID& accountID, const speckle::utility::String& serverURL, const SettingList& settings);
/*!
Copy constructor
@param source The object to copy
*/
SenderModelCard(const SenderModelCard& source);
/*!
Destructor
*/
~SenderModelCard();
/*!
Record cloning
@return A clone of this record
*/
virtual SenderModelCard* clonePtr() const override { return new SenderModelCard(*this); };
// MARK: - Functions (const)
/*!
Get the filter applied when the model was sent
@return The model filter
*/
const SendFilter& getFilter() const { return *m_filter; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///The filter applied when the model was sent
std::unique_ptr<SendFilter> m_filter;
};
}
#endif //CONNECTOR_RECORD_SENDER_MODEL_CARD
+2 -2
View File
@@ -5,9 +5,9 @@ namespace connector {
static const unsigned int versionMajor = 0;
static const unsigned int versionMinor = 2;
static const unsigned int versionMinor = 1;
static const unsigned int versionPatch = 4;
static const unsigned int versionPatch = 0;
}
@@ -1,41 +0,0 @@
#include "ActiveLibDoctest/TestingPlatforms.h"
#include "Active/Serialise/JSON/JSONTransport.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Active/Utility/BufferIn.h"
#include "Active/Utility/BufferOut.h"
#include "Speckle/Record/Credentials/Account.h"
using namespace active::serialise;
using namespace active::serialise::json;
using namespace active::serialise::json;
using namespace speckle::record::cred;
using namespace speckle::utility;
namespace {
const char* accountJSON = "{\"id\":\"d4468f8d6f1e4c48a899518795326ea8\",\"token\":\"42986a57b3304baa8773f937aa0b7bcd42986a57b3\",\"refreshToken\":\"00b01c421de4404889f30947de1506d3440c476432\",\"isDefault\":true,\"isOnline\":false,\"serverInfo\":{\"name\":\"My new Speckle Server\",\"company\":\"Unknown Company\",\"version\":\"2.20.2-branch.testing.138676-e8c8291\",\"adminContact\":\"n/a\",\"description\":\"This a community deployment of a Speckle Server.\",\"frontend2\":true,\"url\":\"https://testing.speckle.dev\",\"migration\":null},\"userInfo\":{\"id\":\"00b01c421d\",\"name\":\"someone@speckle.systems\",\"email\":\"someone@speckle.systems\",\"company\":null,\"avatar\":null,\"streams\":{\"totalCount\":2},\"commits\":{\"totalCount\":5}}}";
}
TEST_SUITE(TESTQ(AccountTests)) TEST_SUITE_OPEN
//Test to receive account serialised as JSON from SQLite dbase
TEST_CASE(TESTQ(testAccountReceive)) {
Account account;
JSONTransport transport;
try {
transport.receive(PackageWrap{account}, Identity{}, String{accountJSON});
} catch(...) {
FAIL_CHECK(TEST_MESSAGE(Account deserialisation failed));
}
String accountOut;
try {
transport.send(PackageWrap{account}, Identity{}, accountOut);
} catch(...) {
FAIL_CHECK(TEST_MESSAGE(Account serialisation failed));
}
}
TEST_SUITE_CLOSE
File diff suppressed because it is too large Load Diff
-1
View File
@@ -8,7 +8,6 @@
#include "Connector.grc.rc2"
#include "ConnectorMenu.grc.rc2"
#include "SpecklePalette.grc.rc2"
#include "Speckle.grc.rc2"
#include "ConnectorFix.grc.rc2"
+1 -2
View File
@@ -3,7 +3,6 @@ REM AC Resource build script
ECHO "Building AC Resources"
if not exist "%RES_OUTPUT%" MD "%RES_OUTPUT%"
python "%HEADER_PATH_5%\Tools\CompileResources.py" "INT" "%HEADER_PATH_5%\.." "%HEADER_PATH_6%\Connector" "%SYMROOT%\" "%RES_OUTPUT%" "%RES_SOURCE%\Speckle Connector.apx.mui"
python "%HEADER_PATH_5%\Tools\CompileResources.py" "INT" "%HEADER_PATH_5%\.." "%HEADER_PATH_4%\Speckle" "%HEADER_PATH_4%" "%RES_OUTPUT%" "%RES_SOURCE%\Speckle Connector.apx.mui"
python "%HEADER_PATH_5%\Tools\CompileResources.py" "INT" "%HEADER_PATH_5%\.." "%HEADER_PATH_6%Source" "%SYMROOT%\" "%RES_OUTPUT%" "%RES_SOURCE%\CodesignImport.apx.mui"
ECHO "Finished AC Resource"
-3
View File
@@ -1,3 +0,0 @@
'STR#' 32700 "Speckle Title strings" {
/* [ 1] */ "Untitled"
}
@@ -1,91 +0,0 @@
#include "Active/Database/Storage/SQLite/SQLiteEngine.h"
#include "Active/Database/Storage/Storage.h"
#include "Active/Serialise/JSON/JSONTransport.h"
#include "Active/Setting/ValueSetting.h"
#include "Active/Setting/Values/StringValue.h"
#include "Speckle/Database/AccountDatabase.h"
using namespace active::container;
using namespace active::database;
using namespace active::serialise::json;
using namespace active::setting;
using namespace speckle::record::cred;
using namespace speckle::database;
using namespace speckle::utility;
namespace {
//Account field indices
enum Fields {
hashID = 0,
contentID,
};
///Internal name of the accounts dbase
const char* accountsDBaseName = "accounts";
///Accounts table name
const char* accountsTableName = "objects";
///Hash field name
const char* hashFieldName = "hash";
///Content field name
const char* contentFieldName = "content";
}
namespace speckle::database {
///Accounts database engine declaration
using AccountsEngine = SQLiteEngine<Account, Account, JSONTransport, active::utility::String, active::utility::String>;
///Accounts database storage declaration
class AccountDatabase::Store : public active::database::Storage<speckle::record::cred::Account, active::serialise::json::JSONTransport,
active::utility::String, active::utility::String, active::utility::String, active::utility::String> {
using base = active::database::Storage<speckle::record::cred::Account, active::serialise::json::JSONTransport,
active::utility::String, active::utility::String, active::utility::String, active::utility::String>;
using base::base;
};
}
/*--------------------------------------------------------------------
Constructor
path: Path to the database file
--------------------------------------------------------------------*/
AccountDatabase::AccountDatabase(const active::file::Path& path) {
//Create accounts database storage (with schema)
m_store = std::make_unique<Store>(
//Engine
std::make_shared<AccountsEngine>(path,
//Schema
DBaseSchema{active::utility::String{accountsDBaseName},
//Tables
{
//Account table
{
accountsTableName, Fields::hashID, Fields::contentID, {
ValueSetting{StringValue{}, hashFieldName},
ValueSetting{StringValue{}, contentFieldName},
}
}
}
}
)
);
} //AccountDatabase::AccountDatabase
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
AccountDatabase::~AccountDatabase() {}
/*--------------------------------------------------------------------
Get all accounts
return: All the accounts
--------------------------------------------------------------------*/
Vector<Account> AccountDatabase::getAccounts() const {
return m_store->getObjects();
} //AccountDatabase::getAccounts
@@ -1,46 +0,0 @@
#ifndef SPECKLE_DATABASE_ACCOUNT_DBASE
#define SPECKLE_DATABASE_ACCOUNT_DBASE
#include "Active/File/Path.h"
#include "Speckle/Record/Credentials/Account.h"
namespace speckle::database {
/*!
A base class for an addon
*/
class AccountDatabase {
public:
// MARK: - Constructors
/*!
Constructor
@param path Path to the database file
*/
AccountDatabase(const active::file::Path& path);
AccountDatabase(const AccountDatabase&) = delete;
/*!
Destructor
*/
~AccountDatabase();
// MARK: - Functions (const)
/*!
Get all accounts
@return All the accounts
*/
active::container::Vector<record::cred::Account> getAccounts() const;
// MARK: - Functions (mutating)
private:
class Store;
///Accounts database storage
std::unique_ptr<Store> m_store;
};
}
#endif //SPECKLE_DATABASE_ACCOUNT_DBASE
@@ -1,11 +1,7 @@
#ifndef SPECKLE_DATABASE_INDEX
#define SPECKLE_DATABASE_INDEX
#include "Active/Database/Identity/Link.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Utility/String.h"
#include <any>
#include "Speckle/Utility/Guid.h"
namespace speckle::database {
@@ -16,16 +12,23 @@ namespace speckle::database {
this is typically a guid, for Revit a string and for Vectorworks a handle. Note that this index is not necessarily persistent between
sessions.
*/
class Index : public active::database::Index<RecordID> {
class Index : public speckle::utility::Guid {
public:
// MARK: - Types
using base = active::database::Index<RecordID>;
using base = speckle::utility::Guid;
// MARK: - Constructors
using base::base;
Index(speckle::utility::Guid ID, speckle::utility::Guid dbaseID) : base{ID}, databaseID{dbaseID} {}
// MARK: - Public variables
///ID of the source database (not defined in every case, undefined = null guid)
speckle::utility::Guid databaseID;
};
}
@@ -1,8 +1,6 @@
#include "Speckle/Database/Identity/Link.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Database/Content/Link.h"
using namespace speckle::database;
using namespace speckle::utility;
#ifdef ARCHICAD
/*--------------------------------------------------------------------
@@ -10,9 +8,9 @@ using namespace speckle::utility;
selected: Information about a selected Archicad element
--------------------------------------------------------------------*/
//Link::Link(const API_Neig& selected) : base{Guid{selected.guid}} {
Link::Link(const API_Neig& selected) : recordID{selected.guid} {
//More info should be extracted from API_Neig in future (as required)
//} //Link::Link
} //Link::Link
#endif
@@ -2,7 +2,7 @@
#define SPECKLE_DATABASE_LINK
#include "Active/Setting/SettingList.h"
#include "Speckle/Database/Identity/Index.h"
#include "Speckle/Database/Content/Index.h"
namespace speckle::database {
@@ -17,18 +17,30 @@ namespace speckle::database {
A link may optionally carry any number of settings. In the context of a user selection (for example) there might be settings describing where
the user made the selection (e.g. the hole in a floor slab), allowing a tool working on that selection to be more precise.
*/
class Link : public active::database::Link<RecordID> {
class Link : public active::setting::SettingList {
public:
// MARK: - Types
using base = active::database::Link<RecordID>;
using base = active::setting::SettingList;
///Unique pointer
using Unique = std::unique_ptr<Link>;
///Shared pointer
using Shared = std::shared_ptr<Link>;
///Optional
using Option = std::optional<Link>;
// MARK: - Constructors
using base::base;
Link() = default;
/*!
Constructor
@param index An element index
@param origIndex The index of the original element (when the preceding index is to a proxy element)
*/
Link(const Index& index, const Index& origIndex = Index{}) : recordID{index}, originalID{origIndex} {}
#ifdef ARCHICAD
/*!
Constructor
@@ -36,6 +48,13 @@ namespace speckle::database {
*/
Link(const API_Neig& selected);
#endif
// MARK: - Public variables
///ID of the linked record (defaults to null guid = undefined)
Index recordID;
///ID of the original record (in the case where the record is proxy for another - null guid = undefined)
Index originalID;
};
}
+34 -11
View File
@@ -8,17 +8,40 @@ using namespace speckle::utility;
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool Record::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ Identity{"id"}, active::database::record::FieldIndex::idIndex, element },
},
}.withType(&typeid(base)));
bool Record::fillInventory(Inventory& inventory) const {
//TODO: Complete
return true;
} //Record::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique Record::getCargo(const Inventory::Item& item) const {
//TODO: Complete
return nullptr;
} //Record::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void Record::setDefault() {
//TODO: Complete
} //Record::setDefault
/*--------------------------------------------------------------------
Validate the cargo data
return: True if the data has been validated
--------------------------------------------------------------------*/
bool Record::validate() {
//TODO: Complete
return true;
} //Record::validate
+61 -15
View File
@@ -1,22 +1,19 @@
#ifndef SPECKLE_DATABASE_RECORD
#define SPECKLE_DATABASE_RECORD
#include "Active/Database/Content/Record.h"
#include "Speckle/Database/Identity/Link.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Active/Serialise/Package/Package.h"
#include "Speckle/Database/Content/Link.h"
namespace speckle::database {
/*!
Base class for a database record
*/
class Record : public active::database::Record<RecordID> {
class Record : public active::serialise::Package, public active::utility::Cloner {
public:
// MARK: - Types
using base = active::database::Record<RecordID>;
///Unique pointer
using Unique = std::unique_ptr<Record>;
///Shared pointer
using Shared = std::shared_ptr<Record>;
@@ -25,27 +22,51 @@ namespace speckle::database {
// MARK: - Constructors
/*!
Default constructor
*/
Record() : base{active::utility::Guid{true}.operator active::utility::String(),
active::utility::Guid{true}.operator active::utility::String()} {} //TODO: Implement a better default for the ID
/*!
Constructor
@param ID The record ID
*/
Record(speckle::utility::String ID, speckle::utility::String::Option globID = std::nullopt) :
base{ID, globID.value_or(active::utility::Guid{true}.operator active::utility::String())} {}
Record(speckle::utility::Guid ID) : m_ID{ID} {}
/*!
Destructor
*/
virtual ~Record() {}
// MARK: - Functions (const)
/*!
Get the record ID
@return The record ID
*/
speckle::utility::Guid getID() const { return m_ID; }
/*!
Get the record unique ID
@return The record unique ID
*/
speckle::utility::Guid getUniqueID() const { return m_uniqueID; }
/*!
Get the record index
@return The record index
*/
virtual Index getIndex() const { return Index{m_ID, m_ownerID}; }
/*!
Get the record link
@return The record link
*/
virtual Link getLink() const { return Link{getIndex()}; }
// MARK: - Functions (mutating)
/*!
Set the record ID
@param ID The record ID
*/
void setID(speckle::utility::Guid ID) { m_ID = ID; }
/*!
Set the record unique ID
@param ID The record unique ID
*/
void setUniqueID(speckle::utility::Guid ID) { m_uniqueID = ID; }
// MARK: - Serialisation
@@ -55,6 +76,31 @@ namespace speckle::database {
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
/*!
Validate the cargo data
@return True if the data has been validated
*/
bool validate() override;
private:
///The record ID (may not be unique across models)
speckle::utility::Guid m_ID = speckle::utility::Guid{true};
///The record unique ID
speckle::utility::Guid m_uniqueID = speckle::utility::Guid{true};
///The record owner ID (null guid if unspecified)
speckle::utility::Guid m_ownerID;
///The last edit time
active::utility::Time editTime = active::utility::Time{};
};
}
@@ -1,20 +0,0 @@
#ifndef SPECKLE_DATABASE_ID
#define SPECKLE_DATABASE_ID
#include "Speckle/Utility/String.h"
namespace speckle::database {
//Common Speckle record identifier type
using RecordID = speckle::utility::String;
//Common Speckle table identifier type
using TableID = speckle::utility::String;
//Common Speckle database identifier type
using DBaseID = speckle::utility::String;
//A list of record IDs
using RecordIDList = std::vector<RecordID>;
}
#endif //SPECKLE_DATABASE_ID
@@ -1,302 +0,0 @@
#include "Speckle/Database/Storage/DocumentStore/DocumentStoreCore.h"
#include "Active/Utility/Defer.h"
#include "Active/Utility/Memory.h"
#include "Active/Utility/String.h"
#include "Speckle/Environment/Addon.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Event/Type/DocStoreMergeEvent.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#ifdef ARCHICAD
#include <ACAPinc.h>
#include <BM.hpp>
#endif
using namespace active::event;
using namespace active::setting;
using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::event;
using namespace speckle::utility;
using enum DocumentStoreCore::Status;
namespace {
#ifdef ARCHICAD
/*--------------------------------------------------------------------
Convert an Archicad API error code to a DocumentStoreCore status
acErrorCode: The API error code
return: An equivalent status code
--------------------------------------------------------------------*/
DocumentStoreCore::Status convertArchicadError(long acErrorCode) {
using enum DocumentStoreCore::Status;
switch (acErrorCode) {
case NoError:
return nominal;
case APIERR_BADPARS:
return badParameter;
case APIERR_BADID:
return badID;
default:
break;
}
return error;
} //convertArchicadError
/*--------------------------------------------------------------------
Determine if a specified data store exists
id: The store identity
return: True if the store exists
--------------------------------------------------------------------*/
bool isExistingStore(active::utility::NameID& storeID) {
if (storeID.id)
return true; //We must have a store if the ID is populated
GS::UniString storeName{String{storeID.name}};
API_Guid acID;
if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_GetObjectGuidFromName(storeName, &acID)); statusCode != nominal)
throw std::system_error(DocumentStoreCore::makeError(statusCode));
storeID.id = Guid{acID};
if (!storeID.id) {
GS::Array<API_Guid> storedObjects;
ACAPI_AddOnObject_GetObjectList(&storedObjects);
for (auto iter = storedObjects.Enumerate(); iter != nullptr; ++iter) {
API_Guid objGuid = *iter;
GS::UniString objName;
GSHandle content = nullptr;
auto scope = active::utility::defer([&content](){ BMKillHandle(&content); });
if (ACAPI_AddOnObject_GetObjectContent(objGuid, &objName, &content) == NoError) {
if (objName == storeName) {
storeID.id = Guid{objGuid};
break;
}
}
}
}
return storeID.id.operator bool(); //Returns true if the store ID is non-null, i.e. the object exists
} //isExistingStore
/*--------------------------------------------------------------------
Copy a GS handle to a Memory object
handle: The GS handle
memory: The Memory object to receive the data
--------------------------------------------------------------------*/
void copyHandleToMemory(const GSHandle& handle, active::utility::Memory& memory) {
auto storeSize = BMGetHandleSize(handle);
memory.resize(storeSize);
if ((storeSize > 0) && (*handle != nullptr))
active::utility::Memory::copy(memory.data(), *handle, storeSize, storeSize);
} //copyHandleToMemory
#endif
///Category for DocumentStore processing errors
class DocumentStoreCategory : public std::error_category {
public:
///Category name
const char* name() const noexcept override {
return "active::database::sqlite::category";
}
/*!
Get a message for a specified error code
@param errorCode A DocumentStore processing code
@return The error message for the specified code
*/
std::string message(int errorCode) const override {
//TODO: These error messages are ok for developers - but can we help users more?
switch (static_cast<DocumentStoreCore::Status>(errorCode)) {
case nominal:
return "";
case badParameter:
return "An internal function has been incorrectly used";
case badID:
return "Internal data has been requested using an invalid identity";
case error:
return "A non-specific error occurred";
default:
return "An unknown error occurred";
}
}
};
///DocumentStore processing category error instance
static DocumentStoreCategory instance;
}
/*--------------------------------------------------------------------
Make an error code for DocumentStore processing
return: An STL error code
--------------------------------------------------------------------*/
std::error_code DocumentStoreCore::makeError(DocumentStoreCore::Status code) {
return std::error_code(static_cast<int>(code), instance);
} //DocumentStoreCore::makeError
/*--------------------------------------------------------------------
Handle a document merge operation
event: The merge event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool DocumentStoreCore::handle(const DocStoreMergeEvent& event) {
#ifdef ARCHICAD
if (event.objects == nullptr)
return false;
for (const auto& object : *event.objects) {
if (*object.name != String{m_id.name})
continue;
active::utility::Memory toMerge;
copyHandleToMemory(object.data, toMerge);
mergeStore(toMerge);
writeStore();
}
#endif
return false;
} //DocumentStoreCore::handle
/*--------------------------------------------------------------------
Handle a project event
event: The project event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool DocumentStoreCore::handle(const event::ProjectEvent& event) {
using enum ProjectEvent::Type;
switch (event.getType()) {
case close:
resetStore(); //Wipe the cache, forcing a full reload when the data is requested again (after a project is opened)
break;
case presave: case send:
writeStore(); //Ensure the data is stored with the save/send
break;
default:
break;
}
return false;
} //DocumentStoreCore::handle
/*--------------------------------------------------------------------
Read the data stored in the document
return: The stored data (empty if the data doesn't exist)
--------------------------------------------------------------------*/
active::utility::Memory DocumentStoreCore::readStore() const {
active::utility::Memory result;
//First establish that we actually have stored data to read
if (!isExistingStore(m_id))
return result;
//Read the stored data
#ifdef ARCHICAD
GS::UniString storeName{String{m_id.name}};
GSHandle storedData;
auto scoped = active::utility::defer([&storedData](){ BMKillHandle(&storedData); });
if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_GetObjectContent(Guid{m_id.id}, &storeName, &storedData)); statusCode != nominal)
throw std::system_error(makeError(statusCode));
//Copy the stored data into the result
copyHandleToMemory(storedData, result);
#endif
return result;
} //DocumentStoreCore::readStore
/*--------------------------------------------------------------------
Write the data to document storage
toWrite: The data to write to storage
--------------------------------------------------------------------*/
void DocumentStoreCore::writeStore() {
#ifdef ARCHICAD
auto activeProject = addon()->getActiveProject();
bool shared = false;
if (auto project = activeProject.lock(); project && project->getInfo().isShared)
shared = true;
//Ensure a suitable data store exists
if (!isExistingStore(m_id)) {
//Create when missing
API_Guid acID;
if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_CreateUniqueObject(String{m_id.name}, &acID)); statusCode != nominal)
throw std::system_error(makeError(statusCode));
m_id.id = Guid{acID};
}
//Reserve the storage object in TW
if (shared) {
GS::HashTable<API_Guid, short> conflicts;
if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_ReserveObjects({Guid{m_id.id}}, &conflicts)); statusCode != nominal)
throw std::system_error(makeError(statusCode));
//TODO: Implamenent handling for conflicts
}
auto toWrite = buildStore();
//Write the new data
GSHandle output = BMAllocateHandle(static_cast<GSSize>(toWrite.size()), ALLOCATE_CLEAR, 0);
auto scoped = active::utility::defer([&output](){ BMKillHandle(&output); });
active::utility::Memory::copy(*output, toWrite.data(), toWrite.size(), toWrite.size());
if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_ModifyObject(Guid{m_id.id}, nullptr, &output)); statusCode != nominal)
throw std::system_error(makeError(statusCode));
//Release the storage object in TW
if (shared) {
if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_ReleaseObjects({Guid{m_id.id}})); statusCode != nominal)
throw std::system_error(makeError(statusCode));
}
#endif
} //DocumentStoreCore::writeStore
/*--------------------------------------------------------------------
Get the event subscription list
return: The subscription list (an empty list will put the subscriber into a suspended state)
--------------------------------------------------------------------*/
Subscriber::Subscription DocumentStoreCore::subscription() const {
auto result = DocStoreSubscriber::subscription();
auto other = ProjectSubscriber::subscription();
result.insert(other.begin(), other.end());
return result;
} //DocumentStoreCore::subscription
/*--------------------------------------------------------------------
Receive a subscribed event
event: The incoming event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool DocumentStoreCore::receive(const active::event::Event& event) {
return DocStoreSubscriber::receive(event) || ProjectSubscriber::receive(event);
} //DocumentStoreCore::receive
/*--------------------------------------------------------------------
Attach participant components to the app (as required)
return: True if the participant is able to function
--------------------------------------------------------------------*/
bool DocumentStoreCore::attach() {
return DocStoreSubscriber::attach() && ProjectSubscriber::attach();
} //DocumentStoreCore::attach
/*--------------------------------------------------------------------
Start the participant operation
return: True if the participant is able to continue
--------------------------------------------------------------------*/
bool DocumentStoreCore::start() {
return DocStoreSubscriber::start() && ProjectSubscriber::start();
} //DocumentStoreCore::start
@@ -1,142 +0,0 @@
#ifndef SPECKLE_DATABASE_DOCUMENT_STORE_CORE
#define SPECKLE_DATABASE_DOCUMENT_STORE_CORE
#include "Active/File/Path.h"
#include "Active/Setting/SettingList.h"
#include "Active/Database/Storage/DBaseSchema.h"
#include "Active/Utility/NameID.h"
#include "Speckle/Event/Subscriber/DocStoreSubscriber.h"
#include "Speckle/Event/Subscriber/ProjectSubscriber.h"
namespace speckle::database {
using DocumentStoreSchema = active::database::DBaseSchema<>;
/*!
Core functionality and definitions for a mechanism to store data in a BIM (3rd-party) document/database
Currently implement for Archicad Add-On Objects
*/
class DocumentStoreCore : public event::DocStoreSubscriber, public event::ProjectSubscriber {
public:
// MARK: - Types
///Status of of the DocumentStore database
enum class Status {
nominal, ///<No errors logged
badParameter, ///<The data supplied to an SDK function call was invalid
badID, ///<The ID for the stored data is invalid
error, ///<An unidentified error occurred
};
// MARK: - Static functions
/*!
Make an error code for DocumentStore processing
@return An STL error code
*/
static std::error_code makeError(DocumentStoreCore::Status code);
// MARK: - Constructors
/*!
Default constructor
@param id The document storage identifier
@param schema The document storage schema
*/
DocumentStoreCore(const active::utility::NameID& id, DocumentStoreSchema&& schema) : m_id(id), m_schema{schema} {}
DocumentStoreCore(const DocumentStoreCore&) = default;
/*!
Destructor
*/
virtual ~DocumentStoreCore() {}
// MARK: - Function (const)
/*!
Get the database schema
@return The database schema
*/
const DocumentStoreSchema& getSchema() const { return m_schema; }
/*!
Get the database id
@return The database id
*/
const active::utility::NameID& getID() const { return m_id; }
// MARK: - Functions (mutating)
/*!
Handle a document merge operation
@param event The merge event
@return True if the event should be closed
*/
bool handle(const event::DocStoreMergeEvent& event) override;
/*!
Handle a project event
@param event The project event
@return True if the event should be closed
*/
bool handle(const event::ProjectEvent& event) override;
protected:
/*!
Read the data stored in the document (should be lazy-loading, only at the point where data is actually requested)
@return The stored data (empty if the data doesn't exist)
*/
active::utility::Memory readStore() const;
/*!
Write the data to document storage (currently happens at every change - could implement delayed storage until the point of send/save)
*/
void writeStore();
/*!
Build new store data from the latest records
@return Data to store from the latest records
*/
virtual active::utility::Memory buildStore() = 0;
/*!
Merge existing stored data with incoming stored data (from an external source)
@param toMerge The external stored data to merge
*/
virtual void mergeStore(const active::utility::Memory& toMerge) = 0;
/*!
Reset the stored data (some external change has invalidated previous data, e.g. the document was closed)
*/
virtual void resetStore() { m_id.id.clear(); }
// MARK: Subscriber functions
/*!
Get the event subscription list
@return The subscription list (an empty list will put the subscriber into a suspended state)
*/
Subscription subscription() const override;
/*!
Receive a subscribed event
@param event The incoming event
@return True if the event should be closed
*/
bool receive(const active::event::Event& event) override;
/*!
Attach participant components to the app (as required)
@return True if the participant is able to function
*/
bool attach() override;
/*!
Start the participant operation
@return True if the participant is able to continue
*/
bool start() override;
private:
///The database schema
DocumentStoreSchema m_schema;
///The database ID (mutable to allow lazy loading when data is accessed)
mutable active::utility::NameID m_id;
};
}
#endif //SPECKLE_DATABASE_DOCUMENT_STORE_CORE
@@ -1,349 +0,0 @@
#ifndef SPECKLE_DATABASE_DOCUMENT_STORE_ENGINE
#define SPECKLE_DATABASE_DOCUMENT_STORE_ENGINE
#include "Active/Database/Concepts.h"
#include "Active/Database/Storage/DBaseEngine.h"
#include "Active/Database/Storage/RecordCache.h"
#include "Active/File/Path.h"
#include "Active/Serialise/Cargo.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Active/Serialise/Transport.h"
#include "Active/Utility/BufferIn.h"
#include "Active/Utility/BufferOut.h"
#include "Speckle/Database/Storage/DocumentStore/DocumentStoreCore.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#include <algorithm>
#include <ranges>
namespace speckle::database {
///Concept for the ability to store objects in a document
template<typename Obj, typename ObjWrapper, typename Transport>
concept DocumentStorable = (active::database::CanWrap<Obj, ObjWrapper> || active::database::FlatType<Obj, ObjWrapper>) &&
std::is_base_of_v<active::serialise::Cargo, Obj> &&
std::is_base_of_v<active::serialise::Transport, Transport>;
/*!
A database engine to store records in a 3rd-party BIM document
Due to the fact that these records are intended to represent a single table and are stored in a document, the concepts of 'table' and
'document' aren't currently applicable (this could be extended in future if there is a use-case)
@tparam Obj Interface for the stored object. NB: This can be a base class for an object hierarchy, not necessarily a concrete class
@tparam ObjWrapper Wrapper type for (de)serialising objects
@tparam Transport The serialisation transport mechanism for objects
@tparam ObjID The object identifier type, e.g. Guid
*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID = RecordID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
class DocumentStoreEngine : public DocumentStoreCore, public active::database::DBaseEngine<Obj, ObjID, RecordID, RecordID> {
public:
// MARK: - Types
using base = active::database::DBaseEngine<Obj, ObjID, RecordID, RecordID>;
using Filter = base::Filter;
using Outline = base::Outline;
using Cache = active::database::RecordCache<Obj, ObjWrapper, ObjID, RecordID, RecordID>;
// MARK: - Constructors
/*!
Constructor
@param id The document storage identifier
*/
DocumentStoreEngine(const active::utility::NameID& id, DocumentStoreSchema&& schema) : DocumentStoreCore{id, std::move(schema)} {}
DocumentStoreEngine(const DocumentStoreEngine&) = delete;
// MARK: - Functions (const)
/*!
Get an object by index
@param ID The object ID
@param tableID Optional table ID (defaults to the first table)
@param documentID Optional document ID (when the object is bound to a specific document)
@return The requested object (nullptr on failure)
*/
std::unique_ptr<Obj> getObject(const ObjID& objID, std::optional<RecordID> tableID = std::nullopt, std::optional<RecordID> documentID = std::nullopt) const override;
/*!
Get an object in a transportable form, e.g. packaged for serialisation
@param ID The object ID
@param tableID Optional table ID (defaults to the first table)
@param documentID Optional document ID (when the object is bound to a specific document)
@return: The requested wrapped cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getObjectCargo(const ObjID& objID, std::optional<RecordID> tableID = std::nullopt, std::optional<RecordID> documentID = std::nullopt) const override;
/*!
Get all objects
@param tableID Optional table ID (defaults to the first table)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The requested objects (nullptr on failure)
*/
active::container::Vector<Obj> getObjects(std::optional<RecordID> tableID = std::nullopt, std::optional<RecordID> documentID = std::nullopt) const override;
/*!
Get a filtered list of objects
@param filter The object filter
@param tableID Optional table ID (defaults to the first table)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The filtered objects (nullptr on failure)
*/
active::container::Vector<Obj> getObjects(const Filter& filter, std::optional<RecordID> tableID = std::nullopt,
std::optional<RecordID> documentID = std::nullopt) const override;
/*!
Write an object to the database
@param object The object to write
@param objID The object ID
@param objDocID The object document-specific ID (unique within a specific document - nullopt if not document-bound)
@param tableID Optional table ID (defaults to the first table)
@param documentID Optional document ID (when the object is bound to a specific document)
*/
void write(const Obj& object, const ObjID& objID, std::optional<ObjID> objDocID = std::nullopt,
std::optional<RecordID> tableID = std::nullopt, std::optional<RecordID> documentID = std::nullopt) const override;
/*!
Erase an object by index
@param ID The object ID
@param tableID Optional table ID (defaults to the first table)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(const ObjID& ID, std::optional<RecordID> tableID = std::nullopt,
std::optional<RecordID> documentID = std::nullopt) const override;
/*!
Erase all objects
@param tableID Optional table ID (defaults to the first table)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(std::optional<RecordID> tableID = std::nullopt, std::optional<RecordID> documentID = std::nullopt) const override;
/*!
Get the database outline
@return The database outline
*/
Outline getOutline() const override;
protected:
/*!
Get the cache of records built from the data stored in the document
@return The cached records
*/
Cache* getCache() const;
/*!
Build new store data from the latest records
@return Data to store from the latest records
*/
active::utility::Memory buildStore() override;
/*!
Merge existing stored data with incoming stored data (from an external source)
@param toMerge The external stored data to merge
@return The merged data to be stored
*/
void mergeStore(const active::utility::Memory& toMerge) override;
/*!
Reset the stored data (some external change has invalidated previous data, e.g. the document was closed)
*/
void resetStore() override {
DocumentStoreCore::resetStore();
m_cache.reset();
}
private:
//Cached records from the document store
mutable std::unique_ptr<Cache> m_cache;
};
/*--------------------------------------------------------------------
Get the cache of records built from the data stored in the document
return: The cached records (nullptr on failure)
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
typename DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::Cache* DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getCache() const {
if (m_cache)
return m_cache.get();
//Read the data stored in the document
auto storedData = readStore();
m_cache = std::make_unique<Cache>();
if (!storedData)
return m_cache.get(); //Return an empty container if there's no data
//Import the document data into the record cache
if constexpr (std::is_same_v<ObjWrapper, Obj>)
Transport().receive(std::forward<active::serialise::Cargo&&>(*m_cache), active::serialise::Identity{}, storedData);
else
Transport().receive(active::serialise::PackageWrap{*m_cache}, active::serialise::Identity{}, storedData);
return m_cache.get();
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getCache
/*--------------------------------------------------------------------
Get an object by index
index: The object index
tableID: Optional table ID (defaults to the first table)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested object (nullptr on failure)
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
std::unique_ptr<Obj> DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObject(const ObjID& ID, std::optional<RecordID> tableID,
std::optional<RecordID> documentID) const {
return getCache()->read(ID);
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObject
/*--------------------------------------------------------------------
Get an object in a transportable form, e.g. packaged for serialisation
index: The object index
tableID: Optional table ID (defaults to the first table)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested wrapped cargo (nullptr on failure)
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
active::serialise::Cargo::Unique DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObjectCargo(const ObjID& ID, std::optional<RecordID> tableID,
std::optional<RecordID> documentID) const {
if (auto object = getObject(ID, tableID, documentID); object)
return std::make_unique<active::serialise::CargoHold<ObjWrapper, Obj>>(std::move(object));
return nullptr;
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObject
/*--------------------------------------------------------------------
Get all objects
tableID: Optional table ID (defaults to the first table)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
active::container::Vector<Obj> DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObjects(std::optional<RecordID> tableID,
std::optional<RecordID> documentID) const {
return getCache()->read();
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObjects
/*--------------------------------------------------------------------
Get all objects
filter: The object filter
tableID: Optional table ID (defaults to the first table)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
active::container::Vector<Obj> DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObjects(const Filter& filter, std::optional<RecordID> tableID,
std::optional<RecordID> documentID) const {
return getCache()->read(filter);
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getObjects
/*--------------------------------------------------------------------
Write an object to the database
object: The object to write
objID: The object ID
objDocID: The object document-specific ID (unique within a specific document - nullopt if not document-bound)
tableID: Optional table ID (defaults to the first table)
documentID: Optional document ID (when the object is bound to a specific document)
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
void DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::write(const Obj& object, const ObjID& objID, std::optional<ObjID> objDocID,
std::optional<RecordID> tableID, std::optional<RecordID> documentID) const {
getCache()->write(object); //NB: In future we might support duplicating records if objID != obj.id
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::write
/*--------------------------------------------------------------------
Erase an object by index
objID: The object ID
tableID: Optional table ID (defaults to the first table)
documentID: Optional document ID (when the object is bound to a specific document)
return: True if the object was successfully erased
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
void DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::erase(const ObjID& ID, std::optional<RecordID> tableID,
std::optional<RecordID> documentID) const {
getCache()->erase(ID);
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::erase
/*--------------------------------------------------------------------
Erase all objects
tableID: Optional table ID (defaults to the first table)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
void DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::erase(std::optional<RecordID> tableID, std::optional<RecordID> documentID) const {
getCache()->erase();
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::erase
/*--------------------------------------------------------------------
Get the database outline
return: The database outline
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::Outline DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getOutline() const {
Outline result;
if (getSchema().empty())
return result;
//NB: Currently implementing only a single table in a document store
result.emplace_back(std::make_pair(getSchema()[0].ID, getCache()->keys()));
return result;
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::getOutline
/*--------------------------------------------------------------------
Build new store data from the latest records
return: Data to store from the latest records
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
active::utility::Memory DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::buildStore() {
active::utility::Memory result;
Transport().send(std::forward<active::serialise::Cargo&&>(*getCache()), active::serialise::Identity{}, result);
return result;
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::buildStore
/*--------------------------------------------------------------------
Merge existing stored data with incoming stored data (from an external source)
toMerge: The external stored data to merge
return: The merged data to be stored
--------------------------------------------------------------------*/
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
requires DocumentStorable<Obj, ObjWrapper, Transport>
void DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::mergeStore(const active::utility::Memory& toMerge) {
//Import the incoming records from the data to merge
Cache incoming;
if constexpr (std::is_same_v<ObjWrapper, Obj>)
Transport().receive(std::forward<active::serialise::Cargo&&>(incoming), active::serialise::Identity{}, toMerge);
else
Transport().receive(ObjWrapper{incoming}, active::serialise::Identity{}, toMerge);
//Get the data currently stored in the document
getCache()->merge(std::forward<Cache&&>(incoming));
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::mergeStore
}
#endif //SPECKLE_DATABASE_DOCUMENT_STORE_ENGINE
+2 -72
View File
@@ -1,16 +1,10 @@
#include "Speckle/Environment/Addon.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include <limits>
#ifdef ARCHICAD
#include <ACAPinc.h>
#endif
using namespace speckle::environment;
using namespace speckle::event;
using namespace speckle::utility;
namespace {
@@ -52,23 +46,11 @@ String Addon::getLocalString(short itemIndex, short resourceIndex) const {
RSGetIndString(&string, itemIndex, resourceIndex, ACAPI_GetOwnResModule());
return string;
#else
return String{};
return String{}
#endif
} //Addon::getLocalString
/*--------------------------------------------------------------------
Get the active project
return: The active project (nullptr = no open project)
--------------------------------------------------------------------*/
std::weak_ptr<Project> Addon::getActiveProject() const {
if (m_activeProject)
return m_activeProject;
return std::weak_ptr<Project>{};
} //Addon::getActiveProject
/*--------------------------------------------------------------------
Publish an event from an external source to subscribers
@@ -78,9 +60,7 @@ void Addon::publishExternal(const active::event::Event& event) {
if (!logCallback())
return;
try {
preprocessEvent(event);
publish(event);
postprocessEvent(event);
} catch (...) {
//Add error logging in future
}
@@ -151,7 +131,7 @@ speckle::environment::Addon* speckle::environment::addon() {
return: True if the callback can continue (false on error)
--------------------------------------------------------------------*/
bool Addon::logCallback(bool initialise) {
bool speckle::environment::Addon::logCallback(bool initialise) {
if (initialise)
m_callDepth = 1;
else
@@ -166,53 +146,3 @@ bool Addon::logCallback(bool initialise) {
}
return true;
} //Addon::publishExternalEvent
/*--------------------------------------------------------------------
Preprocess an external event (allowing key add-on operations to act before other subscribers)
event: An incoming event
return: True if the event should be closed, i.e. not passed to other subscribers
--------------------------------------------------------------------*/
bool Addon::preprocessEvent(const active::event::Event& event) {
if (auto projectEvent = dynamic_cast<const ProjectEvent*>(&event); projectEvent != nullptr) {
using enum ProjectEvent::Type;
switch (projectEvent->getType()) {
case newDocument: case newAndReset: case open:
m_activeProject = makeProject(); //Ensure a project object is available
default:
break;
}
}
return false;
} //Addon::preprocessEvent
/*--------------------------------------------------------------------
Postprocess an external event (allowing key add-on operations to act after all other subscribers are complete)
event: An incoming (completed) event
--------------------------------------------------------------------*/
void Addon::postprocessEvent(const active::event::Event& event) {
if (auto projectEvent = dynamic_cast<const ProjectEvent*>(&event); projectEvent != nullptr) {
using enum ProjectEvent::Type;
switch (projectEvent->getType()) {
case close: case quit:
m_activeProject.reset(); //Release the active project on close/quit
default:
break;
}
}
} //Addon::postprocessEvent
/*--------------------------------------------------------------------
Make a new new project. Allows Addon subclasses to define a Project subclass with additional functions/databases
return: A new project instance
--------------------------------------------------------------------*/
std::shared_ptr<Project> Addon::makeProject() const {
auto project = new Project; //make_shared can't use protected constructor
return std::shared_ptr<Project>{project};
} //Addon::makeProject
+7 -30
View File
@@ -5,9 +5,7 @@
#include "Speckle/Utility/String.h"
namespace speckle::environment {
class Project;
/*!
A base class for an addon
*/
@@ -21,7 +19,11 @@ namespace speckle::environment {
@param identity Optional name/ID for the subscriber
*/
Addon(const active::utility::NameID& identity);
Addon(const App&) = delete;
/*!
Copy constructor
@param source The object to copy
*/
Addon(const App& source) : App{source} {}
/*!
Destructor
*/
@@ -36,11 +38,6 @@ namespace speckle::environment {
@return The localised string
*/
speckle::utility::String getLocalString(short itemIndex, short resourceIndex) const;
/*!
Get the active project
@return The active project (nullptr = no open project)
*/
std::weak_ptr<Project> getActiveProject() const;
// MARK: - Functions (mutating)
@@ -48,7 +45,7 @@ namespace speckle::environment {
Set the add-on name
@param nm The add-on name
*/
void setName(const speckle::utility::String& nm) { App::name = nm; }
void setName(const speckle::utility::String& nm) { name = nm; }
/*!
Publish an event from an external source to subscribers
@param event The event to publish
@@ -73,7 +70,6 @@ namespace speckle::environment {
Shut down event handling
*/
void stop() override;
protected:
/*!
Log a callback into the add-on (allows checking of re-entry)
@@ -81,27 +77,8 @@ namespace speckle::environment {
@return True if the callback can continue (false on error)
*/
bool logCallback(bool initialise = true);
/*!
Preprocess an external event (allowing key add-on operations to act before other subscribers)
@param event An incoming event
@return True if the event should be closed, i.e. not passed to other subscribers
*/
virtual bool preprocessEvent(const active::event::Event& event);
/*!
Postprocess an external event (allowing key add-on operations to act after all other subscribers are complete)
@param event An incoming (completed) event
*/
virtual void postprocessEvent(const active::event::Event& event);
/*!
Make a new new project. Allows Addon subclasses to define a Project subclass with additional functions/databases
@return A new project instance
*/
virtual std::shared_ptr<Project> makeProject() const;
private:
///The active project
std::shared_ptr<Project> m_activeProject;
///The depth of nested callbacks - the root call starts at depth 0 (important for some entry-point initialisation)
uint32_t m_callDepth = 0;
};
@@ -1,37 +0,0 @@
#include "Speckle/Environment/Platform.h"
#include <iostream>
using namespace speckle::environment;
using namespace speckle::utility;
namespace {
//An object representing the active addon
Platform m_platformInstance;
}
/*--------------------------------------------------------------------
Write a message to the console
message: The message to write
--------------------------------------------------------------------*/
void Platform::writeToConsole(const active::utility::String& message) {
#ifdef WINDOWS
//NB: std::cout doesn't write to the console in Windows by default
OutputDebugString((LPCTSTR)message.operator std::u16string().data());
#else
std::cout << message.data();
#endif
} //Platform::writeToConsole
/*--------------------------------------------------------------------
Get an object representing the parent process/application
return: The active application instance
--------------------------------------------------------------------*/
speckle::environment::Platform* speckle::environment::platform() {
return &m_platformInstance;
} //speckle::environment::platform

Some files were not shown because too many files have changed in this diff Show More