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
{
public:
PortLinkData(void);
~PortLinkData(void);
status_t Set(const void *data, size_t size);
char *buffer;
size_t buffersize;
};
class PortLink
{
class PortLink : public BSession{
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);
PortLink( port_id port );
PortLink( const PortLink &link );
virtual ~PortLink() { }
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 );
status_t Attach(const void *data, size_t size);
void MakeEmpty();
template <class Type> status_t Attach(Type data)
{
int32 size=sizeof(Type);
int32 size = sizeof(Type);
#ifdef CAPACITY_CHECKING
if(bufferlength+size>capacity)
return B_NO_MEMORY;
#endif
// 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;
}
else
{
delete pld;
return B_ERROR;
}
if (4096 - fSendPosition > size){
memcpy(fSendBuffer + fSendPosition, &data, size);
fSendPosition += size;
return B_OK;
}
void MakeEmpty(void);
protected:
void FlattenData(int8 **buffer,int32 *size);
port_id target, replyport;
int32 opcode;
uint32 bufferlength,capacity;
return B_NO_MEMORY;
}
private:
bool port_ok;
BList *attachlist;
};
//extern _IMPEXP_BE _PortLink_ *main_session;
#endif