/** * @brief Parses ClockIdentity from message buffer * @param buffer [in] Message buffer. It should be at least ::PTP_CLOCK_IDENTITY_LENGTH bytes long. * @param size [in] Buffer size. Should be the length of the data pointed to by the buffer argument. * @return void */ void parseClockIdentity(uint8_t *buffer, int size) { int length = PLAT_ntohs(*(uint16_t*)buffer); buffer += sizeof(uint16_t); size -= sizeof(uint16_t); if((unsigned)size < (unsigned)length) { length = size; } length /= PTP_CLOCK_IDENTITY_LENGTH; for(; length > 0; --length) { ClockIdentity add; add.set(buffer); identityList.push_back(add); buffer += PTP_CLOCK_IDENTITY_LENGTH; } }
/** * @brief Appends new ClockIdentity to internal ClockIdentity list * @param id ClockIdentity to be appended * @return void */ void appendClockIdentity(ClockIdentity * id) { identityList.push_back(*id); }
bool Disco::handleIq( const IQ& iq ) { switch( iq.subtype() ) { case IQ::Get: { IQ re( IQ::Result, iq.from(), iq.id() ); re.setFrom( iq.to() ); const SoftwareVersion* sv = iq.findExtension<SoftwareVersion>( ExtVersion ); if( sv ) { re.addExtension( new SoftwareVersion( m_versionName, m_versionVersion, m_versionOs ) ); m_parent->send( re ); return true; } const Info *info = iq.findExtension<Info>( ExtDiscoInfo ); if( info ) { Info *i = new Info( EmptyString, true ); if( !info->node().empty() ) { i->setNode( info->node() ); IdentityList identities; StringList features; DiscoNodeHandlerMap::const_iterator it = m_nodeHandlers.find( info->node() ); if( it == m_nodeHandlers.end() ) { delete i; IQ re( IQ::Error, iq.from(), iq.id() ); re.addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorItemNotFound ) ); m_parent->send( re ); return true; } else { DiscoNodeHandlerList::const_iterator in = (*it).second.begin(); for( ; in != (*it).second.end(); ++in ) { IdentityList il = (*in)->handleDiscoNodeIdentities( iq.from(), info->node() ); il.sort(); // needed on win32 identities.merge( il ); StringList fl = (*in)->handleDiscoNodeFeatures( iq.from(), info->node() ); fl.sort(); // needed on win32 features.merge( fl ); } } i->setIdentities( identities ); i->setFeatures( features ); } else { IdentityList il; IdentityList::const_iterator it = m_identities.begin(); for( ; it != m_identities.end(); ++it ) { il.push_back( new Identity( *(*it) ) ); } i->setIdentities( il ); i->setFeatures( m_features ); if( m_form ) i->setForm( new DataForm( *m_form ) ); } re.addExtension( i ); m_parent->send( re ); return true; } const Items *items = iq.findExtension<Items>( ExtDiscoItems ); if( items ) { Items *i = new Items( items->node() ); if( !items->node().empty() ) { DiscoNodeHandlerMap::const_iterator it = m_nodeHandlers.find( items->node() ); if( it == m_nodeHandlers.end() ) { delete i; IQ re( IQ::Error, iq.from(), iq.id() ); re.addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorItemNotFound ) ); m_parent->send( re ); return true; } else { ItemList itemlist; DiscoNodeHandlerList::const_iterator in = (*it).second.begin(); for( ; in != (*it).second.end(); ++in ) { ItemList il = (*in)->handleDiscoNodeItems( iq.from(), iq.to(), items->node() ); il.sort(); // needed on win32 itemlist.merge( il ); } i->setItems( itemlist ); } } re.addExtension( i ); m_parent->send( re ); return true; } break; } case IQ::Set: { bool res = false; DiscoHandlerList::const_iterator it = m_discoHandlers.begin(); for( ; it != m_discoHandlers.end(); ++it ) { if( (*it)->handleDiscoSet( iq ) ) res = true; } return res; break; } default: break; } return false; }