blob: bd40c63c6c11f1c76ad79d33fdc13b4159b45fa6 [file] [log] [blame]
#ifndef _QmfEngineConsole_
#define _QmfEngineConsole_
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include <qmf/engine/ResilientConnection.h>
#include <qmf/engine/Schema.h>
#include <qmf/engine/ObjectId.h>
#include <qmf/engine/Object.h>
#include <qmf/engine/Event.h>
#include <qmf/engine/Query.h>
#include <qmf/engine/Value.h>
#include <qmf/engine/Message.h>
namespace qmf {
namespace engine {
class Console;
class ConsoleImpl;
class BrokerProxyImpl;
class AgentProxy;
struct AgentProxyImpl;
struct MethodResponseImpl;
struct QueryResponseImpl;
struct QueryContext;
/**
*
*/
class MethodResponse {
public:
MethodResponse(const MethodResponse& from);
~MethodResponse();
uint32_t getStatus() const;
const Value* getException() const;
const Value* getArgs() const;
private:
friend struct MethodResponseImpl;
friend class ConsoleImpl;
MethodResponse(MethodResponseImpl* impl);
MethodResponseImpl* impl;
};
/**
*
*/
class QueryResponse {
public:
~QueryResponse();
uint32_t getStatus() const;
const Value* getException() const;
uint32_t getObjectCount() const;
const Object* getObject(uint32_t idx) const;
private:
friend struct QueryResponseImpl;
friend struct QueryContext;
QueryResponse(QueryResponseImpl* impl);
QueryResponseImpl *impl;
};
/**
*
*/
struct ConsoleEvent {
enum EventKind {
AGENT_ADDED = 1,
AGENT_DELETED = 2,
NEW_PACKAGE = 3,
NEW_CLASS = 4,
OBJECT_UPDATE = 5,
EVENT_RECEIVED = 7,
AGENT_HEARTBEAT = 8
};
EventKind kind;
AgentProxy* agent; // (AGENT_[ADDED|DELETED|HEARTBEAT])
char* name; // (NEW_PACKAGE)
const SchemaClassKey* classKey; // (NEW_CLASS)
Object* object; // (OBJECT_UPDATE)
void* context; // (OBJECT_UPDATE)
Event* event; // (EVENT_RECEIVED)
uint64_t timestamp; // (AGENT_HEARTBEAT)
QueryResponse* queryResponse; // (QUERY_COMPLETE)
bool hasProps;
bool hasStats;
};
/**
*
*/
struct BrokerEvent {
enum EventKind {
BROKER_INFO = 10,
DECLARE_QUEUE = 11,
DELETE_QUEUE = 12,
BIND = 13,
UNBIND = 14,
SETUP_COMPLETE = 15,
STABLE = 16,
QUERY_COMPLETE = 17,
METHOD_RESPONSE = 18
};
EventKind kind;
char* name; // ([DECLARE|DELETE]_QUEUE, [UN]BIND)
char* exchange; // ([UN]BIND)
char* bindingKey; // ([UN]BIND)
void* context; // (QUERY_COMPLETE, METHOD_RESPONSE)
QueryResponse* queryResponse; // (QUERY_COMPLETE)
MethodResponse* methodResponse; // (METHOD_RESPONSE)
};
/**
*
*/
class AgentProxy {
public:
AgentProxy(const AgentProxy& from);
~AgentProxy();
const char* getLabel() const;
uint32_t getBrokerBank() const;
uint32_t getAgentBank() const;
private:
friend struct StaticContext;
friend struct QueryContext;
friend struct AgentProxyImpl;
friend class BrokerProxyImpl;
AgentProxy(AgentProxyImpl* impl);
AgentProxyImpl* impl;
};
/**
*
*/
class BrokerProxy {
public:
BrokerProxy(Console& console);
~BrokerProxy();
void sessionOpened(SessionHandle& sh);
void sessionClosed();
void startProtocol();
void handleRcvMessage(Message& message);
bool getXmtMessage(Message& item) const;
void popXmt();
bool getEvent(BrokerEvent& event) const;
void popEvent();
uint32_t agentCount() const;
const AgentProxy* getAgent(uint32_t idx) const;
void sendQuery(const Query& query, void* context, const AgentProxy* agent = 0);
private:
friend class ConsoleImpl;
friend struct StaticContext;
BrokerProxyImpl* impl;
};
// TODO - move this to a public header
struct ConsoleSettings {
bool rcvObjects;
bool rcvEvents;
bool rcvHeartbeats;
bool userBindings;
ConsoleSettings() :
rcvObjects(true),
rcvEvents(true),
rcvHeartbeats(true),
userBindings(false) {}
};
class Console {
public:
Console(const ConsoleSettings& settings = ConsoleSettings());
~Console();
bool getEvent(ConsoleEvent& event) const;
void popEvent();
void addConnection(BrokerProxy& broker, void* context);
void delConnection(BrokerProxy& broker);
uint32_t packageCount() const;
const char* getPackageName(uint32_t idx) const;
uint32_t classCount(const char* packageName) const;
const SchemaClassKey* getClass(const char* packageName, uint32_t idx) const;
ClassKind getClassKind(const SchemaClassKey* key) const;
const SchemaObjectClass* getObjectClass(const SchemaClassKey* key) const;
const SchemaEventClass* getEventClass(const SchemaClassKey* key) const;
void bindPackage(const char* packageName);
void bindClass(const SchemaClassKey* key);
void bindClass(const char* packageName, const char* className);
void bindEvent(const SchemaClassKey *key);
void bindEvent(const char* packageName, const char* eventName);
/*
void startSync(const Query& query, void* context, SyncQuery& sync);
void touchSync(SyncQuery& sync);
void endSync(SyncQuery& sync);
*/
private:
friend class BrokerProxyImpl;
friend struct AgentProxyImpl;
friend struct StaticContext;
ConsoleImpl* impl;
};
}
}
#endif