Beispiel #1
0
/** Loads group fields from the stream. Returns true on success, false in case of error. */
bool PwGroupV3::readFromStream(QDataStream& stream) {
    quint16 fieldType;
    qint32 fieldSize;
    while (!stream.atEnd()) {
        stream >> fieldType >> fieldSize;
        switch(fieldType) {
        case FIELD_RESERVED:
            stream.skipRawData(fieldSize);
            break;
        case FIELD_GROUP_ID:
            this->setId(PwStreamUtilsV3::readInt32(stream));
            break;
        case FIELD_NAME:
            this->setName(PwStreamUtilsV3::readString(stream, fieldSize));
            break;
        case FIELD_CREATION_TIME:
            this->setCreationTime(PwStreamUtilsV3::readTimestamp(stream));
            break;
        case FIELD_LAST_MODIFIED_TIME:
            this->setLastModificationTime(PwStreamUtilsV3::readTimestamp(stream));
            break;
        case FIELD_LAST_ACCESS_TIME:
            this->setLastAccessTime(PwStreamUtilsV3::readTimestamp(stream));
            break;
        case FIELD_EXPIRATION_TIME:
            this->setExpiryTime(PwStreamUtilsV3::readTimestamp(stream));
            break;
        case FIELD_ICON_ID:
            this->setIconId(PwStreamUtilsV3::readInt32(stream));
            break;
        case FIELD_GROUP_LEVEL:
            this->setLevel(PwStreamUtilsV3::readUInt16(stream));
            break;
        case FIELD_GROUP_FLAGS:
            this->setFlags(PwStreamUtilsV3::readInt32(stream));
            break;
        case FIELD_END:
            // group fields finished
            stream.skipRawData(fieldSize);
            // a "Backup" group in the root is equivalent of V4's "Recycle Bin"
            if ((this->getLevel() == 0) && (BACKUP_GROUP_NAME == this->getName())) {
                this->setDeleted(true);
            }
            return true;
        }
    }
    // something went wrong, there was no FIELD_END marker
    return false;
}
Beispiel #2
0
inline bool KNMusicTagM4a::getBox(QDataStream &musicDataStream,
                                  KNMusicTagM4a::M4ABox &box,
                                  bool ignoreContent)
{
    //Clear the box data.
    clearBox(box);
    //Set the box properties to independet box.
    box.independence=true;
    //Get the size of the box, reduce the 8 bytes size of itself and the name.
    musicDataStream>>box.size;
    box.size-=8;
    //Generate the name field.
    char nameField[5]={0};
    //Get the name of the box.
    if(musicDataStream.readRawData(nameField, 4)==-1)
    {
        //If you cannot read the data, then it's failed to read the box.
        return false;
    }
    //Save the box name.
    box.name=nameField;
    //Get the content, or else we will simply get back.
    if(ignoreContent)
    {
        box.independence=false;
        //Skip the box size data.
        return musicDataStream.skipRawData(box.size);
    }
    //Allocate memory to store the box data.
    box.data=new char[box.size];
    //Read the new data.
    return musicDataStream.readRawData(box.data, box.size);
}
QString AbrStructParser::p_desc(QDataStream &buf){
    // convert 4 bytes as big-endian unsigned long
    quint32 size;
    // 22 + 4
    buf >> size;
    buf.skipRawData(22);
    return QString::number( size );
}
Beispiel #4
0
void LYTTextBox::readFromDataStream(QDataStream &in) {
	qint64 saveStartPos = in.device()->pos();

	LYTPane::readFromDataStream(in);

	// the lengths are stored in bytes (not characters) and count the
	// zero terminator, and strings are UTF-16 (I think) so we need
	// to take it off here
	in >> (quint16&)bufferLength;
	bufferLength >>= 1;
	bufferLength--;

	quint16 stringLength;
	in >> (quint16&)stringLength;
	stringLength >>= 1;
	stringLength--;

	// read the material and font names
	quint16 materialNum, fontNum;
	in >> (quint16&)materialNum;
	in >> (quint16&)fontNum;

	materialName = m_layout.materials.getNameOfIndex(materialNum);
	fontName = m_layout.m_fontRefs.at(fontNum);

	in >> (quint8&)alignment;
	in >> (quint8&)alignmentOverride;

	in.skipRawData(2); // padding

	quint32 stringOffset;
	in >> (quint32&)stringOffset;

	ReadRGBA8Color(colour1, in);
	ReadRGBA8Color(colour2, in);

	in >> (float&)fontSizeX;
	in >> (float&)fontSizeY;
	in >> (float&)charSpace;
	in >> (float&)lineSpace;

	// read the textbox contents
	// subtract 8 to account for BinaryBlockHeader or whatever it's called
	in.device()->seek(saveStartPos + stringOffset - 8);

	ushort *rawText = new ushort[stringLength];

	for (int i = 0; i < stringLength; i++)
		in >> (quint16&)rawText[i];

	text.setUtf16(rawText, stringLength);
	delete[] rawText;
}
Beispiel #5
0
void chmEditer::on_pushButton_clicked()
{
    //
    chmHeader hd;
    QString fileName = QFileDialog::getOpenFileName(this,
         tr("Открыть chm"), ".", tr("Chm Files (*.chm)"));
//    fileName = "D:\\ferz\\chm1\\TestPrj.chm";
    QFile f;
    f.setFileName(fileName);
    if (f.open(QIODevice::ReadOnly))
    {
        QDataStream stream;
        stream.setDevice(&f);
        stream.setByteOrder(QDataStream::LittleEndian);

        char *tmp1;
        tmp1 = new char[4];
        stream.readRawData(tmp1,4);
        hd.header = tmp1;
        delete tmp1;

        stream>> hd.version;
        stream>> hd.lenght;
        stream.skipRawData(4);
        stream>>hd.timestamp;
        stream>>hd.languageID;

        tmp1 = new char[10];
        stream.readRawData(tmp1,10);
        hd.GUID1 = tmp1;
        delete tmp1;
        tmp1 = new char[10];
        stream.readRawData(tmp1,10);
        hd.GUID2 = tmp1;
        delete tmp1;

        qDebug()<<hd.GUID1;
        ui->textEdit->append("<b>Заголовок</b>: "+hd.header);
        ui->textEdit->append("<b>Версия</b>: "+QString("%1").arg(hd.version));
        ui->textEdit->append("<b>полный размер заголовка</b> : "+QString("%1").arg(hd.lenght));
        ui->textEdit->append("<b>Язык</b> : "+QString("%1").arg(hd.languageID,0, 16));
    }
Beispiel #6
0
bool KNMusicTagApev2::parseTag(QFile &musicFile,
                               QDataStream &musicDataStream,
                               KNMusicAnalysisItem &analysisItem)
{
    //Check the file size first.
    if(musicFile.size()<APEv2HeaderSize)
    {
        return false;
    }
    //There're several positions we have to check:
    // * The beginning of the file. (APEv2)
    // * The end of the file. (APEv1, APEv2)
    // * If there's ID3v1 tag, check the position before ID3v1. (APEv1, APEv2)
    //Generate a header structure.
    APEHeader header;
    //Initial the tag start position.
    bool foundHeader=false;
    //Check the beginning of the file.
    if(checkHeader(0,
                   musicDataStream,
                   header))
    {
        //Tag start right after the tag. So we don't need to move the position
        //of the data stream.
        //Set the header found flag.
        foundHeader=true;
    }
    //Check the end of the file.
    else if(checkHeader(musicFile.size()-APEv2HeaderSize,
                        musicDataStream,
                        header))
    {
        //Move the data stream to the right position. It should be: (APEv1)
        //...........xxxx ... xxxxAPETAGEXxxxx ... xxx|(EOF)
        //(File data)|            |                   |
        //           Tag Start    Header Start        End of File
        //For APEv2, before the tag start it has another header. Ignore it.
        //Reset the device to start.
        musicDataStream.device()->reset();
        //Skip the file data.
        musicDataStream.skipRawData(musicFile.size()-header.size);
        //Set the header found flag.
        foundHeader=true;
    }
    //Check the position before ID3v1. Some file may have both ID3v1 and APEv1/
    //APEv2.
    else if(musicFile.size()>=ID3v1nAPEv2 && //File size first.
            checkHeader(musicFile.size()-ID3v1nAPEv2,
                        musicDataStream,
                        header))
    {
        //Move the data stream to the right position. It should be: (APEv1)
        //...........xxxx ... xxxxAPETAGEXxxxx ... xxxTAGxxx ... xxx|(EOF)
        //(File data)|            |                   |             |
        //           Tag Start    Header Start        ID3v1         End of File
        //For APEv2, before the tag start it has another header. Ignore it.
        //Reset the device to start.
        musicDataStream.device()->reset();
        //Skip the file data.
        musicDataStream.skipRawData(musicFile.size()-ID3v1Size-header.size);
        //Set the header found flag.
        foundHeader=true;
    }
    //Check if we have found the header. If we didn't find any header, then
    //failed to parse the APEv1/APEv2.
    if(!foundHeader)
    {
        return false;
    }
    //Read the tag from the file.
    char *rawTagData=new char[header.size];
    musicDataStream.readRawData(rawTagData, header.size);
    //Parse the raw tag data list.
    QList<APETagItem> tagList;
    parseRawData(rawTagData, header, tagList);
    //Recover the memory.
    delete[] rawTagData;
    //Write the tag list to analysis item.
    //Get the detail info.
    KNMusicDetailInfo &detailInfo=analysisItem.detailInfo;
    //Parse each tag list.
    for(auto i=tagList.constBegin(); i!=tagList.constEnd(); ++i)
    {
        //Get the frame index from the hash list.
        int frameIndex=m_keyIndex.value((*i).key, -1);
        //If we cannot map the key to the index, then ignore the current frame.
        if(frameIndex==-1)
        {
            continue;
        }
        switch(frameIndex)
        {
        case TrackNumber:
        {
            //Get the track string data.
            QString trackText=QString((*i).value);
            //Find the '/' char.
            int splitterIndex=trackText.indexOf('/');
            //If we cannot find the splitter,
            if(splitterIndex==-1)
            {
                //means it only contains track number.
                detailInfo.textLists[TrackNumber]=QVariant(trackText);
            }
            else
            {
                //Or else, it contains track number and track count data.
                //Treat the left side as track number, and the right side as
                //track count.
                detailInfo.textLists[TrackNumber]=trackText.left(splitterIndex);
                detailInfo.textLists[TrackCount]=trackText.mid(splitterIndex+1);
            }
        }
        default:
            //For default cases, because it's UTF-8 plain text, just write the
            //data to the text list.
            detailInfo.textLists[frameIndex]=QString((*i).value);
        }
    }
    //Parse complete.
    return true;
}
Beispiel #7
0
bool CPatchFile::loadFOX(QDataStream &stream, QVector<QRgb> &palette) {
	stream.setByteOrder(QDataStream::LittleEndian);

	// Read the file header
	char magic[4];
	stream.readRawData(magic, 4);

	if (magic[0] != 'F' || magic[1] != 'S' || magic[2] != 'H' || magic[3] != 'X') {
		m_error = BadMagicError;
		return false;
	}

	stream >> version;

	qint32 numShapes, generator, encryption, reserved1, reserved2;
	stream >> numShapes;
	stream >> generator;
	stream >> encryption;
	stream >> reserved1 >> reserved2;

	if (encryption > 0) {
		m_error = FileIsEncryptedError;
		return false;
	}

	// Go on to reading every shape now
	shapes.resize(numShapes);

	for (int shapeIdx = 0; shapeIdx < numShapes; shapeIdx++) {
		CShape &shape = shapes[shapeIdx];

		quint16 flags, numFrames, numSteps;

		stream >> flags;
		stream >> shape.replacedIndex;
		stream >> numFrames >> numSteps;

		shape.flags = (CShape::Flags)flags;

		// V3 and above has SHAPEEXT
		if (version >= 3) {
			quint16 shapeExtSize;
			stream >> shapeExtSize;

			// what else...?
			stream.skipRawData(shapeExtSize - 2);
		}

		// Frames come now
		shape.frames.resize(numFrames);

		for (int frameIdx = 0; frameIdx < numFrames; frameIdx++) {
			CFrame &frame = shape.frames[frameIdx];

			quint16 frameFormat, frameWidth, frameHeight;
			quint32 imageDataSize;

			stream >> frameFormat;
			stream >> frameWidth >> frameHeight;
			stream >> frame.posX >> frame.posY;
			stream >> frame.furrePosX >> frame.furrePosY;
			stream >> imageDataSize;

			frame.format = (CFrame::FormatType)frameFormat;

			// Deal with FRAMEEXT
			if (version >= 3) {
				quint16 frameExtSize;
				stream >> frameExtSize;

				// opacity and compressionType are always present.
				stream >> frame.opacity;
				quint8 compressionType;
				stream >> compressionType;
				frame.compression = (CFrame::CompressionType)compressionType;

				stream.skipRawData(frameExtSize - 4);
			} else {
Beispiel #8
0
bool KNMusicTagWav::parseTag(QFile &musicFile,
                             QDataStream &musicDataStream,
                             KNMusicAnalysisItem &analysisItem)
{
    //Check file size.
    if(musicFile.size()<12)
    {
        //It cannot be a wav format file, until a valid one.
        return false;
    }
    //Gernerate the header cache.
    char rawHeader[12];
    //Read the header.
    musicDataStream.readRawData(rawHeader, 12);
    //Check the riff header and the wave header.
    if(memcmp(rawHeader, m_riffHeader, 4)!=0 ||
            memcmp(rawHeader+8, m_waveHeader, 4)!=0)
    {
        //This is not a wav file.
        return false;
    }
    /*
     * WAV file is a combination of several chunks.
     * Read all the chunks, and find LIST and id32 chunk.
     */
    //Get the music file size.
    qint64 fileSize=musicFile.size();
    //Generate the chunk header cache.
    char chunkHeader[8];
    //Initial the chunk found flag.
    bool listFound=false, id32Found=false;
    //We have to prepare the list here and write the data after parse all the
    //data, we want the id32 chunk has a higher priority than list chunk.
    //Prepare the wav item list for list chunk.
    QList<WAVItem> listData;
    //Generate the raw frame linked list for id32 chunk.
    QLinkedList<ID3v2Frame> frames;
    //Generate the id3v2 frame function set for id32 chunk.
    ID3v2FunctionSet functionSet;
    //Start finding the chunk.
    while(musicDataStream.device()->pos()<fileSize && !listFound && !id32Found)
    {
        //Read chunk head.
        musicDataStream.readRawData(chunkHeader, 8);
        //Calculate the chunk size.
        quint32 chunkSize=KNMusicUtil::inverseCharToInt32(chunkHeader+4);
        //Check if it's list chunk
        if(memcmp(chunkHeader, m_listChunk, 4)==0)
        {
            //Set list chunk found flag to true.
            listFound=true;
            //Generate chunk size cache.
            char *listRawData=new char[chunkSize];
            //Read the raw data.
            musicDataStream.readRawData(listRawData, chunkSize);
            //Parse list chunk.
            parseListChunk(listRawData, chunkSize, listData);
            //Recover memory.
            delete[] listRawData;
        }
        //Check if it's id32 chunk.
        else if(memcmp(chunkHeader, m_id32Chunk, 4)==0)
        {
            //Generate ID3v2 header cache.
            char rawHeader[10];
            //Generate ID3v2 header structure.
            ID3v2Header header;
            //Read ID3v2 header data.
            musicDataStream.readRawData(rawHeader, 10);
            //Parse the ID3v2 header.
            //and then Check is chunk size smaller than tag size.
            if(!parseID3v2Header(rawHeader, header) ||
                    chunkSize<(header.size+10))
            {
                //If we cannot parse it, skip the whole chunk.
                musicDataStream.skipRawData(chunkSize-10);
                //Continue to next chunk.
                continue;
            }
            //Generate the raw tag data field.
            char *rawTagData=new char[header.size];
            //Read the raw tag data.
            musicDataStream.readRawData(rawTagData, header.size);
            //Get the function set according to the minor version of the header.
            getId3v2FunctionSet(header.major, functionSet);
            //Parse the raw data.
            parseID3v2RawData(rawTagData, header, functionSet, frames);
            //Recover the memory.
            delete[] rawTagData;
            //Set the id32 chunk find flag to true.
            id32Found=true;
        }
        //For all the other chunks.
        else
        {
            //Skip the data.
            musicDataStream.skipRawData(chunkSize);
        }
    }
    //Check if the list data is not empty, first.
    //The data can be overwrite by id32 chunk data.
    if(!listData.isEmpty())
    {
        //Check all the data in the wav item list.
        for(auto i : listData)
        {
            //Get the index of current item.
            int chunkIndex=m_listKeyIndex.value(i.key, -1);
            //Check the validation of chunk index.
            if(chunkIndex==-1)
            {
                //Abandon the current index.
                continue;
            }
            //Set the data.
            analysisItem.detailInfo.textLists[chunkIndex]=
                    QVariant(i.value);
        }
    }
    //Check id32 chunk data then.
    if(!frames.isEmpty())
    {
        //Write the tag to analysis info.
        writeFrameToDetails(frames, functionSet, analysisItem);
    }
    //Mission complete.
    return true;
}
QSharedPointer<AttributesInfo> AttributesInfo::parse(QDataStream &data, ConstantPool const &cp)
{
    quint16 attributeIndex;
    data >> attributeIndex;

    quint32 attributeDataLength;
    data >> attributeDataLength;

    QSharedPointer<ConstantPoolInfo_Utf8> attributeName = cp.get<ConstantPoolInfo_Utf8>(attributeIndex);

    AttributesInfo *info;

    if (attributeName->string() == "ConstantValue")
    {
        info = new AttributesInfo_ConstantValue(data);
    }

    else if (attributeName->string() == "Code")
    {
        info = new AttributesInfo_Code(data, cp);
    }

    else if (attributeName->string() == "Exceptions")
    {
        info = new AttributesInfo_Exceptions(data);
    }

    else if (attributeName->string() == "InnerClasses")
    {
        data.skipRawData(attributeDataLength);
        info = new AttributesInfo_InnerClasses(data);
    }

    else if (attributeName->string() == "Synthetic")
    {
        info = new AttributesInfo_Synthetic();
    }

    else if (attributeName->string() == "SourceFile")
    {
        info = new AttributesInfo_SourceFile(data);
    }

    else if (attributeName->string() == "LineNumberTable")
    {
        data.skipRawData(attributeDataLength);
        info = new AttributesInfo_LineNumberTable();
    }

    else if (attributeName->string() == "LocalVariableTable")
    {
        data.skipRawData(attributeDataLength);
        info = new AttributesInfo_LocalVariableTable();
    }

    else if (attributeName->string() == "Deprecated")
    {
        info = new AttributesInfo_Deprecated();
    }

    else if (attributeName->string() == "StackMapTable")
    {
        data.skipRawData(attributeDataLength);
        info = new AttributesInfo_StackMapTable();
    }

    else if (attributeName->string() == "Signature")
    {
        info = new AttributesInfo_Signature(data);
    }

    else
    {
        data.skipRawData(attributeDataLength);
        info = NULL;
        qWarning("unknown attribute name: %s", attributeName->string().toUtf8().constData());
    }

    return QSharedPointer<AttributesInfo>(info);
}
//---------------------------------------------------------------------
// TODO factor code out of here and into its own class for loading and
//      saving PLY files (additional code in stereo/multiviewstereo.cpp)
//
void MainWindow::on_actionView_PLY_File_triggered() {
	QString initialDir = userSettings.contains("InitialPLYDir")
	                     ? userSettings.value("InitialPLYDir").toString()
	                     : QDir::homePath();

	// TODO sheets would be nice for Mac users :)
	QString fname = QFileDialog::getOpenFileName(this,
	                                             tr("Open File"),
	                                             initialDir,
	                                             "PLY Files (*.ply)");

	if(!fname.isNull()) {
		QFile file(fname);
		if(file.open(QFile::ReadOnly)) {
			userSettings.setValue("InitialPLYDir", QDir(fname).absolutePath());

			QTextStream textStream(&file);

			// For now we'll ignore the header and assume a certain format
			QString line;
			bool hasNormal = false;
			bool hasColor = false;
			bool isBinary = false;

			unsigned int numVertices = 0;
			unsigned int numFaces = 0;

			static QRegExp typeTest("n[xyz]");
			static QRegExp normalTest("n[xyz]");
			static QRegExp colorTest("diffuse_(red|blue|green)");
			static QRegExp elementTest("element (vertex|face) (\\d+)");

			while((line = textStream.readLine().trimmed()) != "end_header") {
				if(line.startsWith("property")) {
					if( line.contains(normalTest) )
						hasNormal = true;

					if( line.contains(colorTest) )
						hasColor = true;
				} else if(elementTest.indexIn(line) != -1) {
					if(elementTest.cap(1) == "face")
						numFaces = elementTest.cap(2).toUInt();
					else if(elementTest.cap(1) == "vertex")
						numVertices = elementTest.cap(2).toUInt();
				} else if(line.startsWith("format")) {
					isBinary = line.contains("binary");
				}
			}

			QDataStream dataStream;
			if(isBinary) {
				qint64 pos = textStream.pos();
				file.close();
				file.open(QFile::ReadOnly);
				dataStream.setDevice(&file);
				dataStream.skipRawData(pos);
			}

			//
			// Read in the verticies
			//
			GLfloat d[9] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
			std::vector<GLfloat> vertices(numVertices * 9);
			std::vector<GLfloat>::iterator vertexIter = vertices.begin();
			if(isBinary) {
				uint len = 12 + (hasNormal ? 12 : 0) + (hasColor ? 3 : 0);

				// TODO more efficient to read in larger chunk of data
				for(unsigned int vertex = 0; vertex < numVertices && !textStream.atEnd(); ++vertex) {
					dataStream.readRawData(reinterpret_cast<char *>(d), len);
					if(!hasNormal)
						d[3] = d[4] = d[5] = 0;

					if(!hasColor)
						d[6] = d[7] = d[8] = 1;

					if(dataStream.status() != QDataStream::ReadPastEnd)
						vertexIter = std::copy(d, d + 9, vertexIter);
				}
			} else {
				for(unsigned int vertex = 0; vertex < numVertices && !textStream.atEnd(); ++vertex) {
					textStream >> d[0] >> d[1] >> d[2];
					if(hasNormal)
						textStream >> d[3] >> d[4] >> d[5];
					else
						d[3] = d[4] = d[5] = 0.0f;

					if(hasColor) {
						textStream >> d[6] >> d[7] >> d[8];
						d[6] /= 255.0;
						d[7] /= 255.0;
						d[8] /= 255.0;
					} else {
						d[6] = d[7] = d[8] = 0.5f;
						//d[6] = qrand() / (1.0*RAND_MAX);
						//d[7] = qrand() / (1.0*RAND_MAX);
						//d[8] = qrand() / (1.0*RAND_MAX);
					}

					if(textStream.status() != QTextStream::ReadPastEnd)
						vertexIter = std::copy(d, d + 9, vertexIter);

					textStream.readLine();
				}