void PropertyMap::fromStream(QDataStream& _is) { QString _hash; deserialize(_is,_hash); uint32_t _size = 0; _is >> _size; for (size_t i = 0; i < _size; ++i) { QString _propertyHash; QString _propertyId; QByteArray _propertyData; deserialize(_is,_propertyHash); deserialize(_is,_propertyId); deserialize(_is,_propertyData); properties_[_propertyId] = _propertyData; if (_propertyHash != makeChecksum(_propertyData)) { throw exception::ChecksumError(_propertyHash, makeChecksum( properties_), _propertyId); } } if (_hash != makeChecksum(properties_)) { throw exception::ChecksumError(_hash, makeChecksum(properties_)); } }
QString PropertyMap::makeChecksum(property_map const& _properties) { QString _merged; _merged += QString("%1").arg(_properties.size()); for (auto& _property : _properties) { _merged += _property.first; _merged += makeChecksum(_property.second); } return makeChecksum(_merged); }
Boolean liethWrite(obj xpressnet, byte* outin, Boolean* rspexpected) { iOXpressNetData data = Data(xpressnet); int len = 0; Boolean ok = False; unsigned char out[256]; *rspexpected = False; if( !data->enablecom ) { return 0; } if( data->socket == NULL ) { return 0; } ThreadOp.sleep( 50 ); len = makeChecksum(outin); if( len == 0 ) { TraceOp.trc( "lieth", TRCLEVEL_WARNING, __LINE__, 9999, "zero bytes to write LI-ETH" ); return False; } /* make extra header for LI-USB*/ MemOp.copy( out+2, outin, len ); len = len+2; out[0] = 0xFF; out[1] = 0xFE; if( data->dummyio ) { TraceOp.dump( NULL, TRCLEVEL_BYTE, (char*)out, len ); *rspexpected = False; return True; } if( data->socket != NULL && !SocketOp.isBroken(data->socket) ) { TraceOp.trc( "lieth", TRCLEVEL_BYTE, __LINE__, 9999, "write to LI-ETH" ); TraceOp.dump( NULL, TRCLEVEL_BYTE, (char*)out, len ); ok = SocketOp.write( data->socket, (char*)out, len ); data->lastcmd = time(NULL); if( ok ) { *rspexpected = True; /* LIUSB/ETH or CS will confirm every command */ } else { TraceOp.trc( "lieth", TRCLEVEL_WARNING, __LINE__, 9999, "could not write to XpressNet" ); } } return ok; }
QString PropertyMap::makeChecksum(QString const& _s) { return makeChecksum(_s.toLatin1()); }