]> sjero.net Git - linphone/blob - coreapi/message_storage.c
Add strtok in ortp for mingw compilation
[linphone] / coreapi / message_storage.c
1 /*\r
2 message_storage.c\r
3 Copyright (C) 2012  Belledonne Communications, Grenoble, France\r
4 \r
5 This program is free software; you can redistribute it and/or\r
6 modify it under the terms of the GNU General Public License\r
7 as published by the Free Software Foundation; either version 2\r
8 of the License, or (at your option) any later version.\r
9 \r
10 This program is distributed in the hope that it will be useful,\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 GNU General Public License for more details.\r
14 \r
15 You should have received a copy of the GNU General Public License\r
16 along with this program; if not, write to the Free Software\r
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
18 */\r
19 \r
20 #include "private.h"\r
21 #include "linphonecore.h"\r
22 \r
23 #ifdef WIN32\r
24 \r
25 static inline char *my_ctime_r(const time_t *t, char *buf){\r
26         strcpy(buf,ctime(t));\r
27         return buf;\r
28 }\r
29 \r
30 #else\r
31 #define my_ctime_r ctime_r\r
32 #endif\r
33 \r
34 #ifdef MSG_STORAGE_ENABLED\r
35 \r
36 #include "sqlite3.h"\r
37 \r
38 static const char *days[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};\r
39 static const char *months[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};\r
40 \r
41 \r
42 static void create_chat_message(char **argv, void *data){\r
43         LinphoneChatRoom *cr = (LinphoneChatRoom *)data;\r
44         LinphoneChatMessage* new_message = linphone_chat_room_create_message(cr,argv[4]);\r
45         LinphoneAddress *from;\r
46         struct tm ret={0};\r
47         char tmp1[80]={0};\r
48         char tmp2[80]={0};\r
49         \r
50         if(atoi(argv[3])==LinphoneChatMessageIncoming){\r
51                 from=linphone_address_new(argv[2]);\r
52         } else {\r
53                 from=linphone_address_new(argv[1]);\r
54         }\r
55         linphone_chat_message_set_from(new_message,from);\r
56         linphone_address_destroy(from);\r
57 \r
58         if(argv[5]!=NULL){\r
59                 int i,j;\r
60                 sscanf(argv[5],"%3c %3c%d%d:%d:%d %d",tmp1,tmp2,&ret.tm_mday,\r
61                      &ret.tm_hour,&ret.tm_min,&ret.tm_sec,&ret.tm_year);\r
62                 ret.tm_year-=1900;\r
63                 for(i=0;i<7;i++) { \r
64                         if(strcmp(tmp1,days[i])==0) ret.tm_wday=i; \r
65                 }\r
66                 for(j=0;j<12;j++) { \r
67                         if(strcmp(tmp2,months[j])==0) ret.tm_mon=j; \r
68                 }\r
69                 ret.tm_isdst=-1;\r
70         }\r
71         new_message->time=argv[5]!=NULL ? mktime(&ret) : time(NULL);\r
72         new_message->state=atoi(argv[7]);\r
73         cr->messages_hist=ms_list_prepend(cr->messages_hist,new_message);\r
74 }\r
75 \r
76 static int callback(void *data, int argc, char **argv, char **colName){\r
77     create_chat_message(argv,data);\r
78     return 0;\r
79 }\r
80 \r
81 void linphone_sql_request_message(sqlite3 *db,const char *stmt,LinphoneChatRoom *cr){\r
82         char* errmsg=NULL;\r
83         int ret;\r
84         ret=sqlite3_exec(db,stmt,callback,cr,&errmsg);\r
85         if(ret != SQLITE_OK) {\r
86                 ms_error("Error in creation: %s.\n", errmsg);\r
87                 sqlite3_free(errmsg);\r
88         }\r
89 }\r
90 \r
91 void linphone_sql_request(sqlite3* db,const char *stmt){\r
92         char* errmsg=NULL;\r
93         int ret;\r
94         ret=sqlite3_exec(db,stmt,0,0,&errmsg);\r
95         if(ret != SQLITE_OK) {\r
96                 ms_error("linphone_sql_request: error sqlite3_exec(): %s.\n", errmsg);\r
97                 sqlite3_free(errmsg);\r
98         }\r
99 }\r
100 \r
101 void linphone_chat_message_store(LinphoneChatMessage *msg){\r
102         LinphoneCore *lc=linphone_chat_room_get_lc(msg->chat_room);\r
103         if (lc->db){\r
104                 char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(msg->chat_room));\r
105                 char *local_contact=linphone_address_as_string_uri_only(linphone_chat_message_get_local_address(msg));\r
106                 char datebuf[26];\r
107                 char *buf=sqlite3_mprintf("insert into history values(NULL,%Q,%Q,%i,%Q,%Q,%i,%i);",\r
108                                                 local_contact,peer,msg->dir,msg->message,my_ctime_r(&msg->time,datebuf),msg->is_read,msg->state);\r
109                 linphone_sql_request(lc->db,buf);\r
110                 sqlite3_free(buf);\r
111                 ms_free(local_contact);\r
112                 ms_free(peer);\r
113         }\r
114 }\r
115 \r
116 void linphone_chat_message_store_state(LinphoneChatMessage *msg){\r
117         LinphoneCore *lc=msg->chat_room->lc;\r
118         if (lc->db){\r
119                 char time_str[26];\r
120                 char *buf=sqlite3_mprintf("update history set status=%i where message = %Q and time = %Q;",\r
121                         msg->state,msg->message,my_ctime_r(&msg->time,time_str));\r
122                 linphone_sql_request(lc->db,buf);\r
123                 sqlite3_free(buf);\r
124         }\r
125 }\r
126 \r
127 void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){\r
128         LinphoneCore *lc=linphone_chat_room_get_lc(cr);\r
129         int read=1;\r
130         \r
131         if (lc->db==NULL) return ;\r
132 \r
133         char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));\r
134         char *buf=sqlite3_mprintf("update history set read=%i where remoteContact = %Q;",\r
135                        read,peer);\r
136         linphone_sql_request(lc->db,buf);\r
137         sqlite3_free(buf);\r
138         ms_free(peer);\r
139 }\r
140 \r
141 int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){\r
142         LinphoneCore *lc=linphone_chat_room_get_lc(cr);\r
143         int numrows=0;\r
144         \r
145         if (lc->db==NULL) return 0;\r
146         \r
147         char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));\r
148         char *buf=sqlite3_mprintf("select count(*) from history where remoteContact = %Q and read = 0;",peer);\r
149         sqlite3_stmt *selectStatement;\r
150         int returnValue = sqlite3_prepare_v2(lc->db,buf,-1,&selectStatement,NULL);\r
151         if (returnValue == SQLITE_OK){\r
152                 if(sqlite3_step(selectStatement) == SQLITE_ROW){\r
153                         numrows= sqlite3_column_int(selectStatement, 0);\r
154                 }\r
155         }\r
156         sqlite3_finalize(selectStatement);\r
157         sqlite3_free(buf);\r
158         ms_free(peer);\r
159         return numrows;\r
160 }\r
161 \r
162 void linphone_chat_room_delete_history(LinphoneChatRoom *cr){\r
163         LinphoneCore *lc=cr->lc;\r
164         \r
165         if (lc->db==NULL) return ;\r
166         \r
167         char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));\r
168         char *buf=sqlite3_mprintf("delete from history where remoteContact = %Q;",peer);\r
169         linphone_sql_request(lc->db,buf);\r
170         sqlite3_free(buf);\r
171         ms_free(peer);\r
172 }\r
173 \r
174 MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){\r
175         LinphoneCore *lc=linphone_chat_room_get_lc(cr);\r
176         MSList *ret;\r
177         \r
178         if (lc->db==NULL) return NULL;\r
179         char *peer=linphone_address_as_string_uri_only(linphone_chat_room_get_peer_address(cr));\r
180         cr->messages_hist = NULL;\r
181         char *buf=sqlite3_mprintf("select * from history where remoteContact = %Q order by id DESC limit %i ;",peer,nb_message);\r
182         linphone_sql_request_message(lc->db,buf,cr);\r
183         sqlite3_free(buf);\r
184         ret=cr->messages_hist;\r
185         cr->messages_hist=NULL;\r
186         ms_free(peer);\r
187         return ret;\r
188 }\r
189 \r
190 void linphone_close_storage(sqlite3* db){\r
191         sqlite3_close(db);\r
192 }\r
193 \r
194 void linphone_create_table(sqlite3* db){\r
195         char* errmsg=NULL;\r
196         int ret;\r
197         ret=sqlite3_exec(db,"CREATE TABLE if not exists history (id INTEGER PRIMARY KEY AUTOINCREMENT, localContact TEXT NOT NULL, remoteContact TEXT NOT NULL, direction INTEGER, message TEXT, time TEXT NOT NULL, read INTEGER, status INTEGER);",\r
198                 0,0,&errmsg);\r
199         if(ret != SQLITE_OK) {\r
200                 ms_error("Error in creation: %s.\n", errmsg);\r
201                 sqlite3_free(errmsg);\r
202         }\r
203 }\r
204 \r
205 void linphone_core_message_storage_init(LinphoneCore *lc){\r
206         int ret;\r
207         const char *errmsg;\r
208         sqlite3 *db;\r
209         ret=sqlite3_open(lc->chat_db_file,&db);\r
210         if(ret != SQLITE_OK) {\r
211                 errmsg=sqlite3_errmsg(db);\r
212                 ms_error("Error in the opening: %s.\n", errmsg);\r
213                 sqlite3_close(db);\r
214         }\r
215         linphone_create_table(db);\r
216         lc->db=db;\r
217 }\r
218 \r
219 void linphone_core_message_storage_close(LinphoneCore *lc){\r
220         if (lc->db){\r
221                 sqlite3_close(lc->db);\r
222                 lc->db=NULL;\r
223         }\r
224 }\r
225 \r
226 #else \r
227 \r
228 void linphone_chat_message_store(LinphoneChatMessage *cr){\r
229 }\r
230 \r
231 void linphone_chat_message_store_state(LinphoneChatMessage *cr){\r
232 }\r
233 \r
234 void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr){\r
235 }\r
236 \r
237 MSList *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message){\r
238         return NULL;\r
239 }\r
240 \r
241 void linphone_chat_room_delete_history(LinphoneChatRoom *cr){\r
242 }\r
243 \r
244 void linphone_core_message_storage_init(LinphoneCore *lc){\r
245 }\r
246 \r
247 void linphone_core_message_storage_close(LinphoneCore *lc){\r
248 }\r
249 \r
250 int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr){\r
251         return 0;\r
252 }\r
253 \r
254 #endif\r