//////////////////////////////////////////////////////////////////////////////// // Subscribe a device to a group. Send out data messages for the current group entries. int LocalBB::ProcessSubscribeGroupMessage(QueuePointer &resp_queue, player_msghdr * hdr, void * data) { if (!CheckHeader(hdr)) return -1; // Add the device to the listeners map player_blackboard_entry_t *request = reinterpret_cast<player_blackboard_entry_t*>(data); std::vector<BlackBoardEntry> entries = SubscribeGroup(request->group, resp_queue, hdr->addr); for (std::vector<BlackBoardEntry>::iterator itr = entries.begin(); itr != entries.end(); itr++) { BlackBoardEntry current_value = *itr; player_blackboard_entry_t response = ToPlayerBlackBoardEntry(current_value); size_t response_size = sizeof(player_blackboard_entry_t) + response.key_count + response.group_count + response.data_count; // Publish the blackboard entries this->Publish(this->device_addr, resp_queue, PLAYER_MSGTYPE_DATA, PLAYER_BLACKBOARD_DATA_UPDATE, &response, response_size, NULL); if (response.key) { delete [] response.key; } if (response.group) { delete [] response.group; } if (response.data) { delete [] response.data; } } // Then send an empty ack this->Publish( this->device_addr, resp_queue, PLAYER_MSGTYPE_RESP_ACK, PLAYER_BLACKBOARD_REQ_SUBSCRIBE_TO_GROUP, NULL, 0, NULL); return 0; }
void CHyperFeedPriceProvider::OnRequest(CRequestBasePtr pRequest) { switch(pRequest->m_enType) { case _enRequestLast: GetPrice(pRequest); break; case _enRequestRealtime: Subscribe(pRequest, false); break; case _enRequestGroup: { CGroupRequestPtr pGroupRequest = boost::shared_dynamic_cast<CGroupRequest>(pRequest); if(pGroupRequest) { if(enGroupRequestLastQuote == pGroupRequest->m_enGroupRequestType) GetGroupPrice(pGroupRequest->m_recParams); else SubscribeGroup(pGroupRequest->m_recParams, pGroupRequest->m_enGroupRequestType); } } break; } }