char* Image::serialize(unsigned int & Size) const{ QFile imageFile(path); imageFile.open(QIODevice::ReadOnly); QByteArray bytearr = imageFile.readAll(); Size = 4 * 5 + image_name.size() + bytearr.size() + Key::PubKeySize; char* data = new char[Size]; *(int*)data = HostToNetwork(ID); *(int*)(data+4)=HostToNetwork(up_count); *(int*)(data+8)=HostToNetwork(view_limit); *(int*)(data+12)=HostToNetwork(image_name.size()); memcpy(data+16,image_name.toStdString().c_str(),image_name.size()); *(int*)(data+16+image_name.size())=HostToNetwork(bytearr.size()); memcpy(data+16+image_name.size()+4, bytearr.data(), bytearr.size()); memcpy(data+Size-Key::PubKeySize, owner_key.getAsString().toStdString().c_str(), Key::PubKeySize); return data; }
/* * Start listening * @param address the address to listen on * @param port the port to listen on * @param backlog the backlog * @return true if it succeeded, false otherwise */ bool TcpAcceptingSocket::Listen(const IPV4Address &address, unsigned short port, int backlog) { struct sockaddr_in server_address; int reuse_flag = 1; if (m_sd != ola::io::INVALID_DESCRIPTOR) return false; // setup memset(&server_address, 0x00, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_port = HostToNetwork(port); int sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) { OLA_WARN << "socket() failed: " << strerror(errno); return false; } int ok = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&reuse_flag), sizeof(reuse_flag)); if (ok < 0) { OLA_WARN << "can't set reuse for " << sd << ", " << strerror(errno); close(sd); return false; } if (bind(sd, (struct sockaddr *) &server_address, sizeof(server_address)) == -1) { OLA_WARN << "bind to " << address << ":" << port << " failed, " << strerror(errno); close(sd); return false; } if (listen(sd, backlog)) { OLA_WARN << "listen on " << address << ":" << port << " failed, " << strerror(errno); return false; } m_sd = sd; return true; }
/* * Send the next RDM request, this assumes that SetFilter has been called */ void DmxTriWidgetImpl::DispatchRequest(const ola::rdm::RDMRequest *request, ola::rdm::RDMCallback *callback) { std::vector<string> packets; if (request->ParamId() == ola::rdm::PID_QUEUED_MESSAGE && request->CommandClass() == RDMCommand::GET_COMMAND) { // these are special if (request->ParamDataSize()) { DispatchQueuedGet(request, callback); return; } else { OLA_WARN << "Missing param data in queued message get"; delete request; callback->Run(ola::rdm::RDM_FAILED_TO_SEND, NULL, packets); return; } } struct rdm_message { uint8_t command; uint8_t index; uint16_t sub_device; uint16_t param_id; uint8_t data[ola::rdm::RDMCommand::MAX_PARAM_DATA_LENGTH]; } __attribute__((packed)); rdm_message message; if (request->CommandClass() == RDMCommand::GET_COMMAND) { message.command = REMOTE_GET_COMMAND_ID; } else if (request->CommandClass() == RDMCommand::SET_COMMAND) { message.command = REMOTE_SET_COMMAND_ID; } else { OLA_WARN << "Request was not get or set: " << static_cast<int>(request->CommandClass()); delete request; callback->Run(ola::rdm::RDM_FAILED_TO_SEND, NULL, packets); return; } if (request->DestinationUID().IsBroadcast()) { message.index = 0; } else { map<UID, uint8_t>::const_iterator iter = m_uid_index_map.find(request->DestinationUID()); if (iter == m_uid_index_map.end()) { OLA_WARN << request->DestinationUID() << " not found in uid map"; delete request; callback->Run(ola::rdm::RDM_UNKNOWN_UID, NULL, packets); return; } message.index = iter->second; } message.sub_device = HostToNetwork(request->SubDevice()); message.param_id = HostToNetwork(request->ParamId()); if (request->ParamDataSize()) memcpy(message.data, request->ParamData(), request->ParamDataSize()); unsigned int size = sizeof(message) - ola::rdm::RDMCommand::MAX_PARAM_DATA_LENGTH + request->ParamDataSize(); OLA_INFO << "Sending request to " << request->DestinationUID() << " with command " << std::hex << request->CommandClass() << " and param " << std::hex << request->ParamId(); m_pending_request = request; m_rdm_request_callback = callback; bool r = SendMessage(EXTENDED_COMMAND_LABEL, reinterpret_cast<uint8_t*>(&message), size); if (!r) { m_pending_request = NULL; m_rdm_request_callback = NULL; delete request; callback->Run(ola::rdm::RDM_FAILED_TO_SEND, NULL, packets); } }