blob: e61cd737d0eac99325c0e963cf33bb82e94f4c40 [file]
#ifndef _QmfAgent_
#define _QmfAgent_
/*
* 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/QmfImportExport.h"
namespace qmf {
class AgentImpl;
class Connection;
class ObjectId;
class AgentObject;
class Value;
class Event;
class SchemaObjectClass;
/**
* AgentListener is used by agents that select the internalStore=false option (see Agent
* constructor) or by agents that wish to provide access control for queries and methods.
*
* \ingroup qmfapi
*/
class AgentListener {
QMF_EXTERN virtual ~AgentListener();
/**
* allowQuery is called before a query operation is executed. If true is returned
* by this function, the query will proceed. If false is returned, the query will
* be forbidden.
*
* @param q The query being requested.
* @param userId The authenticated identity of the user requesting the query.
*/
virtual bool allowQuery(const Query& q, const char* userId);
/**
* allowMethod is called before a method call is executed. If true is returned
* by this function, the method call will proceed. If false is returned, the method
* call will be forbidden.
*
* @param name The name of the method being called.
* @param args A value object (of type "map") that contains both input and output arguments.
* @param oid The objectId that identifies the instance of the object being called.
* @param cls The Schema describing the object being called.
* @param userId The authenticated identity of the requesting user.
*/
virtual bool allowMethod(const char* name, const Value& args, const ObjectId& oid,
const SchemaObjectClass& cls, const char* userId);
/**
* query is called when the agent receives a query request. The handler must invoke
* Agent::queryResponse zero or more times (using the supplied context) followed by
* a single invocation of Agent::queryComplete. These calls do not need to be made
* synchronously in the context of this function. They may occur before or after this
* function returns.
*
* This function will only be invoked if internalStore=false in the Agent's constructor.
*
* @param context A context value to use in resulting calls to queryResponse and quertComplete.
* @param q The query requested by the console.
* @param userId the authenticated identity of the user requesting the query.
*/
virtual void query(uint32_t context, const Query& q, const char* userId);
/**
* syncStart is called when a console requests a standing query. This function must
* behave exactly like AgentListener::query (i.e. send zero or more responses followed
* by a queryComplete) except it then remembers the context and the query and makes
* subsequent queryResponse calls whenever appropriate according the the query.
*
* The standing query shall stay in effect until syncStop is called with the same context
* value or until a specified period of time elapses without receiving a syncTouch for the
* context.
*
* This function will only be invoked if internalStore=false in the Agent's constructor.
*
* @param context A context value to use in resulting calls to queryResponse and queryComplete.
* @param q The query requested by the console.
* @param userId the authenticated identity of the user requesting the query.
*/
virtual void syncStart(uint32_t context, const Query& q, const char* userId);
/**
* syncTouch is called when the console that requested a standing query refreshes its
* interest in the query. The console must periodically "touch" a standing query to keep
* it alive. This prevents standing queries from accumulating when the console disconnects
* before it can stop the query.
*
* This function will only be invoked if internalStore=false in the Agent's constructor.
*
* @param context The context supplied in a previous call to syncStart.
* @param userId The authenticated identity of the requesting user.
*/
virtual void syncTouch(uint32_t context, const char* userId);
/**
* syncStop is called when the console that requested a standing query no longer wishes to
* receive data associated with that query. The application shall stop processing this
* query and shall remove its record of the context value.
*
* This function will only be invoked if internalStore=false in the Agent's constructor.
*
* @param context The context supplied in a previous call to syncStart.
* @param userId The authenticated identity of the requesting user.
*/
virtual void syncStop(uint32_t context, const char* userId);
/**
* methodCall is called when a console invokes a method on a QMF object. The application
* must call Agent::methodResponse once in response to this function. The response does
* not need to be called synchronously in the context of this function. It may be called
* before or after this function returns.
*
* This function will only be invoked if internalStore=false in the Agent's constructor.
*
* @param context A context value to use in resulting call to methodResponse.
* @param name The name of the method being called.
* @param args A value object (of type "map") that contains both input and output arguments.
* @param oid The objectId that identifies the instance of the object being called.
* @param cls The Schema describing the object being called.
* @param userId The authenticated identity of the requesting user.
*/
virtual void methodCall(uint32_t context, const char* name, Value& args,
const ObjectId& oid, const SchemaObjectClass& cls, const char* userId);
};
/**
* The Agent class is the QMF Agent portal. It should be instantiated once and associated with a
* Connection (setConnection) to connect an agent to the QMF infrastructure.
*
* \ingroup qmfapi
*/
class Agent {
public:
/**
* Create an instance of the Agent class.
*
* @param label An optional string label that can be used to identify the agent.
*
* @param internalStore If true, objects shall be tracked internally by the agent.
* If false, the user of the agent must track the objects.
* If the agent is tracking the objects, queries and syncs are handled by
* the agent. The only involvement the user has is to optionally authorize
* individual operations. If the user is tracking the objects, the user code
* must implement queries and syncs (standing queries).
*
* @param listener A pointer to a class that implements the AgentListener interface.
* This must be supplied if any of the following conditions are true:
* - The agent model contains methods
* - The user wishes to individually authorize query and sync operations.
* - internalStore = false
*/
QMF_EXTERN Agent(char* label="qmfa", bool internalStore=true, AgentListener* listener=0);
/**
* Destroy an instance of the Agent class.
*/
QMF_EXTERN ~Agent();
/**
* Set the persistent store file. This file, if specified, is used to store state information
* about the Agent. For example, if object-ids must be persistent across restarts of the Agent
* program, this file path must be supplied.
*
* @param path Full path to a file that is both writable and readable by the Agent program.
*/
QMF_EXTERN void setStoreDir(const char* path);
/**
* Provide a connection (to a Qpid broker) over which the agent can communicate.
*
* @param conn Pointer to a Connection object.
*/
QMF_EXTERN void setConnection(Connection* conn);
/**
* Register a class schema (object or event) with the agent. The agent must have a registered
* schema for an object class or an event class before it can handle objects or events of that
* class.
*
* @param cls Pointer to the schema structure describing the class.
*/
QMF_EXTERN void registerClass(SchemaObjectClass* cls);
QMF_EXTERN void registerClass(SchemaEventClass* cls);
/**
* Add an object to the agent (for internal storage mode only).
*
* @param obj Reference to the object to be managed by the agent.
*
* @param persistent Iff true, the object ID assigned to the object shall indicate persistence
* (i.e. the object ID shall be the same across restarts of the agent program).
*
* @param oid 64-bit value for the oid (if zero, the agent will assign the value).
*
* @param oidLo 32-bit value for the lower 32-bits of the oid.
*
* @param oidHi 32-bit value for the upper 32-bits of the oid.
*/
QMF_EXTERN const ObjectId* addObject(AgentObject& obj, bool persistent=false, uint64_t oid=0);
QMF_EXTERN const ObjectId* addObject(AgentObject& obj, bool persistent, uint32_t oidLo, uint32_t oidHi);
/**
* Allocate an object ID for an object (for external storage mode only).
*
* @param persistent Iff true, the object ID allocated shall indicate persistence
* (i.e. the object ID shall be the same across restarts of the agent program).
*
* @param oid 64-bit value for the oid (if zero, the agent will assign the value).
*
* @param oidLo 32-bit value for the lower 32-bits of the oid.
*
* @param oidHi 32-bit value for the upper 32-bits of the oid.
*/
QMF_EXTERN const ObjectId* allocObjectId(bool persistent=false, uint64_t oid=0);
QMF_EXTERN const ObjectId* allocObjectId(bool persistent, uint32_t oidLo, uint32_t oidHi);
/**
* Raise a QMF event.
*
* @param event Reference to an event object to be raised to the QMF infrastructure.
*/
QMF_EXTERN void raiseEvent(Event& event);
/**
* Provide a response to a query (for external storage mode only).
*
* @param context The context value supplied in the query (via the AgentListener interface).
*
* @param object A reference to the agent that matched the query criteria.
*
* @param prop If true, transmit the property attributes of this object.
*
* @param stat If true, transmit the statistic attributes of this object.
*/
QMF_EXTERN void queryResponse(uint32_t context, AgentObject& object, bool prop = true, bool stat = true);
/**
* Indicate that a query (or the initial dump of a sync) is complete (for external storage mode only).
*
* @param context The context value supplied in the query/sync (via the AgentListener interface).
*/
QMF_EXTERN void queryComplete(uint32_t context);
/**
* Provide the response to a method call.
*
* @param context The context value supplied in the method request (via the AgentListener interface).
*
* @param args The argument list from the method call. Must include the output arguments (may include
* the input arguments).
*
* @param status Numerical return status: zero indicates no error, non-zero indicates error.
*
* @param exception Pointer to an exception value. If status is non-zero, the exception value is
* sent to the caller. It is optional (i.e. leave the pointer as 0), or may be
* set to any legal value. A string may be supplied, but an unmanaged object of
* any schema may also be passed.
*/
QMF_EXTERN void methodResponse(uint32_t context, const Value& args, uint32_t status=0,
const Value* exception=0);
private:
AgentImpl* impl;
};
}
#endif