support Pause/Resume with new connection
[framework/web/download-provider.git] / src / download-provider-utils.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <time.h>
6 #include <sys/time.h>
7 #include <sys/socket.h>
8
9 #include "download-provider-config.h"
10 #include "download-provider-notification.h"
11 #include "download-provider-pthread.h"
12 #include "download-provider-log.h"
13
14 extern fd_set g_download_provider_socket_readset;
15 extern fd_set g_download_provider_socket_exceptset;
16
17 int get_download_request_id(void)
18 {
19         int uniquetime = 0;
20         struct timeval tval;
21         static int last_uniquetime = 0;
22
23         do {
24                 uniquetime = (int)time(NULL);
25                 gettimeofday(&tval, NULL);
26                 if (tval.tv_usec == 0)
27                         uniquetime = uniquetime + (tval.tv_usec + 1) % 0xfffff;
28                 else
29                         uniquetime = uniquetime + tval.tv_usec;
30                 TRACE_DEBUG_INFO_MSG("ID : %d", uniquetime);
31         } while (last_uniquetime == uniquetime);
32         last_uniquetime = uniquetime;   // store
33         return uniquetime;
34 }
35
36 void clear_socket(download_clientinfo *clientinfo)
37 {
38         if (!clientinfo)
39                 return;
40         if (clientinfo->clientfd) {
41                 FD_CLR(clientinfo->clientfd, &g_download_provider_socket_readset);
42                 FD_CLR(clientinfo->clientfd, &g_download_provider_socket_exceptset);
43                 shutdown(clientinfo->clientfd, 0);
44                 fdatasync(clientinfo->clientfd);
45                 close(clientinfo->clientfd);
46                 clientinfo->clientfd = 0;
47         }
48 }
49
50 void clear_clientinfo(download_clientinfo *clientinfo)
51 {
52         TRACE_DEBUG_INFO_MSG("[TEST] clear [%p]",clientinfo);
53         // clear this slot
54         if (!clientinfo)
55                 return;
56
57         clear_socket(clientinfo);
58
59         CLIENT_MUTEX_LOCK(&(clientinfo->client_mutex));
60         if (clientinfo->requestinfo) {
61                 clientinfo->requestinfo->requestid = 0;
62                 if (clientinfo->requestinfo->client_packagename.length > 0
63                         && clientinfo->requestinfo->client_packagename.str)
64                         free(clientinfo->requestinfo->client_packagename.str);
65                 clientinfo->requestinfo->client_packagename.str = NULL;
66                 if (clientinfo->requestinfo->url.str)
67                         free(clientinfo->requestinfo->url.str);
68                 clientinfo->requestinfo->url.str = NULL;
69                 if (clientinfo->requestinfo->install_path.str)
70                         free(clientinfo->requestinfo->install_path.str);
71                 clientinfo->requestinfo->install_path.str = NULL;
72                 if (clientinfo->requestinfo->filename.str)
73                         free(clientinfo->requestinfo->filename.str);
74                 clientinfo->requestinfo->filename.str = NULL;
75                 if (clientinfo->requestinfo->service_data.str)
76                         free(clientinfo->requestinfo->service_data.str);
77                 clientinfo->requestinfo->service_data.str = NULL;
78                 if (clientinfo->requestinfo->headers.rows) {
79                         int i = 0;
80                         for (i = 0; i < clientinfo->requestinfo->headers.rows;
81                                 i++) {
82                                 if (clientinfo->requestinfo->headers.str[i].str)
83                                         free(clientinfo->requestinfo->headers.
84                                                 str[i].str);
85                                 clientinfo->requestinfo->headers.str[i].str =
86                                         NULL;
87                         }
88                         free(clientinfo->requestinfo->headers.str);
89                         clientinfo->requestinfo->headers.str = NULL;
90                 }
91                 free(clientinfo->requestinfo);
92                 clientinfo->requestinfo = NULL;
93         }
94         if (clientinfo->downloadinginfo)
95                 free(clientinfo->downloadinginfo);
96         clientinfo->downloadinginfo = NULL;
97         if (clientinfo->downloadinfo)
98                 free(clientinfo->downloadinfo);
99         clientinfo->downloadinfo = NULL;
100         if (clientinfo->tmp_saved_path)
101                 free(clientinfo->tmp_saved_path);
102         clientinfo->tmp_saved_path = NULL;
103         if (clientinfo->ui_notification_handle || clientinfo->service_handle)
104                 destroy_appfw_notification(clientinfo);
105         CLIENT_MUTEX_UNLOCK(&(clientinfo->client_mutex));
106         CLIENT_MUTEX_DESTROY(&(clientinfo->client_mutex));
107         memset(clientinfo, 0x00, sizeof(download_clientinfo));
108         free(clientinfo);
109         clientinfo = NULL;
110 }
111
112 void clear_clientinfoslot(download_clientinfo_slot *clientinfoslot)
113 {
114         // clear this slot
115         if (!clientinfoslot)
116                 return;
117         download_clientinfo *clientinfo =
118                 (download_clientinfo *) clientinfoslot->clientinfo;
119         clear_clientinfo(clientinfo);
120         clientinfoslot->clientinfo = NULL;
121 }
122
123 int get_downloading_count(download_clientinfo_slot *clientinfo_list)
124 {
125         int count = 0;
126         int i = 0;
127         for (i = 0; i < MAX_CLIENT; i++) {
128                 if (clientinfo_list[i].clientinfo) {
129                         if (clientinfo_list[i].clientinfo->state ==
130                                 DOWNLOAD_STATE_DOWNLOADING
131                                 || clientinfo_list[i].clientinfo->state ==
132                                 DOWNLOAD_STATE_INSTALLING
133                                 || clientinfo_list[i].clientinfo->state ==
134                                 DOWNLOAD_STATE_READY)
135                                 count++;
136                 }
137         }
138         return count;
139 }
140
141 int get_same_request_slot_index(download_clientinfo_slot *clientinfo_list,
142                                 int requestid)
143 {
144         int i = 0;
145
146         if (!clientinfo_list || !requestid)
147                 return -1;
148
149         for (i = 0; i < MAX_CLIENT; i++) {
150                 if (clientinfo_list[i].clientinfo
151                         && clientinfo_list[i].clientinfo->requestinfo) {
152                         if (clientinfo_list[i].clientinfo->requestinfo->
153                                 requestid == requestid) {
154                                 return i;
155                         }
156                 }
157         }
158         return -1;
159 }
160
161 int get_empty_slot_index(download_clientinfo_slot *clientinfo_list)
162 {
163         int i = 0;
164
165         if (!clientinfo_list)
166                 return -1;
167
168         for (i = 0; i < MAX_CLIENT; i++)
169                 if (!clientinfo_list[i].clientinfo)
170                         return i;
171         return -1;
172 }