Пример #1
0
void telnet_run (void) {
    _i16 rxLen;
    switch (telnet_data.state) {
        case E_TELNET_STE_DISABLED:
            telnet_wait_for_enabled();
            break;
        case E_TELNET_STE_START:
            if (wlan_is_connected() && telnet_create_socket()) {
                telnet_data.state = E_TELNET_STE_LISTEN;
            }
            break;
        case E_TELNET_STE_LISTEN:
            telnet_wait_for_connection();
            break;
        case E_TELNET_STE_CONNECTED:
            switch (telnet_data.substate.connected) {
            case E_TELNET_STE_SUB_WELCOME:
                telnet_send_and_proceed((void *)telnet_welcome_msg, strlen(telnet_welcome_msg), E_TELNET_STE_SUB_SND_USER_OPTIONS);
                break;
            case E_TELNET_STE_SUB_SND_USER_OPTIONS:
                telnet_send_and_proceed((void *)telnet_options_user, sizeof(telnet_options_user), E_TELNET_STE_SUB_REQ_USER);
                break;
            case E_TELNET_STE_SUB_REQ_USER:
                // to catch any left over characters from the previous actions
                telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen);
                telnet_send_and_proceed((void *)telnet_request_user, strlen(telnet_request_user), E_TELNET_STE_SUB_GET_USER);
                break;
            case E_TELNET_STE_SUB_GET_USER:
                if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex,
                                                                        TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex,
                                                                        &rxLen)) {
                    int result;
                    if ((result = telnet_process_credential (servers_user, rxLen))) {
                        telnet_data.credentialsValid = result > 0 ? true : false;
                        telnet_data.substate.connected = E_TELNET_STE_SUB_REQ_PASSWORD;
                    }
                }
                break;
            case E_TELNET_STE_SUB_REQ_PASSWORD:
                telnet_send_and_proceed((void *)telnet_request_password, strlen(telnet_request_password), E_TELNET_STE_SUB_SND_PASSWORD_OPTIONS);
                break;
            case E_TELNET_STE_SUB_SND_PASSWORD_OPTIONS:
                // to catch any left over characters from the previous actions
                telnet_recv_text_non_blocking(telnet_data.rxBuffer, TELNET_RX_BUFFER_SIZE, &rxLen);
                telnet_send_and_proceed((void *)telnet_options_pass, sizeof(telnet_options_pass), E_TELNET_STE_SUB_GET_PASSWORD);
                break;
            case E_TELNET_STE_SUB_GET_PASSWORD:
                if (E_TELNET_RESULT_OK == telnet_recv_text_non_blocking(telnet_data.rxBuffer + telnet_data.rxWindex,
                                                                        TELNET_RX_BUFFER_SIZE - telnet_data.rxWindex,
                                                                        &rxLen)) {
                    int result;
                    if ((result = telnet_process_credential (servers_pass, rxLen))) {
                        if ((telnet_data.credentialsValid = telnet_data.credentialsValid && (result > 0 ? true : false))) {
                            telnet_data.substate.connected = E_TELNET_STE_SUB_SND_REPL_OPTIONS;
                        }
                        else {
                            telnet_data.substate.connected = E_TELNET_STE_SUB_INVALID_LOGGIN;
                        }
                    }
                }
                break;
            case E_TELNET_STE_SUB_INVALID_LOGGIN:
                if (E_TELNET_RESULT_OK == telnet_send_non_blocking((void *)telnet_invalid_loggin, strlen(telnet_invalid_loggin))) {
                    telnet_data.credentialsValid = true;
                    if (++telnet_data.logginRetries >= TELNET_LOGIN_RETRIES_MAX) {
                        telnet_reset();
                    }
                    else {
                        telnet_data.substate.connected = E_TELNET_STE_SUB_SND_USER_OPTIONS;
                    }
                }
                break;
            case E_TELNET_STE_SUB_SND_REPL_OPTIONS:
                telnet_send_and_proceed((void *)telnet_options_repl, sizeof(telnet_options_repl), E_TELNET_STE_SUB_LOGGIN_SUCCESS);
                break;
            case E_TELNET_STE_SUB_LOGGIN_SUCCESS:
                if (E_TELNET_RESULT_OK == telnet_send_non_blocking((void *)telnet_loggin_success, strlen(telnet_loggin_success))) {
                    // clear the current line and force the prompt
                    telnet_reset_buffer();
                    telnet_data.state= E_TELNET_STE_LOGGED_IN;
                }
            default:
                break;
            }
            break;
        case E_TELNET_STE_LOGGED_IN:
            telnet_process();
            break;
        default:
            break;
    }

    if (telnet_data.state >= E_TELNET_STE_CONNECTED) {
        if (telnet_data.timeout++ > (servers_get_timeout() / TELNET_CYCLE_TIME_MS)) {
            telnet_reset();
        }
    }
}
Пример #2
0
void on_data_available(gpointer tab, gint fd, GdkInputCondition cond)
{
  GtkWidget *notebook, *top;
  gchar *buff = NULL;
  gsize len = 0;
  SESSION_STATE *session;
  session = g_object_get_data(G_OBJECT(tab), "session");

  telnet_process(session->telnet, &buff, &len);

  //if nothing to process - don't process
  if( len > 0 )
    process_text(session, buff, len);

  // if top != current window change title
  top = gtk_widget_get_toplevel(GTK_WIDGET(tab));
  //if (top != interface_get_active_window()) {
  if (!gtk_window_is_active(GTK_WINDOW(top)))
  {
    gchar *icon;
    gtk_window_set_title(GTK_WINDOW(top), "### MudMagic ###");
    icon = g_build_filename( mudmagic_data_directory(), "interface", "mudmagic2.xpm", NULL);
    gtk_window_set_icon_from_file(GTK_WINDOW(top), icon, NULL);
    g_free(icon);
  }

  if (session->telnet->fd < 0 ) // connection close occurs
  { 
    GtkWidget *wid, *message;
    gchar *label;
    gint response;
    gtk_input_remove(session->input_event_id);
    session->input_event_id = -1;
    wid = g_object_get_data(G_OBJECT(session->tab), "input1_entry");

    g_return_if_fail(wid != NULL);
    if ( ! gtk_entry_get_visibility (GTK_ENTRY(wid)) ) {
      interface_input_shadow(session, FALSE);
      gtk_entry_set_text(GTK_ENTRY(wid), "");
    }

    while (1) {
      wid =
          interface_create_object_by_name
          ("dialog_connection_close");
      if (wid == NULL) {
        g_warning
            ("can't create 'dialog_connection_close");
      }
      message =
          interface_get_widget(wid,
             "connection_close_message");
      if (message == NULL) {
        g_warning
            ("can't get 'dialog_connection_close");
      }
      label =
          g_strdup_printf
          ("Connection to %s:%d has been close.",
           session->game_host, session->game_port);
      gtk_label_set_text(GTK_LABEL(message), label);
      g_free(label);
      response = gtk_dialog_run(GTK_DIALOG(wid));
      gtk_widget_destroy(wid);
      if (response == 0) {  // stay disconnect
        break;
      }
      if (response == 1) {  // try to reconnect
		if (session->pconn) proxy_connection_close (session->pconn);
		session->pconn = proxy_connection_open(
    	  session->game_host, session->game_port, proxy_get_by_name (session->proxy, config->proxies)
	    );
		if (session->pconn) session->telnet->fd = session->pconn->sock; else session->telnet->fd = NO_CONNECTION;

        if (session->telnet->fd == NO_CONNECTION ) {
                          interface_messagebox (GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
                  network_errmsg (session->telnet->fd));
          continue;
        }
        session->input_event_id =
            gtk_input_add_full(session->telnet->fd,
                   GDK_INPUT_READ,(GdkInputFunction)on_data_available, NULL, tab, NULL);
        break;
      }
      if (response == 2) {  // close tab
        interface_remove_tab(tab);
        return;
      }

    }
  }
  // if tab != current tab change label color 
  notebook = gtk_widget_get_ancestor(tab, GTK_TYPE_NOTEBOOK);
  if (notebook) {
    GtkWidget *label;
    GtkWidget *current_tab;

    current_tab =
        gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook),
                gtk_notebook_get_current_page
                (GTK_NOTEBOOK(notebook))
        );
    if (tab != current_tab) {
      label =
          gtk_notebook_get_tab_label(GTK_NOTEBOOK
                   (notebook),
                   GTK_WIDGET(tab));
      if (label) {
        GtkWidget* icon;
        icon = g_object_get_data (G_OBJECT (label), "label_icon");
        gtk_image_set_from_stock (GTK_IMAGE (icon),
                GTK_STOCK_NO,
                GTK_ICON_SIZE_MENU); 
      }
    }
  }
}