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