PortLink now uses a fixed buffer. Its base class is.... BSession...

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4424 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adi Oanca 2003-08-31 17:21:49 +00:00
parent 3bbe920498
commit f90fc6a679
1 changed files with 44 additions and 74 deletions

View File

@ -1,88 +1,58 @@
#ifndef _PORTLINK_H_
#define _PORTLINK_H_
#ifndef _PORTLINK_H
#define _PORTLINK_H
#include <Errors.h>
#include <BeBuild.h>
#include <OS.h>
#include <SupportDefs.h>
#include <Rect.h>
#include <List.h>
#include "Session.h"
class PortMessage;
/*!
\class PortLinkData PortLink.cpp
\brief Internal data storage class
PortLinkData objects serve to hold attached data whilst it is waiting to be Flattened()
and then Flushed(). There is no need for this to be used outside the PortLink class.
*/
class PortLinkData
{
class PortLink : public BSession{
public:
PortLinkData(void);
~PortLinkData(void);
status_t Set(const void *data, size_t size);
char *buffer;
size_t buffersize;
};
class PortLink
{
public:
class ReplyData
{
public:
ReplyData(void) { code=0; buffersize=0; buffer=NULL; }
~ReplyData(void) { if(buffer) delete buffer; }
int32 code;
ssize_t buffersize;
int8 *buffer;
};
PortLink(port_id port);
PortLink(const PortLink &link);
~PortLink(void);
void SetOpCode(int32 code);
void SetPort(port_id port);
port_id GetPort(void);
status_t Flush(bigtime_t timeout=B_INFINITE_TIMEOUT);
int8* FlushWithReply(int32 *code, status_t *status, ssize_t *buffersize,
bigtime_t timeout=B_INFINITE_TIMEOUT);
status_t FlushWithReply(PortLink::ReplyData *data,bigtime_t timeout=B_INFINITE_TIMEOUT);
status_t FlushWithReply(PortMessage *msg,bigtime_t timeout=B_INFINITE_TIMEOUT);
status_t Attach(const void *data, size_t size);
template <class Type> status_t Attach(Type data)
class ReplyData
{
int32 size=sizeof(Type);
public:
ReplyData(void) { code=0; buffersize=0; buffer=NULL; }
~ReplyData(void) { if(buffer) delete buffer; }
int32 code;
ssize_t buffersize;
int8 *buffer;
};
PortLink( port_id port );
PortLink( const PortLink &link );
virtual ~PortLink() { }
#ifdef CAPACITY_CHECKING
if(bufferlength+size>capacity)
return B_NO_MEMORY;
#endif
void SetOpCode( int32 code );
void SetPort( port_id port );
port_id GetPort();
status_t Flush( bigtime_t timeout = B_INFINITE_TIMEOUT );
int8* FlushWithReply( int32 *code, status_t *status, ssize_t *buffersize,
bigtime_t timeout=B_INFINITE_TIMEOUT );
status_t FlushWithReply( PortLink::ReplyData *data,bigtime_t timeout=B_INFINITE_TIMEOUT );
status_t FlushWithReply( PortMessage *msg,bigtime_t timeout=B_INFINITE_TIMEOUT );
// create a new storage object and stash the data
PortLinkData *pld=new PortLinkData;
if(pld->Set(&data,size)==B_OK)
{
attachlist->AddItem(pld);
bufferlength+=size;
status_t Attach(const void *data, size_t size);
void MakeEmpty();
template <class Type> status_t Attach(Type data)
{
int32 size = sizeof(Type);
if (4096 - fSendPosition > size){
memcpy(fSendBuffer + fSendPosition, &data, size);
fSendPosition += size;
return B_OK;
}
else
{
delete pld;
return B_ERROR;
}
return B_OK;
return B_NO_MEMORY;
}
void MakeEmpty(void);
protected:
void FlattenData(int8 **buffer,int32 *size);
port_id target, replyport;
int32 opcode;
uint32 bufferlength,capacity;
bool port_ok;
BList *attachlist;
private:
bool port_ok;
};
//extern _IMPEXP_BE _PortLink_ *main_session;
#endif