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(); } } }
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); } } } }