* Updated some wx data and makefiles * Updates on wxStream (reorganization) makefile for Windows will nearly follow wxSocket should work on wxGTK (I've tested it) * IPC over Network is included git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@684 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
278 lines
5.2 KiB
C++
278 lines
5.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: url.cpp
|
|
// Purpose: URL parser
|
|
// Author: Guilhem Lavaux
|
|
// Modified by:
|
|
// Created: 20/07/1997
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 1997, 1998 Guilhem Lavaux
|
|
// Licence: wxWindows license
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __GNUG__
|
|
#pragma implementation "url.h"
|
|
#endif
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
// wxWindows headers
|
|
#include <wx/string.h>
|
|
#include <wx/list.h>
|
|
#include <wx/utils.h>
|
|
|
|
// wxSocket header
|
|
#include "wx/url.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#if !USE_SHARED_LIBRARY
|
|
IMPLEMENT_CLASS(wxProtoInfo, wxObject)
|
|
IMPLEMENT_CLASS(wxURL, wxObject)
|
|
#endif
|
|
|
|
// Protocols list
|
|
wxProtoInfo *wxURL::g_protocols = NULL;
|
|
wxHTTP wxURL::g_proxy;
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// wxURL ////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
/*
|
|
* --------------------------------------------------------------
|
|
* --------- wxURL CONSTRUCTOR DESTRUCTOR -----------------------
|
|
* --------------------------------------------------------------
|
|
*/
|
|
|
|
wxURL::wxURL(const wxString& url)
|
|
{
|
|
m_protocol = NULL;
|
|
if (g_proxy.IsConnected()) {
|
|
m_protocol = &g_proxy;
|
|
m_protoname = "proxy";
|
|
m_path = url;
|
|
return;
|
|
}
|
|
m_url = url;
|
|
m_error = wxURL_NOERR;
|
|
}
|
|
|
|
bool wxURL::ParseURL()
|
|
{
|
|
wxString last_url = m_url;
|
|
|
|
// Clean up
|
|
CleanData();
|
|
|
|
// Extract protocol name
|
|
if (!PrepProto(last_url)) {
|
|
m_error = wxURL_SNTXERR;
|
|
return FALSE;
|
|
}
|
|
|
|
// Find and create the protocol object
|
|
if (!FetchProtocol()) {
|
|
m_error = wxURL_NOPROTO;
|
|
return FALSE;
|
|
}
|
|
|
|
// Do we need a host name ?
|
|
if (m_protoinfo->m_needhost) {
|
|
// Extract it
|
|
if (!PrepHost(last_url)) {
|
|
m_error = wxURL_SNTXERR;
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
// Extract full path
|
|
if (!PrepPath(last_url)) {
|
|
m_error = wxURL_NOPATH;
|
|
return FALSE;
|
|
}
|
|
|
|
m_error = wxURL_NOERR;
|
|
return TRUE;
|
|
}
|
|
|
|
void wxURL::CleanData()
|
|
{
|
|
if (m_protoname != "proxy")
|
|
delete m_protocol;
|
|
}
|
|
|
|
wxURL::~wxURL()
|
|
{
|
|
CleanData();
|
|
}
|
|
|
|
/*
|
|
* --------------------------------------------------------------
|
|
* --------- wxURL urls decoders --------------------------------
|
|
* --------------------------------------------------------------
|
|
*/
|
|
bool wxURL::PrepProto(wxString& url)
|
|
{
|
|
int pos;
|
|
|
|
// Find end
|
|
pos = url.Find(':');
|
|
if (pos == -1)
|
|
return FALSE;
|
|
|
|
m_protoname = url(0, pos);
|
|
|
|
url = url(pos+1, url.Length());
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool wxURL::PrepHost(wxString& url)
|
|
{
|
|
int pos, pos2;
|
|
|
|
if ((url[0UL] != '/') || (url[1UL] != '/'))
|
|
return FALSE;
|
|
|
|
url = url(2, url.Length());
|
|
|
|
pos = url.Find('/');
|
|
if (pos == -1)
|
|
return FALSE;
|
|
|
|
pos2 = url.Find(':');
|
|
if (pos2 != -1 && pos2 < pos) {
|
|
m_servname = url(pos2, pos);
|
|
if (!m_servname.IsNumber())
|
|
return FALSE;
|
|
pos2 = pos;
|
|
}
|
|
|
|
m_hostname = url(0, pos);
|
|
|
|
url = url(url.Find('/'), url.Length());
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool wxURL::PrepPath(wxString& url)
|
|
{
|
|
if (url.Length() != 0)
|
|
m_path = url;
|
|
else
|
|
m_path = "/";
|
|
return TRUE;
|
|
}
|
|
|
|
bool wxURL::FetchProtocol()
|
|
{
|
|
wxProtoInfo *info = g_protocols;
|
|
|
|
while (info) {
|
|
if (m_protoname == info->m_protoname) {
|
|
if (m_servname.IsNull())
|
|
m_servname = info->m_servname;
|
|
|
|
m_protoinfo = info;
|
|
m_protocol = (wxProtocol *)m_protoinfo->m_cinfo->CreateObject();
|
|
wxSocketHandler::Master().Register(m_protocol);
|
|
return TRUE;
|
|
}
|
|
info = info->next;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
* --------------------------------------------------------------
|
|
* --------- wxURL get ------------------------------------------
|
|
* --------------------------------------------------------------
|
|
*/
|
|
wxInputStream *wxURL::GetInputStream(void)
|
|
{
|
|
wxIPV4address addr;
|
|
wxInputStream *the_i_stream = NULL;
|
|
|
|
if (!m_protocol)
|
|
if (!ParseURL())
|
|
return NULL;
|
|
|
|
if (!m_protocol) {
|
|
m_error = wxURL_NOPROTO;
|
|
return NULL;
|
|
}
|
|
|
|
m_error = wxURL_NOERR;
|
|
if (m_protoinfo->m_needhost) {
|
|
if (!addr.Hostname(m_hostname)) {
|
|
m_error = wxURL_NOHOST;
|
|
return NULL;
|
|
}
|
|
|
|
addr.Service(m_servname);
|
|
|
|
if (!m_protocol->Connect(addr)) {
|
|
m_error = wxURL_CONNERR;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
the_i_stream = m_protocol->GetInputStream(m_path);
|
|
if (!the_i_stream) {
|
|
m_error = wxURL_PROTOERR;
|
|
return NULL;
|
|
}
|
|
|
|
return the_i_stream;
|
|
}
|
|
|
|
void wxURL::SetDefaultProxy(const wxString& url_proxy)
|
|
{
|
|
g_proxy.Close();
|
|
|
|
if (url_proxy.IsNull())
|
|
return;
|
|
|
|
wxString tmp_str = url_proxy;
|
|
int pos = tmp_str.Find(':');
|
|
wxString hostname = tmp_str(0, pos),
|
|
port = tmp_str(pos, tmp_str.Length()-pos);
|
|
wxIPV4address addr;
|
|
|
|
addr.Hostname(hostname);
|
|
addr.Service(port);
|
|
|
|
g_proxy.Connect(addr);
|
|
}
|
|
|
|
void wxURL::SetProxy(const wxString& url_proxy)
|
|
{
|
|
if (url_proxy.IsNull()) {
|
|
m_proxy.Close();
|
|
return;
|
|
}
|
|
|
|
CleanData();
|
|
|
|
wxString tmp_str;
|
|
wxString hostname, port;
|
|
int pos;
|
|
wxIPV4address addr;
|
|
|
|
tmp_str = url_proxy;
|
|
pos = tmp_str.Find(':');
|
|
hostname = tmp_str(0, pos);
|
|
port = tmp_str(pos, tmp_str.Length()-pos);
|
|
|
|
addr.Hostname(hostname);
|
|
addr.Service(port);
|
|
|
|
m_proxy.Connect(addr);
|
|
|
|
m_protocol = &m_proxy;
|
|
m_protoname = "proxy";
|
|
m_path = url_proxy;
|
|
}
|