Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / resource / include / OCApi.h
1 //******************************************************************
2 //
3 // Copyright 2014 Intel Mobile Communications GmbH 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 #ifndef __INTEL_OCAPI_H_2014_07_10
22 #define __INTEL_OCAPI_H_2014_07_10
23
24 #include <string>
25 #include <sstream>
26 #include <vector>
27 #include <map>
28 #include <memory>
29 #include <iterator>
30
31 #include "octypes.h"
32 #include "OCHeaderOption.h"
33 #include <OCException.h>
34 #include "StringConstants.h"
35 #include "oc_logger.hpp"
36
37 #include <OCRepresentation.h>
38
39 namespace OC
40 {
41     class OCResource;
42     class OCResourceRequest;
43     class OCResourceResponse;
44 } // namespace OC
45
46 namespace OC
47 {
48     typedef boost::iostreams::stream<OC::oc_log_stream>     log_target_t;
49
50     namespace detail
51     {
52         /* We'll want to provide some sort of explicit hook for custom logging at some
53         point; until then, this should do nicely (note that since these are lambdas,
54         later a special target could be captured, allowing much flexibility): */
55         auto oclog_target = []() -> log_target_t&
56         {
57             static OC::oc_log_stream    ols(oc_make_ostream_logger);
58             static log_target_t         os(ols);
59
60             return os;
61         };
62     } // namespace OC::detail
63
64     auto oclog = []() -> boost::iostreams::stream<OC::oc_log_stream>&
65     {
66         return detail::oclog_target();
67     };
68
69 } // namespace OC
70
71 namespace OC
72 {
73
74     enum class OCPlatformStatus
75     {
76         PlatformUp,
77         PlatformDown
78     };
79
80     enum class OCAdvertisementStatus
81     {
82         None
83     };
84
85     typedef std::string URI;
86
87     enum class ServiceType
88     {
89         InProc,
90         OutOfProc
91     };
92
93     enum class ModeType
94     {
95         Server,
96         Client,
97         Both
98     };
99
100     enum class QualityOfService : uint8_t
101     {
102         LowQos      = OC_LOW_QOS,
103         MidQos      = OC_MEDIUM_QOS,
104         HighQos     = OC_HIGH_QOS,
105         NaQos       = OC_NA_QOS // No Quality is defined, let the stack decide
106     };
107
108     /**
109     *  Data structure to provide the configuration.
110     *  ServiceType: indicate InProc or OutOfProc
111     *  ModeType   : indicate whether we want to do server, client or both
112     *  ipAddress  : ip address of server.
113     *               if you specify 0.0.0.0 : it listens on any interface.
114     *  port       : port of server.
115     *             : if you specify 0 : next available random port is used.
116     *             : if you specify 5683 : client discovery can work even if they don't specify port.
117     *  QoS        : Quality of Service : CONFIRMABLE or NON CONFIRMABLE.
118     */
119     struct PlatformConfig
120     {
121         ServiceType                serviceType;
122         ModeType                   mode;
123         std::string                ipAddress;
124         uint16_t                   port;
125
126         QualityOfService           QoS;
127
128         public:
129             PlatformConfig()
130                 : serviceType(ServiceType::InProc),
131                 mode(ModeType::Both),
132                 ipAddress("0.0.0.0"),
133                 port(0),
134                 QoS(QualityOfService::NaQos)
135         {}
136             PlatformConfig(const ServiceType serviceType_,
137             const ModeType mode_,
138             const std::string& ipAddress_,
139             const uint16_t port_,
140             const QualityOfService QoS_)
141                 : serviceType(serviceType_),
142                 mode(mode_),
143                 ipAddress(ipAddress_),
144                 port(port_),
145                 QoS(QoS_)
146         {}
147     };
148
149     enum RequestHandlerFlag
150     {
151         RequestFlag = 1 << 1,
152         ObserverFlag = 1 << 2
153     };
154
155     enum class ObserveType
156     {
157         Observe,
158         ObserveAll
159     };
160     //
161     // Typedef for header option vector
162     // OCHeaderOption class is in HeaderOption namespace
163     typedef std::vector<HeaderOption::OCHeaderOption> HeaderOptions;
164
165     // Typedef for query parameter map
166     typedef std::map<std::string, std::string> QueryParamsMap;
167
168     // Typedef for list of observation IDs
169     typedef std::vector<OCObservationId> ObservationIds;
170
171     enum class ObserveAction
172     {
173         ObserveRegister,
174         ObserveUnregister
175     };
176
177     typedef struct
178     {
179         // Action associated with observation request
180         ObserveAction action;
181         // Identifier for observation being registered/unregistered
182         OCObservationId obsId;
183     } ObservationInfo;
184
185     // const strings for different interfaces
186
187     // Default interface
188     const std::string DEFAULT_INTERFACE = "oic.if.baseline";
189
190     // Used in discovering (GET) links to other resources of a collection.
191     const std::string LINK_INTERFACE = "oic.if.ll";
192
193     // Used in GET, PUT, POST, DELETE methods on links to other resources of a collection.
194     const std::string BATCH_INTERFACE = "oic.if.b";
195
196     // Used in GET, PUT, POST methods on links to other remote resources of a group.
197     const std::string GROUP_INTERFACE = "oc.mi.grp";
198
199
200     typedef std::function<void(std::shared_ptr<OCResource>)> FindCallback;
201
202     typedef std::function<void(const OCRepresentation&)> FindDeviceCallback;
203
204     typedef std::function<void(const OCRepresentation&)> FindPlatformCallback;
205
206     typedef std::function<OCEntityHandlerResult(
207                             const std::shared_ptr<OCResourceRequest>)> EntityHandler;
208
209     typedef std::function<void(OCStackResult, const unsigned int,
210                                 const std::string&)> SubscribeCallback;
211
212     typedef std::function<void(const HeaderOptions&,
213                                 const OCRepresentation&, const int)> GetCallback;
214
215     typedef std::function<void(const HeaderOptions&,
216                                 const OCRepresentation&, const int)> PostCallback;
217
218     typedef std::function<void(const HeaderOptions&,
219                                 const OCRepresentation&, const int)> PutCallback;
220
221     typedef std::function<void(const HeaderOptions&, const int)> DeleteCallback;
222
223     typedef std::function<void(const HeaderOptions&,
224                                 const OCRepresentation&, const int, const int)> ObserveCallback;
225 } // namespace OC
226
227 #endif