Re: [gnet-devel] GIOChannels
- From: "n duarte" <totalgreenhaven2 gmail com>
- To: "Tim-Philipp Müller" <t i m zen co uk>
- Cc: gnet-devel-list gnome org
- Subject: Re: [gnet-devel] GIOChannels
- Date: Tue, 5 Aug 2008 10:56:25 -0400
Ok, here is the relevant code:
// Chat update - this successfully gets text from a text widget and sends to another function for GNet to handle
long MainWindow::onChatUUpdt(FXObject *sender, FXSelector, void *)
{
// gets the index of the current tab
current_child = chattabs->getCurrent();
// make this fetch the alias for the appropriate network
curr_alias = "Alias";
FXString bcText = curr_alias;
bcText.append(": ");
int nlength = bcText.FXString::length();
// fetch the bottom chat of the current tab
FXWindow* bottom_win = ((((chattabs->childAtIndex(current_child *
2))->getNext())->childAtIndex(0))->childAtIndex(1))->childAtIndex(0);
FXText* bottom_chat = ((FXText*)bottom_win);
FXString text = bottom_chat->getText();
FXint len = bottom_chat->getLength();
// if there is text in the bottom chat...
if(text != "" && text[len - 1] == '\n')
{
// get the text of the bottom chat and append it to bcText
bcText.append(bottom_chat->getText());
// clear the text of the bottom chat
bottom_chat->setText("", 0, true);
// fetch the top chat of the current tab
FXWindow* top_win = ((((chattabs->childAtIndex(current_child *
2))->getNext())->childAtIndex(0))->childAtIndex(0))->childAtIndex(0);
FXText* top_chat = ((FXText*)top_win);
// append bcText to the top chat
top_chat->appendText(bcText);
int length = bcText.FXString::length();
char sts[length];
int l;
for(l = nlength; l < length; l++)
{
if(bcText[l] == '\n')
{
sts[l - nlength] = bcText[l];
sts[l - nlength + 1] = '\0';
break;
}
sts[l - nlength] = bcText[l];
}
length = strlen(sts);
sendStringToGnet(sts, length);
}
return 1;
}
// once this function is called it writes the string given it to a GIOChannel (doing this somehow also ends up printing the string to stdout if the program was launched from the terminal)
void sendStringToGnet(char* s, int len)
{
lenOfOutString = len;
s[len] = '\0';
GIOChannel* sin;
GIOError error;
gsize bytes_read = strlen(s);
gsize bytes_written;
sin = server_iochannel;
error = gnet_io_channel_writen (sin, s, bytes_read, &bytes_written);
/*g_print ("# write %d\n", bytes_written); */
g_assert (error == G_IO_ERROR_NONE);
g_assert (bytes_written == bytes_read);
return;
}
/* this is my slightly modified version of the main function from the GNet async-server example
everything compiles and runs properly (on linux anyways) except my GIOChannel issue
void* netmain(void* arg)
{
GTcpSocket* server;
GInetAddr* addr;
gchar* name;
gint port;
GMainLoop* main_loop;
gnet_init ();
port = atoi(((peer*)arg)->port);
/* Create the server */
server = gnet_tcp_socket_server_new_with_port (port);
if (server == NULL)
{
fprintf (stderr, "Could not create server on port %d\n", port);
exit (EXIT_FAILURE);
}
async_server = server;
signal (SIGINT, async_sig_int);
/* Print the address */
addr = gnet_tcp_socket_get_local_inetaddr(server);
g_assert (addr);
name = gnet_inetaddr_get_canonical_name (addr);
g_assert (name);
port = gnet_inetaddr_get_port (addr);
g_print ("Online and listening on %s:%d\n", name, port);
gnet_inetaddr_delete (addr);
g_free (name);
/* Create the main loop */
main_loop = g_main_new (FALSE);
/* Wait asyncy for incoming clients */
gnet_tcp_socket_server_accept_async (server, async_accept, NULL);
/* this is the problem right here. I think that the input written directly to the GIOChannel from my text widget
doesnt meet the G_IO_IN condition because the channel was initalized to read from stdin,
however i dont know how to initalize it any other way, and g_io_channel_init () makes my program segfault */
server_iochannel = g_io_channel_unix_new(fileno(stdin));
g_io_add_watch (server_iochannel, (GIOCondition)(G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL),
async_srv_iofunc, client_iochannel);
/* Start the main loop */
g_main_run (main_loop);
exit (EXIT_SUCCESS);
return 0;
}
I hope this helps and does not appear as just a garbled mess of code. I appreciate your help.
~Nate
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]