Beispiel #1
0
bool CFPServerInfo::Parse(uint8_t* pBuf, uint32_t len)
{
  uint16_t os;
  uint8_t count;
  uint8_t* p = pBuf;
  
  os = ntohs((*(uint16_t*)p)); // MachineType Offset
  memset(m_MachineType, 0, sizeof(m_MachineType));
  CopyPascalString(m_MachineType, pBuf + os);
  p += 2;
  
  os = ntohs((*(uint16_t*)p)); // AFPVersionCount Offset
  count = *(pBuf + os);
  char* pVer = (char*)(pBuf + os + 1); // [Base] + [AFPVersionCount Offset] + [AFPVersionCount Size]
  for (uint8_t i = 0; i < count; i++)
  {
    uint8_t len = *((uint8_t*)pVer);
    std::string s(pVer + 1, len);
    m_AFPVersions.push_back(s);
    pVer += (len + 1);
  }
  p += 2;
  
  os = ntohs((*(uint16_t*)p)); // UAMCount Offset
  count = *(pBuf + os);
  char* pUAM = (char*)(pBuf + os + 1);
  for (uint8_t i = 0; i < count; i++)
  {
    uint8_t len = *((uint8_t*)pUAM);
    std::string s(pUAM + 1, len);
    m_UAMs.push_back(s);
    pUAM += (len + 1);
  }
  p += 4; // Ignore VolumIconAndMask
  
  m_Flags = ntohs((*(uint16_t*)p));
  p += 2;
  
  CopyPascalString(m_ServerName, p);
  if (*p & 0x1) // Is Odd?
    p+= (*p + 1); 
  else
    p += (*p + 2);
  
  os = ntohs((*(uint16_t*)p)); // ServerSignature Offset
  memcpy(m_ServerSignature, (pBuf + os), 16);
  
  return true;
}
Beispiel #2
0
//!
//! \brief Parse the contents of a song info SCP message into a SONGINFO
//! structure.
//!
//! \param[in] data Pointer to the message data to be parsed
//! \param[in] len Length of the message data
//!
//! \retval size_t The number of bytes processed from the input buffer
//!
//========================================================================
size_t SCESongInfo::deserialize(uint8_t* data, size_t len)
{
	size_t offset = 0;		// CURRENT OFFSET INTO THE DATA BUFFER
	uint32_t num_fields;	// NUMBER OF FIELDS CONTAINED IN THE MESSAGE

	// SANITY CHECK
	if (len < 1)
	{
		return 0;
	}

	// GET THE NUMBER OF FIELDS
	num_fields = data[offset++];

	// PROCESS EACH FIELD
	for (uint32_t i = 0; (i < num_fields) && (offset < len); ++i)
	{
		uint32_t tag = data[offset++];

		switch (tag)
		{
			case SIT_ARTIST:
				offset += CopyPascalString(data + offset, artist);
			break;

			case SIT_TITLE:
				offset += CopyPascalString(data + offset, title);
			break;

			case SIT_ALBUM:
				offset += CopyPascalString(data + offset, album);
			break;

			case SIT_COMPOSER:
				offset += CopyPascalString(data + offset, composer);
			break;

			case SIT_SONGID:
				offset += CopyPascalString(data + offset, song_id);
			break;

			case SIT_ARTISTID:
				offset += CopyPascalString(data + offset, artist_id);
			break;

			case SIT_ERASE:
			break;

			default:
				LogWrite(LEVEL_DEBUG, "Unknown Song Info field tag %u", tag);
				string tmpstr;
				offset += CopyPascalString(data + offset, tmpstr);
			break;
		}
	}
	return offset;
}
Beispiel #3
0
//!
//! \brief Parse the contents of a channel info SCP message into an 
//! SCEChannelInfo object.
//!
//! \param[in] data Pointer to the message data to be parsed
//! \param[in] len Length of the message data
//! \retval size_t The number of bytes processed from the input buffer
//!
//========================================================================
size_t SCEChannelInfo::deserialize(uint8_t* data, size_t len)
{
	size_t offset = 0u;

	channel = data[offset++];
	genre = data[offset++];

	// SKIP PAST THE UNKNOWN STUFF
	offset = 5;

	// PARSE SHORT CHANNEL NAME
	offset += CopyPascalString(data + offset, sname);

	// PARSE LONG CHANNEL NAME
	offset += CopyPascalString(data + offset, lname);

	// PARSE SHORT GENRE NAME
	offset += CopyPascalString(data + offset, sgenre);

	// PARSE LONG GENRE NAME
	offset += CopyPascalString(data + offset, lgenre);

	return offset;
}
Beispiel #4
0
OSErr GetShortVersionString(short rID, StringPtr version)
{
	VersRecHndl		versionH;
	OSErr			error = resNotFound;
	
	versionH = (VersRecHndl)Get1Resource('vers', rID);		
	
	if (versionH)
	{
		CopyPascalString(version, (**versionH).shortVersion);
		ReleaseResource((Handle) versionH);
		error = noErr;
	}
	else
 		CopyPascalString(version, (StringPtr)"\p<unknown>");

	return error;
}
Beispiel #5
0
//!
//! \brief Parse the contents 
//!
//! \param[in] data Pointer to the message data to be parsed
//! \param[in] len Length of the message data
//!
//! \retval size_t The number of bytes processed from the input buffer
//!
//========================================================================
size_t SCESiriusID::deserialize(uint8_t* data, size_t len)
{

	return CopyPascalString(data, sid);
}