mirror of
https://github.com/jezhiggins/arabica
synced 2025-01-30 08:38:15 +01:00
Took out code conversion - it is inappropriate here
This commit is contained in:
parent
d11e03155b
commit
48f0f2a705
1 changed files with 12 additions and 84 deletions
|
@ -11,6 +11,7 @@
|
||||||
// $Id$
|
// $Id$
|
||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <SAX/ArabicaConfig.h>
|
||||||
#ifndef ARABICA_WINDOWS
|
#ifndef ARABICA_WINDOWS
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@ -71,7 +72,7 @@ class basic_socketbuf : public std::basic_streambuf<charT, traitsT>
|
||||||
static const size_t bufferSize_;
|
static const size_t bufferSize_;
|
||||||
static const size_t pbSize_;
|
static const size_t pbSize_;
|
||||||
|
|
||||||
#ifndef _MSC_VER
|
#ifndef ARABICA_WINDOWS
|
||||||
static const int INVALID_SOCKET;
|
static const int INVALID_SOCKET;
|
||||||
static const int SOCKET_ERROR;
|
static const int SOCKET_ERROR;
|
||||||
#endif
|
#endif
|
||||||
|
@ -82,7 +83,7 @@ const size_t basic_socketbuf<charT, traitsT>::bufferSize_ = 1024;
|
||||||
template<class charT, class traitsT>
|
template<class charT, class traitsT>
|
||||||
const size_t basic_socketbuf<charT, traitsT>::pbSize_ = 4;
|
const size_t basic_socketbuf<charT, traitsT>::pbSize_ = 4;
|
||||||
// why 4? both Josuttis and Langer&Kreft use 4.
|
// why 4? both Josuttis and Langer&Kreft use 4.
|
||||||
#ifndef _MSC_VER
|
#ifndef ARABICA_WINDOWS
|
||||||
template<class charT, class traitsT>
|
template<class charT, class traitsT>
|
||||||
const int basic_socketbuf<charT, traitsT>::INVALID_SOCKET = -1;
|
const int basic_socketbuf<charT, traitsT>::INVALID_SOCKET = -1;
|
||||||
template<class charT, class traitsT>
|
template<class charT, class traitsT>
|
||||||
|
@ -241,51 +242,15 @@ template<class charT, class traitsT>
|
||||||
bool basic_socketbuf<charT, traitsT>::writeSocket()
|
bool basic_socketbuf<charT, traitsT>::writeSocket()
|
||||||
{
|
{
|
||||||
// write to the socket
|
// write to the socket
|
||||||
size_t length = pptr() - &(outBuffer_[0]);
|
charT* from_next = &(outBuffer_[0]);
|
||||||
|
size_t length = pptr() - from_next;
|
||||||
if(!length)
|
if(!length)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
bool ok(true);
|
bool ok = (send(sock_, from_next, length, 0) != SOCKET_ERROR);
|
||||||
const std::codecvt<charT, char, state_t>& cvt =
|
|
||||||
#if !(defined _MSC_VER) || !(_MSC_VER < 1300)
|
|
||||||
std::use_facet<std::codecvt<charT, char, typename traitsT::state_type> >(this->getloc());
|
|
||||||
#else
|
|
||||||
std::use_facet(this->getloc(), (std::codecvt<charT, char, traitsT::state_type>*)0, true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(cvt.always_noconv())
|
|
||||||
ok = (send(sock_, &(outBuffer_[0]), length, 0) != SOCKET_ERROR);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// we must do code conversion
|
|
||||||
std::vector<char> to(length);
|
|
||||||
char* to_begin = &(to[0]);
|
|
||||||
const charT* from_next = &(outBuffer_[0]);
|
|
||||||
std::codecvt_base::result r;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
char* to_next;
|
|
||||||
r = cvt.out(outState_, from_next, pptr(), from_next,
|
|
||||||
to_begin, to_begin + length, to_next);
|
|
||||||
|
|
||||||
if(r == std::codecvt_base::noconv)
|
|
||||||
{
|
|
||||||
ok = (send(sock_, from_next, length, 0) != SOCKET_ERROR);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ok = (send(sock_, to_begin, to_next - to_begin, 0) != SOCKET_ERROR);
|
|
||||||
}
|
|
||||||
while((r == std::codecvt_base::partial) && (ok));
|
|
||||||
|
|
||||||
ok = ok ? (r != std::codecvt_base::error) : false;
|
|
||||||
} // if(cvt.always_noconv())
|
|
||||||
|
|
||||||
if(ok)
|
if(ok)
|
||||||
{
|
|
||||||
charT* from_next = &(outBuffer_[0]);
|
|
||||||
setp(from_next, from_next + outBuffer_.capacity());
|
setp(from_next, from_next + outBuffer_.capacity());
|
||||||
} // if(ok)
|
|
||||||
|
|
||||||
return ok;
|
return ok;
|
||||||
} // writeSocket
|
} // writeSocket
|
||||||
|
@ -304,54 +269,17 @@ int basic_socketbuf<charT, traitsT>::readSocket()
|
||||||
if(!inBuffer_.capacity())
|
if(!inBuffer_.capacity())
|
||||||
growInBuffer();
|
growInBuffer();
|
||||||
|
|
||||||
#if !(defined _MSC_VER) || !(_MSC_VER < 1300)
|
#ifdef ARABICA_VS6_WORKAROUND
|
||||||
size_t pbCount = std::min<int>(gptr() - eback(), pbSize_);
|
size_t pbCount = std::min<int>(gptr() - eback(), pbSize_);
|
||||||
#else
|
#else
|
||||||
size_t pbCount = min(gptr() - eback(), pbSize_);
|
size_t pbCount = min(gptr() - eback(), pbSize_);
|
||||||
#endif
|
#endif
|
||||||
memcpy(&(inBuffer_[0]) + (pbSize_-pbCount)*sizeof(charT),
|
memcpy(&(inBuffer_[0]) + (pbSize_-pbCount)*sizeof(charT),
|
||||||
gptr() - pbCount*sizeof(charT),
|
gptr() - pbCount*sizeof(charT),
|
||||||
pbCount*sizeof(charT));
|
pbCount*sizeof(charT));
|
||||||
|
|
||||||
const std::codecvt<charT, char, state_t>& cvt =
|
int res = recv(sock_, &(inBuffer_[0]) + pbSize_, inBuffer_.capacity() - pbSize_, 0);
|
||||||
#if !(defined _MSC_VER) || !(_MSC_VER < 1300)
|
if(res == 0)
|
||||||
std::use_facet<std::codecvt<charT, char, typename traitsT::state_type> >(this->getloc());
|
|
||||||
#else
|
|
||||||
std::use_facet(this->getloc(), (std::codecvt<charT, char, traitsT::state_type>*)0, true);
|
|
||||||
#endif
|
|
||||||
std::vector<char> from(inBuffer_.capacity() - pbSize_);
|
|
||||||
int res = recv(sock_, &(from[0]), from.capacity(), 0);
|
|
||||||
if(res > 0)
|
|
||||||
{
|
|
||||||
std::codecvt_base::result r;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
const char* from_begin = &(from[0]);
|
|
||||||
const char* from_next;
|
|
||||||
charT* to_begin = &(inBuffer_[0]) + pbSize_;
|
|
||||||
charT* to_next;
|
|
||||||
charT* to_end = &(inBuffer_[0]) + inBuffer_.capacity();
|
|
||||||
|
|
||||||
r = cvt.in(inState_, from_begin, from_begin + res, from_next,
|
|
||||||
to_begin, to_end, to_next);
|
|
||||||
|
|
||||||
if(r == std::codecvt_base::noconv)
|
|
||||||
memcpy(to_begin, from_begin, res);
|
|
||||||
else
|
|
||||||
res = to_next - to_begin;
|
|
||||||
if(r == std::codecvt_base::partial)
|
|
||||||
growInBuffer();
|
|
||||||
}
|
|
||||||
while(r == std::codecvt_base::partial);
|
|
||||||
|
|
||||||
if(r == std::codecvt_base::error)
|
|
||||||
{
|
|
||||||
// couldn't convert - let's bail
|
|
||||||
close();
|
|
||||||
return 0;
|
|
||||||
} // if(r == std::codecvt_base::error)
|
|
||||||
}
|
|
||||||
else if(res == 0)
|
|
||||||
{
|
{
|
||||||
// server closed the socket
|
// server closed the socket
|
||||||
close();
|
close();
|
||||||
|
@ -359,7 +287,7 @@ int basic_socketbuf<charT, traitsT>::readSocket()
|
||||||
} // if(res == 0)
|
} // if(res == 0)
|
||||||
else if(res == SOCKET_ERROR)
|
else if(res == SOCKET_ERROR)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#ifdef ARABICA_WINDOWS
|
||||||
if(GetLastError() == WSAEMSGSIZE)
|
if(GetLastError() == WSAEMSGSIZE)
|
||||||
{
|
{
|
||||||
// buffer was too small, so make it bigger
|
// buffer was too small, so make it bigger
|
||||||
|
@ -382,7 +310,7 @@ int basic_socketbuf<charT, traitsT>::readSocket()
|
||||||
template <class charT, class traitsT>
|
template <class charT, class traitsT>
|
||||||
int basic_socketbuf<charT, traitsT>::closeSocket(int sock) const
|
int basic_socketbuf<charT, traitsT>::closeSocket(int sock) const
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#ifdef ARABICA_WINDOWS
|
||||||
return closesocket(sock);
|
return closesocket(sock);
|
||||||
#else
|
#else
|
||||||
return ::close(sock);
|
return ::close(sock);
|
||||||
|
|
Loading…
Add table
Reference in a new issue