static gboolean listen_from_server(GIOChannel *io, GIOCondition condition, void *cnt) { gchar buf[512]; gsize nbr; t_message msg; debug("listen_from_server()"); (void) condition; if (g_io_channel_read(io, buf, CLIENT_READ_BUF_SIZE, &nbr) != G_IO_ERROR_NONE) { g_io_channel_close(io); return (-1); } buf[nbr] = '\0'; if (nbr > 0) { extract_msg((char *) buf, &msg); printf("[%s]\n", msg.command); mesg_init(cnt, &msg); insert_mesg_to_list(cnt, EMPTY, "server", trim(buf)); } scrolled_window(cnt, SCROLL_MESG); g_io_add_watch(io, G_IO_IN, listen_from_server, cnt); return (0); }
packet * read_serial (){ for (errors = 0; errors < MAXERRORS; errors ++){ fgets(inbuf, BUFSIZ, dev); if ((extract_msg() < 0) && (printMode == VERBOSE)) printf("ERROR: Corrupt packet.\n"); else return inpacket; usleep(10); } return NULL; }
void PingTalk::evtMsg(const void* data, size_t size) { if(size < sizeof(MsgHeader)) return; MsgHeader* msg = (MsgHeader*)data; size_t rawsize = extract_msg(msg, size-sizeof(MsgHeader)); if(mode == MODE_TALK){ switch(msg->type){ case TYPE_TEXT: printf("%s\n", (char*)(msg+1)); break; case TYPE_FILE_START: printf("pingtalk: start downloading.\n"); printf("open file: %s\n", (char*)(msg+1)); fd_trans = open((char*)(msg+1), O_WRONLY|O_CREAT|O_TRUNC, 0666); if(fd_trans < 0){ perror("pingtalk: open"); fd_trans = 0; return; } mode = MODE_DOWNLOAD; break; } }else if(mode == MODE_DOWNLOAD){ switch(msg->type){ case TYPE_FILE_DATA: #ifdef LOGGING printf("pingtalk: downloading.\n"); #endif write(fd_trans, msg+1, rawsize); break; case TYPE_FILE_FIN: printf("pingtalk: downloading completed.\n"); close(fd_trans); fd_trans = 0; mode = MODE_TALK; break; } } }