Commit dd3e2302 authored by jan.koester's avatar jan.koester
Browse files

fixed write event

parent 4bbf3327
Loading
Loading
Loading
Loading
+31 −34
Original line number Diff line number Diff line
@@ -145,54 +145,52 @@ void netplus::con::sending(bool state) {
    _eventapi->sendReady(this,state);
}

bool netplus::con::issending() {
    return _sending;
}


netplus::con::condata *netplus::con::_resizeQueue(condata** firstdata, condata** lastdata,
                                                               size_t &qsize,size_t size){
    NetException exception;
    if(!*firstdata || size > qsize || qsize==0 || size==0){
    if (!*firstdata || size > qsize) {
        exception[NetException::Error] << "_resizeQueue wrong datasize or ConnectionData";
        throw exception;
    }

#ifdef DEBUG
    int delsize=0,presize=qsize;
    unsigned long delsize = 0, presize = qsize;
#endif

    qsize -= size;

HAVEDATA:
    if((*firstdata)) {
            int curlen = ((int)(*firstdata)->getDataLength() - size);
            if ( curlen <= 0 || curlen >= (*firstdata)->getDataLength()) {
                size -= (*firstdata)->getDataLength();
    if ((*firstdata)->getDataLength()<=size) {
#ifdef DEBUG
                delsize += (*firstdata)->getDataLength();
        delsize += (*firstdata)->getDataLength();;
#endif
        size -= (*firstdata)->getDataLength();
        condata* newdat = (*firstdata)->_nextConnectionData;
        (*firstdata)->_nextConnectionData = nullptr;
        if (*firstdata == *lastdata)
            (*lastdata) = nullptr;
        delete* firstdata;
                (*firstdata) = newdat;

            }else{
                std::string buf = (*firstdata)->_Data.substr(size,curlen);
                (*firstdata)->_Data = buf;
        *firstdata = newdat;
        if (*firstdata)
            goto HAVEDATA;
    }
    if (size != 0) {
#ifdef DEBUG
        delsize += size;
#endif
                size -= curlen;
            }

            if(size!=0)
                goto HAVEDATA;
        std::string buffer;
        buffer = (*firstdata)->_Data.substr(size, (*firstdata)->_Data.length() - size);
        (*firstdata)->_Data = buffer;
        *firstdata = (*firstdata);
    }

#ifdef DEBUG
    // std::cout << " delsize: "    << delsize << ": " << size
    //                              << " Calculated Blocksize: " << (presize-delsize)
    //                              << " Planned size: " << qsize
    //                              << std::endl;
    if((unsigned long)(presize-delsize)!=qsize){
    std ::cout << " delsize: " << delsize
        << " Calculated Blocksize: " << (presize - delsize)
        << " Planned size: " << qsize
        << std::endl;
    if ((presize - delsize) != qsize) {
        exception[NetException::Critical] << "_resizeQueue: Calculated wrong size";
        throw exception;
    }
@@ -201,7 +199,6 @@ HAVEDATA:
    return *firstdata;
}
                                                               
                                                               
int netplus::con::copyValue(con::condata* startblock, size_t startpos,
    con::condata* endblock, size_t endpos, std::string& buffer) {

+1 −0
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ namespace netplus {

            /*set sending state*/
            void    sending(bool state);
	    bool    issending();

            std::atomic<bool> closecon;
        protected:
+14 −10
Original line number Diff line number Diff line
@@ -108,7 +108,7 @@ namespace netplus {
        if(!pcon)
            return EventHandlerStatus::EVCON;

        if(pcon->getSendData())
        if(pcon->issending())
            return EventHandlerStatus::EVOUT;

        return EventHandlerStatus::EVIN;
@@ -193,25 +193,29 @@ namespace netplus {
    };

    void poll::WriteEventHandler(int pos) {
        NetException exception;
        con *wcon = (con*)_Events[pos].data.ptr;
        if(!wcon->getSendData()){
            NetException exp;
            exp[NetException::Note] << "WriteEvent: no data to send!";
            throw exp;
             wcon->sending(false);
             return;
        }
        size_t sended = _ServerSocket->sendData(wcon->csock,
            (void*)wcon->getSendData()->getData(),
            wcon->getSendData()->getDataLength(), 0);

        if(sended>0){
            wcon->resizeSendQueue(sended);
        if(sended!=0){
	    ResponseEvent(wcon);
            wcon->resizeSendQueue(sended);
        }else{
           NetException exp;
	   switch(errno){
                case EAGAIN:
                    exp[NetException::Note] << "WriteEvent: Resource temporarily unavailable";
                    throw exp;
                default:
                    exp[NetException::Error] << "WriteEvent: no data sended";
                    throw exp;
	    }
        }
    };