source: titan/titan/provider.h @ 15272

Last change on this file since 15272 was 14252, checked in by nit, 12 years ago

[titan] fix spinner in channel movemode if only 1 channel exists

File size: 7.0 KB
Line 
1#ifndef PROVIDER_H
2#define PROVIDER_H
3
4int getlastproviderid()
5{
6        debug(1000, "in");
7        int lastid = 0;
8        struct provider *node = provider, *prev = NULL;
9
10        while(node != NULL)
11        {
12                if(lastid < node->providerid)
13                        lastid = node->providerid;
14                prev = node;
15                node = node->next;
16        }
17
18        debug(1000, "out");
19        return lastid;
20}
21
22struct provider* getlastprovider(struct provider* node)
23{
24        debug(1000, "in");
25        struct provider *prev = NULL;
26
27        while(node != NULL)
28        {
29                prev = node;
30                node = node->next;
31        }
32
33        debug(1000, "out");
34        return prev;
35}
36
37int moveproviderdown(struct provider* node)
38{
39        struct provider* prev = NULL, *next = NULL;
40
41        if(node == NULL || provider == NULL)
42        {
43                debug(1000, "NULL detect");
44                return 1;
45        }
46       
47        //only one node
48        if(node->prev == NULL && node->next == NULL)
49                return 0;
50
51        //last node
52        if(node->next == NULL)
53        {
54                if(node->prev != NULL)
55                        node->prev->next = NULL;
56                node->prev = NULL;
57                node->next = provider;
58                provider->prev = node;
59                provider = node;
60                return 0;
61        }
62
63        //haenge node aus
64        if(node->prev != NULL)
65                node->prev->next = node->next;
66        else
67                provider = node->next;
68        node->next->prev = node->prev;
69
70        //save nodes next and prev
71        next = node->next;
72        prev = node->prev;
73
74        //haenge es eine pos nacher ein
75        node->next = next->next;
76        node->prev = next;
77       
78        if(next->next != NULL)
79                next->next->prev = node;
80        next->next = node;
81
82        status.writeprovider = 1;
83        return 0;
84}
85
86int moveproviderup(struct provider* node)
87{
88        struct provider* prev = NULL, *next = NULL, *last = NULL;
89
90        if(node == NULL || provider == NULL)
91        {
92                debug(1000, "NULL detect");
93                return 1;
94        }
95       
96        //only one node
97        if(node->prev == NULL && node->next == NULL)
98                return 0;
99
100        //first node
101        if(node->prev == NULL)
102        {
103                last = getlastprovider(provider);
104
105                if(node->next != NULL)
106                        node->next->prev = NULL;
107                provider = node->next;
108                node->next = NULL;
109                last->next = node;
110                node->prev = last;
111                return 0;
112        }
113
114        //haenge node aus
115        node->prev->next = node->next;
116        if(node->next != NULL)
117                node->next->prev = node->prev;
118
119        //save nodes next and prev
120        next = node->next;
121        prev = node->prev;
122
123        //haenge es eine pos voher ein
124        node->next = prev;
125        node->prev = prev->prev;
126       
127        if(prev->prev != NULL)
128                prev->prev->next = node;
129        else
130                provider = node;
131        prev->prev = node;
132
133        status.writeprovider = 1;
134        return 0;
135}
136
137struct provider* addprovider(char *line, int count, struct provider* last)
138{
139        //debug(1000, "in");
140        struct provider *newnode = NULL, *prev = NULL, *node = provider;
141        char *name = NULL;
142        int ret = 0;
143
144        newnode = (struct provider*)malloc(sizeof(struct provider));   
145        if(newnode == NULL)
146        {
147                err("no memory");
148                return NULL;
149        }
150
151        name = malloc(MINMALLOC);
152        if(name == NULL)
153        {
154                err("no memory");
155                free(newnode);
156                return NULL;
157        }
158
159        memset(newnode, 0, sizeof(struct provider));
160        status.writeprovider = 1;
161
162        ret = sscanf(line, "%d#%[^#]#%d", &newnode->providerid, name, &newnode->flag);
163        if(ret != 3)
164        {
165                if(count > 0)
166                {
167                        err("providerlist line %d not ok", count);
168                }
169                else
170                {
171                        err("add provider");
172                }
173                free(name);
174                free(newnode);
175                return NULL;
176        }
177
178        newnode->name = ostrcat(name, "", 1, 0);
179
180        if(last == NULL)
181        {
182                while(node != NULL && strcoll(newnode->name, node->name) > 0)
183                {
184                        prev = node;
185                        node = node->next;
186                }
187        }
188        else
189        {
190                prev = last;
191                node = last->next;
192        }
193
194        if(prev == NULL)
195                provider = newnode;
196        else
197        {
198                prev->next = newnode;
199                newnode->prev = prev;
200        }
201        newnode->next = node;
202        if(node != NULL) node->prev = newnode;
203
204        //debug(1000, "out");
205        return newnode;
206}
207
208int readprovider(const char* filename)
209{
210        debug(1000, "in");
211        FILE *fd = NULL;
212        char *fileline = NULL, *tmpstr = NULL, *tmpstr0 = NULL, *tmpstr1 = NULL;
213        int linecount = 0, treffer0 = 1, treffer1 = 1;
214        struct provider* last = NULL, *tmplast = NULL;
215       
216        tmpstr0 = getconfig("channellist", NULL);
217        tmpstr1 = getconfig("rchannellist", NULL);
218        if(ostrncmp("(PROVIDER)-", tmpstr0, 11) == 0) treffer0 = 0;
219        if(ostrncmp("(PROVIDER)-", tmpstr1, 11) == 0) treffer1 = 0;
220
221        fileline = malloc(MINMALLOC);
222        if(fileline == NULL)
223        {
224                err("no memory");
225                return 1;
226        }
227
228        fd = fopen(filename, "r");
229        if(fd == NULL)
230        {
231                perr("can't open %s", filename);
232                free(fileline);
233                return 1;
234        }
235
236        while(fgets(fileline, MINMALLOC, fd) != NULL)
237        {
238                if(fileline[0] == '#' || fileline[0] == '\n')
239                        continue;
240                if(fileline[strlen(fileline) - 1] == '\n')
241                        fileline[strlen(fileline) - 1] = '\0';
242                if(fileline[strlen(fileline) - 1] == '\r')
243                        fileline[strlen(fileline) - 1] = '\0';
244
245                linecount++;
246
247                if(last == NULL) last = tmplast;
248                last = addprovider(fileline, linecount, last);
249                if(last != NULL)
250                {
251                        tmplast = last;
252                        tmpstr = ostrcat("(PROVIDER)-", last->name, 0, 0);
253
254                        if(treffer0 == 0 && ostrcmp(tmpstr, tmpstr0) == 0)
255                                treffer0 = 1;
256                        if(treffer1 == 0 && ostrcmp(tmpstr, tmpstr1) == 0)
257                                treffer1 = 1;
258                        free(tmpstr); tmpstr = NULL;
259                }
260        }
261       
262        if(treffer0 == 0) delconfig("channellist");
263        if(treffer1 == 0) delconfig("rchannellist");
264
265        status.writeprovider = 0;
266        free(fileline);
267        fclose(fd);
268        return 0;
269}
270
271void delprovider(int providerid)
272{
273        debug(1000, "in");
274        struct provider *node = provider, *prev = provider;
275
276        while(node != NULL)
277        {
278                if(node->providerid == providerid)
279                {
280                        status.writeprovider = 1;
281                        if(node == provider)
282                        {
283                                provider = node->next;
284                                if(provider != NULL)
285                                        provider->prev = NULL;
286                        }
287                        else
288                        {
289                                prev->next = node->next;
290                                if(node->next != NULL)
291                                        node->next->prev = prev;
292                        }
293
294                        free(node->name);
295                        node->name = NULL;
296
297                        free(node);
298                        node = NULL;
299                        break;
300                }
301
302                prev = node;
303                node = node->next;
304        }
305        debug(1000, "out");
306}
307
308void delprovidernotused(struct provider* node)
309{
310        struct channel* chnode = channel;
311
312        if(node == NULL) return;
313
314        while(chnode != NULL)
315        {
316                if(chnode->providerid == node->providerid)
317                        return;
318                chnode = chnode->next;
319        }
320        delprovider(node->providerid);
321}
322
323struct provider* getproviderbyname(char* name)
324{
325        debug(1000, "in");
326        struct provider *node = provider;
327
328        while(node != NULL)
329        {
330                if(ostrcmp(node->name, name) == 0)
331                {
332                        debug(1000, "out");
333                        return node;
334                }
335
336                node = node->next;
337        }
338        debug(100, "provider not found (name=%s)", name);
339        return NULL;
340}
341
342struct provider* getprovider(int providerid)
343{
344        //debug(1000, "in");
345        struct provider *node = provider;
346
347        while(node != NULL)
348        {
349                if(node->providerid == providerid)
350                {
351                        //debug(1000, "out");
352                        return node;
353                }
354
355                node = node->next;
356        }
357        debug(100, "provider not found (providerid=%d)", providerid);
358        return NULL;
359}
360
361void freeprovider()
362{
363        debug(1000, "in");
364        struct provider *node = provider, *prev = provider;
365
366        while(node != NULL)
367        {
368                prev = node;
369                node = node->next;
370                if(prev != NULL)
371                        delprovider(prev->providerid);
372        }
373        debug(1000, "out");
374}
375
376int writeprovider(const char *filename)
377{
378        debug(1000, "in");
379        FILE *fd = NULL;
380        struct provider *node = provider;
381        int ret;
382
383        fd = fopen(filename, "w");
384        if(fd == NULL)
385        {
386                perr("can't open %s", filename);
387                return 1;
388        }
389
390        while(node != NULL)
391        {
392                ret = fprintf(fd, "%d#%s#%d\n", node->providerid, node->name, node->flag);
393                if(ret < 0)
394                {
395                        perr("writting file %s", filename);
396                }
397                node = node->next;
398        }
399
400        fclose(fd);
401        debug(1000, "out");
402        return 0;
403}
404
405#endif
406
Note: See TracBrowser for help on using the repository browser.