#include "../../CppCliInterop/MTConnectorSDK.h"
#include <magic_enum.hpp>
#include <chrono>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <process.h>
#include <random>
#include <thread>
using namespace std::chrono_literals;
namespace fs = std::filesystem;
template <>
static constexpr int min = 1000;
static constexpr int max = 5000;
};
static std::string random_string(std::string::size_type length)
{
static auto& chrs = "0123456789"
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
thread_local static std::mt19937 rg{ std::random_device{}() };
thread_local static std::uniform_int_distribution<std::string::size_type> pick(0, sizeof(chrs) - 2);
std::string s;
s.reserve(length);
while (length--)
s += chrs[pick(rg)];
return s;
}
namespace
{
constexpr bool showUI = false;
{
std::cout << "Package processing in main thread" << std::endl;
std::cout << "Finished processing in main thread" << std::endl;
}
{
concurrency::cancellation_token_source cts;
auto token = cts.get_token();
{
}, token)
{
cts.cancel();
}, token)
{
}, token);
std::cout << "Package processing in background" << std::endl;
const concurrency::task_status taskStatus = t.wait();
std::cout << "Finished processing in background being canceled? " <<
std::boolalpha << (concurrency::task_status::canceled == taskStatus) << std::endl;
}
{
bool done = false;
{
std::cout << "Preparing multiple Sync processing in background" << std::endl;
{
std::cout << "Done processing" << std::endl;
done = true;
});
std::cout << "Leave task scope" << std::endl;
}
std::cout << "Out of scope processing in background" << std::endl;
while (!done)
{
std::cout << "Still waiting for task to be done" << std::endl;
std::this_thread::sleep_for(1s);
}
std::cout << "Done waiting" << std::endl;
}
void SubscribeToEvents()
{
std::list<MTConnectorSDK::LogEvent> eventIds;
{
std::cout << connectorEvent.
time
<<
": Event (" << magic_enum::enum_name(connectorEvent.
eventId) <<
") received: "
<< connectorEvent.
message << std::endl;
}, eventIds);
std::this_thread::sleep_for(10s);
}
auto AddRandomFile(const std::string& baseName, const fs::path& destinationDir)
{
auto rnd_suffix = random_string(6);
auto localFileName = baseName + "_" + rnd_suffix + ".txt";
auto localFilePath = destinationDir / localFileName;
std::ofstream outfile(localFilePath);
outfile.close();
return localFilePath.string();
}
auto SetUpTestPackage(const std::string& baseName, const std::string& serverUrl, int numberTestFiles = 10)
{
auto rnd_suffix = random_string(6);
auto displayName = baseName + "_" + rnd_suffix;
packageConfiguration.
enabled =
true;
packageConfiguration.
localRoot = R
"(C:\temp\test\)" + rnd_suffix;
for (int i = 0; i < numberTestFiles; ++i)
{
AddRandomFile(std::format(
"dummy {} ({})", i, rnd_suffix), packageConfiguration.
localRoot);
}
if (numberTestFiles > 0)
{
}
return packageConfiguration;
}
}
int main()
{
try
{
if (serverRegistrations.empty())
{
throw std::runtime_error("No server registrations found - register a MineTrust server first");
}
std::cout <<
"Server registration: " << serverRegistration.
serverUrl
<<
" (ServiceUID: " << serverRegistration.
serviceUID <<
")" << std::endl;
{
std::cout <<
"Looked up registration by URL, ServiceUID: " << lookedUpRegistration.
serviceUID << std::endl;
}
{
std::cout << "Available package: " << packageSummary.packageUID
<< " (" << packageSummary.displayName << ")"
<< " - locally enabled: " << std::boolalpha << packageSummary.locallyEnabled << std::endl;
}
{
std::cout <<
"Package is enabled: " << packageConfiguration.
packageUID << std::endl;
}
{
std::cout << "Tag name: " << tagRecord.name << " / Tag value: " << tagRecord.value << std::endl;
{
std::cout << "File record file found: " << fileRecord.name << std::endl;
}
}
{
std::cout << "Level map file found: " << fileRecord.name << std::endl;
}
{
std::cout << "AR Level map file found: " << fileRecord.name << std::endl;
}
{
std::cout << "Located level map file via filter evaluation: " << filterResult.name << std::endl;
}
{
std::cout << "Package is accessible: " << packageUID << std::endl;
}
{
std::cout << "Package is inaccessible: " << packageUID << std::endl;
}
{
std::cout << "Package has been deleted: " << packageUID << std::endl;
}
{
std::cout << "Package has been archived: " << packageUID << std::endl;
}
auto testPackage1 = SetUpTestPackage(
"Cpp/CLI Package Test 1", serverRegistration.
serverUrl);
DoSync(testPackage1);
DoAsync(testPackage1);
DoAsyncLeavingScope(testPackage1);
SubscribeToEvents();
{
std::cout << "Test package has local file: " << localFile << std::endl;
}
std::cout << "Test package total files: " << packageMetrics.totalFiles << std::endl;
std::cout << "Test package local files: " << packageMetrics.localFiles << std::endl;
std::cout << "Test package percentage downloaded: " << packageMetrics.percentageDownloaded << std::endl;
auto testEmptyPackage = [&testPackage1](auto&& emptyThePackageFn)
{
auto packageCopy = testPackage1;
emptyThePackageFn(packageCopy);
};
{
std::cout << "Emptying the package (add empty include) " << std::endl;
packageConfig.
include.push_back({});
});
{
std::cout << "Emptying the package (exclude everything) " << std::endl;
packageConfig.
exclude.push_back(
"*");
});
auto testFile1a = AddRandomFile("testFile1a", testPackage1.localRoot);
{
std::cout << "Located the following file by tag in the test package: " << localFile << std::endl;
}
auto testFile1b = AddRandomFile("testFile1b", testPackage1.localRoot);
{
include.
tags.insert(std::make_pair(
"Status",
"Published"));
});
{
std::cout << "Located the following file by tag in the test package: " << localFile << std::endl;
}
testPackage1.enabled = false;
testPackage1.localRoot = std::string();
auto testPackage2 = SetUpTestPackage(
"Cpp/CLI Package Test 2", serverRegistration.
serverUrl);
auto testFile2a = AddRandomFile("testFile2a", testPackage2.localRoot);
auto testFile2b = AddRandomFile("testFile2b", testPackage2.localRoot);
{
{
std::cout << "Received file: " << receivedFile.localFilePath << std::endl;
const fs::path tempDir(testPackage2.localRoot);
if (!fs::exists(tempDir / receivedFile.name))
{
fs::copy_file(receivedFile.localFilePath, tempDir / receivedFile.name);
}
}
}).wait();
{
{
if (tagRecord.
name ==
"LocalOnly" && tagRecord.
value ==
"True")
{
}
}
std::cout <<
"Sending file to package: " << localFileRecord.
localFilePath << std::endl;
return testPackage1;
}).wait();
{
std::cout << "Permitted value: " << permittedValue << std::endl;
}
}
catch (const std::runtime_error& e)
{
std::cout << "Sample app encountered an error: " << e.what() << std::endl;
}
return 0;
}
MT_CONNECTOR_EXPORT std::vector< ServerRegistration > ListServerRegistrations()
MT_CONNECTOR_EXPORT std::vector< PackageSummary > GetAvailablePackages(const ServerRegistration ®istration)
MT_CONNECTOR_EXPORT std::vector< std::string > GetArchivedPackages(const std::string &serviceUID="")
MT_CONNECTOR_EXPORT bool IsMineTrustConnectorRunning()
LockPackageResultCodes
Definition MTConnectorSDK.h:816
MT_CONNECTOR_EXPORT RegistrationWrapper RegisterEvents(std::function< void(const MTConnectorEvent &)> callback, const std::list< LogEvent > &eventIDs={})
MT_CONNECTOR_EXPORT std::vector< std::string > EnumerateLocalFilesByTag(const std::string &packageUID, const std::string &tagName, const std::string &tagValue)
MT_CONNECTOR_EXPORT PackageMetrics LoadPackageMetrics(const std::string &packageUID, const std::string &serviceUID="")
MT_CONNECTOR_EXPORT void TagFile(PackageConfiguration &instance, const std::string &localFilePath, const std::string &tagName, const std::string &tagValue)
MT_CONNECTOR_EXPORT std::vector< std::string > GetDeletedPackages(const std::string &serviceUID="")
MT_CONNECTOR_EXPORT concurrency::task< LockPackageResultCodes > LockPackageTask(const std::string &packageUID, const int &ownerProcess=0, bool showUI=false, concurrency::cancellation_token cancel=concurrency::cancellation_token::none())
MT_CONNECTOR_EXPORT void IncludeInPackage(PackageConfiguration &instance, const std::string &localFilePath, std::function< void(IncludeConfiguration &)> configureInclusion)
MT_CONNECTOR_EXPORT SyncNowResultCodes SyncNow(const std::string &packageUID, bool showUI=false)
SyncNowResultCodes
Definition MTConnectorSDK.h:908
MT_CONNECTOR_EXPORT std::vector< std::string > GetInaccessiblePackages(const std::string &serviceUID="")
MT_CONNECTOR_EXPORT std::vector< std::string > EnumerateLocalContents(const std::string &packageUID)
MT_CONNECTOR_EXPORT bool LoadPackageConfiguration(const std::string &packageUID, PackageConfiguration &instance)
MT_CONNECTOR_EXPORT concurrency::task< void > ReceiveFiles(const std::vector< LocalFileRecord > &selection, std::function< void(const std::vector< LocalFileRecord > &)> filesReceivedCallback, concurrency::cancellation_token cancel=concurrency::cancellation_token::none())
MT_CONNECTOR_EXPORT std::vector< std::string > GetPermittedValues(const std::string &configPath)
MT_CONNECTOR_EXPORT concurrency::task< UnlockPackageResultCodes > UnlockPackageTask(const std::string &packageUID, bool discardChanges=false, bool showUI=false, concurrency::cancellation_token cancel=concurrency::cancellation_token::none())
MT_CONNECTOR_EXPORT concurrency::task< void > SendFiles(const std::vector< LocalFileRecord > &selection, std::function< PackageConfiguration(const LocalFileRecord &)> packageSelectionCallback, concurrency::cancellation_token cancel=concurrency::cancellation_token::none())
MT_CONNECTOR_EXPORT bool IsMineTrustConnectorInstalled()
MT_CONNECTOR_EXPORT std::vector< LocalTagRecord > FindTags(const std::string &tagNameFilter="", const std::string &tagValueFilter="", const std::string &serviceUID="", bool fuzzyMatch=false)
MT_CONNECTOR_EXPORT concurrency::task< SyncNowResultCodes > SyncNowTask(const std::string &packageUID, bool showUI=false, concurrency::cancellation_token cancel=concurrency::cancellation_token::none())
MT_CONNECTOR_EXPORT UnlockPackageResultCodes UnlockPackage(const std::string &packageUID, bool discardChanges=false, bool showUI=false)
MT_CONNECTOR_EXPORT std::vector< LocalFileRecord > EvaluateFilter(const std::string &filter, const std::string &packageUID="", const std::string &serviceUID="")
MT_CONNECTOR_EXPORT LockPackageResultCodes LockPackage(const std::string &packageUID, const int &ownerProcess=0, bool showUI=false)
MT_CONNECTOR_EXPORT std::vector< LocalFileRecord > FindFiles(const std::string &tagName, const std::string &tagValue, const std::string &serviceUID="", bool fuzzyMatch=false)
MT_CONNECTOR_EXPORT bool SavePackageConfiguration(const PackageConfiguration &instance)
MT_CONNECTOR_EXPORT bool GetServerRegistrationForServerURL(const std::string &serverUrl, ServerRegistration &instance)
MT_CONNECTOR_EXPORT void RemoveTag(PackageConfiguration &instance, const std::string &localFilePath, const std::string &tagName)
@ AllFilesUpToDate
Definition MTConnectorSDK.h:37
@ SyncCompleted
Definition MTConnectorSDK.h:45
@ GeneralSyncError
Definition MTConnectorSDK.h:207
@ SyncStarted
Definition MTConnectorSDK.h:41
MT_CONNECTOR_EXPORT std::vector< std::string > GetAccessiblePackages(const std::string &serviceUID="")
MT_CONNECTOR_EXPORT std::vector< PackageConfiguration > FindPackageConfigurations(const std::string &jsonPath, const std::string &testValue, bool negate=false)
Definition MTConnectorSDK.h:303
std::unordered_map< std::string, std::string > tags
Definition MTConnectorSDK.h:319
Definition MTConnectorSDK.h:519
std::vector< LocalTagRecord > tags
Definition MTConnectorSDK.h:531
std::string localFilePath
Definition MTConnectorSDK.h:539
Definition MTConnectorSDK.h:494
std::string name
Definition MTConnectorSDK.h:498
std::string value
Definition MTConnectorSDK.h:502
Definition MTConnectorSDK.h:550
LogEvent eventId
Definition MTConnectorSDK.h:555
std::string message
Definition MTConnectorSDK.h:563
std::chrono::system_clock::time_point time
Definition MTConnectorSDK.h:559
Definition MTConnectorSDK.h:332
std::string displayName
Definition MTConnectorSDK.h:353
std::string serverUrl
Definition MTConnectorSDK.h:361
std::vector< IncludeConfiguration > include
Definition MTConnectorSDK.h:380
static MT_CONNECTOR_EXPORT const std::string SHARED_PACKAGE_VISIBILITY
Definition MTConnectorSDK.h:336
std::string localRoot
Definition MTConnectorSDK.h:365
bool enabled
Definition MTConnectorSDK.h:349
std::vector< std::string > exclude
Definition MTConnectorSDK.h:385
std::string visibility
Definition MTConnectorSDK.h:404
std::string packageUID
Definition MTConnectorSDK.h:357
Definition MTConnectorSDK.h:629
Definition MTConnectorSDK.h:596
std::string serviceUID
Definition MTConnectorSDK.h:604
std::string serverUrl
Definition MTConnectorSDK.h:600