bc4ea2d7b7eab640871b2a9ab87c031dd452a146
[profile/ivi/wrt-plugins-tizen.git] / src / platform / Tizen / Call / CallHistoryFilter.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License. 
15  */
16
17
18 #include <dpl/log/log.h>
19 #include <iomanip>
20
21 #include "CallHistoryFilter.h"
22 #include "CallHistoryQuery.h"
23
24 using namespace std;
25 using namespace TizenApis::Api::Tizen;
26 using namespace TizenApis::Api::Call;
27
28 namespace {
29 const std::string STR_LOG_TYPE ("log_type");
30 const std::string STR_CONTACT_ID ("contact_id");
31 const std::string STR_NUMBER ("number");
32 const std::string STR_LOG_TIME ("log_time");
33 const std::string STR_DURATION ("data1");
34 const std::string STR_VOICE_ANSWERED ("1");
35 const std::string STR_VOICE_OUTGOING ("2");
36 const std::string STR_VOICE_MISSED_UNCHECKED ("5");
37 const std::string STR_VOICE_MISSED_CHECKED ("6");
38 const std::string STR_VOICE_REJECTED ("9");
39 const std::string STR_VOICE_BLOCKED ("11");
40 const std::string STR_VIDEO_ANSWERED ("3");
41 const std::string STR_VIDEO_OUTGOING ("4");
42 const std::string STR_VIDEO_MISSED_UNCHECKED ("7");
43 const std::string STR_VIDEO_MISSED_CHECKED ("8");
44 const std::string STR_VIDEO_REJECTED ("10");
45 const std::string STR_VIDEO_BLOCKED ("12");
46 const std::string STR_LEFT_BRACKET(" (");
47 const std::string STR_RIGHT_BRACKET(")");
48 const std::string STR_AND(" AND ");
49 const std::string STR_OR(" OR ");
50 const std::string STR_GREATER_THAN (">");
51 const std::string STR_LESS_THAN ("<");
52 const std::string STR_EQUAL ("=");
53 const std::string STR_S_QUOTATION ("'");
54 }
55 namespace TizenApis {
56 namespace Platform {
57 namespace Call {
58
59 CallHistoryFilter::CallHistoryFilter() : m_query("")
60 {
61         init();
62 }
63
64 CallHistoryFilter::~CallHistoryFilter()
65 {
66 }
67
68 void CallHistoryFilter::visitPreComposite(FilterType& type, int depth)
69 {
70         m_query = m_query + STR_LEFT_BRACKET;
71 }
72
73 void CallHistoryFilter::visitInComposite(FilterType& type, int depth)
74 {
75         if(type == Api::Tizen::UNION_FILTER)
76                 m_query = m_query + STR_OR;
77         else if(type == Api::Tizen::INTERSECTION_FILTER)
78                 m_query = m_query + STR_AND;
79 }
80
81 void CallHistoryFilter::visitPostComposite(FilterType& type, int depth)
82 {
83         m_query = m_query + STR_RIGHT_BRACKET;
84 }
85
86 void CallHistoryFilter::visitAttribute(std::string& attrName, Api::Tizen::AnyArrayPtr& values, std::string& matchFlag, bool caseSensitive, int depth)
87 {
88         std::string str ("");
89
90         if (values == NULL) {
91                 return;
92         }
93
94         if (values->size() == 1) {
95                 AnyPtr value = values->at(0);
96                 str.append(convertAttribute(attrName, value));
97         } else if (values->size() > 1) {
98                 str.append(convertAttributeArray(attrName, values));
99         }
100
101         m_query = m_query + str;
102 }
103
104 void CallHistoryFilter::visitAttributeRange(std::string& attrName, AnyPtr& initialValue, AnyPtr& endValue, int depth)
105 {
106         string str ("");
107         string name ("");
108         string initialValueStr ("");
109         string endValueStr ("");
110
111         if (attrName.compare("remoteParty") == 0) {
112                 name = STR_NUMBER;
113         } else if (attrName.compare("contactId") == 0) {
114                 name = STR_CONTACT_ID;
115         } else if (attrName.compare("startTime") == 0) {
116                 name = STR_LOG_TIME;    
117         } else if (attrName.compare("duration") == 0) {
118                 name = STR_DURATION;
119         } else {
120                 name = attrName;
121         }
122
123         if (initialValue != NULL) {
124                 if(initialValue->getType() == PrimitiveType_Time) {
125                         tm date = DPL::DynamicPointerCast< Any_T<tm> >(initialValue)->getValue();
126                         std::stringstream time;
127                         time << mktime(&date);
128                         initialValueStr = time.str();
129                 } else {
130                         initialValueStr = initialValue->toString();
131                 }
132         }
133
134         if (endValue != NULL) {
135                 if(endValue->getType() == PrimitiveType_Time) {
136                         tm date = DPL::DynamicPointerCast< Any_T<tm> >(endValue)->getValue();
137                         std::stringstream time;
138                         time << mktime(&date);
139                         endValueStr = time.str();
140
141                 } else {
142                         endValueStr = endValue->toString();
143                 }
144         }
145
146         if (initialValue != NULL && endValue == NULL) {
147                 str = STR_LEFT_BRACKET + name + STR_GREATER_THAN + STR_EQUAL + STR_S_QUOTATION + initialValueStr + STR_S_QUOTATION + STR_RIGHT_BRACKET;
148         } else if (initialValue == NULL && endValue != NULL) {
149                 str = STR_LEFT_BRACKET + name + STR_LESS_THAN + STR_S_QUOTATION + endValueStr + STR_S_QUOTATION + STR_RIGHT_BRACKET;
150         } else if (initialValue != NULL && endValue != NULL) {
151                 str = STR_LEFT_BRACKET + name + STR_GREATER_THAN + STR_EQUAL + STR_S_QUOTATION + initialValueStr + STR_S_QUOTATION + STR_AND + name + STR_LESS_THAN + STR_S_QUOTATION + endValueStr + STR_S_QUOTATION + STR_RIGHT_BRACKET;
152         }
153
154         m_query = m_query + str;
155 }
156
157 void CallHistoryFilter::init()
158 {
159         m_query.clear();
160         m_query.append(" WHERE");
161 }
162 std::string CallHistoryFilter::convertAttributeArray(std::string &name, AnyArrayPtr& values)
163 {
164         std::string query("");
165         AnyArray::iterator it = values->begin();
166         query.append(STR_LEFT_BRACKET);
167
168         do {
169                 if (it != values->begin()) {
170                         query.append(STR_OR);
171                 }
172                 query.append(convertAttribute(name, *it));
173                 it++;
174         } while(it != values->end());
175
176         query.append(STR_RIGHT_BRACKET);
177         return query;
178 }
179
180 std::string CallHistoryFilter::convertAttribute(std::string &name, AnyPtr& value)
181 {
182         std::string query("");
183         if (name.compare("direction") == 0) {
184                 if (value->toString().compare("received") == 0) {
185                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_ANSWERED + STR_OR
186                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_ANSWERED + STR_RIGHT_BRACKET;
187                 } else if (value->toString().compare("dialed") == 0) {
188                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_OUTGOING + STR_OR
189                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_OUTGOING + STR_RIGHT_BRACKET;
190                 } else if (value->toString().compare("missed") == 0) {
191                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_MISSED_CHECKED + STR_OR
192                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_MISSED_CHECKED + STR_RIGHT_BRACKET;
193                 } else if (value->toString().compare("missed-new") == 0) {
194                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_MISSED_UNCHECKED + STR_OR
195                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_MISSED_UNCHECKED + STR_RIGHT_BRACKET;
196                 } else if (value->toString().compare("rejected") == 0) {
197                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_REJECTED + STR_OR
198                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_REJECTED  + STR_RIGHT_BRACKET;
199                 } else if (value->toString().compare("blocked") == 0) {
200                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_BLOCKED + STR_OR
201                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_BLOCKED + STR_RIGHT_BRACKET;
202                 } else {
203                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + "=0" + STR_RIGHT_BRACKET;
204                 }
205         } else if (name.compare("callType") == 0) {
206                 if (value->toString().compare("tel") == 0) {
207                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_ANSWERED + STR_OR
208                                         + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_OUTGOING + STR_OR
209                                         + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_MISSED_UNCHECKED + STR_OR
210                                         + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_MISSED_CHECKED + STR_OR
211                                         + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_REJECTED + STR_OR
212                                         + STR_LOG_TYPE + STR_EQUAL + STR_VOICE_BLOCKED + STR_RIGHT_BRACKET;
213                 } else if (value->toString().compare("vt") == 0) {
214                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_ANSWERED + STR_OR
215                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_OUTGOING + STR_OR
216                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_MISSED_UNCHECKED + STR_OR
217                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_MISSED_CHECKED + STR_OR
218                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_REJECTED + STR_OR
219                                         + STR_LOG_TYPE + STR_EQUAL + STR_VIDEO_BLOCKED + STR_RIGHT_BRACKET;
220                 } else {
221                         query = STR_LEFT_BRACKET + STR_LOG_TYPE + "=0" + STR_RIGHT_BRACKET;
222                 }
223         } else if (name.compare("remoteParty") == 0) {
224                 query = STR_LEFT_BRACKET + STR_NUMBER + STR_EQUAL + STR_S_QUOTATION + value->toString() + STR_S_QUOTATION + STR_RIGHT_BRACKET;
225         } else if (name.compare("contactId") == 0) {
226                 query = STR_LEFT_BRACKET + STR_CONTACT_ID + STR_EQUAL + STR_S_QUOTATION + value->toString() + STR_S_QUOTATION + STR_RIGHT_BRACKET;
227         } else if (name.compare("startTime") == 0) {
228                 std::string dateStr ("");
229                 if(value->getType() == PrimitiveType_Time) {
230                         tm date = DPL::DynamicPointerCast< Any_T<tm> >(value)->getValue();
231                         std::stringstream time;
232                         time << mktime(&date);
233                         dateStr = time.str();
234                 } else {
235                         return query;
236                 }
237                 query = STR_LEFT_BRACKET + STR_LOG_TIME + STR_EQUAL + STR_S_QUOTATION + dateStr + STR_S_QUOTATION + STR_RIGHT_BRACKET;
238         } else if (name.compare("duration") == 0) {
239                 query = STR_LEFT_BRACKET + STR_DURATION + STR_EQUAL + STR_S_QUOTATION + value->toString() + STR_S_QUOTATION + STR_RIGHT_BRACKET;
240         }
241
242         return query;
243 }
244
245 std::string CallHistoryFilter::getResult() const
246 {
247         return m_query;
248 }
249
250 }
251 }
252 }