Разработка приложений для Internet

Как работает приложение ParseURL


Структура приложения ParseURL ничем не отличается от других приложений с пользовательским интерфейсом на основе диалоговой панели, сформированных средствами MFC AppWizard. Поэтому мы не будем останавливаться на описании устройства приложения, и рассмотрим только моменты, непосредственно связанные с разбором адресов URL и отображением полученной информации в диалоговой панели.

Сразу после запуска, приложение ParseURL создает диалоговую панель IDD_PARSEURL_DIALOG и отображает ее на экране. Управление этой диалоговой панелью осуществляет класс CParseURLDlg, определенный в нашем приложении.

Конструктор класса CParseURLDlg инициализирует строки m_ObjectName, m_PortNumber, m_ServiceType, m_UrlAddress. Несколько позже, когда будет вызван метод OnInitDialog, мы запишем в строку m_UrlAddress пример адреса URL. Чтобы вывести этот адрес на экран, метод OnInitDialog вызывает метод UpdateData с параметром FALSE:

UpdateData(FALSE);

Когда пользователь нажимает кнопку Convert, командное сообщение от нее попадает в таблицу сообщений класса CParseURLDlg и для его обработки вызывается метод OnButtonConvert:

ON_BN_CLICKED(IDC_BUTTON_CONVERT, OnButtonConvert)

Метод OnButtonConvert опять вызывает метод UpdateData, но на этот раз в качестве параметра ему передается значение TRUE. Этот метод считывает данные из органов управления диалоговой панели и записывает их в соответствующие переменные. Вызов этого метода необходим, так как пользователь мог изменить адрес URL в поле URL Address диалоговой панели приложения:

UpdateData(TRUE);

Теперь в строке m_UrlAddress записан адрес URL, который необходимо разобрать на составные части. Для этого вызываем глобальную функцию AfxParseURL, передавая ей строку m_UrlAddress для разбора и переменные dwServiceType, m_ServerName, m_ObjectName, nPort. В них будет записан результат разбора адреса:

if (!AfxParseURL(m_UrlAddress, dwServiceType, m_ServerName,

                    m_ObjectName, nPort))

{

}



Обратите внимание, что имя сервера и имя объекта записываются непосредственно в переменные m_ServerName и m_ObjectName, привязанные к полям диалоговой панели. А вот тип сервиса (тип протокола) и номер порта записываются во временные переменные nPort и dwServiceType, так как их тип не соответствует строковому:


INTERNET_PORT nPort;

DWORD dwServiceType;

Если в строке m_UrlAddress записан неправильный адрес, то функция AfxParseURL возвращает нулевое значение. В этом случае мы выводим сообщение об ошибке и сбрасываем строки m_ObjectName, m_PortNumber, m_ServerName, m_ServiceType:

AfxMessageBox("AfxParseURL Error");

m_ObjectName = "";

m_PortNumber = "";

m_ServerName = "";

m_ServiceType = "";

Если адрес успешно разобран, мы проверяем тип сервиса dwServiceType и записываем в строку m_ServiceType соответствующий текст. Чтобы не загромождать приложение мы таким образом распознаем только четыре основных типа сервиса:

switch(dwServiceType)

{

   case AFX_INET_SERVICE_FTP:

      m_ServiceType = "AFX_INET_SERVICE_FTP";

      break;

   case AFX_INET_SERVICE_HTTP:

      m_ServiceType = "AFX_INET_SERVICE_HTTP";

      break;

   case AFX_INET_SERVICE_GOPHER:

      m_ServiceType = "AFX_INET_SERVICE_GOPHER";

      break;

           

   case AFX_INET_SERVICE_FILE:

      m_ServiceType = "AFX_INET_SERVICE_FILE";

      break;        

   default:

      // Формируем строку из значения переменной dwServiceType

      m_ServiceType.Format("%d", dwServiceType);

}

Если вы указали другой тип сервиса мы записываем в строку m_PortNumber соответствующее числовое значение. Для этого мы используем метод Format класса CString:

m_PortNumber.Format("%d", nPort);

¨     Метод Format класса CString очень удобен для записи в строку форматированных значений каких-либо переменных. По своему назначению и формату вызова данный метод напоминает хорошо известную вам функцию sprintf. Только в функции sprintf

строка, в которую записываются форматированные данные, определяется первым параметром, а метод Format вызывается для объекта представляющего эту строку.

После того, как все переменные, привязанные к полям редактирования диалоговой панели, заполнены, вызываем метод UpdateData с параметром FALSE. Он отображает их содержимое в диалоговой панели:

UpdateData(FALSE);


Содержание раздела