diff --git a/src/tools/MonarchPeasantSample/Monarch.cpp b/src/tools/MonarchPeasantSample/Monarch.cpp index 3766db76a91..eeeb50220a0 100644 --- a/src/tools/MonarchPeasantSample/Monarch.cpp +++ b/src/tools/MonarchPeasantSample/Monarch.cpp @@ -17,8 +17,9 @@ namespace winrt::MonarchPeasantSample::implementation Monarch::Monarch() { printf("Instantiated a Monarch\n"); - _peasants = winrt::single_threaded_observable_map(); + // _peasants = winrt::single_threaded_observable_map(); } + Monarch::~Monarch() { printf("~Monarch()\n"); @@ -26,6 +27,12 @@ namespace winrt::MonarchPeasantSample::implementation dtored = true; cv.notify_one(); } + + uint64_t Monarch::GetPID() + { + return GetCurrentProcessId(); + } + uint64_t Monarch::AddPeasant(winrt::MonarchPeasantSample::IPeasant peasant) { // TODO: This whole algo is terrible. There's gotta be a better way of @@ -42,8 +49,28 @@ namespace winrt::MonarchPeasantSample::implementation printf("Peasant already had an ID, %lld\n", peasant.GetID()); _nextPeasantID = providedID >= _nextPeasantID ? providedID + 1 : _nextPeasantID; } - _peasants.Insert(peasant.GetID(), peasant); + _peasants[peasant.GetID()] = peasant; printf("(the next new peasant will get the ID %lld)\n", _nextPeasantID); return peasant.GetID(); } + + bool Monarch::IsInSingleInstanceMode() + { + return false; + } + + winrt::MonarchPeasantSample::IPeasant Monarch::GetPeasant(uint64_t peasantID) + { + return _peasants.at(peasantID); + } + + winrt::MonarchPeasantSample::IPeasant Monarch::GetMostRecentPeasant() + { + return nullptr; + } + + void Monarch::SetSelfID(const uint64_t selfID) + { + _thisPeasantID = selfID; + } } diff --git a/src/tools/MonarchPeasantSample/Monarch.h b/src/tools/MonarchPeasantSample/Monarch.h index 0f2bec81841..a2bc98eecfe 100644 --- a/src/tools/MonarchPeasantSample/Monarch.h +++ b/src/tools/MonarchPeasantSample/Monarch.h @@ -14,23 +14,27 @@ constexpr GUID Monarch_clsid{ namespace winrt::MonarchPeasantSample::implementation { - struct Monarch : public MonarchT, public PeasantBase + struct Monarch : public MonarchT { Monarch(); ~Monarch(); + uint64_t GetPID(); + uint64_t AddPeasant(winrt::MonarchPeasantSample::IPeasant peasant); - bool IsInSingleInstanceMode() { return false; } - winrt::MonarchPeasantSample::IPeasant GetPeasant(uint64_t peasantID) - { - peasantID; - return nullptr; - } - winrt::MonarchPeasantSample::IPeasant GetMostRecentPeasant() { return nullptr; } + + bool IsInSingleInstanceMode(); + + winrt::MonarchPeasantSample::IPeasant GetPeasant(uint64_t peasantID); + + winrt::MonarchPeasantSample::IPeasant GetMostRecentPeasant(); + + void SetSelfID(const uint64_t selfID); private: uint64_t _nextPeasantID{ 1 }; - Windows::Foundation::Collections::IObservableMap _peasants{ nullptr }; + uint64_t _thisPeasantID{ 0 }; + std::unordered_map _peasants; }; } diff --git a/src/tools/MonarchPeasantSample/Monarch.idl b/src/tools/MonarchPeasantSample/Monarch.idl index 50a96305dd1..0cef80d4bc6 100644 --- a/src/tools/MonarchPeasantSample/Monarch.idl +++ b/src/tools/MonarchPeasantSample/Monarch.idl @@ -2,10 +2,10 @@ import "Peasant.idl"; namespace MonarchPeasantSample { - [default_interface] runtimeclass Monarch : IPeasant - { + [default_interface] runtimeclass Monarch { Monarch(); + UInt64 GetPID(); UInt64 AddPeasant(IPeasant peasant); Boolean IsInSingleInstanceMode(); IPeasant GetPeasant(UInt64 peasantID); diff --git a/src/tools/MonarchPeasantSample/Peasant.cpp b/src/tools/MonarchPeasantSample/Peasant.cpp index 34493707715..d7151cd3da1 100644 --- a/src/tools/MonarchPeasantSample/Peasant.cpp +++ b/src/tools/MonarchPeasantSample/Peasant.cpp @@ -14,4 +14,25 @@ namespace winrt::MonarchPeasantSample::implementation { } + void Peasant::AssignID(uint64_t id) + { + _id = id; + } + uint64_t Peasant::GetID() + { + return _id; + } + + uint64_t Peasant::GetPID() + { + return GetCurrentProcessId(); + } + + bool Peasant::ExecuteCommandline(winrt::array_view args, winrt::hstring currentDirectory) + { + args; + currentDirectory; + return true; + } + } diff --git a/src/tools/MonarchPeasantSample/Peasant.h b/src/tools/MonarchPeasantSample/Peasant.h index f525fa663f4..e3309ff356c 100644 --- a/src/tools/MonarchPeasantSample/Peasant.h +++ b/src/tools/MonarchPeasantSample/Peasant.h @@ -13,28 +13,20 @@ constexpr GUID Peasant_clsid{ namespace winrt::MonarchPeasantSample::implementation { - struct PeasantBase + struct Peasant : public PeasantT { - void AssignID(uint64_t id) { _id = id; } - uint64_t GetID() { return _id; } - uint64_t GetPID() { return GetCurrentProcessId(); } - bool ExecuteCommandline(winrt::array_view args, winrt::hstring currentDirectory) - { - args; - currentDirectory; - return true; - } - TYPED_EVENT(WindowActivated, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); + Peasant(); - private: - uint64_t _id{ 0 }; - }; + void AssignID(uint64_t id); + uint64_t GetID(); + uint64_t GetPID(); - struct Peasant : public PeasantT, public PeasantBase - { - Peasant(); + bool ExecuteCommandline(winrt::array_view args, winrt::hstring currentDirectory); + + TYPED_EVENT(WindowActivated, winrt::Windows::Foundation::IInspectable, winrt::Windows::Foundation::IInspectable); private: + uint64_t _id{ 0 }; }; } diff --git a/src/tools/MonarchPeasantSample/main.cpp b/src/tools/MonarchPeasantSample/main.cpp index bd893d02690..dc7f4592b9f 100644 --- a/src/tools/MonarchPeasantSample/main.cpp +++ b/src/tools/MonarchPeasantSample/main.cpp @@ -81,7 +81,7 @@ bool areWeTheKing(const winrt::MonarchPeasantSample::Monarch& monarch, const boo { if (ourPID == kingPID) { - printf(fmt::format("We're the king - our PID is {}\n", ourPID).c_str()); + printf(fmt::format("We're the \x1b[33mking\x1b[m - our PID is {}\n", ourPID).c_str()); } else { @@ -91,20 +91,34 @@ bool areWeTheKing(const winrt::MonarchPeasantSample::Monarch& monarch, const boo return (ourPID == kingPID); } -MonarchPeasantSample::IPeasant getOurPeasant(const winrt::MonarchPeasantSample::Monarch& monarch) +void remindKingWhoTheyAre(const winrt::MonarchPeasantSample::Monarch& monarch, + const winrt::MonarchPeasantSample::IPeasant& peasant) { - if (areWeTheKing(monarch)) + winrt::com_ptr monarchImpl; + monarchImpl.copy_from(winrt::get_self(monarch)); + if (monarchImpl) { - auto iPeasant = monarch.try_as(); - return iPeasant; + auto ourID = peasant.GetID(); + monarchImpl->SetSelfID(ourID); + printf("The king is peasant #%lld\n", ourID); } else { - auto peasant = winrt::make_self(); - auto ourID = monarch.AddPeasant(*peasant); - printf("The monarch assigned us the ID %llu\n", ourID); - return *peasant; + // printf("Shoot, we wanted to be able to get the impl here but couldnt\n"); + } +} + +MonarchPeasantSample::IPeasant createOurPeasant(const winrt::MonarchPeasantSample::Monarch& monarch) +{ + auto peasant = winrt::make_self(); + auto ourID = monarch.AddPeasant(*peasant); + printf("The monarch assigned us the ID %llu\n", ourID); + + if (areWeTheKing(monarch)) + { + remindKingWhoTheyAre(monarch, *peasant); } + return *peasant; } void printPeasants(const winrt::MonarchPeasantSample::Monarch& /*monarch*/) @@ -199,22 +213,22 @@ bool peasantAppLoop(const winrt::MonarchPeasantSample::Monarch& monarch, while (!exitRequested) { - printf("Beginning wait...\n"); + // printf("Beginning wait...\n"); auto waitResult = WaitForMultipleObjects(2, handlesToWaitOn, false, INFINITE); switch (waitResult) { // handlesToWaitOn[0] was signaled case WAIT_OBJECT_0 + 0: - printf("First event was signaled.\n"); - printf("THE KING IS DEAD\n"); + // printf("First event was signaled.\n"); + printf("THE KING IS \x1b[31mDEAD\x1b[m\n"); // Return false here - this will trigger us to find the new monarch return false; break; // handlesToWaitOn[1] was signaled case WAIT_OBJECT_0 + 1: - printf("Second event was signaled.\n"); + // printf("Second event was signaled.\n"); exitRequested = peasantReadInput(monarch, peasant); break; @@ -244,7 +258,7 @@ void app() auto monarch = instantiateAMonarch(); bool isMonarch = areWeTheKing(monarch, true); - auto peasant = getOurPeasant(monarch); + auto peasant = createOurPeasant(monarch); while (!exitRequested) { @@ -259,9 +273,12 @@ void app() { monarch = instantiateAMonarch(); isMonarch = areWeTheKing(monarch, true); - printf("LONG LIVE THE KING\n"); + + printf("LONG LIVE THE %sKING\x1b[m\n", isMonarch ? "\x1b[33m" : ""); + if (isMonarch) { + remindKingWhoTheyAre(monarch, peasant); // TODO: If we've been elected monarch, then we need to make // sure that we're one of the listed peasants (right?) We // probably don't _only_ need to do this during the @@ -298,5 +315,8 @@ int main(int /*argc*/, char** /*argv*/) printf("Error: %ls\n", e.message().c_str()); } + printf("We've left the app. Press any key to close.\n"); + const auto ch = _getch(); + ch; printf("Exiting client\n"); }