Пример #1
0
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;
}
Пример #2
0
/*
 * 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;
}
Пример #3
0
/*
 * 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);
    }
}