source: titan/titan/pic.h @ 42143

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

[titan] cleanup

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