source: titan/titan/newsletter.h @ 39651

Last change on this file since 39651 was 39152, checked in by obi, 7 years ago

fix first newsletter

File size: 6.3 KB
Line 
1#ifndef NEWSLETTER_H
2#define NEWSLETTER_H
3
4struct newsletter* addnewsletter(char *line, int count, struct newsletter* last)
5{
6        struct newsletter *newnode = NULL, *prev = NULL, *node = newsletter;
7        char *date = NULL, *title = NULL, *text = NULL;
8        int ret = 0;
9
10        newnode = (struct newsletter*)calloc(1, sizeof(struct newsletter));
11        if(newnode == NULL)
12        {
13                err("no memory");
14                return NULL;
15        }
16
17        date = malloc(MINMALLOC);
18        if(date == NULL)
19        {
20                err("no memory");
21                free(newnode);
22                return NULL;
23        }
24
25        title = malloc(MINMALLOC);
26        if(title == NULL)
27        {
28                err("no memory");
29                free(date);
30                free(newnode);
31                return NULL;
32        }
33
34        text = malloc(MINMALLOC * 10);
35        if(text == NULL)
36        {
37                err("no memory");
38                free(date);
39                free(title);
40                free(newnode);
41                return NULL;
42        }
43
44        ret = sscanf(line, "%lu#%[^#]#%[^#]#%[^#]", &newnode->nr, date, title, text);
45        if(ret != 4)
46        {
47                if(count > 0)
48                {
49                        err("newsletter line %d not ok or double", count);
50                }
51                else
52                {
53                        err("add newsletter");
54                }
55                free(date);
56                free(title);
57                free(text);
58                free(newnode);
59                return NULL;
60        }
61
62        newnode->date = ostrshrink(date);
63        newnode->title = ostrshrink(title);
64        newnode->text = ostrshrink(text);
65        newnode->text = string_replace_all("\\n", "\n", newnode->text, 1);
66
67        if(last == NULL)
68        {
69                while(node != NULL)
70                {
71                        prev = node;
72                        node = node->next;
73                }
74        }
75        else
76        {
77                prev = last;
78                node = last->next;
79        }
80
81        if(prev == NULL)
82                newsletter = newnode;
83        else
84                prev->next = newnode;
85
86        newnode->next = node;
87
88        return newnode;
89}
90
91int readnewsletter()
92{
93        FILE *fd = NULL;
94        char* fileline = NULL;
95        int linecount = 0, len = 0;
96        struct newsletter* last = NULL, *tmplast = NULL;
97        char* newsletterfile = "/tmp/newsletter.txt";
98
99        unlink(newsletterfile);
100
101//      if(checkbox("WHITEBOX") == 1)
102//              gethttp("atemio.dyndns.tv", "/mediathek/newsletter.crenova.txt", 80, newsletterfile, HTTPAUTH, 5000, NULL, 0);
103//      else
104                gethttp("atemio.dyndns.tv", "/mediathek/newsletter.txt", 80, newsletterfile, HTTPAUTH, 5000, NULL, 0);
105       
106        fileline = malloc(MINMALLOC);
107        if(fileline == NULL)
108        {
109                err("no memory");
110                return 1;
111        }
112
113        fd = fopen(newsletterfile, "r");
114        if(fd == NULL)
115        {
116                perr("can't open %s", newsletterfile);
117                free(fileline);
118                return 1;
119        }
120
121        while(fgets(fileline, MINMALLOC, fd) != NULL)
122        {
123                if(fileline[0] == '#' || fileline[0] == '\n')
124                        continue;
125                len = strlen(fileline) - 1;
126                if(len >= 0 && fileline[len] == '\n')
127                        fileline[len] = '\0';
128                len--;
129                if(len >= 0 && fileline[len] == '\r')
130                        fileline[len] = '\0';
131
132                linecount++;
133
134                if(last == NULL) last = tmplast;
135                last = addnewsletter(fileline, linecount, last);
136                if(last != NULL) tmplast = last;
137        }
138
139        free(fileline);
140        fclose(fd);
141        unlink(newsletterfile);
142        return 0;
143}
144
145int delnewsletter(struct newsletter* nnode)
146{
147        int ret = 1;
148        struct newsletter *node = newsletter, *prev = newsletter;
149
150        while(node != NULL)
151        {
152                if(nnode == node)
153                {
154                        ret = 0;
155                        if(node == newsletter)
156                                newsletter = node->next;
157                        else
158                                prev->next = node->next;
159
160                        free(node->date);
161                        node->date = NULL;
162
163                        free(node->title);
164                        node->date = NULL;
165
166                        free(node->text);
167                        node->text = NULL;
168
169                        free(node);
170                        node = NULL;
171
172                        break;
173                }
174
175                prev = node;
176                node = node->next;
177        }
178
179        return ret;
180}
181
182void freenewsletter()
183{
184        struct newsletter *node = newsletter, *prev = newsletter;
185
186        while(node != NULL)
187        {
188                prev = node;
189                node = node->next;
190                if(prev != NULL)
191                        delnewsletter(prev);
192        }
193}
194
195void screennewsletter()
196{
197        int rcret = -1;
198        struct skin* loading = getscreen("loading");
199        struct skin* skinnewsletter = getscreen("newsletter");
200        struct skin* listbox = getscreennode(skinnewsletter, "listbox");
201        struct skin* tmp = NULL;
202        struct newsletter* node = NULL;
203        char* tmpstr = NULL;
204
205        drawscreen(loading, 0, 0);
206
207        m_lock(&status.newslettermutex, 19);
208        long unsigned lastnewsletter = getconfiglu("lastnewsletter", NULL);
209
210        readnewsletter();
211        listbox->aktline = 1;
212        listbox->aktpage = -1;
213
214        node = newsletter;
215
216        while(node != NULL)
217        {
218                tmp = addlistbox(skinnewsletter, listbox, tmp, 1);
219                if(tmp != NULL)
220                {
221                        tmpstr = ostrcat(node->title, NULL, 0, 0);
222                        tmpstr = ostrcat(tmpstr, " - ", 1, 0);
223                        tmpstr = ostrcat(tmpstr, node->date, 1, 0);
224
225                        changetext(tmp, tmpstr);
226                        free(tmpstr); tmpstr = NULL;
227                        tmp->del = 1;
228                        tmp->handle = (char*)node;
229                }
230
231                if(node->nr > lastnewsletter)
232                        addconfiglu("lastnewsletter", node->nr);
233
234                node = node->next;
235        }
236
237        drawscreen(skinnewsletter, 0, 0);
238        addscreenrc(skinnewsletter, listbox);
239
240        while(1)
241        {
242                rcret = waitrc(skinnewsletter, 0, 0);
243
244                if(rcret == getrcconfigint("rcexit", NULL)) break;
245                if(rcret == getrcconfigint("rcok", NULL))
246                {
247                        if(listbox->select != NULL && listbox->select->handle != NULL)
248                        {
249                                tmpstr = ostrcat(((struct newsletter*)listbox->select->handle)->title, NULL, 0, 0);
250                                tmpstr = ostrcat(tmpstr, " - ", 1, 0);
251                                tmpstr = ostrcat(tmpstr, ((struct newsletter*)listbox->select->handle)->date, 1, 0);
252                                textbox(tmpstr, ((struct newsletter*)listbox->select->handle)->text, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1200, 600, 0, 2);
253                                free(tmpstr); tmpstr = NULL;
254                                drawscreen(skinnewsletter, 0, 0);
255                        }
256                }
257        }
258
259        delmarkedscreennodes(skinnewsletter, 1);
260        freenewsletter();
261        delownerrc(skinnewsletter);
262        clearscreen(skinnewsletter);
263        m_unlock(&status.newslettermutex, 19);
264}
265
266void newsletterthreadfunc(struct stimerthread* self)
267{
268        char* tmpstr = NULL;
269        struct newsletter* node = NULL;
270
271        if(self == NULL) return;
272
273        debug(427, "start newsletter thread");
274
275        while(self->aktion != STOP)
276        {
277                int count = 0, ret = 0;
278
279                if(status.standby == 0)
280                {
281                        m_lock(&status.newslettermutex, 19);
282                        long unsigned lastnewsletter = getconfiglu("lastnewsletter", NULL);
283                        readnewsletter();
284                        node = newsletter;
285
286                        if(node != NULL && node->nr > lastnewsletter)
287                        {
288                                tmpstr = ostrcat(node->title, NULL, 0, 0);
289                                tmpstr = ostrcat(tmpstr, " - ", 1, 0);
290                                tmpstr = ostrcat(tmpstr, node->date, 1, 0);
291
292                                ret = textbox(tmpstr, node->text, _("OK"), getrcconfigint("rcok", NULL), _("EXIT"), getrcconfigint("rcexit", NULL), NULL, 0, NULL, 0, 1200, 700, 15, 2);
293                                free(tmpstr); tmpstr = NULL;
294
295                                //mark only if no timeout
296                                if(ret != 0)
297                                {
298                                        addconfiglu("lastnewsletter", node->nr);
299                                        writeallconfig(3);
300                                }
301                        }
302
303                        freenewsletter();
304                        m_unlock(&status.newslettermutex, 19);
305                }
306
307                //wait 1h
308                while(count < 3600)
309                {
310                        if(self->aktion == STOP) break;
311                        sleep(1);
312                        count++;
313                }
314        }
315
316        debug(427, "end newsletter thread");
317}
318
319#endif
Note: See TracBrowser for help on using the repository browser.