source: titan/plugins/tmc/mediadb.h @ 15743

Last change on this file since 15743 was 15743, checked in by nit, 11 years ago

[titan] update tmc

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