1 //******************************************************************
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
11 // http://www.apache.org/licenses/LICENSE-2.0
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.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include <cereal/cereal.hpp>
22 #include <cereal/types/memory.hpp>
23 #include <cereal/types/vector.hpp>
24 #include <cereal/archives/json.hpp>
26 #include <StringConstants.h>
30 class ListenOCContainer
33 enum class OCSecureType
39 class ListenResourceContainer
41 class ListenResourcePropertiesContainer
43 friend class cereal::access;
44 friend class ListenResourceContainer;
46 template<class Archive>
47 void serialize(Archive& ar)
53 ar(cereal::make_nvp(OC::Key::OBSERVABLEKEY, obsTemp));
54 m_observable = obsTemp != 0;
56 catch(cereal::Exception&)
58 // we swallow this exception, since it means the key
59 // doesn't exist, allowing these to be optional
60 ar.setNextName(nullptr);
67 ar(cereal::make_nvp(OC::Key::SECUREKEY, secureTemp));
68 m_secure = secureTemp != 0;
71 ar(cereal::make_nvp(OC::Key::PORTKEY, m_port));
73 catch(cereal::Exception&)
75 ar.setNextName(nullptr);
80 ar(cereal::make_nvp(OC::Key::RESOURCETYPESKEY,m_resourceTypes));
82 catch(cereal::Exception&)
84 ar.setNextName(nullptr);
88 ar(cereal::make_nvp(OC::Key::INTERFACESKEY, m_interfaces));
90 catch(cereal::Exception&)
92 ar.setNextName(nullptr);
97 std::vector<std::string> m_resourceTypes;
98 std::vector<std::string> m_interfaces;
104 ListenResourceContainer() : m_loaded(false)
108 friend class cereal::access;
109 friend class ListenOCContainer;
111 template <class Archive>
112 void serialize(Archive& ar)
116 ar(cereal::make_nvp(OC::Key::URIKEY, m_uri));
119 catch(cereal::Exception&)
121 ar.setNextName(nullptr);
125 ar(cereal::make_nvp(OC::Key::SERVERIDKEY, m_serverId));
128 catch(cereal::Exception&)
130 ar.setNextName(nullptr);
134 ar(cereal::make_nvp(OC::Key::PROPERTYKEY, m_props));
137 catch(cereal::Exception&)
139 ar.setNextName(nullptr);
145 std::string m_serverId;
147 ListenResourcePropertiesContainer m_props;
154 bool observable() const
156 return m_props.m_observable;
159 OCSecureType secureType() const
161 return m_props.m_secure?OCSecureType::IPv4Secure :OCSecureType::IPv4;
166 return m_props.m_port;
169 std::vector<std::string> resourceTypes() const
171 return m_props.m_resourceTypes;
174 std::vector<std::string> interfaces() const
176 return m_props.m_interfaces;
181 friend class cereal::access;
182 template <class Archive>
183 void serialize(Archive& ar)
185 std::vector<ListenResourceContainer> resources;
190 ListenOCContainer(std::weak_ptr<IClientWrapper> cw, const OCDevAddr& address,
191 OCConnectivityType connectivityType, std::stringstream& json):
192 m_clientWrapper(cw), m_address(address), m_connectivityType(connectivityType)
194 ListenOCContainer(std::weak_ptr<IClientWrapper> cw, const OCDevAddr& address,
195 std::stringstream& json):
196 m_clientWrapper(cw), m_address(address)
202 const std::vector<std::shared_ptr<OCResource>>& Resources() const
208 std::string ConvertOCAddrToString(OCSecureType sec, int secureport)
210 char stringAddress[DEV_ADDR_SIZE_MAX];
215 if(sec== OCSecureType::IPv4)
219 else if(sec == OCSecureType::IPv4Secure)
225 oclog() << "ConvertOCAddrToString(): invalid SecureType"<<std::flush;
226 throw ResourceInitException(false, false, false, false, false, true);
229 if(0== OCDevAddrToString(&m_address, stringAddress))
231 // nothing to do, successful case.
235 oclog() << "ConvertOCAddrToString(): Invalid Ip"
237 throw ResourceInitException(false, false, false, false, false, true);
242 if(sec == OCSecureType::IPv4Secure && secureport>0 && secureport<=65535)
244 port = static_cast<uint16_t>(secureport);
246 else if(sec == OCSecureType::IPv4 && 0==OCDevAddrToPort(&m_address, &port))
248 // nothing to do, this is a successful case
252 oclog() << "ConvertOCAddrToString() : Invalid Port"
254 throw ResourceInitException(false, false, false, false, true, false);
257 os <<":"<< static_cast<int>(port);
262 void LoadFromJson(std::stringstream& json)
264 cereal::JSONInputArchive archive(json);
266 std::vector<ListenResourceContainer> resources;
267 archive(cereal::make_nvp(OC::Key::OCKEY, resources));
271 for(const auto& res : resources)
278 m_resources.push_back(std::shared_ptr<OCResource>(
279 new OCResource(m_clientWrapper,
280 ConvertOCAddrToString(res.secureType(),res.port()),
281 res.m_uri, res.m_serverId, m_connectivityType, res.observable(),
282 res.resourceTypes(), res.interfaces())));
284 m_resources.push_back(std::shared_ptr<OCResource>(
285 new OCResource(m_clientWrapper,
286 ConvertOCAddrToString(res.secureType(),res.port()),
287 res.m_uri, res.m_serverId, res.observable(),
288 res.resourceTypes(), res.interfaces())));
293 catch(ResourceInitException& e)
295 oclog() << "listenCallback(): failed to create resource: " << e.what()
300 std::vector<std::shared_ptr<OC::OCResource>> m_resources;
301 std::weak_ptr<IClientWrapper> m_clientWrapper;
303 OCConnectivityType m_connectivityType;