source: filezilla/trunk/fuentes/src/engine/backend.cpp @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 2 years ago

Update new version: 3.15.02

File size: 1.8 KB
Line 
1#include <filezilla.h>
2
3#include "backend.h"
4#include "socket.h"
5#include <errno.h>
6
7CBackend::CBackend(fz::event_handler* pEvtHandler) : m_pEvtHandler(pEvtHandler)
8{
9}
10
11CBackend::~CBackend()
12{
13        RemoveSocketEvents(m_pEvtHandler, this);
14}
15
16CSocketBackend::CSocketBackend(fz::event_handler* pEvtHandler, CSocket & socket, CRateLimiter& rateLimiter)
17        : CBackend(pEvtHandler)
18        , socket_(socket)
19        , m_rateLimiter(rateLimiter)
20{
21        socket_.SetEventHandler(pEvtHandler);
22        m_rateLimiter.AddObject(this);
23}
24
25CSocketBackend::~CSocketBackend()
26{
27        socket_.SetEventHandler(0);
28        m_rateLimiter.RemoveObject(this);
29}
30
31int CSocketBackend::Write(const void *buffer, unsigned int len, int& error)
32{
33        int64_t max = GetAvailableBytes(CRateLimiter::outbound);
34        if (max == 0) {
35                Wait(CRateLimiter::outbound);
36                error = EAGAIN;
37                return -1;
38        }
39        else if (max > 0 && max < len)
40                len = max;
41
42        int written = socket_.Write(buffer, len, error);
43
44        if (written > 0 && max != -1)
45                UpdateUsage(CRateLimiter::outbound, written);
46
47        return written;
48}
49
50int CSocketBackend::Read(void *buffer, unsigned int len, int& error)
51{
52        int64_t max = GetAvailableBytes(CRateLimiter::inbound);
53        if (max == 0) {
54                Wait(CRateLimiter::inbound);
55                error = EAGAIN;
56                return -1;
57        }
58        else if (max > 0 && max < len)
59                len = max;
60
61        int read = socket_.Read(buffer, len, error);
62
63        if (read > 0 && max != -1)
64                UpdateUsage(CRateLimiter::inbound, read);
65
66        return read;
67}
68
69int CSocketBackend::Peek(void *buffer, unsigned int len, int& error)
70{
71        return socket_.Peek(buffer, len, error);
72}
73
74void CSocketBackend::OnRateAvailable(CRateLimiter::rate_direction direction)
75{
76        if (direction == CRateLimiter::outbound)
77                m_pEvtHandler->send_event<CSocketEvent>(this, SocketEventType::write, 0);
78        else
79                m_pEvtHandler->send_event<CSocketEvent>(this, SocketEventType::read, 0);
80}
Note: See TracBrowser for help on using the repository browser.