source: titan/titan/pic.h @ 15501

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

fix

File size: 3.0 KB
Line 
1#ifndef PIC_H
2#define PIC_H
3
4void debugpic()
5{
6        struct pic* node = pic;
7
8        while(node != NULL)
9        {
10                printf("%s\n", node->name);
11                node = node->next;
12        }
13}
14
15struct pic* addpic(char *name, unsigned char* picbuf, int memfd, unsigned long width, unsigned long height, unsigned long rowbytes, int channels, int timeout, int del, struct pic* last)
16{
17        debug(1000, "in");
18        struct pic *newnode = NULL, *prev = NULL, *node = pic;
19
20        newnode = (struct pic*)malloc(sizeof(struct pic));     
21        if(newnode == NULL)
22        {
23                err("no memory");
24                return NULL;
25        }
26
27        memset(newnode, 0, sizeof(struct pic));
28
29        newnode->name = ostrcat(name, "", 0, 0);
30        newnode->picbuf = picbuf;
31        newnode->memfd = memfd;
32        newnode->width = width;
33        newnode->height = height;
34        newnode->rowbytes = rowbytes;
35        newnode->channels = channels;
36  newnode->timeout = timeout;
37        newnode->del = del;
38
39        if(last == NULL)
40        {
41                while(node != NULL && strcoll(newnode->name, node->name) > 0)
42                {
43                        prev = node;
44                        node = node->next;
45                }
46        }
47        else
48        {
49                prev = last;
50                node = last->next;
51        }
52
53        if(prev == NULL)
54                pic = newnode;
55        else
56                prev->next = newnode;
57
58        newnode->next = node;
59
60        debug(1000, "out");
61        return newnode;
62}
63
64void freepiccontent(struct pic* node)
65{
66        free(node->name);
67        node->name = NULL;
68
69        if(node->memfd >= 0)
70        {
71                freebpamem(node->memfd, node->picbuf, node->width * node->height * node->channels);
72                node->memfd = -1;
73        }
74        else
75                free(node->picbuf);
76
77        node->picbuf = NULL;
78}
79
80void delpic(char* name)
81{
82        debug(1000, "in");
83        struct pic *node = pic, *prev = pic;
84        char* tmpstr = NULL;
85
86        tmpstr = changepicpath(name);
87
88        while(node != NULL)
89        {
90                if(ostrcmp(node->name, tmpstr) == 0)
91                {
92                        if(node == pic)
93                                pic = node->next;
94                        else
95                                prev->next = node->next;
96
97                        freepiccontent(node);
98
99                        free(node);
100                        node = NULL;
101                        break;
102                }
103
104                prev = node;
105                node = node->next;
106        }
107        free(tmpstr);
108        debug(1000, "out");
109}
110
111void delmarkedpic(int del)
112{
113        debug(1000, "in");
114        struct pic *node = pic, *prev = pic;
115
116        while(node != NULL)
117        {
118                if(node->del == del)
119                {
120                        if(node == pic)
121                                pic = node->next;
122                        else
123                                prev->next = node->next;
124
125                        freepiccontent(node);
126
127                        free(node);
128                        node = NULL;
129                        break;
130                }
131
132                prev = node;
133                node = node->next;
134        }
135        debug(1000, "out");
136}
137
138void checkpictimeout()
139{
140  struct pic* node = pic;
141  time_t akttime = time(NULL);
142
143  while(node != NULL)
144  {
145    if(node->timeout != 0 && node->lastaccess + node->timeout < akttime)
146      delpic(node->name);
147    node = node->next;
148  }
149}
150
151struct pic* getpic(char* name)
152{
153        debug(1000, "in");
154        struct pic *node = pic;
155        char* tmpstr = NULL;
156
157        tmpstr = changepicpath(name);
158
159        while(node != NULL)
160        {
161                if(ostrcmp(node->name, tmpstr) == 0)
162                {
163                        debug(1000, "out");
164                        free(tmpstr);
165      node->lastaccess = time(NULL);
166                        return node;
167                }
168
169                node = node->next;
170        }
171        debug(100, "pic not found (name=%s)", name);
172        free(tmpstr);
173        return NULL;
174}
175
176void freepic()
177{
178        debug(1000, "in");
179        struct pic *node = pic, *prev = pic;
180
181        while(node != NULL)
182        {
183                prev = node;
184                node = node->next;
185                if(prev != NULL)
186                        delpic(prev->name);
187        }
188        debug(1000, "out");
189}
190
191#endif
Note: See TracBrowser for help on using the repository browser.