I attach a slightly more elaborated sketch of the interface.

What I mostly want to illustrate here is that very few of the actual
types used needs to be visible in the interface.

Don't take the use of pointers too literally - they might well be
references in an actual design.

Andrew

#include <stdint.h>
#include <string>

using std::string;

namespace qpid {

// This is probably not the correct forward declaration, but it allows this to compile.
namespace types {
    namespace Variant {
        class Map;
    }
}

namespace broker {

class BrokerContext;

// This is the parent class for the others here, but this need not be visible in this header file.
class AsyncHandle;

class DataHandle;
class QueueHandle;
class ConfigHandle;
class FlushHandle;
class TxnHandle;
class EventHandle;
class EnqueueHandle;

// This need not be defined here
/*
class DataSource {
public:
    virtual ~DataSource() = 0;
    virtual uint64_t getSize() = 0;
    virtual void write(char* target) = 0;
};
*/
class DataSource;

class AsyncResult;

class ResultFactory {
public:
    virtual AsyncResult* createSuccessResult(AsyncHandle*) = 0;
    virtual AsyncResult* createFailureResult(AsyncHandle*, const int errNo, const std::string& errMsg) = 0;
};


typedef void (*ResultCallback)(AsyncResult*);

class StoreAsyncInterface {
public:
    StoreAsyncInterface();
    virtual ~StoreAsyncInterface() = 0;

    virtual DataHandle* createDataHandle(BrokerContext*, DataSource& data) = 0;
    virtual QueueHandle* createQueueHandle(BrokerContext*, const std::string& queueName , const qpid::types::Variant::Map& queueOptions) = 0;
    virtual ConfigHandle* createConfigHandle(BrokerContext*) = 0;
    virtual FlushHandle* createFlushHandle(BrokerContext*) = 0;
    virtual TxnHandle* createTxnHandle(BrokerContext*, const std::string& xid=std::string()) = 0;
    virtual EventHandle* createEventHandle(BrokerContext*) = 0;
    virtual EnqueueHandle* createEnqueueHandle(BrokerContext*) = 0;

    virtual void submitStoreConfig(ConfigHandle*, const DataHandle*, ResultCallback*) = 0;
    virtual void submitDestroyConfig(ConfigHandle*, ResultCallback*) = 0;

    virtual void submitCreateQueue(QueueHandle*, ResultCallback*) = 0;
    virtual void submitDestroyQueue(QueueHandle*, ResultCallback*) = 0;
    
    virtual void submitFlushQueue(FlushHandle*, const QueueHandle*, ResultCallback*) = 0;

    virtual void submitBeginTxn(TxnHandle*, ResultCallback*) = 0;
    virtual void submitPrepareTxn(TxnHandle*, ResultCallback*) = 0;
    virtual void submitCommitTxn(TxnHandle*, ResultCallback*) = 0;
    virtual void submitAbortTxn(TxnHandle*, ResultCallback*) = 0;

    virtual void submitStoreEvent(EventHandle*, const DataHandle*, const QueueHandle*, const TxnHandle*, ResultCallback*) = 0;

    virtual void submitEnqueueMsg(EnqueueHandle*, const DataHandle*, const QueueHandle*, const TxnHandle*, ResultCallback*) = 0;
    virtual void submitDequeueMsg(EnqueueHandle*, const TxnHandle*, ResultCallback*) = 0;

    // Legacy - Restore FTD message, is NOT async!
    virtual int loadContent(EnqueueHandle*, const QueueHandle*, char* data, uint64_t offset, const uint64_t length) = 0;

};

}}

---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to