Use `URI` all caps in documentation
[iotivity.git] / resource / csdk / connectivity / inc / caadapterutils.h
1 /* ****************************************************************
2  *
3  * Copyright 2014 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************/
20
21 /**
22  * @file
23  *
24  * This file contains common utility function for CA transport adaptors.
25  */
26
27 #ifndef CA_ADAPTER_UTILS_H_
28 #define CA_ADAPTER_UTILS_H_
29
30 #include "iotivity_config.h"
31
32 #include <stdbool.h>
33 #ifdef __JAVA__
34 #include <jni.h>
35 #endif
36
37 #ifdef HAVE_SYS_SOCKET_H
38 #include <sys/socket.h>
39 #endif
40
41 #if defined(HAVE_WINSOCK2_H) && defined(HAVE_WS2TCPIP_H)
42 #include <winsock2.h>
43 #include <ws2tcpip.h>
44 #endif
45 #ifdef HAVE_SYS_SOCKET_H
46 #include <sys/socket.h>
47 #endif
48
49 #include "cacommon.h"
50 #include "experimental/logger.h"
51 #include <coap/pdu.h>
52 #include "uarraylist.h"
53 #include "cacommonutil.h"
54
55 #ifdef __cplusplus
56 extern "C"
57 {
58 #endif
59
60 /**
61  * Length of network interface name.
62  */
63 #define CA_INTERFACE_NAME_SIZE 16
64
65 /**
66  * Macro to allocate memory for ipv4 address in the form of uint8_t.
67  */
68 #define IPV4_ADDR_ONE_OCTECT_LEN 4
69
70
71 /**
72  * unicast and multicast server information.
73  */
74 typedef struct
75 {
76     int socketFd;                               /**< Socket descriptor. **/
77     CAEndpoint_t endpoint;                      /**< endpoint description. **/
78     bool isServerStarted;                       /**< Indicates server started. **/
79     bool isMulticastServer;                     /**< Indicates multicast server. **/
80     char ifAddr[CA_IPADDR_SIZE];                /**< Address of the multicast interface. **/
81     char interfaceName[CA_INTERFACE_NAME_SIZE]; /**< Interface Name. **/
82     char subNetMask[CA_IPADDR_SIZE];            /**< Subnet Mask. **/
83 } CAServerInfo_t;
84
85 /**
86  * To parse the IP address and port from "ipaddress:port".
87  * @param[in]   ipAddrStr       IP address to be parsed.
88  * @param[out]  ipAddr          Parsed IP address.
89  * @param[in]   ipAddr          Buffer length for parsed IP address.
90  * @param[out]  port            Parsed Port number.
91  * @return ::CA_STATUS_OK or Appropriate error code.
92  */
93 CAResult_t CAParseIPv4AddressInternal(const char *ipAddrStr, uint8_t *ipAddr,
94                                       size_t ipAddrLen, uint16_t *port);
95
96 /**
97  * Check if two ip address belong to same subnet.
98  * @param[in]   ipAddress1      IP address to be checked.
99  * @param[in]   ipAddress2      IP address to be checked.
100  * @param[in]   netMask         Subnet mask.
101  * @return  true if same subnet and false if not same subnet.
102  */
103 bool CAAdapterIsSameSubnet(const char *ipAddress1, const char *ipAddress2,
104                            const char *netMask);
105 /**
106  * Used to check the multicast server is running or not.
107  *
108  * @param[in]   serverInfoList    Server information list.
109  * @param[in]   ipAddress         Interface address of the server.
110  * @param[in]   multicastAddress  Multicast address of the server.
111  * @param[in]   port              Port number of the server.
112  *
113  * @return  true or false.
114  */
115 bool CAIsMulticastServerStarted(const u_arraylist_t *serverInfoList, const char *ipAddress,
116                                 const char *multicastAddress, uint16_t port);
117
118 /**
119  * Used to check the unicast server is running or not.
120  *
121  * @param[in]   serverInfoList   Server information list.
122  * @param[in]   ipAddress        Ip address of the server.
123  * @param[in]   port             Port number of the server.
124  *
125  * @return  true or false.
126  */
127 bool CAIsUnicastServerStarted(const u_arraylist_t *serverInfoList, const char *ipAddress,
128                               uint16_t port);
129
130 /**
131  * Used to get the port number based on given information.
132  *
133  * @param[in]   serverInfoList   Server information list.
134  * @param[in]   ipAddress        Ip address of the server.
135  * @param[in]   isSecured        specifies whether to get secured or normal unicast server port.
136  *
137  * @return  positive value on success and 0 on error.
138  */
139 uint16_t CAGetServerPort(const u_arraylist_t *serverInfoList, const char *ipAddress,
140                          bool isSecured);
141
142 /**
143  * Used to get the socket fd for given server information.
144  *
145  * @param[in]   serverInfoList   Server information list.
146  * @param[in]   isMulticast      To check whether it is multicast server or not.
147  * @param[in]   endpoint         network address
148
149  * @return  positive value on success and -1 on error.
150  */
151 int CAGetSocketFdForUnicastServer(const u_arraylist_t *serverInfoList,
152                          bool isMulticast, const CAEndpoint_t *endpoint);
153
154 /**
155  * Used to add the server information into serverinfo list.
156  *
157  * @param[in,out]   serverInfoList    server information list.
158  * @param[in]       info              server informations like ip, port.
159  *
160  * @return ::CA_STATUS_OK or Appropriate error code.
161  * @retval ::CA_STATUS_OK  Successful.
162  * @retval ::CA_STATUS_INVALID_PARAM Invalid input data.
163  * @retval ::CA_STATUS_FAILED Initialization failed.
164  */
165 CAResult_t CAAddServerInfo(u_arraylist_t *serverInfoList, CAServerInfo_t *info);
166
167 /**
168  * Used to remove the server information based on socket fd from server info list.
169  *
170  * @param[in,out]   serverInfoList    server information list.
171  * @param[in]       sockFd            Socket descriptor.
172  */
173 void CARemoveServerInfo(u_arraylist_t *serverInfoList, int sockFd);
174
175 /**
176  * Used to clear the memory of network interface list.
177  * Memory pointed by infoList will become invalid after this function call.
178  *
179  * @param[in]   infoList    Network interface list.
180  */
181 void CAClearNetInterfaceInfoList(u_arraylist_t *infoList);
182
183 /**
184  * Used to clear the memory of server info list.
185  * Memory pointed by serverInfoList will become invalid after this function call.
186  *
187  * @param[in]   infoList    Server information list.
188  */
189 void CAClearServerInfoList(u_arraylist_t *serverInfoList);
190
191 /**
192  * Convert address from binary to string.
193  * @param[in]    sockAddr     IP address info.
194  * @param[in]    sockAddrLen  size of sockAddr.
195  * @param[out]   host         address string (must be CA_IPADDR_SIZE).
196  * @param[out]   port         host order port number.
197  * @return CA_STATUS_OK on success, or an appropriate error code on failure.
198  */
199 CAResult_t CAConvertAddrToName(const struct sockaddr_storage *sockAddr, socklen_t sockAddrLen,
200                                char *host, uint16_t *port);
201
202 /**
203  * Convert address from string to binary.
204  * @param[in]   host      address string.
205  * @param[in]   port      host order port number.
206  * @param[out]  ipaddr    IP address info.
207  * @return CA_STATUS_OK on success, or an appropriate error code on failure.
208  */
209 CAResult_t CAConvertNameToAddr(const char *host, uint16_t port, struct sockaddr_storage *sockaddr);
210
211 #ifdef __JAVA__
212 /**
213  * To set jvm object.
214  * This must be called by the Android API before CA Initialization.
215  * @param[in]   jvm         jvm object.
216  */
217 void CANativeJNISetJavaVM(JavaVM *jvm);
218
219 /**
220  * To get JVM object.
221  * Called from adapters to get JavaVM object.
222  * @return  JVM object.
223  */
224 JavaVM *CANativeJNIGetJavaVM(void);
225
226 /**
227  * get method ID for method Name and class
228  * @param[in]   env              JNI interface pointer.
229  * @param[in]   className        android class.
230  * @param[in]   methodName       android method name.
231  * @param[in]   methodFormat     method type of methodName.
232  * @return      jmethodID        iD of the method.
233  */
234 jmethodID CAGetJNIMethodID(JNIEnv *env, const char* className,
235                            const char* methodName,
236                            const char* methodFormat);
237
238 /**
239  * check JNI exception occurrence
240  * @param[in]   env              JNI interface pointer.
241  * @return  true(occurrence) or false(no occurrence).
242  */
243 bool CACheckJNIException(JNIEnv *env);
244
245 /**
246  * To Delete other Global References
247  * Called during CATerminate to remove global references
248  */
249 void CADeleteGlobalReferences(JNIEnv *env);
250
251 #ifdef __ANDROID__
252 /**
253  * To set context of JNI Application.
254  * This must be called by the Android API before CA Initialization.
255  * @param[in]   env         JNI interface pointer.
256  * @param[in]   context     context object.
257  */
258 void CANativeJNISetContext(JNIEnv *env, jobject context);
259
260 /**
261  * To set Activity to JNI.
262  * This must be called by the Android API before CA Initialization.
263  * @param[in]   env         JNI Environment pointer.
264  * @param[in]   activity    Activity object.
265  */
266 void CANativeSetActivity(JNIEnv *env, jobject activity);
267
268 /**
269  * To get context.
270  * Called by adapters to get Application context.
271  * @return  context object.
272  */
273 jobject CANativeJNIGetContext();
274
275 /**
276  * To get Activity.
277  * Called from adapters to get Activity.
278  * @return  Activity object.
279  */
280 jobject *CANativeGetActivity();
281 #endif
282 #endif
283
284 /**
285  * print send state in the adapter.
286  * @param[in]   adapter          transport adapter type.
287  * @param[in]   addr             remote address.
288  * @param[in]   port             port.
289  * @param[in]   sentLen          sent data length.
290  * @param[in]   isSuccess        sent state.
291  * @param[in]   message          detailed message.
292  */
293 void CALogSendStateInfo(CATransportAdapter_t adapter,
294                         const char *addr, uint16_t port, ssize_t sentLen,
295                         bool isSuccess, const char* message);
296
297 /**
298  * print adapter state in the adapter.
299  * @param[in]   adapter          transport adapter type.
300  * @param[in]   state            adapter state.
301  */
302 void CALogAdapterStateInfo(CATransportAdapter_t adapter, CANetworkStatus_t state);
303
304 /**
305  * print adapter type name in the adapter.
306  * @param[in]   adapter          transport adapter type.
307  */
308 void CALogAdapterTypeInfo(CATransportAdapter_t adapter);
309
310 /**
311  * return scope level of given ip address.
312  * @param[in]    address    remote address.
313  * @param[out]   scopeLevel scope level of given ip address.
314  * @return      ::CA_STATUS_OK or Appropriate error code.
315  */
316 CAResult_t CAGetIpv6AddrScopeInternal(const char *addr, CATransportFlags_t *scopeLevel);
317
318 #ifdef __cplusplus
319 } /* extern "C" */
320 #endif
321 #endif  /* CA_ADAPTER_UTILS_H_ */