From: <bre...@us...> - 2008-09-24 20:54:13
|
Revision: 1253 http://conky.svn.sourceforge.net/conky/?rev=1253&view=rev Author: brenden1 Date: 2008-09-24 20:53:58 +0000 (Wed, 24 Sep 2008) Log Message: ----------- oops; forgot to add moc.[ch] Added Paths: ----------- trunk/conky1/src/moc.c trunk/conky1/src/moc.h Added: trunk/conky1/src/moc.c =================================================================== --- trunk/conky1/src/moc.c (rev 0) +++ trunk/conky1/src/moc.c 2008-09-24 20:53:58 UTC (rev 1253) @@ -0,0 +1,128 @@ +/* MOC Conky integration + * + * Please see COPYING for details + * + * Copyright (c) 2008, Henri Häkkinen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "conky.h" +#include "moc.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +void init_moc(struct moc_s *moc) +{ + moc->state = NULL; + moc->file = NULL; + moc->title = NULL; + moc->artist = NULL; + moc->song = NULL; + moc->album = NULL; + moc->totaltime = NULL; + moc->timeleft = NULL; + moc->curtime = NULL; + moc->bitrate = NULL; + moc->rate = NULL; +} + +static void update_infos(struct moc_s *moc) +{ + FILE *fp; + + free_moc(moc); + fp = popen("mocp -i", "r"); + if (!fp) { + moc->state = strndup("Can't run 'mocp -i'", text_buffer_size); + return; + } + + while (1) { + char line[100]; + char *p; + + /* Read a line from the pipe and strip the possible '\n'. */ + if (!fgets(line, 100, fp)) + break; + if ((p = strrchr(line, '\n'))) + *p = '\0'; + + /* Parse infos. */ + if (strncmp(line, "State:", 6) == 0) + moc->state = strndup(line + 7, text_buffer_size); + else if (strncmp(line, "File:", 5) == 0) + moc->file = strndup(line + 6, text_buffer_size); + else if (strncmp(line, "Title:", 6) == 0) + moc->title = strndup(line + 7, text_buffer_size); + else if (strncmp(line, "Artist:", 7) == 0) + moc->artist = strndup(line + 8, text_buffer_size); + else if (strncmp(line, "SongTitle:", 10) == 0) + moc->song = strndup(line + 11, text_buffer_size); + else if (strncmp(line, "Album:", 6) == 0) + moc->album = strndup(line + 7, text_buffer_size); + else if (strncmp(line, "TotalTime:", 10) == 0) + moc->totaltime = strndup(line + 11, text_buffer_size); + else if (strncmp(line, "TimeLeft:", 9) == 0) + moc->timeleft = strndup(line + 10, text_buffer_size); + else if (strncmp(line, "CurrentTime:", 12) == 0) + moc->curtime = strndup(line + 13, text_buffer_size); + else if (strncmp(line, "Bitrate:", 8) == 0) + moc->bitrate = strndup(line + 9, text_buffer_size); + else if (strncmp(line, "Rate:", 5) == 0) + moc->rate = strndup(line + 6, text_buffer_size); + } + + pclose(fp); +} + +void *update_moc(void *arg) +{ + struct moc_s *moc; + + if (arg == NULL) { + CRIT_ERR("update_moc called with a null argument!"); + } + + moc = (struct moc_s *) arg; + + while (1) { + timed_thread_lock(moc->timed_thread); + update_infos(moc); + timed_thread_unlock(moc->timed_thread); + if (timed_thread_test(moc->timed_thread)) { + timed_thread_exit(moc->timed_thread); + } + } + /* never reached */ +} + +void free_moc(struct moc_s *moc) +{ + free(moc->state); + free(moc->file); + free(moc->title); + free(moc->artist); + free(moc->song); + free(moc->album); + free(moc->totaltime); + free(moc->timeleft); + free(moc->curtime); + free(moc->bitrate); + free(moc->rate); + + init_moc(moc); +} + Property changes on: trunk/conky1/src/moc.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native Added: trunk/conky1/src/moc.h =================================================================== --- trunk/conky1/src/moc.h (rev 0) +++ trunk/conky1/src/moc.h 2008-09-24 20:53:58 UTC (rev 1253) @@ -0,0 +1,45 @@ +/* MOC Conky integration + * + * Please see COPYING for details + * + * Copyright (c) 2008, Henri Häkkinen + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MOC_H_ +#define MOC_H_ + +#include "timed_thread.h" + +struct moc_s { + char *state; + char *file; + char *title; + char *artist; + char *song; + char *album; + char *totaltime; + char *timeleft; + char *curtime; + char *bitrate; + char *rate; + timed_thread *timed_thread; +}; + +void init_moc(struct moc_s *moc); +void *update_moc(void *) __attribute__((noreturn)); +void free_moc(struct moc_s *moc); + +#endif /* MOC_H_ */ + Property changes on: trunk/conky1/src/moc.h ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bre...@us...> - 2008-09-24 20:55:23
|
Revision: 1254 http://conky.svn.sourceforge.net/conky/?rev=1254&view=rev Author: brenden1 Date: 2008-09-24 20:55:16 +0000 (Wed, 24 Sep 2008) Log Message: ----------- updating props Property Changed: ---------------- trunk/conky1/src/moc.c trunk/conky1/src/moc.h Property changes on: trunk/conky1/src/moc.c ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Rev Property changes on: trunk/conky1/src/moc.h ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Rev This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bre...@us...> - 2008-09-24 20:56:21
|
Revision: 1255 http://conky.svn.sourceforge.net/conky/?rev=1255&view=rev Author: brenden1 Date: 2008-09-24 20:56:09 +0000 (Wed, 24 Sep 2008) Log Message: ----------- add $Id$ to moc stuff Modified Paths: -------------- trunk/conky1/src/moc.c trunk/conky1/src/moc.h Modified: trunk/conky1/src/moc.c =================================================================== --- trunk/conky1/src/moc.c 2008-09-24 20:55:16 UTC (rev 1254) +++ trunk/conky1/src/moc.c 2008-09-24 20:56:09 UTC (rev 1255) @@ -15,7 +15,8 @@ * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ + * + * $Id$ */ #include "conky.h" #include "moc.h" Modified: trunk/conky1/src/moc.h =================================================================== --- trunk/conky1/src/moc.h 2008-09-24 20:55:16 UTC (rev 1254) +++ trunk/conky1/src/moc.h 2008-09-24 20:56:09 UTC (rev 1255) @@ -15,7 +15,8 @@ * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ + * + * $Id$ */ #ifndef MOC_H_ #define MOC_H_ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bre...@us...> - 2008-09-25 03:11:35
|
Revision: 1257 http://conky.svn.sourceforge.net/conky/?rev=1257&view=rev Author: brenden1 Date: 2008-09-25 03:11:24 +0000 (Thu, 25 Sep 2008) Log Message: ----------- improving IMAP IDLE support Modified Paths: -------------- trunk/conky1/src/conky.c trunk/conky1/src/timed_thread.c trunk/conky1/src/timed_thread.h Modified: trunk/conky1/src/conky.c =================================================================== --- trunk/conky1/src/conky.c 2008-09-24 21:04:29 UTC (rev 1256) +++ trunk/conky1/src/conky.c 2008-09-25 03:11:24 UTC (rev 1257) @@ -1647,6 +1647,33 @@ return mail; } +int imap_command(int sockfd, char *command, char *response, const char *verify) +{ + struct timeval timeout; + fd_set fdset; + int res, numbytes; + if (send(sockfd, command, strlen(command), 0) == -1) { + perror("send"); + return -1; + } + timeout.tv_sec = 60; // 60 second timeout i guess + timeout.tv_usec = 0; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); + res = select(sockfd + 1, &fdset, NULL, NULL, &timeout); + if (res > 0) { + if ((numbytes = recv(sockfd, response, MAXDATASIZE - 1, 0)) == -1) { + perror("recv"); + return -1; + } + } + response[numbytes] = '\0'; + if (strstr(response, verify) == NULL) { + return -1; + } + return 0; +} + void *imap_thread(void *arg) { int sockfd, numbytes; @@ -1663,6 +1690,7 @@ struct sockaddr_in their_addr; // connector's address information struct mail_s *mail = (struct mail_s *)arg; int has_idle = 0; + int threadfd = timed_thread_readfd(mail->p_timed_thread); #ifdef HAVE_GETHOSTBYNAME_R if (gethostbyname_r(mail->host, &he, hostbuff, sizeof(hostbuff), &he_res, &he_errno)) { // get the host info @@ -1733,29 +1761,10 @@ strncat(sendbuf, " ", MAXDATASIZE - strlen(sendbuf) - 1); strncat(sendbuf, mail->pass, MAXDATASIZE - strlen(sendbuf) - 1); strncat(sendbuf, "\r\n", MAXDATASIZE - strlen(sendbuf) - 1); - if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) { - perror("send a1"); + if (imap_command(sockfd, sendbuf, recvbuf, "a1 OK")) { fail++; break; } - timeout.tv_sec = 60; // 60 second timeout i guess - timeout.tv_usec = 0; - FD_ZERO(&fdset); - FD_SET(sockfd, &fdset); - res = select(sockfd + 1, &fdset, NULL, NULL, &timeout); - if (res > 0) { - if ((numbytes = recv(sockfd, recvbuf, MAXDATASIZE - 1, 0)) == -1) { - perror("recv a1"); - fail++; - break; - } - } - recvbuf[numbytes] = '\0'; - if (strstr(recvbuf, "a1 OK") == NULL) { - ERR("IMAP server login failed: %s", recvbuf); - fail++; - break; - } if (strstr(recvbuf, " IDLE ") != NULL) { has_idle = 1; } @@ -1764,29 +1773,10 @@ strncat(sendbuf, mail->folder, MAXDATASIZE - strlen(sendbuf) - 1); strncat(sendbuf, " (MESSAGES UNSEEN)\r\n", MAXDATASIZE - strlen(sendbuf) - 1); - if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) { - perror("send a2"); + if (imap_command(sockfd, sendbuf, recvbuf, "a2 OK")) { fail++; break; } - timeout.tv_sec = 60; // 60 second timeout i guess - timeout.tv_usec = 0; - FD_ZERO(&fdset); - FD_SET(sockfd, &fdset); - res = select(sockfd + 1, &fdset, NULL, NULL, &timeout); - if (res > 0) { - if ((numbytes = recv(sockfd, recvbuf, MAXDATASIZE - 1, 0)) == -1) { - perror("recv a2"); - fail++; - break; - } - } - recvbuf[numbytes] = '\0'; - if (strstr(recvbuf, "a2 OK") == NULL) { - ERR("IMAP status failed: %s", recvbuf); - fail++; - break; - } // now we get the data reply = strstr(recvbuf, " (MESSAGES "); @@ -1817,70 +1807,32 @@ strncpy(sendbuf, "a4 SELECT ", MAXDATASIZE); strncat(sendbuf, mail->folder, MAXDATASIZE - strlen(sendbuf) - 1); strncat(sendbuf, "\r\n", MAXDATASIZE - strlen(sendbuf) - 1); - if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) { - perror("send a4"); + if (imap_command(sockfd, sendbuf, recvbuf, "a4 OK")) { fail++; break; } - timeout.tv_sec = 60; // 60 second timeout i guess - timeout.tv_usec = 0; - FD_ZERO(&fdset); - FD_SET(sockfd, &fdset); - res = select(sockfd + 1, &fdset, NULL, NULL, &timeout); - if (res > 0) { - if ((numbytes = recv(sockfd, recvbuf, MAXDATASIZE - 1, 0)) == -1) { - perror("recv a4"); - fail++; - break; - } - } - recvbuf[numbytes] = '\0'; - if (strstr(recvbuf, "a4 OK") == NULL) { - ERR("IMAP status failed: %s", recvbuf); - fail++; - break; - } strncpy(sendbuf, "a5 IDLE\r\n", MAXDATASIZE); - if (send(sockfd, sendbuf, strlen(sendbuf), 0) == -1) { - perror("send a5"); + if (imap_command(sockfd, sendbuf, recvbuf, "+ idling")) { fail++; break; } - timeout.tv_sec = 60; // 60 second timeout i guess - timeout.tv_usec = 0; - FD_ZERO(&fdset); - FD_SET(sockfd, &fdset); - res = select(sockfd + 1, &fdset, NULL, NULL, &timeout); - if (res > 0) { - if ((numbytes = recv(sockfd, recvbuf, MAXDATASIZE - 1, 0)) == -1) { - perror("recv a5"); - fail++; - break; - } - } - recvbuf[numbytes] = '\0'; - if (strstr(recvbuf, "+ idling") == NULL) { - ERR("IMAP status failed: %s", recvbuf); - fail++; - break; - } recvbuf[0] = '\0'; while (1) { FD_ZERO(&fdset); FD_SET(sockfd, &fdset); + FD_SET(threadfd, &fdset); + res = pselect(MAX(sockfd + 1, threadfd + 1), &fdset, NULL, NULL, NULL, &oldmask); if (timed_thread_test(mail->p_timed_thread)) { - break; + timed_thread_exit(mail->p_timed_thread); } - res = pselect(sockfd + 1, &fdset, NULL, NULL, NULL, &oldmask); - if (res == -1 && errno == EINTR) { + if ((res == -1 && errno == EINTR) || FD_ISSET(threadfd, &fdset)) { timed_thread_exit(mail->p_timed_thread); } else if (res > 0) { if ((numbytes = recv(sockfd, recvbuf, MAXDATASIZE - 1, 0)) == -1) { perror("recv idling"); fail++; - printf("fail\n"); break; } } else { @@ -1888,9 +1840,12 @@ } recvbuf[numbytes] = '\0'; if (strlen(recvbuf) > 2) { - unsigned long messages, unseen; + unsigned long messages, recent; char *buf = recvbuf; buf = strstr(buf, "EXISTS"); + while (buf && strlen(buf) > 1 && strstr(buf + 1, "EXISTS")) { + buf = strstr(buf + 1, "EXISTS"); + } if (buf) { // back up until we reach '*' while (buf >= recvbuf && buf[0] != '*') { @@ -1904,14 +1859,20 @@ } buf = recvbuf; buf = strstr(buf, "RECENT"); + while (buf && strlen(buf) > 1 && strstr(buf + 1, "RECENT")) { + buf = strstr(buf + 1, "RECENT"); + } if (buf) { // back up until we reach '*' while (buf >= recvbuf && buf[0] != '*') { buf--; } - if (sscanf(buf, "* %lu RECENT\r\n", &unseen) == 1) { + if (sscanf(buf, "* %lu RECENT\r\n", &recent) == 1) { + /* + * if we have > 0 recent, re-check the unseen count + */ timed_thread_lock(mail->p_timed_thread); - mail->unseen = unseen; + mail->unseen = recent; timed_thread_unlock(mail->p_timed_thread); } } Modified: trunk/conky1/src/timed_thread.c =================================================================== --- trunk/conky1/src/timed_thread.c 2008-09-24 21:04:29 UTC (rev 1256) +++ trunk/conky1/src/timed_thread.c 2008-09-25 03:11:24 UTC (rev 1257) @@ -27,6 +27,7 @@ #include <assert.h> #include <errno.h> #include <time.h> +#include <unistd.h> #ifndef HAVE_CLOCK_GETTIME #include <sys/time.h> #endif @@ -47,6 +48,7 @@ void *arg; /* thread function argument */ struct timespec interval_time; /* interval_usecs as a struct timespec */ struct timespec wait_time; /* absolute future time next timed_thread_test will wait until */ + int pipefd[2]; }; /* linked list of created threads */ @@ -59,6 +61,11 @@ static timed_thread_list *p_timed_thread_list_head = NULL; static timed_thread_list *p_timed_thread_list_tail = NULL; +int timed_thread_readfd(timed_thread *p_timed_thread) +{ + return p_timed_thread->pipefd[0]; +} + static int now(struct timespec *abstime) { #ifndef HAVE_CLOCK_GETTIME @@ -96,6 +103,11 @@ return NULL; } + /* create thread pipe (used to tell threads to die) */ + if (pipe(p_timed_thread->pipefd)) { + return NULL; + } + /* init attributes, e.g. joinable thread */ pthread_attr_init(&p_timed_thread->thread_attr); pthread_attr_setdetachstate(&p_timed_thread->thread_attr, @@ -147,6 +159,7 @@ pthread_mutex_lock(&p_timed_thread->runnable_mutex); pthread_cond_signal(&p_timed_thread->runnable_cond); pthread_mutex_unlock(&p_timed_thread->runnable_mutex); + write(p_timed_thread->pipefd[1], "die", 3); /* join the terminating thread */ if (p_timed_thread->thread) { @@ -236,6 +249,9 @@ { assert(p_timed_thread != NULL); + close(p_timed_thread->pipefd[0]); + close(p_timed_thread->pipefd[1]); + pthread_exit(NULL); } Modified: trunk/conky1/src/timed_thread.h =================================================================== --- trunk/conky1/src/timed_thread.h 2008-09-24 21:04:29 UTC (rev 1256) +++ trunk/conky1/src/timed_thread.h 2008-09-25 03:11:24 UTC (rev 1257) @@ -63,4 +63,7 @@ /* destroy all registered timed threads */ void timed_thread_destroy_registered_threads(void); +/* returns read file descriptor for thread pipe */ +int timed_thread_readfd(timed_thread *p_timed_thread); + #endif /* #ifdef _TIMED_THREAD_H_ */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |