File: PluginHost.h

package info (click to toggle)
audacity 3.7.7%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 134,800 kB
  • sloc: cpp: 366,277; ansic: 198,323; lisp: 7,761; sh: 3,414; python: 1,501; xml: 1,385; perl: 854; makefile: 125
file content (69 lines) | stat: -rw-r--r-- 1,961 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**********************************************************************

  Audacity: A Digital Audio Editor

  @file PluginHost.h

  @author Vitaly Sverchinsky

  Part of lib-module-manager library

**********************************************************************/

#pragma once

#include "IPCChannel.h"
#include <memory>
#include <mutex>
#include <optional>
#include <condition_variable>
#include <wx/string.h>

#include "IPCClient.h"
#include "PluginIPCUtils.h"

/**
 * \brief Internal class, processes plugin validation requests
 * from the main app. Request is a simple string formatted by
 * detail::MakeRequestString. After connection is established
 * host starts to wait for a request from server. Once request
 * is successfully processed host sends a reply. Host is capable
 * to handle only one request at a time, so it's not allowed to
 * send another request until host hasn't finish processing
 * previous request.
 */
class MODULE_MANAGER_API PluginHost final : public IPCChannelStatusCallback
{
   static constexpr auto HostArgument =  "--host";

   std::unique_ptr<IPCClient> mClient;
   IPCChannel* mChannel{nullptr};
   detail::InputMessageReader mInputMessageReader;
   std::mutex mSync;
   std::condition_variable mRequestCondition;
   std::optional<wxString> mRequest;

   bool mRunning{true};

   void Stop() noexcept;

public:
   /**
    * \brief Attempts to start a host application (should be called from
    * the main application)
    * \return true if host has started successfully
    */
   static bool Start(int connectPort);

   ///Returns true if current process is considered to be a plugin host process
   static bool IsHostProcess();

   explicit PluginHost(int connectPort);

   void OnConnect(IPCChannel& channel) noexcept override;
   void OnDisconnect() noexcept override;
   void OnConnectionError() noexcept override;
   void OnDataAvailable(const void* data, size_t size) noexcept override;

   bool Serve();
};