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

Метод OnConnect


Метод OnConnect класса CFtpViewDlg вызывается, когда вы нажимаете кнопку Connect чтобы соединится с сервером FTP. Адрес сервера FTP, с которым устанавливается соединение, должен быть введен в поле редактирования IDC_FTP_ADDRESS. Это поле располагается на диалоговой панели с левой стороны от кнопки Connect.

Перед тем как устанавливать соединение с сервером FTP, метод OnConnect блокирует кнопки управления, расположенные на диалоговой панели - Connect, OK и On top. Блокировка выполняется с помощью метода EnableWindow, определенного в классе CWnd. Этот метод вызывается для объектов m_Connect, m_Ok и m_OnTop класса CButton, представляющих эти кнопки:

// Блокируем кнопки Connect, OK и On Top

m_Connect.EnableWindow(FALSE);

m_Ok.EnableWindow(FALSE);

m_OnTop.EnableWindow(FALSE);

Если вы ранее уже соединились с сервером FTP и указатель m_FtpConnection не равен значению NULL, разрываем эту связь и удаляем объект m_FtpConnection. Затем присваиваем m_FtpConnection значение NULL:

if (m_FtpConnection != NULL)

{

   m_FtpConnection -> Close();

     

   delete m_FtpConnection;  

   m_FtpConnection = NULL;



}

Пользователь мог изменить адрес сервера, с которым надо установить соединение, поэтому обновляем строку m_FtpAddress, считывая значение из поля редактирования IDC_FTP_ADDRESS. Для этого опять (раньше в методе OnInitDialog) вызываем метод UpdateData, но теперь указываем ему параметр TRUE. Он означает, что состояние органов управления диалоговой панели должно быть записано в привязанные к ним переменные:

UpdateData(TRUE);

Теперь, когда адрес сервера известен, пытаемся с ним соединиться. Для этого вызываем метод GetFtpConnection класса CInternetSession объекта. В случае ошибки метод GetFtpConnection может вызвать исключение CInternetException.

Чтобы организовать обработку этого исключения помещаем вызов метода GetFtpConnection в блок try и создаем соответствующий блок catch:

// Пытаемся соединиться с сервером FTP

try

{

   // Меняем форму курсора (курсор “ожидание”)


   CWaitCursor wait;  

   // Соединяемся с сервером FTP. Эта операция

   // может вызвать исключение CInternetException

   m_FtpConnection =

      m_InternetSession->GetFtpConnection(m_FtpAddress);

}

Так как процесс соединения с сервером может занять достаточно много времени, изменяем форму курсора. Для этого достаточно создать объект wait класса CWaitCursor. Курсор примет свою прежнюю форму автоматически, когда объект wait будет удален. В данном случае это произойдет при выходе из блока try.

В случае если работа метода GetFtpConnection вызовет исключение CInternetException, вызывается соответствующий блок catch. Такое может произойти, например, если сервер FTP с заданным адресом не существует или он не работает в данное время.

Обработчик исключения вызывает для него метод GetErrorMessage. Он возвращает текстовое описание причины исключения, которое затем отображается на экране с помощью функции AfxMessageBox. Если метод GetErrorMessage не может вернуть текстового описания, то на экране отображается сообщение GetFtpConnection Error.

Чтобы завершить обработку исключения удаляем его, вызывая для исключения метод Delete. Так как исключение означает, что установить соединение с FTP сервером не удалось, присваиваем указателю m_FtpConnection значение NULL:

catch (CInternetException* pEx)

{

   // Обрабатываем исключение CInternetException

   TCHAR szErr[1024];  // временный буфер для сообщения

   // Выводим сообщение об ошибке

   if (pEx->GetErrorMessage(szErr, 1024))

      AfxMessageBox(szErr);

   else

      AfxMessageBox("GetFtpConnection Error");

   // Удаляем иссключение

   pEx->Delete();

   // Обнуляем указатель m_FtpConnection

   m_FtpConnection = NULL;

}

Если соединение не установлено, тогда выводим соответствующую надпись в поле IDC_STATUS, снимаем блокировку кнопок Connect, OK и On Top и завершаем работу метода. Чтобы снять блокировку кнопок, вызываем для управляющих ими объектов метод EnableWindow с параметром TRUE:



if( m_FtpConnection == NULL )

      m_Status.SetWindowText("Connect not established");

...

m_Connect.EnableWindow(TRUE);

m_Ok.EnableWindow(TRUE);

m_OnTop.EnableWindow(TRUE);

Если соединение с сервером FTP установлено успешно, определяем текущий каталог. Для этого вызываем метод GetCurrentDirectory, передавая ему в качестве параметра строку sCurrentFtpDirectory. Эта строка определена в методе OnConnect как объект класса CString:

// Определяем текущий каталог сервера FTP

BOOL fResult=

   m_FtpConnection ->

      GetCurrentDirectory(sCurrentFtpDirectory);

if(fResult)

   sCurentDirectory = sCurrentFtpDirectory;

else

   AfxMessageBox("GetCurrentDirectory Error");

В случае успешного завершения метод GetCurrentDirectory запишет в строку sCurrentFtpDirectory полный путь текущего каталога и мы скопируем его в строку sCurentDirectory, являющуюся элементом класса CFtpViewDlg.

Узнав текущий каталог, вызываем метод DirectoryView, определенный в классе CFtpViewDlg, который считывает имена файлов и каталогов сервера FTP и отображает их в списке на диалоговой панели. Перед вызовом метода DirectoryView мы создаем объект класса CWaitCursor, поэтому во время длительного процесса опроса текущего каталога сервера курсор изменит свою форму. Заметим, что после заполнения списка при выходе управления из блока в котором определен объект wait класса CWaitCursor, форма курсора автоматически восстанавливается:

// Меняем форму курсора (курсор “ожидание”)

CWaitCursor wait;  

// Отображаем содержимое выбранного каталога

DirectoryView();

После того, как содержимое каталога выведено в списке на диалоговой панели, отображаем в поле IDC_STATUS путь каталога и снимаем блокировку с кнопок Connect, OK и On Top:

// Отображаем на диалоговой панели новый путь каталога

m_Status.SetWindowText(sCurentDirectory);


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