274 lines
8.7 KiB
C
274 lines
8.7 KiB
C
|
/*
|
||
|
*
|
||
|
* Copyright (C) 1998-2012, OFFIS e.V.
|
||
|
* All rights reserved. See COPYRIGHT file for details.
|
||
|
*
|
||
|
* This software and supporting documentation were developed by
|
||
|
*
|
||
|
* OFFIS e.V.
|
||
|
* R&D Division Health
|
||
|
* Escherweg 2
|
||
|
* D-26121 Oldenburg, Germany
|
||
|
*
|
||
|
*
|
||
|
* Module: dcmpstat
|
||
|
*
|
||
|
* Author: Marco Eichelberg
|
||
|
*
|
||
|
* Purpose:
|
||
|
* classes: DVPSIPCMessage
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef DVPSMSG_H
|
||
|
#define DVPSMSG_H
|
||
|
|
||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||
|
#include "dcmtk/dcmpstat/dpdefine.h"
|
||
|
#include "dcmtk/dcmdata/dctypes.h" /* for Uint32 */
|
||
|
#include "dcmtk/ofstd/ofstring.h" /* for class OFString */
|
||
|
|
||
|
class DcmTransportConnection;
|
||
|
|
||
|
/** class for IPC message exchange between different processes of the
|
||
|
* DICOMscope application
|
||
|
*/
|
||
|
class DCMTK_DCMPSTAT_EXPORT DVPSIPCMessage
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
/// default constructor
|
||
|
DVPSIPCMessage();
|
||
|
|
||
|
/// copy constructor
|
||
|
DVPSIPCMessage(const DVPSIPCMessage& copy);
|
||
|
|
||
|
/// destructor
|
||
|
virtual ~DVPSIPCMessage();
|
||
|
|
||
|
/// copy assignment operator
|
||
|
DVPSIPCMessage& operator=(const DVPSIPCMessage&);
|
||
|
|
||
|
/** sets the message type
|
||
|
* @param msgtype new message type
|
||
|
*/
|
||
|
void setMessageType(Uint32 msgtype) { messageType = msgtype; }
|
||
|
|
||
|
/** returns the message type
|
||
|
* @return message type
|
||
|
*/
|
||
|
Uint32 getMessageType() { return messageType; }
|
||
|
|
||
|
/** adds a character string into the message payload.
|
||
|
* @param str zero terminated string, may be NULL (in which case an empty string is added)
|
||
|
*/
|
||
|
void addStringToPayload(const char *str);
|
||
|
|
||
|
/** adds an integer into the message payload.
|
||
|
* @param value to write
|
||
|
*/
|
||
|
void addIntToPayload(Uint32 i);
|
||
|
|
||
|
/** extracts a string from the message payload
|
||
|
* and copies it into the given str object.
|
||
|
* @param str string is written into this parameter
|
||
|
* @return OFTrue if successful, OFFalse otherwise
|
||
|
*/
|
||
|
OFBool extractStringFromPayload(OFString& str);
|
||
|
|
||
|
/** extracts an integer from the message payload.
|
||
|
* @param i integer is written into this parameter
|
||
|
* @return OFTrue if successful, OFFalse otherwise
|
||
|
*/
|
||
|
OFBool extractIntFromPayload(Uint32& i);
|
||
|
|
||
|
/** rewinds the read offset to the beginning of the message payload
|
||
|
*/
|
||
|
void rewindPayload();
|
||
|
|
||
|
/** removes all payload
|
||
|
*/
|
||
|
void erasePayload();
|
||
|
|
||
|
/** sends the current message over the given transport connection.
|
||
|
* @param connection transport connection to be used
|
||
|
* @return OFTrue if successful, OFFalse otherwise.
|
||
|
*/
|
||
|
OFBool send(DcmTransportConnection &connection);
|
||
|
|
||
|
/** receives a messages from the given transport connection
|
||
|
* and stores it in the current object, replacing any existing
|
||
|
* payload.
|
||
|
* @param connection transport connection to be used
|
||
|
* @return OFTrue if successful, OFFalse otherwise.
|
||
|
*/
|
||
|
OFBool receive(DcmTransportConnection &connection);
|
||
|
|
||
|
|
||
|
// constants for message type
|
||
|
static const Uint32 OK;
|
||
|
static const Uint32 requestApplicationID;
|
||
|
static const Uint32 assignApplicationID;
|
||
|
static const Uint32 applicationTerminates;
|
||
|
static const Uint32 receivedUnencryptedDICOMConnection;
|
||
|
static const Uint32 receivedEncryptedDICOMConnection;
|
||
|
static const Uint32 connectionClosed;
|
||
|
static const Uint32 connectionAborted;
|
||
|
static const Uint32 requestedUnencryptedDICOMConnection;
|
||
|
static const Uint32 requestedEncryptedDICOMConnection;
|
||
|
static const Uint32 receivedDICOMObject;
|
||
|
static const Uint32 sentDICOMObject;
|
||
|
|
||
|
// message status constants
|
||
|
static const Uint32 statusOK; // OK
|
||
|
static const Uint32 statusWarning; // warning
|
||
|
static const Uint32 statusError; // error
|
||
|
|
||
|
// client type constants
|
||
|
static const Uint32 clientOther; // client is of unspecified type
|
||
|
static const Uint32 clientStoreSCP; // client is Store SCP
|
||
|
static const Uint32 clientStoreSCU; // client is Store SCU
|
||
|
static const Uint32 clientPrintSCP; // client is Print SCP
|
||
|
static const Uint32 clientPrintSCU; // client is Print SCU
|
||
|
static const Uint32 clientQRSCP; // client is Query/Retrieve (Find/Move/Get) SCP
|
||
|
|
||
|
private:
|
||
|
|
||
|
/** resize payload if necessary such that at least i bytes can be written
|
||
|
* @param i number of bytes required in buffer
|
||
|
*/
|
||
|
void resizePayload(Uint32 i);
|
||
|
|
||
|
/// type of message
|
||
|
Uint32 messageType;
|
||
|
|
||
|
/// number of bytes actually used in payload
|
||
|
Uint32 payloadUsed;
|
||
|
|
||
|
/// number of bytes allocated in payload
|
||
|
Uint32 payloadAllocated;
|
||
|
|
||
|
/// read offset into payload in bytes
|
||
|
Uint32 payloadReadOffset;
|
||
|
|
||
|
/// pointer to raw payload data in big endian byte order
|
||
|
unsigned char *payload;
|
||
|
};
|
||
|
|
||
|
|
||
|
/** a client for IPC message exchange between different processes of the
|
||
|
* DICOMscope application
|
||
|
*/
|
||
|
class DCMTK_DCMPSTAT_EXPORT DVPSIPCClient
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
/** constructor
|
||
|
* @param clientType type of client application, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of client application
|
||
|
* @param thePort TCP/IP port on which the server is listening
|
||
|
* @param keepOpen flag indicating whether the connection should be kept
|
||
|
* open all the time or should be opened/closed for each transaction.
|
||
|
*/
|
||
|
DVPSIPCClient(Uint32 clientType, const char *txt, int thePort, OFBool keepOpen);
|
||
|
|
||
|
/// destructor
|
||
|
virtual ~DVPSIPCClient();
|
||
|
|
||
|
/** sends ApplicationTerminates notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
*/
|
||
|
void notifyApplicationTerminates(Uint32 status);
|
||
|
|
||
|
/** sends ReceivedUnencryptedDICOMConnection notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of notification for server
|
||
|
*/
|
||
|
void notifyReceivedUnencryptedDICOMConnection(Uint32 status, const char *txt);
|
||
|
|
||
|
/** sends ReceivedEncryptedDICOMConnection notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of notification for server
|
||
|
*/
|
||
|
void notifyReceivedEncryptedDICOMConnection(Uint32 status, const char *txt);
|
||
|
|
||
|
/** sends ConnectionClosed notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
*/
|
||
|
void notifyConnectionClosed(Uint32 status);
|
||
|
|
||
|
/** sends ConnectionAborted notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of notification for server
|
||
|
*/
|
||
|
void notifyConnectionAborted(Uint32 status, const char *txt);
|
||
|
|
||
|
/** sends RequestedUnencryptedDICOMConnection notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of notification for server
|
||
|
*/
|
||
|
void notifyRequestedUnencryptedDICOMConnection(Uint32 status, const char *txt);
|
||
|
|
||
|
/** sends RequestedEncryptedDICOMConnection notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of notification for server
|
||
|
*/
|
||
|
void notifyRequestedEncryptedDICOMConnection(Uint32 status, const char *txt);
|
||
|
|
||
|
/** sends ReceivedDICOMObject notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of DICOM object
|
||
|
*/
|
||
|
void notifyReceivedDICOMObject(Uint32 status, const char *txt);
|
||
|
|
||
|
/** sends SentDICOMObject notification to server.
|
||
|
* @param Uint32 message status, see constants defined in DVPSIPCMessage
|
||
|
* @param txt textual description of DICOM object
|
||
|
*/
|
||
|
void notifySentDICOMObject(Uint32 status, const char *txt);
|
||
|
|
||
|
/** checks whether the message server has been found active
|
||
|
* upon creation of this object.
|
||
|
* @return OFTrue if server is active, OFFalse otherwise.
|
||
|
*/
|
||
|
OFBool isServerActive() { return serverActive; }
|
||
|
|
||
|
private:
|
||
|
|
||
|
/// private undefined copy constructor
|
||
|
DVPSIPCClient(const DVPSIPCClient& copy);
|
||
|
|
||
|
/// private undefined copy assignment operator
|
||
|
DVPSIPCClient& operator=(const DVPSIPCClient&);
|
||
|
|
||
|
/** request connection to server, store in 'connection' if successful.
|
||
|
*/
|
||
|
void requestConnection();
|
||
|
|
||
|
/** perform message transaction with server. If serverActive is false,
|
||
|
* no connection attempt is performed.
|
||
|
* @param msg contains message to be sent, overwritten with message
|
||
|
* received from server if successful
|
||
|
* @return OFTrue if successful, OFFalse otherwise
|
||
|
*/
|
||
|
OFBool performTransaction(DVPSIPCMessage& msg);
|
||
|
|
||
|
/// TCP/IP port number on which the server is listening
|
||
|
int port;
|
||
|
|
||
|
/// true if the first connection attempt has succeeded, false otherwise
|
||
|
OFBool serverActive;
|
||
|
|
||
|
/// application ID assigned by the server
|
||
|
Uint32 applicationID;
|
||
|
|
||
|
/// flag indicating whether we want to keep the connection open
|
||
|
OFBool keepConnectionOpen;
|
||
|
|
||
|
/// current transport connection
|
||
|
DcmTransportConnection *connection;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|