replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / resource / examples / rdclient.cpp
1 //******************************************************************
2 //
3 // Copyright 2016 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 #include "OCPlatform.h"
22 #include "OCApi.h"
23 #include "RDClient.h"
24
25 #include <functional>
26 #include <iostream>
27
28 using namespace std;
29 using namespace OC;
30
31 static const char* SVR_DB_FILE_NAME = "./oic_svr_db_server.dat";
32
33 string rdAddress;
34 OCConnectivityType connectivityType = CT_ADAPTER_TCP;
35
36 ResourceHandles m_publishedResourceHandles;
37
38 static void onDelete(const int& eCode);
39 static void onPublish(const OCRepresentation& rep, const int& eCode);
40
41 class Resource
42 {
43
44 public:
45     std::string m_resourceUri;
46     OCResourceHandle m_resourceHandle;
47
48 public:
49     /// This function internally calls registerResource API.
50     void registerResource()
51     {
52         string resourceURI;
53         string resourceTypeName;
54         string resourceInterface;
55
56         std::cout <<"   resourceURI: ";
57         std::cin >> resourceURI;
58         std::cout <<"   resourceTypeName: ";
59         std::cin >> resourceTypeName;
60         std::cout <<"   resourceInterface: ";
61         std::cin >> resourceInterface;
62
63         m_resourceUri = resourceURI;
64
65         OCStackResult ret = OCPlatform::registerResource(m_resourceHandle,
66                                                          resourceURI,
67                                                          resourceTypeName,
68                                                          resourceInterface,
69                                                          nullptr,
70                                                          OC_DISCOVERABLE);
71
72         if (OC_STACK_OK != ret)
73         {
74             cout << "Resource creation was unsuccessful\n";
75             return;
76         }
77
78         m_publishedResourceHandles.push_back(m_resourceHandle);
79         cout << "registerResource is called." << endl;
80     }
81
82     void updateResource()
83     {
84         cout << "   1:: add resource type\n";
85         cout << "   2:: add resource interface\n";
86
87         int selectedMenu;
88         std::cin >> selectedMenu;
89
90         string inputString;
91         switch (selectedMenu)
92         {
93         case 1:
94             std::cout << "Add Resource Type" << std::endl;
95             std::cout <<"   resourceTypeName: ";
96             std::cin >> inputString;
97             OCPlatform::bindTypeToResource(m_resourceHandle, inputString);
98             break;
99         case 2:
100             std::cout << "Add Resource Interface" << std::endl;
101             std::cout <<"   resourceInterface: ";
102             std::cin >> inputString;
103             OCPlatform::bindInterfaceToResource(m_resourceHandle, inputString);
104             break;
105         default:
106             cout << "Invalid option" << endl;
107             return;
108         }
109     }
110
111     void publishResource()
112     {
113         /*
114          * Publish Resource of Resource-Server to RD.
115          */
116
117         OCStackResult result = RDClient::Instance().publishResourceToRD(rdAddress, connectivityType,
118                                                                          m_publishedResourceHandles, &onPublish);
119         if (OC_STACK_OK != result)
120         {
121             cout << "Resource publish was unsuccessful\n";
122         }
123     }
124
125     void deleteResource()
126     {
127         /*
128          * Delete Resource with Resource Handle.
129          * Don't need to include resource handle,
130          * if resource-server want to delete all resources from RD.
131          * Ex.) OCPlatform::deleteResourceFromRD(rdAddress, connectivityType, &onDelete);
132          */
133         OCStackResult result = RDClient::Instance().deleteResourceFromRD(rdAddress, connectivityType,
134                                                                           m_publishedResourceHandles, &onDelete);
135         if (OC_STACK_OK != result)
136         {
137             cout << "Resource delete was unsuccessful\n";
138         }
139     }
140 };
141
142 void onDelete(const int& eCode)
143 {
144     cout << "Received Delete Resource Response From RD\n";
145     try
146     {
147         if (OC_STACK_RESOURCE_DELETED == eCode)
148         {
149             cout << "Resource delete was successful\n";
150         }
151         else
152         {
153             std::cout << "onDelete Response error: " << eCode << std::endl;
154             std::exit(-1);
155         }
156     }
157     catch(std::exception& e)
158     {
159         std::cout << "Exception: " << e.what() << " in onDelete" << std::endl;
160     }
161 }
162
163 void onPublish(const OCRepresentation& rep, const int& eCode)
164 {
165     cout << endl <<"Received Publish Resource Response From RD\n";
166
167     try
168     {
169         if (OC_STACK_RESOURCE_CHANGED == eCode)
170         {
171             cout << "=========== Published Resource ===========" << endl;
172             if (rep.hasAttribute("di"))
173             {
174                 std::cout << " di: " << rep.getValue<std::string>("di") << std::endl;
175             }
176
177             // Published Resource is included as the child resource.
178             std::vector<OCRepresentation> children = rep.getChildren();
179
180             for (auto oit = children.begin(); oit != children.end(); ++oit)
181             {
182                 std::string m_href;
183                 oit->getValue("href", m_href);
184                 cout << "   href : " << m_href << "\n";
185
186                 cout << "   resource type : \n";
187                 for(const std::string& type : oit->getResourceTypes())
188                 {
189                     cout << "       " <<  type << "\n";
190                 }
191
192                 cout << "   resource interface : \n";
193                 for(const std::string& type : oit->getResourceInterfaces())
194                 {
195                     cout << "       " <<  type << "\n";
196                 }
197
198                 int m_ins;
199                 oit->getValue("ins", m_ins);
200                 cout << "   ins : " << m_ins << "\n";
201             }
202             cout << "=========================================" << endl;
203         }
204         else
205         {
206             std::cout << "onPublish Response error: " << eCode << std::endl;
207             std::exit(-1);
208         }
209     }
210     catch(std::exception& e)
211     {
212         std::cout << "Exception: " << e.what() << " in onPublish" << std::endl;
213     }
214 }
215
216 static void printUsage()
217 {
218     std::cout<<"Usage: rdserver <coap+tcp://10.11.12.13:5683>\n";
219 }
220
221 static FILE* client_open(const char* /*path*/, const char *mode)
222 {
223     return fopen(SVR_DB_FILE_NAME, mode);
224 }
225
226 int main(int argc, char* argv[])
227 {
228     ostringstream requestURI;
229
230     if (argc == 2)
231     {
232         rdAddress = argv[1];
233     }
234     else
235     {
236         printUsage();
237         return -1;
238     }
239
240     OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink, NULL, NULL};
241     PlatformConfig config
242     { OC::ServiceType::InProc, ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos, &ps};
243
244     try
245     {
246         OCPlatform::Configure(config);
247
248         int selectedMenu;
249         bool isRun = true;
250
251         std::cout << "Register resources" << std::endl;
252         Resource myResource;
253         myResource.registerResource();
254
255         while (isRun)
256         {
257             cout << "================= MENU =================" << endl;
258             cout << "0 :: Quit" << endl;
259             cout << "1 :: UPDATE RESOURCE" << endl;
260             cout << "2 :: PUBLISH RESOURCE TO RD" << endl;
261             cout << "3 :: DELETE RESOURCE FROM RD" << endl;
262             cout << "========================================" << endl;
263             std::cin >> selectedMenu;
264
265             switch (selectedMenu)
266             {
267             case 0:
268                 isRun = false;
269                 break;
270             case 1:
271                 std::cout << "Update resources" << std::endl;
272                 myResource.updateResource();
273                 break;
274             case 2:
275                 std::cout << "Publish resources to RD" << std::endl;
276                 myResource.publishResource();
277                 break;
278             case 3:
279                 std::cout << "Delete resources from RD" << std::endl;
280                 myResource.deleteResource();
281                 break;
282             default:
283                 cout << "Invalid option" << endl;
284             }
285
286         }
287     }
288     catch (OCException& e)
289     {
290         cerr << "Exception in main: "<< e.what();
291     }
292
293     return 0;
294 }