blob: 5ec9a3fb0c935d7b701cd0b78c66b9060876dd7a [file] [log] [blame]
/* $Id$
*
* 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.
*/
#ifndef __ETCHTCPCONNECTION_H__
#define __ETCHTCPCONNECTION_H__
#include "capu/util/Runnable.h"
#include "common/EtchString.h"
#include "common/EtchSocket.h"
#include "support/EtchRuntime.h"
#include "transport/EtchConnection.h"
#include "transport/EtchTransportData.h"
#include "transport/EtchFlexBuffer.h"
#include "transport/EtchSessionData.h"
#include "transport/EtchTcpOption.h"
#include "util/EtchURL.h"
#include "util/EtchResources.h"
#include "util/EtchLogger.h"
/**
* Implementation of connection which handles a tcp connection.
*/
class EtchTcpConnection : public EtchConnection<EtchSessionData>, public EtchTransportData, public capu::Runnable {
public:
/**
* Constructs the Connection from a uri.
* @param socket
* @param uri
* @param resources
*/
EtchTcpConnection(EtchRuntime* runtime, EtchSocket* socket, EtchURL* uri);
/**
* Destructor
*/
~EtchTcpConnection();
/**
* @see TransportData
*/
status_t transportControl(capu::SmartPointer<EtchObject> control, capu::SmartPointer<EtchObject> value);
/**
* @see TransportData
*/
status_t transportData(capu::SmartPointer<EtchWho> recipient, capu::SmartPointer<EtchFlexBuffer> buf);
/**
* @see TransportData
*/
status_t transportNotify(capu::SmartPointer<EtchObject> event);
/**
* @see TransportData
*/
status_t transportQuery(capu::SmartPointer<EtchObject> query, capu::SmartPointer<EtchObject> *result);
/**
* @return Session
*/
EtchSessionData* getSession();
/**
* Sets session
*/
void setSession(EtchSessionData* session);
/**
* @see EtchConnection
*/
capu::bool_t isStarted();
/**
* @see EtchConnection
*/
capu::bool_t isTerminated();
/**
* @see capu::thread
*/
void run();
/**
* @see EtchConnection
*/
status_t close();
/**
* @see EtchConnection
*/
status_t setupSocket();
/**
* Sends some data to the remote end. If the connection is buffered, the
* data is saved until the buffer is full or the buffer is flushed. If the
* connection is not buffered, the data is sent to the operating system
* immediately. The operating system may or may not transmit the data
* immediately, depending upon the noDelay setting.
* @param buf the bytes to be sent.
* @param off the offset into buf of the first byte to send.
* @param len the number of bytes to send.
* @return ETCH_OK if the sent is successful
* ETCH_EINVAL if the buffer is NULL or socket is not opened
* ETCH_ERROR otherwise
*/
status_t send(capu::int8_t* buf, capu::uint32_t off, capu::uint32_t len);
/**
* Sets the number of connection attempts
* @param numAttempts
*/
void setNumAttempts(capu::uint8_t numAttempts);
private:
EtchRuntime *mRuntime;
EtchString mHost;
capu::uint16_t mPort;
EtchSocket* mSocket;
EtchTcpOption mOptions;
capu::uint8_t mNumAttempts;
protected:
status_t readSocket();
status_t openSocket(capu::bool_t reconnect);
};
#endif /* ETCHTCPCONNECTION_H */