m_RelayQueue.Enqueue(boost::bind(&ApiListener::SyncRelayMessage, this, origin, secobj, message, log));
}
-void ApiListener::PersistMessage(const Dictionary::Ptr& message)
+void ApiListener::PersistMessage(const Dictionary::Ptr& message, const DynamicObject::Ptr& secobj)
{
double ts = message->Get("ts");
pmessage->Set("timestamp", ts);
pmessage->Set("message", JsonSerialize(message));
+
+ Dictionary::Ptr secname = make_shared<Dictionary>();
+ secname->Set("type", secobj->GetType()->GetName());
+ secname->Set("name", secobj->GetName());
+ pmessage->Set("secobj", secname);
boost::mutex::scoped_lock lock(m_LogLock);
if (m_LogFile) {
Log(LogNotice, "ApiListener", "Relaying '" + message->Get("method") + "' message");
if (log)
- m_LogQueue.Enqueue(boost::bind(&ApiListener::PersistMessage, this, message));
+ PersistMessage(message, secobj);
if (origin.FromZone)
message->Set("originZone", origin.FromZone->GetName());
int count = -1;
double peer_ts = endpoint->GetLocalLogPosition();
bool last_sync = false;
+
+ Endpoint::Ptr target_endpoint = client->GetEndpoint();
+ ASSERT(target_endpoint);
+
+ Zone::Ptr target_zone = target_endpoint->GetZone();
+
+ if (!target_zone)
+ return;
for (;;) {
boost::mutex::scoped_lock lock(m_LogLock);
if (pmessage->Get("timestamp") <= peer_ts)
continue;
+ Dictionary::Ptr secname = pmessage->Get("secname");
+
+ if (secname) {
+ DynamicType::Ptr dtype = DynamicType::GetByName(secname->Get("type"));
+
+ if (!dtype)
+ continue;
+
+ DynamicObject::Ptr secobj = dtype->GetObject(secname->Get("name"));
+
+ if (!secobj)
+ continue;
+
+ if (!target_zone->CanAccessObject(secobj))
+ continue;
+ }
+
NetString::WriteStringToStream(client->GetStream(), pmessage->Get("message"));
count++;
void MessageHandler(const TlsStream::Ptr& sender, const String& identity, const Dictionary::Ptr& message);
WorkQueue m_RelayQueue;
- WorkQueue m_LogQueue;
boost::mutex m_LogLock;
Stream::Ptr m_LogFile;
size_t m_LogMessageCount;
void SyncRelayMessage(const MessageOrigin& origin, const DynamicObject::Ptr& secobj, const Dictionary::Ptr& message, bool log);
- void PersistMessage(const Dictionary::Ptr& message);
+ void PersistMessage(const Dictionary::Ptr& message, const DynamicObject::Ptr& secobj);
void OpenLogFile(void);
void RotateLogFile(void);