model3DS::model3DS(const char* filename, float scale) : m_filename(filename), m_scale(scale){ std::ifstream *modelFile = new std::ifstream(filename,std::ios::in | std::ios::binary | std::ios::ate); if(!modelFile->is_open()){ std::cout<<"[3DS] ERROR: Could not open '"<<filename<<"'"<<std::endl; return; } if(int(modelFile->tellg()) == 0){ std::cout<<"[3DS] ERROR: Model '"<<filename<<"' is empty"<<std::endl; modelFile->close(); return; } // Extract path from filename int lastSlashPosition=-1, lastForwardSlash=-1, lastBackslash=-1; lastForwardSlash = (int)m_filename.find_last_of('/'); lastBackslash = (int)m_filename.find_last_of('/'); if(lastForwardSlash > lastSlashPosition) lastSlashPosition = lastForwardSlash; if(lastBackslash > lastSlashPosition) lastSlashPosition = lastBackslash; m_filepath = m_filename.substr(0,lastSlashPosition+1); m_filename = m_filename.substr(lastSlashPosition+1); std::cout<<"Test "<<m_filepath<<std::endl; // Check to make sure file is valid 3DS format (begins with 0x4D4D) ushort chunkHeader; unsigned int chunkLength; modelFile->seekg(0, std::ios::beg); modelFile->read((char*)&chunkHeader,2); modelFile->read((char*)&chunkLength,4); if(chunkHeader != CHUNK_MAIN){ std::cout<<"[3DS] ERROR: Model '"<<filename<<"' is not a valid 3DS file"<<std::endl; modelFile->close(); return; } // Detect VBO support std::stringstream extStream((const char*)glGetString(GL_EXTENSIONS)); std::string nextToken; bool isVBOSupported=false; while(!extStream.eof()){ extStream >> nextToken; if(nextToken == "GL_ARB_vertex_buffer_object"){ isVBOSupported=true; break; } } m_drawMode = DRAW_VERTEX_ARRAY; // Initialise bounding box to min & max 4-byte float values m_boundingBox.minX = m_boundingBox.minY = m_boundingBox.minZ = 3.4e+38f; m_boundingBox.maxX = m_boundingBox.maxY = m_boundingBox.maxZ = 3.4e-38f; // Read all 3DS chunks recursively bool finished = false; while(!finished){ finished = readChunk(modelFile, modelFile->tellg(), chunkLength); } m_centerX = (m_boundingBox.minX + m_boundingBox.maxX) / 2.f; m_centerY = (m_boundingBox.minY + m_boundingBox.maxY) / 2.f; m_centerZ = (m_boundingBox.minZ + m_boundingBox.maxZ) / 2.f; // Model loaded, clean up modelFile->close(); delete modelFile; std::cout<<"[3DS] Model '"<<filename<<"' loaded"<<std::endl; }
bool QSslCertificatePrivate::parse(const QByteArray &data) { QAsn1Element root; QDataStream dataStream(data); if (!root.read(dataStream) || root.type() != QAsn1Element::SequenceType) return false; QDataStream rootStream(root.value()); QAsn1Element cert; if (!cert.read(rootStream) || cert.type() != QAsn1Element::SequenceType) return false; // version or serial number QAsn1Element elem; QDataStream certStream(cert.value()); if (!elem.read(certStream)) return false; if (elem.type() == QAsn1Element::Context0Type) { QDataStream versionStream(elem.value()); if (!elem.read(versionStream) || elem.type() != QAsn1Element::IntegerType) return false; versionString = QByteArray::number(elem.value()[0] + 1); if (!elem.read(certStream)) return false; } else { versionString = QByteArray::number(1); } // serial number if (elem.type() != QAsn1Element::IntegerType) return false; serialNumberString = colonSeparatedHex(elem.value()); // algorithm ID if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; // issuer info if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; QByteArray issuerDer = data.mid(dataStream.device()->pos() - elem.value().length(), elem.value().length()); issuerInfo = elem.toInfo(); // validity period if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; QDataStream validityStream(elem.value()); if (!elem.read(validityStream) || (elem.type() != QAsn1Element::UtcTimeType && elem.type() != QAsn1Element::GeneralizedTimeType)) return false; notValidBefore = elem.toDateTime(); if (!elem.read(validityStream) || (elem.type() != QAsn1Element::UtcTimeType && elem.type() != QAsn1Element::GeneralizedTimeType)) return false; notValidAfter = elem.toDateTime(); // subject name if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; QByteArray subjectDer = data.mid(dataStream.device()->pos() - elem.value().length(), elem.value().length()); subjectInfo = elem.toInfo(); subjectMatchesIssuer = issuerDer == subjectDer; // public key qint64 keyStart = certStream.device()->pos(); if (!elem.read(certStream) || elem.type() != QAsn1Element::SequenceType) return false; publicKeyDerData.resize(certStream.device()->pos() - keyStart); QDataStream keyStream(elem.value()); if (!elem.read(keyStream) || elem.type() != QAsn1Element::SequenceType) return false; // key algorithm if (!elem.read(elem.value()) || elem.type() != QAsn1Element::ObjectIdentifierType) return false; const QByteArray oid = elem.toObjectId(); if (oid == RSA_ENCRYPTION_OID) publicKeyAlgorithm = QSsl::Rsa; else if (oid == DSA_ENCRYPTION_OID) publicKeyAlgorithm = QSsl::Dsa; else if (oid == EC_ENCRYPTION_OID) publicKeyAlgorithm = QSsl::Ec; else publicKeyAlgorithm = QSsl::Opaque; certStream.device()->seek(keyStart); certStream.readRawData(publicKeyDerData.data(), publicKeyDerData.size()); // extensions while (elem.read(certStream)) { if (elem.type() == QAsn1Element::Context3Type) { if (elem.read(elem.value()) && elem.type() == QAsn1Element::SequenceType) { QDataStream extStream(elem.value()); while (elem.read(extStream) && elem.type() == QAsn1Element::SequenceType) { QSslCertificateExtension extension; if (!parseExtension(elem.value(), &extension)) return false; extensions << extension; if (extension.oid() == QLatin1String("2.5.29.17")) { // subjectAltName QAsn1Element sanElem; if (sanElem.read(extension.value().toByteArray()) && sanElem.type() == QAsn1Element::SequenceType) { QDataStream nameStream(sanElem.value()); QAsn1Element nameElem; while (nameElem.read(nameStream)) { if (nameElem.type() == QAsn1Element::Rfc822NameType) { subjectAlternativeNames.insert(QSsl::EmailEntry, nameElem.toString()); } else if (nameElem.type() == QAsn1Element::DnsNameType) { subjectAlternativeNames.insert(QSsl::DnsEntry, nameElem.toString()); } } } } } } } } derData = data.left(dataStream.device()->pos()); null = false; return true; }