Add sample application[phone]
[staging/soundmanager.git] / sample / phone / app / libsmwrapper.cpp
1 /*
2  * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "libsmwrapper.h"
18 using namespace std;
19
20 static int create_json_object(const QJsonObject& obj, struct json_object* jobj);
21 static bool put_val_to_jobj(const char* key, const QJsonValue& val, struct json_object* jobj);
22 static bool put_array_to_jobj(const char* key, const QJsonArray& qarray, struct json_object* jobj);
23
24 LibSMWrapper::LibSMWrapper(QObject *parent) :
25     QObject(parent)
26 {
27     /* This is not enabled */
28     //libsm = new LibSoundmanager();
29 }
30
31 LibSMWrapper::LibSMWrapper(const int port, const QString& token, QObject *parent) :
32     QObject(parent)
33 {
34     libsm = new LibSoundmanager(port, token.toStdString());
35 }
36
37 LibSMWrapper::~LibSMWrapper()
38 {
39     delete libsm;
40 }
41
42 int LibSMWrapper::call(const QString &verb, const QJsonObject &arg)
43 {
44     // translate QJsonObject to struct json_object
45     struct json_object* jobj = json_object_new_object();
46     int ret = create_json_object(arg, jobj);
47     if(ret < 0)
48     {
49         return -1;
50     }
51     return libsm->call(verb.toStdString().c_str(), jobj);
52 }
53
54 static int create_json_object(const QJsonObject& obj, struct json_object* jobj)
55 {
56     try{
57         for(auto itr = obj.begin(); itr != obj.end();++itr)
58         {
59             string key = itr.key().toStdString();
60             //const char* key = itr.key().toStdString().c_str(); // Do not code like this. string is removed if size is over 16!!
61
62             bool ret = put_val_to_jobj(key.c_str(), itr.value(),jobj);
63             if(!ret){
64                 /*This is not implemented*/
65                 qDebug("JsonArray can't parse for now");
66                 return -1;
67                 // ToDo 
68                 // For now, array may not be inputted for soundmanager
69                 // But use case absolutely exists
70                 /*QJsonArray qarray = itr.value().toArray();
71                 ret = put_array_to_jobj(key, qarray, jobj);*/
72             }
73         }
74     }
75     catch(...){
76         qDebug("Json parse error occured");
77         return -1;
78     }
79     return 0;
80 }
81
82 static bool put_val_to_jobj(const char* key, const QJsonValue& val, struct json_object* jobj)
83 {
84     if(val.isArray()){
85         return false;  // Array can't input
86     }
87     if(val.isString()){
88         string value = val.toString().toStdString();
89         json_object_object_add(jobj, key, json_object_new_string(value.c_str()));
90     }
91     else{
92         const int value = val.toInt();     
93         json_object_object_add(jobj, key, json_object_new_int(value));   
94     }
95     return true;
96 }
97
98 static bool put_array_to_jobj(const char* key, const QJsonArray& qarray, struct json_object* jobj)
99 {
100     // ToDo Fix this !!
101 /*    struct json_object* jarray = json_object_new_array();
102     
103     bool ret;
104     for(auto jitr = qarray.begin(); jitr != qarray.end(); ++jitr){
105         struct json_object* tmp = json_object_new_object();
106         ret = put_val_to_jobj(key,jitr,tmp);
107         if(!ret)
108         {
109             put_array_to_jobj(key,jitr,tmp);
110         }
111         json_object_array_add(jarray, tmp);
112     }
113     json_object_object_add(jobj, key, jarray);
114     return true;*/
115 }
116
117 void LibSMWrapper::wrapper_registerCallback(
118     void (*event_func)(const string& event, struct json_object* event_contents), 
119     void (*reply_func)(struct json_object* reply_contents))
120 {
121     libsm->register_callback(event_func, reply_func);
122 }
123
124 void LibSMWrapper::subscribe(const QString event_name)
125 {
126     std::string str = event_name.toStdString();
127     libsm->subscribe(str);
128 }
129
130 void LibSMWrapper::unsubscribe(const QString event_name)
131 {
132     std::string str = event_name.toStdString();
133     libsm->unsubscribe(str);
134 }
135
136 void LibSMWrapper::run_eventloop()
137 {
138     libsm->run_eventloop();
139 }
140
141 void LibSMWrapper::print(const QString &str)
142 {
143     qDebug("%s is called", str.toStdString().c_str());
144 }
145
146 void LibSMWrapper::emit_event(const QString &event, const QJsonObject &msg)
147 {
148     qDebug("emit smEvent signal @%s", __FUNCTION__);
149     emit smEvent(event, msg);
150 }
151 void LibSMWrapper::emit_reply(const QJsonObject &msg)
152 {
153     qDebug("emit smReply signal @%s", __FUNCTION__);    
154     emit smReply(msg);
155 }