Robot Raconteur Core C++ Library
Loading...
Searching...
No Matches
Service.h
Go to the documentation of this file.
1
23
24#pragma once
25
31#include <istream>
32#include <boost/atomic.hpp>
33
34#ifdef _MSVC_VER
35#pragma warning(push)
36#pragma warning(disable : 4996)
37#include <boost/signals2.hpp>
38#endif
39
40namespace RobotRaconteur
41{
42
43class ROBOTRACONTEUR_CORE_API ServerEndpoint;
44class ROBOTRACONTEUR_CORE_API AuthenticatedUser;
45class ROBOTRACONTEUR_CORE_API ServerContext;
46class ROBOTRACONTEUR_CORE_API ServerContext_ObjectLock;
47class ROBOTRACONTEUR_CORE_API ServerContext_MonitorObjectSkel;
48
49class ROBOTRACONTEUR_CORE_API GeneratorServerBase;
50
51class ROBOTRACONTEUR_CORE_API IRobotRaconteurMonitorObject;
52
65class ROBOTRACONTEUR_CORE_API IRRServiceObject
66{
67 public:
77 virtual void RRServiceObjectInit(RR_WEAK_PTR<ServerContext> context, const std::string& service_path) = 0;
78 virtual ~IRRServiceObject() {}
79};
80
81class ROBOTRACONTEUR_CORE_API ServiceSkel : public RR_ENABLE_SHARED_FROM_THIS<ServiceSkel>, private boost::noncopyable
82{
83
84 public:
85 ServiceSkel();
86 virtual ~ServiceSkel() {}
87
88 virtual void Init(boost::string_ref s, const RR_SHARED_PTR<RRObject>& o, const RR_SHARED_PTR<ServerContext>& c);
89
90 virtual void InitCallbackServers(const RR_SHARED_PTR<RRObject>& o);
91
92 std::string GetServicePath() const;
93
94 protected:
95 std::string m_ServicePath;
96
97 public:
98 RR_SHARED_PTR<ServerContext> GetContext();
99
100 protected:
101 RR_WEAK_PTR<ServerContext> m_context;
102
103 RR_SHARED_PTR<RRObject> uncastobj;
104
105 std::vector<boost::tuple<RobotRaconteurVersion, std::string> > object_type_ver;
106
107 boost::unordered_map<int32_t, RR_SHARED_PTR<GeneratorServerBase> > generators;
108 boost::mutex generators_lock;
109
110 int32_t get_new_generator_index();
111
112 public:
113 RR_SHARED_PTR<RRObject> GetUncastObject() const;
114
115 virtual RR_INTRUSIVE_PTR<MessageEntry> CallGetProperty(const RR_INTRUSIVE_PTR<MessageEntry>& m) = 0;
116
117 virtual RR_INTRUSIVE_PTR<MessageEntry> CallSetProperty(const RR_INTRUSIVE_PTR<MessageEntry>& m) = 0;
118
119 virtual RR_INTRUSIVE_PTR<MessageEntry> CallFunction(const RR_INTRUSIVE_PTR<MessageEntry>& m) = 0;
120
121 protected:
122 static void EndAsyncCallGetProperty(RR_WEAK_PTR<ServiceSkel> skel, const RR_INTRUSIVE_PTR<MessageElement>& value,
123 const RR_SHARED_PTR<RobotRaconteurException>& err,
124 const RR_INTRUSIVE_PTR<MessageEntry>& m,
125 const RR_SHARED_PTR<ServerEndpoint>& ep);
126
127 static void EndAsyncCallSetProperty(RR_WEAK_PTR<ServiceSkel> skel,
128 const RR_SHARED_PTR<RobotRaconteurException>& err,
129 const RR_INTRUSIVE_PTR<MessageEntry>& m,
130 const RR_SHARED_PTR<ServerEndpoint>& ep);
131
132 static void EndAsyncCallFunction(RR_WEAK_PTR<ServiceSkel> skel, const RR_INTRUSIVE_PTR<MessageElement>& ret,
133 const RR_SHARED_PTR<RobotRaconteurException>& err,
134 const RR_INTRUSIVE_PTR<MessageEntry>& m, const RR_SHARED_PTR<ServerEndpoint>& ep);
135
136 public:
137 virtual RR_SHARED_PTR<RRObject> GetSubObj(boost::string_ref name, boost::string_ref ind) = 0;
138
139 RR_SHARED_PTR<RRObject> GetSubObj(boost::string_ref name);
140
141 virtual void RegisterEvents(const RR_SHARED_PTR<RRObject>& obj1);
142
143 virtual void UnregisterEvents(const RR_SHARED_PTR<RRObject>& obj1);
144
145 virtual void InitPipeServers(const RR_SHARED_PTR<RRObject>& obj1);
146
147 virtual void InitWireServers(const RR_SHARED_PTR<RRObject>& obj1);
148
149 void ObjRefChanged(boost::string_ref name);
150
151 void SendEvent(const RR_INTRUSIVE_PTR<MessageEntry>& m);
152
153 void ReleaseObject();
154
155 virtual void ReleaseCastObject() = 0;
156
157 void AsyncSendPipeMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e, bool unreliable,
158 RR_MOVE_ARG(boost::function<void(const RR_SHARED_PTR<RobotRaconteurException>&)>)
159 handler);
160
161 void SendWireMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e);
162
163 virtual void DispatchPipeMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e);
164
165 virtual void DispatchWireMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e);
166
167 virtual RR_INTRUSIVE_PTR<MessageEntry> CallPipeFunction(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e);
168
169 virtual RR_INTRUSIVE_PTR<MessageEntry> CallWireFunction(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e);
170
171 virtual RR_SHARED_PTR<void> GetCallbackFunction(uint32_t endpoint, boost::string_ref membername);
172
173 virtual RR_INTRUSIVE_PTR<MessageEntry> CallMemoryFunction(const RR_INTRUSIVE_PTR<MessageEntry>& m,
174 const RR_SHARED_PTR<Endpoint>& e);
175
176 RR_WEAK_PTR<ServerContext_ObjectLock> objectlock;
177 boost::mutex objectlock_lock;
178
179 RR_SHARED_PTR<ServerContext_MonitorObjectSkel> monitorlock;
180
181 RR_UNORDERED_MAP<uint32_t, RR_SHARED_PTR<ServerContext_MonitorObjectSkel> > monitorlocks;
182 boost::mutex monitorlocks_lock;
183
184 bool IsLocked();
185
186 virtual bool IsRequestNoLock(const RR_INTRUSIVE_PTR<MessageEntry>& m);
187
188 bool IsMonitorLocked();
189
190 virtual std::string GetObjectType() = 0;
191
192 virtual std::string GetObjectType(const RobotRaconteurVersion& client_version);
193
194 RR_SHARED_PTR<RobotRaconteurNode> RRGetNode();
195 RR_WEAK_PTR<RobotRaconteurNode> RRGetNodeWeak();
196
197 virtual void CallGeneratorNext(const RR_INTRUSIVE_PTR<MessageEntry>& m, const RR_SHARED_PTR<Endpoint>& e);
198
199 void SendGeneratorResponse(int32_t index, const RR_INTRUSIVE_PTR<MessageEntry>& m,
200 const RR_SHARED_PTR<ServerEndpoint>& ep);
201
202 void CleanupGenerators();
203
204 protected:
205 RR_WEAK_PTR<RobotRaconteurNode> node;
206};
207
208class ROBOTRACONTEUR_CORE_API UserAuthenticator;
209
252class ROBOTRACONTEUR_CORE_API ServerContext : public RR_ENABLE_SHARED_FROM_THIS<ServerContext>, boost::noncopyable
253{
254 public:
262 std::map<std::string, RR_INTRUSIVE_PTR<RRValue> > GetAttributes();
263
273 void SetAttributes(const std::map<std::string, RR_INTRUSIVE_PTR<RRValue> >& attr);
274
275 private:
276 std::map<std::string, RR_INTRUSIVE_PTR<RRValue> > m_Attributes;
277 boost::mutex m_Attributes_lock;
278
279 public:
280 RR_SHARED_PTR<ServiceFactory> GetServiceDef() const;
281
282 RR_SHARED_PTR<ServiceFactory> GetRootObjectServiceDef(const RobotRaconteurVersion& client_version);
283
284 virtual ~ServerContext() {}
285
286 protected:
287 RR_SHARED_PTR<ServiceFactory> m_ServiceDef;
288
289 public:
295 std::vector<std::string> GetExtraImports();
296
310 void AddExtraImport(boost::string_ref import_);
311
321 bool RemoveExtraImport(boost::string_ref import_);
322
323 protected:
324 std::vector<std::string> extra_imports;
325 boost::mutex extra_imports_lock;
326
327 public:
336 std::string GetServiceName() const;
337
338 protected:
339 std::string m_ServiceName;
340
341 RR_UNORDERED_MAP<MessageStringPtr, RR_SHARED_PTR<ServiceSkel> > skels;
342 boost::mutex skels_lock;
343
344 RR_UNORDERED_MAP<uint32_t, RR_SHARED_PTR<ServerEndpoint> > client_endpoints;
345 boost::mutex client_endpoints_lock;
346
347 public:
348 std::string GetRootObjectType(const RobotRaconteurVersion& client_version);
349
350 protected:
351 std::string m_RootObjectType;
352
353 RR_WEAK_PTR<RobotRaconteurNode> node;
354
355 public:
373 ServerContext(const RR_SHARED_PTR<ServiceFactory>& f, const RR_SHARED_PTR<RobotRaconteurNode>& node);
374
375 RR_SHARED_PTR<RobotRaconteurNode> GetNode();
376
377 virtual void SendEvent(const RR_INTRUSIVE_PTR<MessageEntry>& m);
378#undef SendMessage
379 virtual void SendMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, const RR_SHARED_PTR<Endpoint>& e);
380
381 virtual void SendMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e);
382
383 virtual void AsyncSendMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e,
384 const boost::function<void(const RR_SHARED_PTR<RobotRaconteurException>&)>& callback);
385
386 virtual void AsyncSendMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, const RR_SHARED_PTR<Endpoint>& e,
387 const boost::function<void(const RR_SHARED_PTR<RobotRaconteurException>&)>& callback);
388
389 virtual void AsyncSendUnreliableMessage(
390 const RR_INTRUSIVE_PTR<MessageEntry>& m, const RR_SHARED_PTR<ServerEndpoint>& e,
391 const boost::function<void(const RR_SHARED_PTR<RobotRaconteurException>&)>& callback);
392
393 virtual void AsyncSendPipeMessage(
394 const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e, bool unreliable,
395 const boost::function<void(const RR_SHARED_PTR<RobotRaconteurException>&)>& callback);
396
397 virtual void SendWireMessage(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t e);
398
399 private:
400 bool base_object_set;
401
402 protected:
413 void SetSecurityPolicy(const RR_SHARED_PTR<ServiceSecurityPolicy>& policy);
414
415 public:
416 virtual void SetBaseObject(
417 boost::string_ref name, const RR_SHARED_PTR<RRObject>& o,
418 const RR_SHARED_PTR<ServiceSecurityPolicy>& policy = RR_SHARED_PTR<ServiceSecurityPolicy>());
419
420 virtual RR_SHARED_PTR<ServiceSkel> GetObjectSkel(MessageStringRef servicepath);
421
422 virtual void ReplaceObject(boost::string_ref path);
423
424 virtual std::string GetObjectType(MessageStringRef servicepath, const RobotRaconteurVersion& client_version);
425
435 static RR_SHARED_PTR<ServerContext> GetCurrentServerContext();
436
437 private:
438 static boost::thread_specific_ptr<RR_SHARED_PTR<ServerContext> > m_CurrentServerContext;
439
440 public:
451 static std::string GetCurrentServicePath();
452
453 private:
454 static boost::thread_specific_ptr<std::string> m_CurrentServicePath;
455
456 public:
457 virtual RR_INTRUSIVE_PTR<MessageEntry> ProcessMessageEntry(const RR_INTRUSIVE_PTR<MessageEntry>& m,
458 const RR_SHARED_PTR<ServerEndpoint>& c);
459
460 virtual void Close();
461
462 virtual void MessageReceived(const RR_INTRUSIVE_PTR<Message>& m, const RR_SHARED_PTR<ServerEndpoint>& e);
463
464 virtual void AddClient(const RR_SHARED_PTR<ServerEndpoint>& cendpoint);
465
466 virtual void RemoveClient(const RR_SHARED_PTR<ServerEndpoint>& cendpoint);
467
475 virtual void KickUser(boost::string_ref username);
476
477 private:
478 RR_SHARED_PTR<UserAuthenticator> user_authenticator;
479 std::map<std::string, std::string> security_policies;
480
481 bool m_RequireValidUser;
482 bool AllowObjectLock;
483
484 virtual RR_INTRUSIVE_PTR<MessageEntry> ClientSessionOp(const RR_INTRUSIVE_PTR<MessageEntry>& m,
485 const RR_SHARED_PTR<ServerEndpoint>& e);
486
487 public:
497 virtual bool RequireValidUser();
498
499 virtual RR_SHARED_PTR<AuthenticatedUser> AuthenticateUser(
500 boost::string_ref username, std::map<std::string, RR_INTRUSIVE_PTR<RRValue> >& credentials,
501 const RR_SHARED_PTR<ServerEndpoint>& ep);
502
503 private:
504 boost::mutex ClientLockOp_lockobj;
505
506 virtual void ClientLockOp(const RR_INTRUSIVE_PTR<MessageEntry>& m, const RR_INTRUSIVE_PTR<MessageEntry>& ret);
507
508 public:
518 void RequestObjectLock(boost::string_ref servicepath, boost::string_ref username);
519
532 void RequestClientObjectLock(boost::string_ref servicepath, boost::string_ref username, uint32_t endpoint);
533
549 void ReleaseObjectLock(boost::string_ref servicepath, boost::string_ref username, bool override_);
550
557 std::string GetObjectLockUsername(boost::string_ref servicepath);
558
559 protected:
560 void check_lock(const RR_SHARED_PTR<ServiceSkel>& skel, const RR_INTRUSIVE_PTR<MessageEntry>& m);
561
562 void check_monitor_lock(const RR_SHARED_PTR<ServiceSkel>& skel);
563
564 RR_UNORDERED_MAP<std::string, RR_SHARED_PTR<ServerContext_ObjectLock> > active_object_locks;
565
566 public:
567 virtual void PeriodicCleanupTask();
568
569 protected:
570 RR_INTRUSIVE_PTR<MessageEntry> CheckServiceCapability(const RR_INTRUSIVE_PTR<MessageEntry>& m,
571 const RR_SHARED_PTR<ServerEndpoint>& c);
572
573 public:
574 boost::signals2::signal<void(const RR_SHARED_PTR<ServerContext>&, ServerServiceListenerEventType,
575 const RR_SHARED_PTR<void>&)>
576 ServerServiceListener;
577
578 protected:
579 void ReleaseServicePath1(const std::string& path);
580
581 public:
598 void ReleaseServicePath(boost::string_ref path);
599
616 void ReleaseServicePath(boost::string_ref path, const std::vector<uint32_t>& endpoints);
617
618 void AsyncProcessCallbackRequest(
619 const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t endpoint,
620 RR_MOVE_ARG(
621 boost::function<void(const RR_INTRUSIVE_PTR<MessageEntry>&, const RR_SHARED_PTR<RobotRaconteurException>&)>)
622 handler,
623 int32_t timeout = RR_TIMEOUT_INFINITE);
624
625 private:
626 void AsyncProcessCallbackRequest_err(const RR_SHARED_PTR<RobotRaconteurException>& error, uint32_t endpoint,
627 uint32_t requestid);
628
629 void AsyncProcessCallbackRequest_timeout(const TimerEvent&, uint32_t endpoint, uint32_t requestid);
630
631 uint32_t request_number;
632
633 struct outstanding_request
634 {
635 RR_INTRUSIVE_PTR<MessageEntry> ret;
636 RR_SHARED_PTR<AutoResetEvent> evt;
637 boost::function<void(const RR_INTRUSIVE_PTR<MessageEntry>& ret,
638 const RR_SHARED_PTR<RobotRaconteurException>& error)>
639 handler;
640 RR_SHARED_PTR<Timer> timer;
641 };
642
643 boost::mutex outstanding_requests_lock;
644 RR_UNORDERED_MAP<uint32_t, RR_SHARED_PTR<outstanding_request> > outstanding_requests;
645
646 public:
647 RR_INTRUSIVE_PTR<MessageEntry> ProcessCallbackRequest(const RR_INTRUSIVE_PTR<MessageEntry>& m, uint32_t endpointid);
648
657
668 void SetMonitorThreadPoolCount(int32_t count);
669
677 RR_SHARED_PTR<ThreadPool> GetMonitorThreadPool();
678
679 protected:
680 RR_SHARED_PTR<ThreadPool> monitor_thread_pool;
681 boost::mutex monitor_thread_pool_lock;
682
683 public:
693 std::vector<std::string> GetCandidateConnectionURLs();
694
702 void PrintCandidateConnectionURLs(std::ostream& out = std::cout);
703
712};
713
727class ROBOTRACONTEUR_CORE_API ServerEndpoint : public Endpoint, public RR_ENABLE_SHARED_FROM_THIS<ServerEndpoint>
728{
729 public:
730 RR_SHARED_PTR<ServerContext> service;
731
732 private:
733 static boost::thread_specific_ptr<RR_SHARED_PTR<ServerEndpoint> > m_CurrentEndpoint;
734
735 public:
747 static RR_SHARED_PTR<ServerEndpoint> GetCurrentEndpoint();
748
749 private:
750 static boost::thread_specific_ptr<RR_SHARED_PTR<AuthenticatedUser> > m_CurrentAuthenticatedUser;
751
752 public:
768 static RR_SHARED_PTR<AuthenticatedUser> GetCurrentAuthenticatedUser();
769
770 private:
771 RR_SHARED_PTR<AuthenticatedUser> endpoint_authenticated_user;
772
773 public:
774 const std::string GetAuthenticatedUsername() const;
775
776 RR_OVIRTUAL void MessageReceived(const RR_INTRUSIVE_PTR<Message>& m) RR_OVERRIDE;
777
778 void AuthenticateUser(boost::string_ref username, std::map<std::string, RR_INTRUSIVE_PTR<RRValue> >& credentials);
779
780 void LogoutUser();
781
782 RR_OVIRTUAL void PeriodicCleanupTask() RR_OVERRIDE;
783
784 RR_OVIRTUAL void SetTransportConnection(const RR_SHARED_PTR<ITransportConnection>& c) RR_OVERRIDE;
785
786 private:
787 RobotRaconteurVersion client_version;
788 boost::mutex this_lock;
789
790 public:
791 RobotRaconteurVersion GetClientVersion();
792 void SetClientVersion(const RobotRaconteurVersion& version);
793
794 ServerEndpoint(const RR_SHARED_PTR<RobotRaconteurNode>& node) : Endpoint(node) {}
795};
796
806class ROBOTRACONTEUR_CORE_API IRobotRaconteurMonitorObject
807{
808 public:
814 virtual void RobotRaconteurMonitorEnter() = 0;
815
823 virtual void RobotRaconteurMonitorEnter(int32_t timeout) = 0;
824
829 virtual void RobotRaconteurMonitorExit() = 0;
830
832};
833
841class ROBOTRACONTEUR_CORE_API RRObject_default_impl : public virtual RRObject
842{
843 protected:
844 boost::mutex this_lock;
845};
846
847#ifndef ROBOTRACONTEUR_NO_CXX11_TEMPLATE_ALIASES
848using ServiceSkelPtr = RR_SHARED_PTR<ServiceSkel>;
850using ServerContextPtr = RR_SHARED_PTR<ServerContext>;
852using ServerEndpointPtr = RR_SHARED_PTR<ServerEndpoint>;
853#endif
854
855} // namespace RobotRaconteur
856
857#ifdef _MSVC_VER
858#pragma warning(pop)
859#endif
RobotRaconteur_LogLevel
Log level enum.
Definition RobotRaconteurConstants.h:608
@ RobotRaconteur_LogLevel_Info
info log level
Definition RobotRaconteurConstants.h:614
ServerServiceListenerEventType
Enum of service listener events.
Definition RobotRaconteurConstants.h:518
#define RR_TIMEOUT_INFINITE
Disable timeout for asynchronous operations.
Definition RobotRaconteurConstants.h:566
boost::shared_ptr< ServerEndpoint > ServerEndpointPtr
Convenience alias for ServerEndpoint shared_ptr.
Definition Service.h:852
boost::shared_ptr< ServerContext > ServerContextPtr
Convenience alias for ServerContext shared_ptr.
Definition Service.h:850
Class representing an authenticated user.
Definition Security.h:87
Interface for service objects to receive service notifications.
Definition Service.h:66
virtual void RRServiceObjectInit(RR_WEAK_PTR< ServerContext > context, const std::string &service_path)=0
Function called after service object has been initialized.
Service object monitor lock notification.
Definition Service.h:807
virtual void RobotRaconteurMonitorExit()=0
Release the thread-exclusive monitor lock.
virtual void RobotRaconteurMonitorEnter(int32_t timeout)=0
Request a thread-exclusive lock with timeout.
virtual void RobotRaconteurMonitorEnter()=0
Request a thread-exclusive lock without timeout.
Base class for default service object implementations.
Definition Service.h:842
The central node implementation.
Definition RobotRaconteurNode.h:132
Robot Raconteur Version storage class.
Definition ServiceDefinition.h:94
Context for services registered in a node for use by clients.
Definition Service.h:253
void RequestClientObjectLock(boost::string_ref servicepath, boost::string_ref username, uint32_t endpoint)
Request a client lock on servicepath for a specific client connection.
std::vector< std::string > GetExtraImports()
Get the current vector of extra service definition imports.
std::map< std::string, boost::intrusive_ptr< RRValue > > GetAttributes()
Get the service attributes.
virtual bool RequireValidUser()
Return if a valid user is required.
void ReleaseObjectLock(boost::string_ref servicepath, boost::string_ref username, bool override_)
Release a client lock on servicepath.
static boost::shared_ptr< ServerContext > GetCurrentServerContext()
Get the current ServerContext.
int32_t GetMonitorThreadPoolCount()
Get the number of threads used by the monitor thread pool.
void SetAttributes(const std::map< std::string, boost::intrusive_ptr< RRValue > > &attr)
Set the service attributes.
void RequestObjectLock(boost::string_ref servicepath, boost::string_ref username)
Request an object lock on servicepath for user username.
ServerContext(const boost::shared_ptr< ServiceFactory > &f, const boost::shared_ptr< RobotRaconteurNode > &node)
Construct a new ServerContext instance.
void LogCandidateConnectionURLs(RobotRaconteur_LogLevel level=RobotRaconteur_LogLevel_Info)
Log the candidate connection URLs for this service.
void SetSecurityPolicy(const boost::shared_ptr< ServiceSecurityPolicy > &policy)
Set the security policy of the service.
std::vector< std::string > GetCandidateConnectionURLs()
Get the candidate connection URLs for this service.
void ReleaseServicePath(boost::string_ref path, const std::vector< uint32_t > &endpoints)
Release the specified service path and all sub objects.
std::string GetObjectLockUsername(boost::string_ref servicepath)
Get the name of the user that has locked the specified service path.
void SetMonitorThreadPoolCount(int32_t count)
Set the monitor lock thread pool count.
void ReleaseServicePath(boost::string_ref path)
Release the specified service path and all sub objects.
std::string GetServiceName() const
Get the name of the service.
static std::string GetCurrentServicePath()
Get the current object service path.
void AddExtraImport(boost::string_ref import_)
Add an extra service definition import.
void PrintCandidateConnectionURLs(std::ostream &out=std::cout)
Print the candidate connection URLs for this service.
boost::shared_ptr< ThreadPool > GetMonitorThreadPool()
Get the monitor lock thread pool.
virtual void KickUser(boost::string_ref username)
Kicks a user with the specified username.
bool RemoveExtraImport(boost::string_ref import_)
Removes an extra import service definition registered with AddExtraImport().
Server endpoint representing a client connection.
Definition Service.h:728
static boost::shared_ptr< ServerEndpoint > GetCurrentEndpoint()
Returns the current server endpoint.
static boost::shared_ptr< AuthenticatedUser > GetCurrentAuthenticatedUser()
Returns the current authenticated user.
Base class for user authenticators.
Definition Security.h:151
Timer event structure.
Definition Timer.h:55