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; }
//! //! \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; }
//! //! \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; }
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; }
//! //! \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); }