Ejemplo n.º 1
0
        public void load(Stream fs)
        {
            try
            {
                DataReader inr = new DataReader(fs, Encoding.ASCII);
                // read header
                int dbVersion = inr.readInt();

                if (dbVersion != FILE_FORMAT)
                {
                    throw new Exception("Wrong database version");
                }

                // create node reader
                VersionInfo versionInfo = new VersionInfo();
                versionInfo.assetVersion = NODE_FORMAT;
                TypeNodeReader nodeReader = new TypeNodeReader(versionInfo);

                // read field node table
                int             fieldNodeSize = inr.readInt();
                List <TypeNode> typeNodes     = new List <TypeNode>(fieldNodeSize);

                for (int i = 0; i < fieldNodeSize; i++)
                {
                    TypeNode node = new TypeNode(versionInfo);
                    nodeReader.read(inr, node);
                    typeNodes.Add(node);
                }

                // read version string table
                int versionSize = inr.readInt();
                List <UnityVersion> versionsTmp = new List <UnityVersion>(versionSize);

                for (int i = 0; i < versionSize; i++)
                {
                    versionsTmp.Add(new UnityVersion(inr.readStringNull()));
                }

                // read mapping data
                int numEntries = inr.readInt();

                for (int i = 0; i < numEntries; i++)
                {
                    int nodeIndex    = inr.readInt();
                    int classID      = inr.readInt();
                    int versionIndex = inr.readInt();

                    UnityVersion unityVersion = versionsTmp[versionIndex];
                    UnityClass   unityClass   = new UnityClass(classID);
                    TypeNode     typeNode     = typeNodes[nodeIndex];

                    addEntry(unityClass, unityVersion, typeNode);
                }
            }
            catch (IOException ex) {
                Logger.Log("Can't read type database" + ex);
            }
        }
Ejemplo n.º 2
0
        //throws IOException
        public void read(DataReader inr)
        {
            // revision/version for newer formats
            if (versionInfo.assetVersion > 6)
            {
                string sver = inr.readStringNull(255);
                versionInfo.unityRevision = new UnityVersion(sver);
                attributes = inr.readInt();
            }

            TypeNodeReader nodeReader = new TypeNodeReader(versionInfo);

            // Unity 5+ uses a serialized tree structure and string buffers
            if (versionInfo.assetVersion > 13)
            {
                embedded = inr.readBoolean();
                int numBaseClasses = inr.readInt();
                Logger.Log("numBaseClasses=" + numBaseClasses);
                if (numBaseClasses > 1000)
                {
                    return;
                }
                for (int i = 0; i < numBaseClasses; i++)
                {
                    int classID = inr.readInt();
                    EmbeddedTypeInfo embeddedtype = new EmbeddedTypeInfo();
                    embeddedtype.classID = classID;

                    if (classID < 0)
                    {
                        UnityHash128 scriptID = new UnityHash128(versionInfo);
                        scriptID.read(inr);
                        embeddedtype.scriptID = scriptID;
                    }

                    UnityHash128 oldTypeHash = new UnityHash128(versionInfo);
                    oldTypeHash.read(inr);
                    embeddedtype.oldTypeHash = oldTypeHash;

                    if (embedded)
                    {
                        TypeNode node = new TypeNode(versionInfo);
                        nodeReader.read(inr, node);
                        embeddedtype.typeTree = node;
                    }

                    embeddedTypeMap[classID] = embeddedtype;
                }
            }
            else
            {
                int numBaseClasses = inr.readInt();
                Logger.Log("numBaseClasses=" + numBaseClasses);
                for (int i = 0; i < numBaseClasses; i++)
                {
                    int classID = inr.readInt();

                    EmbeddedTypeInfo embeddedtype = new EmbeddedTypeInfo();
                    embeddedtype.classID = classID;

                    TypeNode node = new TypeNode(versionInfo);
                    nodeReader.read(inr, node);
                    embeddedtype.typeTree = node;

                    embeddedTypeMap[classID] = embeddedtype;
                }

                embedded = numBaseClasses > 0;

                // padding
                if (versionInfo.assetVersion > 6)
                {
                    inr.readInt();
                }
            }
        }