Move SetDefaultTimeout to wxProtocol and set it to 60 seconds for both wxHTTP and wxFTP
Move SetPassword and SetUser implementations to wxProtocol to avoid code redundancy Make const-correct various getters Reorganize wxFTP docs Move wxStringToStringHashMap to hashmap.h and document its existance git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58137 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -745,5 +745,8 @@ public: \
|
|||||||
WX_DECLARE_HASH_MAP_WITH_DECL( long, long, wxIntegerHash, wxIntegerEqual,
|
WX_DECLARE_HASH_MAP_WITH_DECL( long, long, wxIntegerHash, wxIntegerEqual,
|
||||||
wxLongToLongHashMap, class WXDLLIMPEXP_BASE );
|
wxLongToLongHashMap, class WXDLLIMPEXP_BASE );
|
||||||
|
|
||||||
|
WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxString, wxStringToStringHashMap,
|
||||||
|
class WXDLLIMPEXP_BASE );
|
||||||
|
|
||||||
|
|
||||||
#endif // _WX_HASHMAP_H_
|
#endif // _WX_HASHMAP_H_
|
||||||
|
@@ -18,18 +18,20 @@
|
|||||||
|
|
||||||
#include "wx/protocol/protocol.h"
|
#include "wx/protocol/protocol.h"
|
||||||
|
|
||||||
class WXDLLIMPEXP_NET wxFileProto: public wxProtocol {
|
class WXDLLIMPEXP_NET wxFileProto: public wxProtocol
|
||||||
DECLARE_DYNAMIC_CLASS_NO_COPY(wxFileProto)
|
{
|
||||||
DECLARE_PROTOCOL(wxFileProto)
|
|
||||||
protected:
|
|
||||||
wxProtocolError m_error;
|
|
||||||
public:
|
public:
|
||||||
wxFileProto();
|
wxFileProto();
|
||||||
virtual ~wxFileProto();
|
virtual ~wxFileProto();
|
||||||
|
|
||||||
wxProtocolError GetError() { return m_error; }
|
bool Abort() { return true; }
|
||||||
bool Abort() { return TRUE; }
|
wxString GetContentType() const { return wxEmptyString; }
|
||||||
|
|
||||||
wxInputStream *GetInputStream(const wxString& path);
|
wxInputStream *GetInputStream(const wxString& path);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
DECLARE_DYNAMIC_CLASS_NO_COPY(wxFileProto)
|
||||||
|
DECLARE_PROTOCOL(wxFileProto)
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // wxUSE_PROTOCOL_FILE
|
#endif // wxUSE_PROTOCOL_FILE
|
||||||
|
@@ -35,31 +35,27 @@ public:
|
|||||||
virtual ~wxFTP();
|
virtual ~wxFTP();
|
||||||
|
|
||||||
// Connecting and disconnecting
|
// Connecting and disconnecting
|
||||||
void SetUser(const wxString& user) { m_user = user; }
|
|
||||||
void SetPassword(const wxString& passwd) { m_passwd = passwd; }
|
|
||||||
|
|
||||||
bool Connect(const wxSockAddress& addr, bool wait = true);
|
bool Connect(const wxSockAddress& addr, bool wait = true);
|
||||||
bool Connect(const wxString& host);
|
bool Connect(const wxString& host);
|
||||||
|
|
||||||
// disconnect
|
// disconnect
|
||||||
virtual bool Close(); // does NOT set m_lastError
|
virtual bool Close();
|
||||||
|
|
||||||
// Parameters set up
|
// Parameters set up
|
||||||
|
|
||||||
// set transfer mode now
|
// set transfer mode now
|
||||||
void SetPassive(bool pasv) { m_bPassive = pasv; }
|
void SetPassive(bool pasv) { m_bPassive = pasv; }
|
||||||
void SetDefaultTimeout(wxUint32 Value);
|
|
||||||
bool SetBinary() { return SetTransferMode(BINARY); }
|
bool SetBinary() { return SetTransferMode(BINARY); }
|
||||||
bool SetAscii() { return SetTransferMode(ASCII); }
|
bool SetAscii() { return SetTransferMode(ASCII); }
|
||||||
bool SetTransferMode(TransferMode mode);
|
bool SetTransferMode(TransferMode mode);
|
||||||
|
|
||||||
// Generic FTP interface
|
// Generic FTP interface
|
||||||
|
|
||||||
// the error code
|
// FTP doesn't know the MIME type of the last downloaded/uploaded file
|
||||||
virtual wxProtocolError GetError() { return m_lastError; }
|
virtual wxString GetContentType() const { return wxEmptyString; }
|
||||||
|
|
||||||
// the last FTP server reply
|
// the last FTP server reply
|
||||||
const wxString& GetLastResult() { return m_lastResult; }
|
const wxString& GetLastResult() const { return m_lastResult; }
|
||||||
|
|
||||||
// send any FTP command (should be full FTP command line but without
|
// send any FTP command (should be full FTP command line but without
|
||||||
// trailing "\r\n") and return its return code
|
// trailing "\r\n") and return its return code
|
||||||
@@ -68,6 +64,7 @@ public:
|
|||||||
// check that the command returned the given code
|
// check that the command returned the given code
|
||||||
bool CheckCommand(const wxString& command, char expectedReturn)
|
bool CheckCommand(const wxString& command, char expectedReturn)
|
||||||
{
|
{
|
||||||
|
// SendCommand() does updates m_lastError
|
||||||
return SendCommand(command) == expectedReturn;
|
return SendCommand(command) == expectedReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,11 +116,6 @@ public:
|
|||||||
bool details = false);
|
bool details = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// just change access from public to protected for this wxSocketBase function:
|
|
||||||
// use SetDefaultTimeout instead which also sets our m_uiDefaultTimeout var
|
|
||||||
virtual void SetTimeout(long seconds)
|
|
||||||
{ wxSocketBase::SetTimeout(seconds); }
|
|
||||||
|
|
||||||
// this executes a simple ftp command with the given argument and returns
|
// this executes a simple ftp command with the given argument and returns
|
||||||
// true if it its return code starts with '2'
|
// true if it its return code starts with '2'
|
||||||
bool DoSimpleCommand(const wxChar *command,
|
bool DoSimpleCommand(const wxChar *command,
|
||||||
@@ -150,11 +142,9 @@ protected:
|
|||||||
wxSocketBase *AcceptIfActive(wxSocketBase *sock);
|
wxSocketBase *AcceptIfActive(wxSocketBase *sock);
|
||||||
|
|
||||||
|
|
||||||
wxString m_user,
|
// internal variables:
|
||||||
m_passwd;
|
|
||||||
|
|
||||||
wxString m_lastResult;
|
wxString m_lastResult;
|
||||||
wxProtocolError m_lastError;
|
|
||||||
|
|
||||||
// true if there is an FTP transfer going on
|
// true if there is an FTP transfer going on
|
||||||
bool m_streaming;
|
bool m_streaming;
|
||||||
@@ -163,17 +153,16 @@ protected:
|
|||||||
// we will use BINARY transfer mode by default for backwards compatibility
|
// we will use BINARY transfer mode by default for backwards compatibility
|
||||||
TransferMode m_currentTransfermode;
|
TransferMode m_currentTransfermode;
|
||||||
|
|
||||||
friend class wxInputFTPStream;
|
|
||||||
friend class wxOutputFTPStream;
|
|
||||||
|
|
||||||
bool m_bPassive;
|
bool m_bPassive;
|
||||||
wxUint32 m_uiDefaultTimeout;
|
|
||||||
|
|
||||||
// following is true when a read or write times out, we then assume
|
// following is true when a read or write times out, we then assume
|
||||||
// the connection is dead and abort. we avoid additional delays this way
|
// the connection is dead and abort. we avoid additional delays this way
|
||||||
bool m_bEncounteredError;
|
bool m_bEncounteredError;
|
||||||
|
|
||||||
|
|
||||||
|
friend class wxInputFTPStream;
|
||||||
|
friend class wxOutputFTPStream;
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS_NO_COPY(wxFTP)
|
DECLARE_DYNAMIC_CLASS_NO_COPY(wxFTP)
|
||||||
DECLARE_PROTOCOL(wxFTP)
|
DECLARE_PROTOCOL(wxFTP)
|
||||||
};
|
};
|
||||||
|
@@ -18,9 +18,6 @@
|
|||||||
#include "wx/hashmap.h"
|
#include "wx/hashmap.h"
|
||||||
#include "wx/protocol/protocol.h"
|
#include "wx/protocol/protocol.h"
|
||||||
|
|
||||||
WX_DECLARE_STRING_HASH_MAP_WITH_DECL( wxString, wxStringToStringHashMap,
|
|
||||||
class WXDLLIMPEXP_NET );
|
|
||||||
|
|
||||||
class WXDLLIMPEXP_NET wxHTTP : public wxProtocol
|
class WXDLLIMPEXP_NET wxHTTP : public wxProtocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -31,21 +28,17 @@ public:
|
|||||||
virtual bool Connect(const wxString& host) { return Connect(host, 0); }
|
virtual bool Connect(const wxString& host) { return Connect(host, 0); }
|
||||||
virtual bool Connect(const wxSockAddress& addr, bool wait);
|
virtual bool Connect(const wxSockAddress& addr, bool wait);
|
||||||
bool Abort();
|
bool Abort();
|
||||||
|
|
||||||
wxInputStream *GetInputStream(const wxString& path);
|
wxInputStream *GetInputStream(const wxString& path);
|
||||||
inline wxProtocolError GetError() { return m_perr; }
|
|
||||||
wxString GetContentType();
|
wxString GetContentType() const;
|
||||||
|
wxString GetHeader(const wxString& header) const;
|
||||||
|
int GetResponse() const { return m_http_response; }
|
||||||
|
|
||||||
void SetHeader(const wxString& header, const wxString& h_data);
|
void SetHeader(const wxString& header, const wxString& h_data);
|
||||||
wxString GetHeader(const wxString& header) const;
|
|
||||||
void SetPostBuffer(const wxString& post_buf);
|
void SetPostBuffer(const wxString& post_buf);
|
||||||
|
|
||||||
void SetProxyMode(bool on);
|
void SetProxyMode(bool on);
|
||||||
|
|
||||||
int GetResponse() { return m_http_response; }
|
|
||||||
|
|
||||||
virtual void SetUser(const wxString& user) { m_username = user; }
|
|
||||||
virtual void SetPassword(const wxString& passwd ) { m_password = passwd; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum wxHTTP_Req
|
enum wxHTTP_Req
|
||||||
{
|
{
|
||||||
@@ -70,15 +63,15 @@ protected:
|
|||||||
// deletes the header value strings
|
// deletes the header value strings
|
||||||
void ClearHeaders();
|
void ClearHeaders();
|
||||||
|
|
||||||
wxProtocolError m_perr;
|
|
||||||
|
// internal variables:
|
||||||
|
|
||||||
wxStringToStringHashMap m_headers;
|
wxStringToStringHashMap m_headers;
|
||||||
bool m_read,
|
bool m_read,
|
||||||
m_proxy_mode;
|
m_proxy_mode;
|
||||||
wxSockAddress *m_addr;
|
wxSockAddress *m_addr;
|
||||||
wxString m_post_buf;
|
wxString m_post_buf;
|
||||||
int m_http_response;
|
int m_http_response;
|
||||||
wxString m_username;
|
|
||||||
wxString m_password;
|
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxHTTP)
|
DECLARE_DYNAMIC_CLASS(wxHTTP)
|
||||||
DECLARE_PROTOCOL(wxHTTP)
|
DECLARE_PROTOCOL(wxHTTP)
|
||||||
|
@@ -58,8 +58,8 @@ public:
|
|||||||
|
|
||||||
#if wxUSE_SOCKETS
|
#if wxUSE_SOCKETS
|
||||||
bool Reconnect();
|
bool Reconnect();
|
||||||
virtual bool Connect( const wxString& WXUNUSED(host) ) { return FALSE; }
|
virtual bool Connect( const wxString& WXUNUSED(host) ) { return false; }
|
||||||
virtual bool Connect( const wxSockAddress& addr, bool WXUNUSED(wait) = TRUE)
|
virtual bool Connect( const wxSockAddress& addr, bool WXUNUSED(wait) = true)
|
||||||
{ return wxSocketClient::Connect(addr); }
|
{ return wxSocketClient::Connect(addr); }
|
||||||
|
|
||||||
// read a '\r\n' terminated line from the given socket and put it in
|
// read a '\r\n' terminated line from the given socket and put it in
|
||||||
@@ -73,10 +73,31 @@ public:
|
|||||||
|
|
||||||
virtual bool Abort() = 0;
|
virtual bool Abort() = 0;
|
||||||
virtual wxInputStream *GetInputStream(const wxString& path) = 0;
|
virtual wxInputStream *GetInputStream(const wxString& path) = 0;
|
||||||
virtual wxProtocolError GetError() = 0;
|
virtual wxString GetContentType() const = 0;
|
||||||
virtual wxString GetContentType() { return wxEmptyString; }
|
|
||||||
virtual void SetUser(const wxString& WXUNUSED(user)) {}
|
// the error code
|
||||||
virtual void SetPassword(const wxString& WXUNUSED(passwd) ) {}
|
virtual wxProtocolError GetError() const { return m_lastError; }
|
||||||
|
|
||||||
|
void SetUser(const wxString& user) { m_username = user; }
|
||||||
|
void SetPassword(const wxString& passwd) { m_password = passwd; }
|
||||||
|
|
||||||
|
virtual void SetDefaultTimeout(wxUint32 Value);
|
||||||
|
|
||||||
|
// override wxSocketBase::SetTimeout function to avoid that the internal
|
||||||
|
// m_uiDefaultTimeout goes out-of-sync:
|
||||||
|
virtual void SetTimeout(long seconds)
|
||||||
|
{ SetDefaultTimeout(seconds); }
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// the timeout associated with the protocol:
|
||||||
|
wxUint32 m_uiDefaultTimeout;
|
||||||
|
|
||||||
|
wxString m_username;
|
||||||
|
wxString m_password;
|
||||||
|
|
||||||
|
// this must be always updated by the derived classes!
|
||||||
|
wxProtocolError m_lastError;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DECLARE_DYNAMIC_CLASS_NO_COPY(wxProtocol)
|
DECLARE_DYNAMIC_CLASS_NO_COPY(wxProtocol)
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
This is a simple, type-safe, and reasonably efficient hash map class,
|
This is a simple, type-safe, and reasonably efficient hash map class,
|
||||||
whose interface is a subset of the interface of STL containers.
|
whose interface is a subset of the interface of STL containers.
|
||||||
In particular, the interface is modeled after std::map, and the various,
|
In particular, the interface is modeled after std::map, and the various,
|
||||||
non-standard, std::hash_map.
|
non-standard, std::hash_map (http://www.cppreference.com/wiki/stl/map/start).
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
@code
|
@code
|
||||||
@@ -73,11 +73,11 @@
|
|||||||
@endcode
|
@endcode
|
||||||
The HASH_T and KEY_EQ_T are the types used for the hashing function and
|
The HASH_T and KEY_EQ_T are the types used for the hashing function and
|
||||||
key comparison. wxWidgets provides three predefined hashing functions:
|
key comparison. wxWidgets provides three predefined hashing functions:
|
||||||
wxIntegerHash for integer types ( int, long, short, and their unsigned counterparts ),
|
@c wxIntegerHash for integer types ( int, long, short, and their unsigned counterparts ),
|
||||||
wxStringHash for strings ( wxString, wxChar*, char* ), and wxPointerHash for
|
@c wxStringHash for strings ( wxString, wxChar*, char* ), and @c wxPointerHash for
|
||||||
any kind of pointer.
|
any kind of pointer.
|
||||||
Similarly three equality predicates: wxIntegerEqual, wxStringEqual,
|
Similarly three equality predicates: @c wxIntegerEqual, @c wxStringEqual,
|
||||||
wxPointerEqual are provided.
|
@c wxPointerEqual are provided.
|
||||||
Using this you could declare a hash map mapping int values to wxString like this:
|
Using this you could declare a hash map mapping int values to wxString like this:
|
||||||
|
|
||||||
@code
|
@code
|
||||||
@@ -151,6 +151,13 @@
|
|||||||
it + 3, it1 - it2.
|
it + 3, it1 - it2.
|
||||||
|
|
||||||
|
|
||||||
|
@section hashmap_predef Predefined hashmap types
|
||||||
|
|
||||||
|
wxWidgets defines the following hashmap types:
|
||||||
|
- wxLongToLongHashMap (uses long both for keys and values)
|
||||||
|
- wxStringToStringHashMap (uses wxString both for keys and values)
|
||||||
|
|
||||||
|
|
||||||
@library{wxbase}
|
@library{wxbase}
|
||||||
@category{containers}
|
@category{containers}
|
||||||
*/
|
*/
|
||||||
|
@@ -20,8 +20,10 @@ enum TransferMode
|
|||||||
@class wxFTP
|
@class wxFTP
|
||||||
|
|
||||||
wxFTP can be used to establish a connection to an FTP server and perform all the
|
wxFTP can be used to establish a connection to an FTP server and perform all the
|
||||||
usual operations. Please consult the RFC 959 for more details about the FTP
|
usual operations. Please consult the RFC 959 (http://www.w3.org/Protocols/rfc959/)
|
||||||
protocol.
|
for more details about the FTP protocol.
|
||||||
|
|
||||||
|
wxFTP can thus be used to create a (basic) FTP @b client.
|
||||||
|
|
||||||
To use a command which doesn't involve file transfer (i.e. directory oriented
|
To use a command which doesn't involve file transfer (i.e. directory oriented
|
||||||
commands) you just need to call a corresponding member function or use the
|
commands) you just need to call a corresponding member function or use the
|
||||||
@@ -38,14 +40,14 @@ enum TransferMode
|
|||||||
ftp.SetUser("user");
|
ftp.SetUser("user");
|
||||||
ftp.SetPassword("password");
|
ftp.SetPassword("password");
|
||||||
|
|
||||||
if ( !ftp.Connect("ftp.wxwindows.org") )
|
if ( !ftp.Connect("ftp.wxwidgets.org") )
|
||||||
{
|
{
|
||||||
wxLogError("Couldn't connect");
|
wxLogError("Couldn't connect");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ftp.ChDir("/pub");
|
ftp.ChDir("/pub/2.8.9);
|
||||||
wxInputStream *in = ftp.GetInputStream("wxWidgets-4.2.0.tar.gz");
|
wxInputStream *i = ftp.GetInputStream("wxWidgets-2.8.9.tar.bz2");
|
||||||
if ( !in )
|
if ( !in )
|
||||||
{
|
{
|
||||||
wxLogError("Coudln't get file");
|
wxLogError("Coudln't get file");
|
||||||
@@ -67,6 +69,9 @@ enum TransferMode
|
|||||||
delete [] data;
|
delete [] data;
|
||||||
delete in;
|
delete in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// gracefully close the connection to the server
|
||||||
|
ftp.Close();
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
To upload a file you would do (assuming the connection to the server was opened
|
To upload a file you would do (assuming the connection to the server was opened
|
||||||
@@ -99,6 +104,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual ~wxFTP();
|
virtual ~wxFTP();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@name Functions for managing the FTP connection
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Aborts the download currently in process, returns @true if ok, @false
|
Aborts the download currently in process, returns @true if ok, @false
|
||||||
if an error occurred.
|
if an error occurred.
|
||||||
@@ -106,10 +118,9 @@ public:
|
|||||||
virtual bool Abort();
|
virtual bool Abort();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Change the current FTP working directory.
|
Gracefully closes the connection with the server.
|
||||||
Returns @true if successful.
|
|
||||||
*/
|
*/
|
||||||
bool ChDir(const wxString& dir);
|
virtual bool Close();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Send the specified @a command to the FTP server. @a ret specifies
|
Send the specified @a command to the FTP server. @a ret specifies
|
||||||
@@ -119,6 +130,96 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool CheckCommand(const wxString& command, char ret);
|
bool CheckCommand(const wxString& command, char ret);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the last command result, i.e. the full server reply for the last command.
|
||||||
|
*/
|
||||||
|
const wxString& GetLastResult();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Send the specified @a command to the FTP server and return the first
|
||||||
|
character of the return code.
|
||||||
|
*/
|
||||||
|
char SendCommand(const wxString& command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets the transfer mode to ASCII. It will be used for the next transfer.
|
||||||
|
*/
|
||||||
|
bool SetAscii();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets the transfer mode to binary. It will be used for the next transfer.
|
||||||
|
*/
|
||||||
|
bool SetBinary();
|
||||||
|
|
||||||
|
/**
|
||||||
|
If @a pasv is @true, passive connection to the FTP server is used.
|
||||||
|
|
||||||
|
This is the default as it works with practically all firewalls.
|
||||||
|
If the server doesn't support passive mode, you may call this function
|
||||||
|
with @false as argument to use an active connection.
|
||||||
|
*/
|
||||||
|
void SetPassive(bool pasv);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets the password to be sent to the FTP server to be allowed to log in.
|
||||||
|
*/
|
||||||
|
virtual void SetPassword(const wxString& passwd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets the transfer mode to the specified one. It will be used for the next
|
||||||
|
transfer.
|
||||||
|
|
||||||
|
If this function is never called, binary transfer mode is used by default.
|
||||||
|
*/
|
||||||
|
bool SetTransferMode(TransferMode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets the user name to be sent to the FTP server to be allowed to log in.
|
||||||
|
*/
|
||||||
|
virtual void SetUser(const wxString& user);
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@name Filesystem commands
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/**
|
||||||
|
Change the current FTP working directory.
|
||||||
|
Returns @true if successful.
|
||||||
|
*/
|
||||||
|
bool ChDir(const wxString& dir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Create the specified directory in the current FTP working directory.
|
||||||
|
Returns @true if successful.
|
||||||
|
*/
|
||||||
|
bool MkDir(const wxString& dir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the current FTP working directory.
|
||||||
|
*/
|
||||||
|
wxString Pwd();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Rename the specified @a src element to @e dst. Returns @true if successful.
|
||||||
|
*/
|
||||||
|
bool Rename(const wxString& src, const wxString& dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Remove the specified directory from the current FTP working directory.
|
||||||
|
Returns @true if successful.
|
||||||
|
*/
|
||||||
|
bool RmDir(const wxString& dir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Delete the file specified by @e path. Returns @true if successful.
|
||||||
|
*/
|
||||||
|
bool RmFile(const wxString& path);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns @true if the given remote file exists, @false otherwise.
|
Returns @true if the given remote file exists, @false otherwise.
|
||||||
*/
|
*/
|
||||||
@@ -179,6 +280,14 @@ public:
|
|||||||
bool GetFilesList(wxArrayString& files,
|
bool GetFilesList(wxArrayString& files,
|
||||||
const wxString& wildcard = wxEmptyString);
|
const wxString& wildcard = wxEmptyString);
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@name Download and upload functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
//@{
|
||||||
/**
|
/**
|
||||||
Creates a new input stream on the specified path.
|
Creates a new input stream on the specified path.
|
||||||
|
|
||||||
@@ -195,90 +304,17 @@ public:
|
|||||||
virtual wxInputStream* GetInputStream(const wxString& path);
|
virtual wxInputStream* GetInputStream(const wxString& path);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the last command result, i.e. the full server reply for the last command.
|
Initializes an output stream to the specified @a file.
|
||||||
*/
|
|
||||||
const wxString& GetLastResult();
|
|
||||||
|
|
||||||
/**
|
|
||||||
Initializes an output stream to the specified @e file.
|
|
||||||
|
|
||||||
The returned stream has all but the seek functionality of wxStreams.
|
The returned stream has all but the seek functionality of wxStreams.
|
||||||
When the user finishes writing data, he has to delete the stream to close it.
|
When the user finishes writing data, he has to delete the stream to close it.
|
||||||
|
|
||||||
@return An initialized write-only stream.
|
@return An initialized write-only stream.
|
||||||
|
Returns @NULL if an error occurred (it could be a network failure
|
||||||
@see wxOutputStream
|
or the fact that the file doesn't exist).
|
||||||
*/
|
*/
|
||||||
virtual wxOutputStream* GetOutputStream(const wxString& file);
|
virtual wxOutputStream* GetOutputStream(const wxString& file);
|
||||||
|
|
||||||
/**
|
//@}
|
||||||
Create the specified directory in the current FTP working directory.
|
|
||||||
Returns @true if successful.
|
|
||||||
*/
|
|
||||||
bool MkDir(const wxString& dir);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Returns the current FTP working directory.
|
|
||||||
*/
|
|
||||||
wxString Pwd();
|
|
||||||
|
|
||||||
/**
|
|
||||||
Rename the specified @a src element to @e dst. Returns @true if successful.
|
|
||||||
*/
|
|
||||||
bool Rename(const wxString& src, const wxString& dst);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Remove the specified directory from the current FTP working directory.
|
|
||||||
Returns @true if successful.
|
|
||||||
*/
|
|
||||||
bool RmDir(const wxString& dir);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Delete the file specified by @e path. Returns @true if successful.
|
|
||||||
*/
|
|
||||||
bool RmFile(const wxString& path);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Send the specified @a command to the FTP server and return the first
|
|
||||||
character of the return code.
|
|
||||||
*/
|
|
||||||
char SendCommand(const wxString& command);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Sets the transfer mode to ASCII. It will be used for the next transfer.
|
|
||||||
*/
|
|
||||||
bool SetAscii();
|
|
||||||
|
|
||||||
/**
|
|
||||||
Sets the transfer mode to binary (IMAGE). It will be used for the next transfer.
|
|
||||||
*/
|
|
||||||
bool SetBinary();
|
|
||||||
|
|
||||||
/**
|
|
||||||
If @a pasv is @true, passive connection to the FTP server is used.
|
|
||||||
|
|
||||||
This is the default as it works with practically all firewalls.
|
|
||||||
If the server doesn't support passive move, you may call this function with
|
|
||||||
@false argument to use active connection.
|
|
||||||
*/
|
|
||||||
void SetPassive(bool pasv);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Sets the password to be sent to the FTP server to be allowed to log in.
|
|
||||||
*/
|
|
||||||
virtual void SetPassword(const wxString& passwd);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Sets the transfer mode to the specified one. It will be used for the next
|
|
||||||
transfer.
|
|
||||||
|
|
||||||
If this function is never called, binary transfer mode is used by default.
|
|
||||||
*/
|
|
||||||
bool SetTransferMode(TransferMode mode);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Sets the user name to be sent to the FTP server to be allowed to log in.
|
|
||||||
*/
|
|
||||||
virtual void SetUser(const wxString& user);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
wxHTTP can be used to establish a connection to an HTTP server.
|
wxHTTP can be used to establish a connection to an HTTP server.
|
||||||
|
|
||||||
|
wxHTTP can thus be used to create a (basic) HTTP @b client.
|
||||||
|
|
||||||
@library{wxnet}
|
@library{wxnet}
|
||||||
@category{net}
|
@category{net}
|
||||||
|
|
||||||
@@ -19,6 +21,16 @@
|
|||||||
class wxHTTP : public wxProtocol
|
class wxHTTP : public wxProtocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
Default constructor.
|
||||||
|
*/
|
||||||
|
wxHTTP();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Destructor will close the connection if connected.
|
||||||
|
*/
|
||||||
|
virtual ~wxHTTP();
|
||||||
|
|
||||||
//@{
|
//@{
|
||||||
/**
|
/**
|
||||||
Connect to the HTTP server.
|
Connect to the HTTP server.
|
||||||
@@ -32,7 +44,7 @@ public:
|
|||||||
//@}
|
//@}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the data attached with a field whose name is specified by @e header.
|
Returns the data attached with a field whose name is specified by @a header.
|
||||||
If the field doesn't exist, it will return an empty string and not a @NULL string.
|
If the field doesn't exist, it will return an empty string and not a @NULL string.
|
||||||
|
|
||||||
@note
|
@note
|
||||||
@@ -71,12 +83,12 @@ public:
|
|||||||
|
|
||||||
Please refer to RFC 2616 for the list of responses.
|
Please refer to RFC 2616 for the list of responses.
|
||||||
*/
|
*/
|
||||||
int GetResponse();
|
int GetResponse() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
It sets data of a field to be sent during the next request to the HTTP server.
|
It sets data of a field to be sent during the next request to the HTTP server.
|
||||||
|
|
||||||
The field name is specified by @a header and the content by @e h_data.
|
The field name is specified by @a header and the content by @a h_data.
|
||||||
This is a low level function and it assumes that you know what you are doing.
|
This is a low level function and it assumes that you know what you are doing.
|
||||||
*/
|
*/
|
||||||
void SetHeader(const wxString& header, const wxString& h_data);
|
void SetHeader(const wxString& header, const wxString& h_data);
|
||||||
|
@@ -28,6 +28,10 @@ enum wxProtocolError
|
|||||||
|
|
||||||
Represents a protocol for use with wxURL.
|
Represents a protocol for use with wxURL.
|
||||||
|
|
||||||
|
Note that you may want to change the default time-out for HTTP/FTP connections
|
||||||
|
and network operations (using SetDefaultTimeout()) since the default time-out
|
||||||
|
value is quite long (60 seconds).
|
||||||
|
|
||||||
@library{wxnet}
|
@library{wxnet}
|
||||||
@category{net}
|
@category{net}
|
||||||
|
|
||||||
@@ -49,15 +53,16 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the type of the content of the last opened stream. It is a mime-type.
|
Returns the type of the content of the last opened stream. It is a mime-type.
|
||||||
|
May be an empty string if the content-type is unknown.
|
||||||
*/
|
*/
|
||||||
virtual wxString GetContentType();
|
virtual wxString GetContentType() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the last occurred error.
|
Returns the last occurred error.
|
||||||
|
|
||||||
@see wxProtocolError
|
@see wxProtocolError
|
||||||
*/
|
*/
|
||||||
virtual wxProtocolError GetError() = 0;
|
virtual wxProtocolError GetError() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Creates a new input stream on the specified path.
|
Creates a new input stream on the specified path.
|
||||||
@@ -85,13 +90,22 @@ public:
|
|||||||
bool Reconnect();
|
bool Reconnect();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the authentication password. It is mainly useful when FTP is used.
|
Sets the authentication password.
|
||||||
*/
|
*/
|
||||||
virtual void SetPassword(const wxString& user);
|
virtual void SetPassword(const wxString& user);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the authentication user. It is mainly useful when FTP is used.
|
Sets the authentication user.
|
||||||
*/
|
*/
|
||||||
virtual void SetUser(const wxString& user);
|
virtual void SetUser(const wxString& user);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Sets a new default timeout for the network operations.
|
||||||
|
|
||||||
|
The default timeout is 60 seconds.
|
||||||
|
|
||||||
|
@see wxSocketBase::SetTimeout
|
||||||
|
*/
|
||||||
|
void SetDefaultTimeout(wxUint32 Value);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -76,17 +76,15 @@ IMPLEMENT_PROTOCOL(wxFTP, wxT("ftp"), wxT("ftp"), true)
|
|||||||
|
|
||||||
wxFTP::wxFTP()
|
wxFTP::wxFTP()
|
||||||
{
|
{
|
||||||
m_lastError = wxPROTO_NOERR;
|
|
||||||
m_streaming = false;
|
m_streaming = false;
|
||||||
m_currentTransfermode = NONE;
|
m_currentTransfermode = NONE;
|
||||||
|
|
||||||
m_user = wxT("anonymous");
|
m_username = wxT("anonymous");
|
||||||
m_passwd << wxGetUserId() << wxT('@') << wxGetFullHostName();
|
m_password << wxGetUserId() << wxT('@') << wxGetFullHostName();
|
||||||
|
|
||||||
SetNotify(0);
|
SetNotify(0);
|
||||||
SetFlags(wxSOCKET_NOWAIT);
|
SetFlags(wxSOCKET_NOWAIT);
|
||||||
m_bPassive = true;
|
m_bPassive = true;
|
||||||
SetDefaultTimeout(60); // Default is Sixty Seconds
|
|
||||||
m_bEncounteredError = false;
|
m_bEncounteredError = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +113,7 @@ bool wxFTP::Connect(const wxSockAddress& addr, bool WXUNUSED(wait))
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !m_user )
|
if ( !m_username )
|
||||||
{
|
{
|
||||||
m_lastError = wxPROTO_CONNERR;
|
m_lastError = wxPROTO_CONNERR;
|
||||||
return false;
|
return false;
|
||||||
@@ -129,27 +127,31 @@ bool wxFTP::Connect(const wxSockAddress& addr, bool WXUNUSED(wait))
|
|||||||
}
|
}
|
||||||
|
|
||||||
wxString command;
|
wxString command;
|
||||||
command.Printf(wxT("USER %s"), m_user.c_str());
|
command.Printf(wxT("USER %s"), m_username.c_str());
|
||||||
char rc = SendCommand(command);
|
char rc = SendCommand(command);
|
||||||
if ( rc == '2' )
|
if ( rc == '2' )
|
||||||
{
|
{
|
||||||
// 230 return: user accepted without password
|
// 230 return: user accepted without password
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( rc != '3' )
|
if ( rc != '3' )
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
Close();
|
Close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
command.Printf(wxT("PASS %s"), m_passwd.c_str());
|
command.Printf(wxT("PASS %s"), m_password.c_str());
|
||||||
if ( !CheckCommand(command, '2') )
|
if ( !CheckCommand(command, '2') )
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
Close();
|
Close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,6 +176,7 @@ bool wxFTP::Close()
|
|||||||
{
|
{
|
||||||
if ( !CheckCommand(wxT("QUIT"), '2') )
|
if ( !CheckCommand(wxT("QUIT"), '2') )
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
wxLogDebug(_T("Failed to close connection gracefully."));
|
wxLogDebug(_T("Failed to close connection gracefully."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,6 +204,7 @@ wxSocketBase *wxFTP::AcceptIfActive(wxSocketBase *sock)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
sock = sockSrv->Accept(true);
|
sock = sockSrv->Accept(true);
|
||||||
delete sockSrv;
|
delete sockSrv;
|
||||||
}
|
}
|
||||||
@@ -220,11 +224,6 @@ bool wxFTP::Abort()
|
|||||||
return CheckResult('2');
|
return CheckResult('2');
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxFTP::SetDefaultTimeout(wxUint32 Value)
|
|
||||||
{
|
|
||||||
m_uiDefaultTimeout = Value;
|
|
||||||
SetTimeout(Value); // sets it for this socket
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Send command to FTP server
|
// Send command to FTP server
|
||||||
@@ -261,6 +260,7 @@ char wxFTP::SendCommand(const wxString& command)
|
|||||||
wxLogTrace(FTP_TRACE_MASK, _T("==> %s"), cmd.c_str());
|
wxLogTrace(FTP_TRACE_MASK, _T("==> %s"), cmd.c_str());
|
||||||
#endif // __WXDEBUG__
|
#endif // __WXDEBUG__
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return GetResult();
|
return GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,6 +380,8 @@ char wxFTP::GetResult()
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
|
|
||||||
// if we got here we must have a non empty code string
|
// if we got here we must have a non empty code string
|
||||||
return (char)code[0u];
|
return (char)code[0u];
|
||||||
@@ -439,10 +441,12 @@ bool wxFTP::DoSimpleCommand(const wxChar *command, const wxString& arg)
|
|||||||
if ( !CheckCommand(fullcmd, '2') )
|
if ( !CheckCommand(fullcmd, '2') )
|
||||||
{
|
{
|
||||||
wxLogDebug(_T("FTP command '%s' failed."), fullcmd.c_str());
|
wxLogDebug(_T("FTP command '%s' failed."), fullcmd.c_str());
|
||||||
|
m_lastError = wxPROTO_NETERR;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,6 +511,7 @@ wxString wxFTP::Pwd()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_PROTERR;
|
||||||
wxLogDebug(_T("FTP PWD command failed."));
|
wxLogDebug(_T("FTP PWD command failed."));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -618,6 +623,7 @@ wxSocketBase *wxFTP::GetActivePort()
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
sockSrv->Notify(false); // Don't send any events
|
sockSrv->Notify(false); // Don't send any events
|
||||||
return sockSrv;
|
return sockSrv;
|
||||||
}
|
}
|
||||||
@@ -626,6 +632,7 @@ wxSocketBase *wxFTP::GetPassivePort()
|
|||||||
{
|
{
|
||||||
if ( !DoSimpleCommand(_T("PASV")) )
|
if ( !DoSimpleCommand(_T("PASV")) )
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_PROTERR;
|
||||||
wxLogError(_("The FTP server doesn't support passive mode."));
|
wxLogError(_("The FTP server doesn't support passive mode."));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -660,12 +667,14 @@ wxSocketBase *wxFTP::GetPassivePort()
|
|||||||
wxSocketClient *client = new wxSocketClient();
|
wxSocketClient *client = new wxSocketClient();
|
||||||
if ( !client->Connect(addr) )
|
if ( !client->Connect(addr) )
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
delete client;
|
delete client;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
client->Notify(false);
|
client->Notify(false);
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -761,7 +770,10 @@ public:
|
|||||||
wxInputStream *wxFTP::GetInputStream(const wxString& path)
|
wxInputStream *wxFTP::GetInputStream(const wxString& path)
|
||||||
{
|
{
|
||||||
if ( ( m_currentTransfermode == NONE ) && !SetTransferMode(BINARY) )
|
if ( ( m_currentTransfermode == NONE ) && !SetTransferMode(BINARY) )
|
||||||
|
{
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
wxSocketBase *sock = GetPort();
|
wxSocketBase *sock = GetPort();
|
||||||
|
|
||||||
@@ -777,7 +789,10 @@ wxInputStream *wxFTP::GetInputStream(const wxString& path)
|
|||||||
|
|
||||||
sock = AcceptIfActive(sock);
|
sock = AcceptIfActive(sock);
|
||||||
if ( !sock )
|
if ( !sock )
|
||||||
|
{
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
sock->SetFlags(wxSOCKET_WAITALL);
|
sock->SetFlags(wxSOCKET_WAITALL);
|
||||||
|
|
||||||
@@ -785,13 +800,17 @@ wxInputStream *wxFTP::GetInputStream(const wxString& path)
|
|||||||
|
|
||||||
wxInputFTPStream *in_stream = new wxInputFTPStream(this, sock);
|
wxInputFTPStream *in_stream = new wxInputFTPStream(this, sock);
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return in_stream;
|
return in_stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxOutputStream *wxFTP::GetOutputStream(const wxString& path)
|
wxOutputStream *wxFTP::GetOutputStream(const wxString& path)
|
||||||
{
|
{
|
||||||
if ( ( m_currentTransfermode == NONE ) && !SetTransferMode(BINARY) )
|
if ( ( m_currentTransfermode == NONE ) && !SetTransferMode(BINARY) )
|
||||||
|
{
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
wxSocketBase *sock = GetPort();
|
wxSocketBase *sock = GetPort();
|
||||||
|
|
||||||
@@ -803,6 +822,7 @@ wxOutputStream *wxFTP::GetOutputStream(const wxString& path)
|
|||||||
|
|
||||||
m_streaming = true;
|
m_streaming = true;
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return new wxOutputFTPStream(this, sock);
|
return new wxOutputFTPStream(this, sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -815,8 +835,10 @@ bool wxFTP::GetList(wxArrayString& files,
|
|||||||
bool details)
|
bool details)
|
||||||
{
|
{
|
||||||
wxSocketBase *sock = GetPort();
|
wxSocketBase *sock = GetPort();
|
||||||
if (!sock)
|
if (!sock) {
|
||||||
|
m_lastError = wxPROTO_NETERR;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// NLST : List of Filenames (including Directory's !)
|
// NLST : List of Filenames (including Directory's !)
|
||||||
// LIST : depending on BS of FTP-Server
|
// LIST : depending on BS of FTP-Server
|
||||||
@@ -838,8 +860,10 @@ bool wxFTP::GetList(wxArrayString& files,
|
|||||||
}
|
}
|
||||||
|
|
||||||
sock = AcceptIfActive(sock);
|
sock = AcceptIfActive(sock);
|
||||||
if ( !sock )
|
if ( !sock ) {
|
||||||
|
m_lastError = wxPROTO_CONNERR;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
files.Empty();
|
files.Empty();
|
||||||
while (ReadLine(sock, line) == wxPROTO_NOERR )
|
while (ReadLine(sock, line) == wxPROTO_NOERR )
|
||||||
@@ -850,6 +874,7 @@ bool wxFTP::GetList(wxArrayString& files,
|
|||||||
delete sock;
|
delete sock;
|
||||||
|
|
||||||
// the file list should be terminated by "226 Transfer complete""
|
// the file list should be terminated by "226 Transfer complete""
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return CheckResult('2');
|
return CheckResult('2');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -34,6 +34,11 @@
|
|||||||
#include "wx/sckstrm.h"
|
#include "wx/sckstrm.h"
|
||||||
#include "wx/thread.h"
|
#include "wx/thread.h"
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxHTTP
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxHTTP, wxProtocol)
|
IMPLEMENT_DYNAMIC_CLASS(wxHTTP, wxProtocol)
|
||||||
IMPLEMENT_PROTOCOL(wxHTTP, wxT("http"), wxT("80"), true)
|
IMPLEMENT_PROTOCOL(wxHTTP, wxT("http"), wxT("80"), true)
|
||||||
|
|
||||||
@@ -61,7 +66,7 @@ void wxHTTP::ClearHeaders()
|
|||||||
m_headers.clear();
|
m_headers.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString wxHTTP::GetContentType()
|
wxString wxHTTP::GetContentType() const
|
||||||
{
|
{
|
||||||
return GetHeader(wxT("Content-Type"));
|
return GetHeader(wxT("Content-Type"));
|
||||||
}
|
}
|
||||||
@@ -177,8 +182,8 @@ bool wxHTTP::ParseHeaders()
|
|||||||
|
|
||||||
for ( ;; )
|
for ( ;; )
|
||||||
{
|
{
|
||||||
m_perr = ReadLine(this, line);
|
m_lastError = ReadLine(this, line);
|
||||||
if (m_perr != wxPROTO_NOERR)
|
if (m_lastError != wxPROTO_NOERR)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (line.length() == 0)
|
if (line.length() == 0)
|
||||||
@@ -205,7 +210,7 @@ bool wxHTTP::Connect(const wxString& host, unsigned short port)
|
|||||||
if (!addr->Hostname(host)) {
|
if (!addr->Hostname(host)) {
|
||||||
delete m_addr;
|
delete m_addr;
|
||||||
m_addr = NULL;
|
m_addr = NULL;
|
||||||
m_perr = wxPROTO_NETERR;
|
m_lastError = wxPROTO_NETERR;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,6 +221,7 @@ bool wxHTTP::Connect(const wxString& host, unsigned short port)
|
|||||||
|
|
||||||
SetHeader(wxT("Host"), host);
|
SetHeader(wxT("Host"), host);
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,6 +238,7 @@ bool wxHTTP::Connect(const wxSockAddress& addr, bool WXUNUSED(wait))
|
|||||||
if (ipv4addr)
|
if (ipv4addr)
|
||||||
SetHeader(wxT("Host"), ipv4addr->OrigHostname());
|
SetHeader(wxT("Host"), ipv4addr->OrigHostname());
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,8 +293,8 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req)
|
|||||||
}
|
}
|
||||||
|
|
||||||
wxString tmp_str;
|
wxString tmp_str;
|
||||||
m_perr = ReadLine(this, tmp_str);
|
m_lastError = ReadLine(this, tmp_str);
|
||||||
if (m_perr != wxPROTO_NOERR) {
|
if (m_lastError != wxPROTO_NOERR) {
|
||||||
RestoreState();
|
RestoreState();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -295,6 +302,7 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req)
|
|||||||
if (!tmp_str.Contains(wxT("HTTP/"))) {
|
if (!tmp_str.Contains(wxT("HTTP/"))) {
|
||||||
// TODO: support HTTP v0.9 which can have no header.
|
// TODO: support HTTP v0.9 which can have no header.
|
||||||
// FIXME: tmp_str is not put back in the in-queue of the socket.
|
// FIXME: tmp_str is not put back in the in-queue of the socket.
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
SetHeader(wxT("Content-Length"), wxT("-1"));
|
SetHeader(wxT("Content-Length"), wxT("-1"));
|
||||||
SetHeader(wxT("Content-Type"), wxT("none/none"));
|
SetHeader(wxT("Content-Type"), wxT("none/none"));
|
||||||
RestoreState();
|
RestoreState();
|
||||||
@@ -325,16 +333,26 @@ bool wxHTTP::BuildRequest(const wxString& path, wxHTTP_Req req)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
m_perr = wxPROTO_NOFILE;
|
m_lastError = wxPROTO_NOFILE;
|
||||||
RestoreState();
|
RestoreState();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
ret_value = ParseHeaders();
|
ret_value = ParseHeaders();
|
||||||
RestoreState();
|
RestoreState();
|
||||||
return ret_value;
|
return ret_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxHTTP::Abort(void)
|
||||||
|
{
|
||||||
|
return wxSocketClient::Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxHTTPStream and wxHTTP::GetInputStream
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
class wxHTTPStream : public wxSocketInputStream
|
class wxHTTPStream : public wxSocketInputStream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -375,18 +393,13 @@ size_t wxHTTPStream::OnSysRead(void *buffer, size_t bufsize)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxHTTP::Abort(void)
|
|
||||||
{
|
|
||||||
return wxSocketClient::Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxInputStream *wxHTTP::GetInputStream(const wxString& path)
|
wxInputStream *wxHTTP::GetInputStream(const wxString& path)
|
||||||
{
|
{
|
||||||
wxHTTPStream *inp_stream;
|
wxHTTPStream *inp_stream;
|
||||||
|
|
||||||
wxString new_path;
|
wxString new_path;
|
||||||
|
|
||||||
m_perr = wxPROTO_CONNERR;
|
m_lastError = wxPROTO_CONNERR; // all following returns share this type of error
|
||||||
if (!m_addr)
|
if (!m_addr)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -417,6 +430,8 @@ wxInputStream *wxHTTP::GetInputStream(const wxString& path)
|
|||||||
Notify(false);
|
Notify(false);
|
||||||
SetFlags(wxSOCKET_BLOCK | wxSOCKET_WAITALL);
|
SetFlags(wxSOCKET_BLOCK | wxSOCKET_WAITALL);
|
||||||
|
|
||||||
|
// no error; reset m_lastError
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
return inp_stream;
|
return inp_stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -28,15 +28,9 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
// ----------------------------------------------------------------------------
|
||||||
// wxProtoInfo
|
// wxProtoInfo
|
||||||
/////////////////////////////////////////////////////////////////
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
/*
|
|
||||||
* --------------------------------------------------------------
|
|
||||||
* --------- wxProtoInfo CONSTRUCTOR ----------------------------
|
|
||||||
* --------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv,
|
wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv,
|
||||||
const bool need_host1, wxClassInfo *info)
|
const bool need_host1, wxClassInfo *info)
|
||||||
@@ -53,9 +47,10 @@ wxProtoInfo::wxProtoInfo(const wxChar *name, const wxChar *serv,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////
|
|
||||||
// wxProtocol ///////////////////////////////////////////////////
|
// ----------------------------------------------------------------------------
|
||||||
/////////////////////////////////////////////////////////////////
|
// wxProtocol
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
#if wxUSE_SOCKETS
|
#if wxUSE_SOCKETS
|
||||||
IMPLEMENT_ABSTRACT_CLASS(wxProtocol, wxSocketClient)
|
IMPLEMENT_ABSTRACT_CLASS(wxProtocol, wxSocketClient)
|
||||||
@@ -68,6 +63,8 @@ wxProtocol::wxProtocol()
|
|||||||
: wxSocketClient()
|
: wxSocketClient()
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
m_lastError = wxPROTO_NOERR;
|
||||||
|
SetDefaultTimeout(60); // default timeout is 60 seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
#if wxUSE_SOCKETS
|
#if wxUSE_SOCKETS
|
||||||
@@ -90,6 +87,15 @@ bool wxProtocol::Reconnect()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxProtocol::SetDefaultTimeout(wxUint32 Value)
|
||||||
|
{
|
||||||
|
m_uiDefaultTimeout = Value;
|
||||||
|
#if wxUSE_SOCKETS
|
||||||
|
wxSocketBase::SetTimeout(Value); // sets it for this socket
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Read a line from socket
|
// Read a line from socket
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -25,13 +25,17 @@
|
|||||||
#include "wx/wfstream.h"
|
#include "wx/wfstream.h"
|
||||||
#include "wx/protocol/file.h"
|
#include "wx/protocol/file.h"
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxFileProto
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxFileProto, wxProtocol)
|
IMPLEMENT_DYNAMIC_CLASS(wxFileProto, wxProtocol)
|
||||||
IMPLEMENT_PROTOCOL(wxFileProto, wxT("file"), NULL, false)
|
IMPLEMENT_PROTOCOL(wxFileProto, wxT("file"), NULL, false)
|
||||||
|
|
||||||
wxFileProto::wxFileProto()
|
wxFileProto::wxFileProto()
|
||||||
: wxProtocol()
|
: wxProtocol()
|
||||||
{
|
{
|
||||||
m_error = wxPROTO_NOERR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFileProto::~wxFileProto()
|
wxFileProto::~wxFileProto()
|
||||||
@@ -43,12 +47,11 @@ wxInputStream *wxFileProto::GetInputStream(const wxString& path)
|
|||||||
wxFileInputStream *retval = new wxFileInputStream(wxURI::Unescape(path));
|
wxFileInputStream *retval = new wxFileInputStream(wxURI::Unescape(path));
|
||||||
if ( retval->Ok() )
|
if ( retval->Ok() )
|
||||||
{
|
{
|
||||||
m_error = wxPROTO_NOERR;
|
m_lastError = wxPROTO_NOERR;
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_error = wxPROTO_NOFILE;
|
m_lastError = wxPROTO_NOFILE;
|
||||||
delete retval;
|
delete retval;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Reference in New Issue
Block a user