update for beta universally
[platform/core/location/lbs-location.git] / location / location-poi-info.c
1 /*
2  * libslp-location
3  *
4  * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Youngae Kang <youngae.kang@samsung.com>, Yunhan Kim <yhan.kim@samsung.com>,
7  *          Genie Kim <daejins.kim@samsung.com>, Minjune Kim <sena06.kim@samsung.com>
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  * http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include "location/location-poi-info.h"
27 #include "location/location-log.h"
28
29 GType
30 location_poiinfo_get_type (void)
31 {
32         static volatile gsize type_volatile = 0;
33         if(g_once_init_enter(&type_volatile)) {
34                 GType type = g_boxed_type_register_static (
35                         g_intern_static_string ("LocationPOIInfo"),
36                         (GBoxedCopyFunc) location_poiinfo_copy,
37                         (GBoxedFreeFunc) location_poiinfo_free);
38                 g_once_init_leave(&type_volatile, type);
39         }
40         return type_volatile;
41 }
42
43 GHashTable*
44 location_poiinfo_detail_properties_new (void)
45 {
46         return g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
47 }
48
49 void
50 location_poiinfo_detail_properties_free (GHashTable* properties)
51 {
52         g_return_if_fail(properties);
53         g_hash_table_destroy(properties);
54 }
55
56 gboolean
57 location_poiinfo_detail_properties_insert (GHashTable* properties,
58         const gchar* key,
59         const gchar* value)
60 {
61         g_return_val_if_fail(properties, FALSE);
62         g_hash_table_insert (properties, g_strdup(key), g_strdup(value));
63         return TRUE;
64 }
65
66 static void
67 copy_poiinfo_detail_properties (gchar *key,
68         gchar *value,
69         GHashTable *properties)
70 {
71         location_poiinfo_detail_properties_insert(properties, key, value);
72 }
73
74 GHashTable *
75 location_poiinfo_detail_properties_copy (const GHashTable *properties)
76 {
77         g_return_val_if_fail(properties, NULL);
78
79         GHashTable *dup = location_poiinfo_detail_properties_new ();
80         g_hash_table_foreach (properties,
81                                                 (GHFunc)copy_poiinfo_detail_properties,
82                                                 dup);
83         return dup;
84 }
85
86 LocationPOIInfo *
87 location_poiinfo_new (int num_of_poi)
88 {
89         LocationPOIInfo* poi_info = g_slice_new0(LocationPOIInfo);
90         poi_info->num_of_poi = num_of_poi;
91         poi_info->poi_detail = g_new0(LocationPOIDetail, poi_info->num_of_poi);
92         return poi_info;
93 }
94
95 void
96 location_poiinfo_free (LocationPOIInfo* poi_info)
97 {
98         g_return_if_fail(poi_info);
99         if(poi_info->poi_detail){
100                 int i = 0;
101                 for (i = 0 ; i < poi_info->num_of_poi ; i++) {
102                         g_free(poi_info->poi_detail[i].name);
103                         g_free(poi_info->poi_detail[i].type);
104                         location_address_free(poi_info->poi_detail[i].address);
105                         location_position_free(poi_info->poi_detail[i].position);
106                         g_free(poi_info->poi_detail[i].phone_number);
107                         location_poiinfo_detail_properties_free(poi_info->poi_detail[i].properties);
108                 }
109         }
110         g_free(poi_info->poi_detail);
111         g_slice_free(LocationPOIInfo, poi_info);
112 }
113
114 LocationPOIInfo *
115 location_poiinfo_copy (const LocationPOIInfo* poi_info)
116 {
117         LocationPOIInfo* poi_info_dup = location_poiinfo_new(poi_info->num_of_poi);
118         int i = 0;
119         for (i = 0 ; i < poi_info_dup->num_of_poi ; i++)
120                 location_poiinfo_set_poi_detail (poi_info_dup, i,
121                                                                                 poi_info->poi_detail[i].name,
122                                                                                 poi_info->poi_detail[i].type,
123                                                                                 poi_info->poi_detail[i].address,
124                                                                                 poi_info->poi_detail[i].position,
125                                                                                 poi_info->poi_detail[i].phone_number,
126                                                                                 poi_info->poi_detail[i].properties);
127
128         return poi_info_dup;
129 }
130
131 gboolean
132 location_poiinfo_get_poi_detail (LocationPOIInfo *poi_info,
133         guint index,
134         gchar** name,
135         gchar** type,
136         LocationAddress** address,
137         LocationPosition** position,
138         gchar** phone_number,
139         GHashTable** properties)
140 {
141         LOCATION_LOGD("location_poiinfo_get_poi_detail");
142         g_return_val_if_fail(name, FALSE);
143         g_return_val_if_fail(type, FALSE);
144         g_return_val_if_fail(address, FALSE);
145         g_return_val_if_fail(position, FALSE);
146         g_return_val_if_fail(phone_number, FALSE);
147         g_return_val_if_fail(properties, FALSE);
148         g_return_val_if_fail(index < poi_info->num_of_poi, FALSE);
149
150         *name = g_strdup(poi_info->poi_detail[index].name);
151         *type = g_strdup(poi_info->poi_detail[index].type);
152         *address = location_address_copy(poi_info->poi_detail[index].address);
153         *position = location_position_copy(poi_info->poi_detail[index].position);
154         *phone_number = g_strdup(poi_info->poi_detail[index].phone_number);
155         *properties = location_poiinfo_detail_properties_copy(poi_info->poi_detail[index].properties);
156
157         return TRUE;
158 }
159
160 gboolean
161 location_poiinfo_set_poi_detail (LocationPOIInfo *poi_info,
162         guint index,
163         const gchar* name,
164         const gchar* type,
165         const LocationAddress* address,
166         const LocationPosition* position,
167         const gchar* phone_number,
168         const GHashTable* properties)
169 {
170         LOCATION_LOGD("location_poiinfo_set_poi_detail");
171         g_return_val_if_fail(name, FALSE);
172         g_return_val_if_fail(type, FALSE);
173         g_return_val_if_fail(address, FALSE);
174         g_return_val_if_fail(position, FALSE);
175         g_return_val_if_fail(phone_number, FALSE);
176         g_return_val_if_fail( index < poi_info->num_of_poi, FALSE);
177
178         g_free(poi_info->poi_detail[index].name);
179         g_free(poi_info->poi_detail[index].type);
180         location_address_free(poi_info->poi_detail[index].address);
181         location_position_free(poi_info->poi_detail[index].position);
182         g_free(poi_info->poi_detail[index].phone_number);
183         location_poiinfo_detail_properties_free(poi_info->poi_detail[index].properties);
184
185         poi_info->poi_detail[index].name = g_strdup(name);
186         poi_info->poi_detail[index].type = g_strdup(type);
187         poi_info->poi_detail[index].address = location_address_copy(address);
188         poi_info->poi_detail[index].position = location_position_copy(position);
189         poi_info->poi_detail[index].phone_number = g_strdup(phone_number);
190         poi_info->poi_detail[index].properties = location_poiinfo_detail_properties_copy(properties);
191
192         return TRUE;
193 }