- #include "FDClient.h"
 
- #include"TempleMsg.pb.h"
 
- #include"CFdbIfPerson.h"
 
-  
 
- CBaseWorker FDClient::main_worker;
 
- FDClient::FDClient(const char * name, CBaseWorker * worker)
 
-         : CBaseClient(name, worker)
 
- {
 
-         mTimer = new CInvokeTimer(this);
 
-         mTimer->attach(&main_worker, false);
 
- }
 
-  
 
- /*向服务器发送请求*/
 
- void FDClient::callServer(CMethodLoopTimer<FDClient>* timer)
 
- {
 
-         FDB_LOG_I("****this is client : %s\n", __FUNCTION__);
 
-         NFdbTemple::SongId song_id;
 
-         song_id.set_id(1234);
 
-         CFdbProtoMsgBuilder builder(song_id);
 
-  
 
-         CBaseJob::Ptr ref(new CBaseMessage(NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA));
 
-         invoke(ref, builder);/*发送至服务器*/
 
-  
 
-         auto msg = castToMessage<CBaseMessage*>(ref);
 
-         printMetadata(objId(), msg->metadata());
 
-  
 
-         if (msg->isStatus())
 
-         {
 
-                 int32_t id;
 
-                 std::string reason;
 
-                 if (!msg->decodeStatus(id, reason))
 
-                 {
 
-                         FDB_LOG_E("onReply:fail to decode status\n");
 
-                         return;
 
-                 }
 
-                 FDB_LOG_I("sync reply: status is received: msg code: %d, id: %d, reason: %s\n",
 
-                         msg->code(), id, reason.c_str());
 
-                 return;
 
-         }
 
-  
 
-         NFdbTemple::NowPlayingDetails now_playing;
 
-         CFdbProtoMsgParser parser(now_playing);
 
-         if (msg->deserialize(parser))
 
-         {
 
-                 auto artist = now_playing.artist().c_str();
 
-                 auto album = now_playing.album().c_str();
 
-                 auto genre = now_playing.genre().c_str();
 
-                 auto title = now_playing.title().c_str();
 
-                 auto file_name = "";
 
-                 if (now_playing.has_file_name())
 
-                 {
 
-                         file_name = now_playing.file_name().c_str();
 
-                 }
 
-                 auto folder_name = "";
 
-                 if (now_playing.has_folder_name())
 
-                 {
 
-                         folder_name = now_playing.folder_name().c_str();
 
-                 }
 
-                 int32_t elapse_time = now_playing.elapse_time();
 
-                 std::cout << artist << album << genre << title << file_name << folder_name << elapse_time << std::endl;
 
-         }
 
-         else
 
-         {
 
-                 FDB_LOG_I("Error! Unable to decode message!!!\n");
 
-         }
 
-         invoke(NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA);
 
- }
 
-  
 
- FDClient::~FDClient()
 
- {
 
- }
 
-  
 
- /*客户端连接服务器时响应*/
 
- void FDClient::onOnline(const CFdbOnlineInfo & info)
 
- {
 
-         FDB_LOG_I("client session online: %d, secure: %d\n", info.mSid, info.mQOS);
 
-         mTimer->enable();
 
-  
 
-         CFdbMsgSubscribeList subscribe_list;
 
-         /*订阅服务器主动推送的广播消息,消息ID与字符串要求和服务器的广播消息保持一致*/
 
-         subscribe_list.addNotifyItem(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, "my_filter");
 
-         subscribe_list.addNotifyItem(NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME, "raw_buffer");
 
-         subscribe_list.addNotifyItem(NTF_CJSON_TEST);
 
-         subscribe_list.addNotifyGroup(GROUP_1);
 
-         subscribe(subscribe_list, 0, info.mQOS);/*注册广播消息,注册完成系统自动回复*/
 
- }
 
-  
 
- /*客户端断开时响应*/
 
- void FDClient::onOffline(const CFdbOnlineInfo & info)
 
- {
 
-         FDB_LOG_I("client session off:%d, secure:%d\n", info.mSid, info.mQOS);
 
-         if (info.mFirstOrLast)
 
-         {
 
-                 mTimer->disable();
 
-         }
 
- }
 
- /*收到服务器主动推送的广播消息*/
 
- void FDClient::onBroadcast(CBaseJob::Ptr & msg_ref)
 
- {
 
-         auto msg = castToMessage<CBaseMessage*>(msg_ref);
 
-         FDB_LOG_I("Broadcast is received:%d, filter: %s, qos:%d\n", msg->code(), msg->topic().c_str(), msg->qos());
 
-  
 
-         switch (msg->code())
 
-         {
 
- /*广播消息有消息ID和消息字符串作为标识*/
 
-         case NFdbTemple::FdbMediaSvcMsgId::NTF_ELAPSE_TIME:
 
-         {
 
-                 std::string filter(msg->topic());
 
-                 if (!filter.compare("my_filter"))
 
-                 {
 
-                         NFdbTemple::ElapseTime eTime;
 
-                         CFdbProtoMsgParser parser(eTime);
 
-                         if (msg->deserialize(parser))
 
-                         {
 
-                                 FDB_LOG_I("elapse time is received: hour: %d, minute: %d, second: %d", eTime.hour(), eTime.minute(), eTime.second());
 
-                                 std::cout << "Broadcast hour: " << eTime.hour() << ", minute: " << eTime.minute() << ", second: " << eTime.second() << std::endl;
 
-                         }
 
-                         else
 
-                         {
 
-                                 FDB_LOG_E("Unable to decode Elapsetime\n");
 
-                         }
 
-                 }
 
-                 else if (!filter.compare("raw_buffer"))
 
-                 {
 
-                         int32_t size = msg->getPayloadSize();
 
-                         std::cout << "Broadcast size: " << size << std::endl;
 
-                         FDB_LOG_I("Broadcast of raw buffer is received: size: %d\n", size);
 
-                 }
 
-         }
 
-         break;
 
-         case NTF_CJSON_TEST:
 
-         {
 
-                 CFdbCJsonMsgParser parser;
 
-                 if (msg->deserialize(parser))
 
-                 {
 
-                         cJSON *f = parser.retrieve();
 
-                         int birthday = 0;
 
-                         int id = 0;
 
-                         const char* name = 0;
 
-                         if (cJSON_IsObject(f))
 
-                         {
 
-                                 cJSON *item = cJSON_GetObjectItem(f, "birthday");
 
-                                 if (item && cJSON_IsNumber(item))
 
-                                 {
 
-                                         birthday = item->valueint;
 
-                                 }
 
-                                 item = cJSON_GetObjectItem(f, "id");
 
-                                 if (item && cJSON_IsNumber(item))
 
-                                 {
 
-                                         id = item->valueint;
 
-                                 }
 
-  
 
-                                 item = cJSON_GetObjectItem(f, "name");
 
-                                 if (item && cJSON_IsString(item))
 
-                                 {
 
-                                         name = item->valuestring;
 
-                                 }
 
-                                 std::cout << "Broadcast json: birthday: " << birthday << ", id: " << id << ", name: " << name << std::endl;
 
-                                 FDB_LOG_I("Broadcast of JSON is: birthday: %d, id: %d, name: %s\n", birthday, id, name);
 
-                         }
 
-                 }
 
-                 else
 
-                 {
 
-                         FDB_LOG_E("Broadcast of JSON is: with error!\n");
 
-                 }
 
-                 break;
 
-         }
 
-         case NTF_GROUP_TEST1:
 
-         case NTF_GROUP_TEST2:
 
-         case NTF_GROUP_TEST3:
 
-                 FDB_LOG_I("Broadcast of group message %d is received, Init:%d\n", fdbMakeEventCode(msg->code()), msg->isInitialResponse());
 
-                 std::cout << "Broadcast of group message: " << msg->code() << ", init: " << msg->isInitialResponse() << std::endl;
 
-                 break;
 
-         default:
 
-                 break;
 
-         }
 
- }
 
-  
 
- void FDClient::onKickDog(CBaseJob::Ptr & msg_ref)
 
- {
 
-         CFdbMessage::kickDog(msg_ref, worker(), [](CBaseJob::Ptr &msg_ref) {
 
-                 CFdbMessage::feedDog(msg_ref);
 
-         });
 
- }
 
- /*异步请求时,通过该回调函数获得server回复*/
 
- void FDClient::onReply(CBaseJob::Ptr & msg_ref)
 
- {
 
-         auto msg = castToMessage<CBaseMessage*>(msg_ref);
 
-         FDB_LOG_I("response is received. sn: %d\n", msg->sn());
 
-  
 
-         printMetadata(objId(), msg->metadata());
 
-  
 
-         switch (msg->code())
 
-         {
 
-         case NFdbTemple::FdbMediaSvcMsgId::REQ_METADATA:
 
-         {
 
-                 if (msg->isStatus())
 
-                 {
 
-                         if (msg->isError())
 
-                         {
 
-                                 int32_t error_code;
 
-                                 std::string reason;
 
-                                 if (!msg->decodeStatus(error_code, reason))
 
-                                 {
 
-                                         FDB_LOG_E("onReply:fail to decode status\n");
 
-                                         return;
 
-                                 }
 
-                                 FDB_LOG_I("onReply: status is received. msg code: %d, error code: %d, reason: %s\n",
 
-                                         msg->code(), error_code, reason.c_str());
 
-                         }
 
-                         return;
 
-                 }
 
-                 NFdbTemple::NowPlayingDetails now_playing;
 
-                 CFdbProtoMsgParser parser(now_playing);
 
-                 if (msg->deserialize(parser))
 
-                 {
 
-                         auto artist = now_playing.artist().c_str();
 
-                         auto album = now_playing.album().c_str();
 
-                         auto genre = now_playing.genre().c_str();
 
-                         auto title = now_playing.title().c_str();
 
-                         auto file_name = "";
 
-                         if (now_playing.has_file_name())
 
-                         {
 
-                                 file_name = now_playing.file_name().c_str();
 
-                         }
 
-                         auto folder_name = "";
 
-                         if (now_playing.has_folder_name())
 
-                         {
 
-                                 folder_name = now_playing.folder_name().c_str();
 
-                         }
 
-                         int32_t elapse_time = now_playing.elapse_time();
 
-                         FDB_LOG_I("async reply: artist: %s, album: %s, genre: %s, title: %s, file name: %s, folder name: %s",
 
-                                 artist, album, genre, title, file_name, folder_name);
 
-                         std::cout << "async from server: artist: " << artist << ", album: " << album << ", genre: " << genre << ", title:" << title << ", file name: " << file_name
 
-                                 << ", folder name: " << folder_name << std::endl;
 
-                  }
 
-                 else
 
-                 {
 
-                         FDB_LOG_I("Error, unable to decode message\n");
 
-                 }
 
-         }
 
-         break;
 
-         case NFdbTemple::FdbMediaSvcMsgId::REQ_RAWDATA:
 
-         {
 
-                 if (msg->isStatus())
 
-                 {
 
-                         int32_t error_code;
 
-                         std::string reason;
 
-                         if (!msg->decodeStatus(error_code, reason))
 
-                         {
 
-                                 FDB_LOG_E("onReply: fail to decode status\n");
 
-                                 return;
 
-                         }
 
-                         FDB_LOG_I("onReply: msg code: %d, error code: %d, reason: %s\n", msg->code(), error_code, reason);
 
-                         return;
 
-                 }
 
-  
 
-                 CFdbParcelableArray<CPerson> persions;
 
-                 CFdbParcelableParser parser(persions);
 
-                 if (!msg->deserialize(parser))
 
-                 {
 
-                         FDB_LOG_E("onReply: fail to decode from simple parser\n");
 
-                         return;
 
-                 }
 
-                 std::ostringstream stream;
 
-                 (void)persions.format(stream);
 
-                 FDB_LOG_I("onReply:%s\n", stream.str().c_str());
 
-                 std::cout << "reply from server:" << stream.str().c_str() << std::endl;
 
-         }
 
-         break;
 
-         default:
 
-                 break;
 
-         }
 
- }
 
- /*注册服务器广播消息后的回复*/
 
- void FDClient::onStatus(CBaseJob::Ptr & msg_ref, int32_t error_code, const char * description)
 
- {
 
-         auto msg = castToMessage<CBaseMessage*>(msg_ref);
 
-         if (msg->isSubscribe())
 
-         {
 
-                 if (!msg->isError())
 
-                 {
 
-                         FDB_LOG_I("subscribe is ok, sn:%d\n", msg->sn());
 
-                 }
 
-         }
 
-         FDB_LOG_I("reason: %s\n", description);
 
- }
 
-  
 
- void FDClient::printMetadata(FdbObjectId_t obj_id, const CFdbMsgMetadata * metadata)
 
- {
 
-         uint64_t time_c2s;
 
-         uint64_t time_s2r;
 
-         uint64_t time_r2c;
 
-         uint64_t time_total;
 
-         CFdbMessage::parseTimestamp(metadata, time_c2s, time_s2r, time_r2c, time_total);
 
-         FDB_LOG_I("obj:%d, server:%llu, reply:%llu, receive:%llu, total:%llu\n",
 
-                 obj_id, time_c2s, time_s2r, time_r2c, time_total);
 
- }
 
-  
 
- /*周期性地向服务器发送请求*/
 
- CInvokeTimer::CInvokeTimer(FDClient *client)
 
-         :CMethodLoopTimer<FDClient>(1000, true, client, &FDClient::callServer)
 
- {}