return m_label.empty();
}
-ServiceConnection::ServiceConnection(char const * const service_interface) {
+ServiceConnection::ServiceConnection(const char *service_interface) {
if(service_interface)
m_serviceInterface = std::string(service_interface);
}
-int ServiceConnection::processRequest( const CKM::RawBuffer &send_buf,
- CKM::MessageBuffer &recv_buf) {
+int ServiceConnection::processRequest(
+ const CKM::RawBuffer &send_buf,
+ CKM::MessageBuffer &recv_buf)
+{
int ec;
if(CKM_API_SUCCESS != (ec = send(send_buf)))
return ec;
return receive(recv_buf);
}
-int ServiceConnection::Connect()
+int ServiceConnection::prepareConnection()
{
- // cleanup
- if (isConnected())
- disconnect();
+ if (m_socket.isConnected())
+ return CKM_API_SUCCESS;
- return SockRAII::connect(m_serviceInterface.c_str());
+ return m_socket.connect(m_serviceInterface.c_str());
}
int ServiceConnection::send(const CKM::RawBuffer &send_buf)
{
- if( ! isConnected() )
- {
- int ec;
- if(CKM_API_SUCCESS != (ec = ServiceConnection::Connect()))
- {
- LogError("send failed, connect fail code: " << ec);
- return ec;
- }
+ int retCode = prepareConnection();
+
+ if (retCode != CKM_API_SUCCESS) {
+ LogError("Failed to prepare connection: " << retCode);
+ return retCode;
}
- int ec = CKM_API_SUCCESS;
ssize_t done = 0;
- while((send_buf.size() - done) > 0)
- {
- if( 0 >= waitForSocket(POLLOUT, POLL_TIMEOUT)) {
+ while ((send_buf.size() - done) > 0) {
+ if (0 >= m_socket.waitForSocket(POLLOUT, POLL_TIMEOUT)) {
LogError("Error in WaitForSocket.");
- ec = CKM_API_ERROR_SOCKET;
+ retCode = CKM_API_ERROR_SOCKET;
break;
}
- ssize_t temp = TEMP_FAILURE_RETRY(write(m_sock, &send_buf[done], send_buf.size() - done));
- if(-1 == temp) {
+ ssize_t temp = TEMP_FAILURE_RETRY(write(m_socket.get(),
+ &send_buf[done],
+ send_buf.size() - done));
+ if (-1 == temp) {
LogError("Error in write: " << CKM::GetErrnoString(errno));
- ec = CKM_API_ERROR_SOCKET;
+ retCode = CKM_API_ERROR_SOCKET;
break;
}
done += temp;
}
- if(ec != CKM_API_SUCCESS)
- disconnect();
+ if (retCode != CKM_API_SUCCESS)
+ m_socket.disconnect();
- return ec;
+ return retCode;
}
int ServiceConnection::receive(CKM::MessageBuffer &recv_buf)
{
- if( ! isConnected() )
+ if (!m_socket.isConnected())
{
LogError("Not connected!");
return CKM_API_ERROR_SOCKET;
char buffer[c_recv_buf_len];
do
{
- if( 0 >= waitForSocket(POLLIN, POLL_TIMEOUT)) {
+ if( 0 >= m_socket.waitForSocket(POLLIN, POLL_TIMEOUT)) {
LogError("Error in WaitForSocket.");
ec = CKM_API_ERROR_SOCKET;
break;
}
- ssize_t temp = TEMP_FAILURE_RETRY(read(m_sock, buffer, sizeof(buffer)));
+ ssize_t temp = TEMP_FAILURE_RETRY(read(m_socket.get(),
+ buffer,
+ sizeof(buffer)));
if(-1 == temp) {
LogError("Error in read: " << CKM::GetErrnoString(errno));
ec = CKM_API_ERROR_SOCKET;
while(!recv_buf.Ready());
if(ec != CKM_API_SUCCESS)
- disconnect();
+ m_socket.disconnect();
return ec;
}
void disconnect();
bool isConnected() const;
int get() const;
+ int waitForSocket(int event, int timeout);
protected:
int connectWrapper(int socket, const char *interface);
- int waitForSocket(int event, int timeout);
int m_sock;
};
-class ServiceConnection : private SockRAII
-{
+class ServiceConnection {
public:
ServiceConnection(const char * service_interface);
int receive(CKM::MessageBuffer &recv_buf);
virtual ~ServiceConnection();
+ protected:
+ int prepareConnection();
- private:
+ SockRAII m_socket;
std::string m_serviceInterface;
-
- int Connect();
};
/*