int cVNSIRecording::Read(unsigned char* buf, int buf_size)
{
  if (m_currentPlayingRecordPosition >= m_currentPlayingRecordBytes)
    return 0;

  cRequestPacket vrp;
  if (!vrp.init(VDR_RECSTREAM_GETBLOCK) ||
      !vrp.add_U64(m_currentPlayingRecordPosition) ||
      !vrp.add_U32(buf_size))
  {
    return 0;
  }

  if (!IsClientConnected())
    return -1;

  cResponsePacket* vresp = m_session.ReadResult(&vrp);
  if (!vresp)
    return 0;

  uint32_t length = vresp->getUserDataLength();
  uint8_t *data   = vresp->getUserData();
  if (length > buf_size)
  {
    XBMC->Log(LOG_ERROR, "cVNSIRecording::Read: PANIC - Received more bytes as requested");
    free(data);
    delete vresp;
    return 0;
  }

  memcpy(buf, data, length);
  m_currentPlayingRecordPosition += length;
  free(data);
  delete vresp;
  return length;
}
Beispiel #2
0
void cVNSIChannelScan::Action()
{
  uint32_t channelID;
  uint32_t requestID;
  uint32_t userDataLength;
  uint8_t* userData;

  bool readSuccess;

  cResponsePacket* vresp;

  while (Running())
  {
    readSuccess = readData((uint8_t*)&channelID, sizeof(uint32_t));
    if (!readSuccess && !IsClientConnected())
      return; // return to stop this thread

    if (!readSuccess) continue; // no data was read but the connection is ok.

    // Data was read
    channelID = ntohl(channelID);
    if (channelID == CHANNEL_REQUEST_RESPONSE)
    {
      if (!readData((uint8_t*)&requestID, sizeof(uint32_t))) break;
      requestID = ntohl(requestID);
      if (!readData((uint8_t*)&userDataLength, sizeof(uint32_t))) break;
      userDataLength = ntohl(userDataLength);
      if (userDataLength > 5000000) break; // how big can these packets get?
      userData = NULL;
      if (userDataLength > 0)
      {
        userData = (uint8_t*)malloc(userDataLength);
        if (!userData) break;
        if (!readData(userData, userDataLength)) break;
      }

      vresp = new cResponsePacket();
      vresp->setResponse(requestID, userData, userDataLength);

      CMD_LOCK;
      SMessages::iterator it = m_queue.find(requestID);
      if (it != m_queue.end())
      {
        it->second.pkt = vresp;
        it->second.event->Signal();
      }
      else
      {
        delete vresp;
      }
    }
    else if (channelID == CHANNEL_SCAN)
    {
      if (!readData((uint8_t*)&requestID, sizeof(uint32_t))) break;
      requestID = ntohl(requestID);
      if (!readData((uint8_t*)&userDataLength, sizeof(uint32_t))) break;
      userDataLength = ntohl(userDataLength);
      if (userDataLength > 5000000) break; // how big can these packets get?
      userData = NULL;
      if (userDataLength > 0)
      {
        userData = (uint8_t*)malloc(userDataLength);
        if (!userData) break;
        if (!readData(userData, userDataLength)) break;
      }

      if (requestID == VDR_SCANNER_PERCENTAGE)
      {
        uint32_t percent = ntohl(*(uint32_t*)&userData[0]);
        if (percent >= 0 && percent <= 100)
          SetProgress(percent);
      }
      else if (requestID == VDR_SCANNER_SIGNAL)
      {
        uint32_t strength = ntohl(*(uint32_t*)&userData[0]);
        uint32_t locked   = ntohl(*(uint32_t*)&userData[4]);
        SetSignal(strength, locked);
      }
      else if (requestID == VDR_SCANNER_DEVICE)
      {
        int length = strlen((char*)&userData[0]);
        char* str = new char[length + 1];
        strcpy(str, (char*)&userData[0]);
        m_window->SetControlLabel(LABEL_DEVICE, str);
        delete[] str;
      }
      else if (requestID == VDR_SCANNER_TRANSPONDER)
      {
        int length = strlen((char*)&userData[0]);
        char* str = new char[length + 1];
        strcpy(str, (char*)&userData[0]);
        m_window->SetControlLabel(LABEL_TRANSPONDER, str);
        delete[] str;
      }
      else if (requestID == VDR_SCANNER_NEWCHANNEL)
      {
        uint32_t isRadio      = ntohl(*(uint32_t*)&userData[0]);
        uint32_t isEncrypted  = ntohl(*(uint32_t*)&userData[4]);
        uint32_t isHD         = ntohl(*(uint32_t*)&userData[8]);
        int length = strlen((char*)&userData[12]);
        char* str = new char[length + 1];
        strcpy(str, (char*)&userData[12]);

        CAddonListItem* item = GUI->ListItem_create(str, NULL, NULL, NULL, NULL);
        if (isEncrypted)
          item->SetProperty("IsEncrypted", "yes");
        if (isRadio)
          item->SetProperty("IsRadio", "yes");
        if (isHD)
          item->SetProperty("IsHD", "yes");
        m_window->AddItem(item, 0);
        GUI->ListItem_destroy(item);

        delete[] str;
      }
      else if (requestID == VDR_SCANNER_FINISHED)
      {
        if (!m_Canceled)
        {
          m_window->SetControlLabel(HEADER_LABEL, XBMC->GetLocalizedString(30036));
          m_window->SetControlLabel(BUTTON_START, XBMC->GetLocalizedString(30024));
          m_window->SetControlLabel(LABEL_STATUS, XBMC->GetLocalizedString(30041));
        }
        else
        {
          m_window->SetControlLabel(HEADER_LABEL, XBMC->GetLocalizedString(30042));
        }
      }
      else if (requestID == VDR_SCANNER_STATUS)
      {
        uint32_t status = ntohl(*(uint32_t*)&userData[0]);
        if (status == 0)
        {
          if (m_Canceled)
            m_window->SetControlLabel(LABEL_STATUS, XBMC->GetLocalizedString(16200));
          else
            m_window->SetControlLabel(LABEL_STATUS, XBMC->GetLocalizedString(30040));
          m_window->SetControlLabel(BUTTON_START, XBMC->GetLocalizedString(30024));
          m_stopped = true;
        }
        else if (status == 1)
        {
          m_window->SetControlLabel(LABEL_STATUS, XBMC->GetLocalizedString(30039));
        }
        else if (status == 2)
        {
          m_window->SetControlLabel(LABEL_STATUS, XBMC->GetLocalizedString(30037));
          m_window->SetControlLabel(BUTTON_START, XBMC->GetLocalizedString(30024));
          m_window->SetControlLabel(HEADER_LABEL, XBMC->GetLocalizedString(30043));
          m_stopped = true;
        }
        else if (status == 3)
        {
          m_window->SetControlLabel(LABEL_STATUS, XBMC->GetLocalizedString(30038));
        }
      }

      if (userData)
        free(userData);
    }
    else
    {
      XBMC->Log(LOG_ERROR, "cVNSIChannelScan::Action() - Rxd a wrong response packet on channel %lu !!", channelID);
      break;
    }
  }
}