1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/protocol/protocol.h
3// Purpose:     Protocol base class
4// Author:      Guilhem Lavaux
5// Modified by:
6// Created:     10/07/1997
7// RCS-ID:      $Id: protocol.h 35650 2005-09-23 12:56:45Z MR $
8// Copyright:   (c) 1997, 1998 Guilhem Lavaux
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_PROTOCOL_PROTOCOL_H
13#define _WX_PROTOCOL_PROTOCOL_H
14
15#include "wx/defs.h"
16
17#if wxUSE_PROTOCOL
18
19#include "wx/object.h"
20#include "wx/string.h"
21#include "wx/stream.h"
22
23#if wxUSE_SOCKETS
24    #include "wx/socket.h"
25#endif
26
27// ----------------------------------------------------------------------------
28// constants
29// ----------------------------------------------------------------------------
30
31typedef enum
32{
33    wxPROTO_NOERR = 0,
34    wxPROTO_NETERR,
35    wxPROTO_PROTERR,
36    wxPROTO_CONNERR,
37    wxPROTO_INVVAL,
38    wxPROTO_NOHNDLR,
39    wxPROTO_NOFILE,
40    wxPROTO_ABRT,
41    wxPROTO_RCNCT,
42    wxPROTO_STREAMING
43} wxProtocolError;
44
45// ----------------------------------------------------------------------------
46// wxProtocol: abstract base class for all protocols
47// ----------------------------------------------------------------------------
48
49class WXDLLIMPEXP_NET wxProtocol
50#if wxUSE_SOCKETS
51 : public wxSocketClient
52#else
53 : public wxObject
54#endif
55{
56public:
57    wxProtocol();
58
59#if wxUSE_SOCKETS
60    bool Reconnect();
61    virtual bool Connect( const wxString& WXUNUSED(host) ) { return FALSE; }
62    virtual bool Connect( wxSockAddress& addr, bool WXUNUSED(wait) = TRUE) { return wxSocketClient::Connect(addr); }
63
64    // read a '\r\n' terminated line from the given socket and put it in
65    // result (without the terminators)
66    static wxProtocolError ReadLine(wxSocketBase *socket, wxString& result);
67
68    // read a line from this socket - this one can be overridden in the
69    // derived classes if different line termination convention is to be used
70    virtual wxProtocolError ReadLine(wxString& result);
71#endif // wxUSE_SOCKETS
72
73    virtual bool Abort() = 0;
74    virtual wxInputStream *GetInputStream(const wxString& path) = 0;
75    virtual wxProtocolError GetError() = 0;
76    virtual wxString GetContentType() { return wxEmptyString; }
77    virtual void SetUser(const wxString& WXUNUSED(user)) {}
78    virtual void SetPassword(const wxString& WXUNUSED(passwd) ) {}
79
80private:
81    DECLARE_DYNAMIC_CLASS_NO_COPY(wxProtocol)
82};
83
84#if wxUSE_SOCKETS
85wxProtocolError WXDLLIMPEXP_NET GetLine(wxSocketBase *sock, wxString& result);
86#endif
87
88// ----------------------------------------------------------------------------
89// macros for protocol classes
90// ----------------------------------------------------------------------------
91
92#define DECLARE_PROTOCOL(class) \
93public: \
94  static wxProtoInfo g_proto_##class;
95
96#define IMPLEMENT_PROTOCOL(class, name, serv, host) \
97wxProtoInfo class::g_proto_##class(name, serv, host, CLASSINFO(class)); \
98bool wxProtocolUse##class = TRUE;
99
100#define USE_PROTOCOL(class) \
101    extern bool wxProtocolUse##class ; \
102    static struct wxProtocolUserFor##class \
103    { \
104        wxProtocolUserFor##class() { wxProtocolUse##class = TRUE; } \
105    } wxProtocolDoUse##class;
106
107class WXDLLIMPEXP_NET wxProtoInfo : public wxObject
108{
109public:
110    wxProtoInfo(const wxChar *name,
111                const wxChar *serv_name,
112                const bool need_host1,
113                wxClassInfo *info);
114
115protected:
116    wxProtoInfo *next;
117    wxString m_protoname;
118    wxString prefix;
119    wxString m_servname;
120    wxClassInfo *m_cinfo;
121    bool m_needhost;
122
123    friend class wxURL;
124
125    DECLARE_DYNAMIC_CLASS(wxProtoInfo)
126    DECLARE_NO_COPY_CLASS(wxProtoInfo)
127};
128
129#endif // wxUSE_PROTOCOL
130
131#endif // _WX_PROTOCOL_PROTOCOL_H
132