コード例 #1
0
ファイル: package.py プロジェクト: markmanching/s3py
    def save(self,out_file=None):
        """
        """

        #temporary file to flush data to
        tmp_filename = tempfile.mktemp()
        tmp_stream = io.open(tmp_filename,'wb')
        s = StreamWriter(tmp_stream)

        self.header.index_entry_count = len(self.entries)

        #current package stream
        pkg_stream = None
        if self.stream:
            pkg_stream = self.stream
        elif exists(self.filename):
            pkg_stream = io.open(self.filename,'rb')


        #skip over header
        #this will be written at the end
        tmp_stream.seek(self.Header.SIZE, SEEK_SET)

        # Write data, update header and index
        self.index_flags = 0
        self.static_key = ResourceKey()
        if any(self.entries):
            self.index_flags = self.INDEX_FLAG.TYPE | self.INDEX_FLAG.GROUP
            static_key = None
            for index in self.entries:
                if index.delete_pending:
                    self.entries.remove(index)
                    continue
                data = None
                if index.key in self.__loaded_resources:
                    # index.compressed = False
                    wrapper = self.__loaded_resources[index.key]
                    with BytesIO() as wrapper_stream:
                        wrapper.write(wrapper_stream)
                        wrapper_stream.seek(0,SEEK_SET)
                        data = wrapper_stream.read(-1)
                    #memsize is uncompressed
                    index.mem_size = len(data)
                elif isinstance(pkg_stream, io.FileIO):
                    pkg_stream.seek(index.offset)
                    data = pkg_stream.read(index.mem_size)
                else:
                    continue
                if index.compressed:
                    data = Package.Compression.compress(data)
                #filesize could change if the index was compressed
                index.file_size = len(data)

                if static_key is None: static_key = index.key.clone()
                if not index.key.t == static_key.t:
                   static_key.t = 0
                   self.index_flags = Flag.unset(self.index_flags, self.INDEX_FLAG.TYPE)
                if not index.key.g == static_key.g:
                   static_key.g = 0
                   self.index_flags = Flag.unset(self.index_flags, self.INDEX_FLAG.GROUP)
                #record offset of this entry
                index.offset = tmp_stream.tell()
                #write data
                tmp_stream.write(bytearray(data))

            if self.index_flags: self.static_key = static_key

        # record offset for index table
        self.header.index_offset = tmp_stream.tell()
        # write index table
        s.u32(0)
        if Flag.is_set(self.index_flags, self.INDEX_FLAG.TYPE):
            s.u32(self.static_key.t)
        if Flag.is_set(self.index_flags, self.INDEX_FLAG.GROUP):
            s.u32(self.static_key.g)
        for index in self.entries:
            if not Flag.is_set(self.index_flags, self.INDEX_FLAG.TYPE):
                s.u32(index.key.t)
            if not Flag.is_set(self.index_flags, self.INDEX_FLAG.GROUP):
                s.u32(index.key.g)
            s.u32(index.key.t)
            s.u32(index.key.g)
            instance_hi = index.key.i >> 32
            instance_lo = index.key.i & 0xFFFFFFFF
            s.u32(instance_hi)
            s.u32(instance_lo)
            s.u32(index.offset)
            s.u32(index.file_size | 0x80000000)
            s.u32(index.mem_size)
            s.u16(0 if not index.compressed else 0xFFFF)
            s.u16(index.unknown)
        end = tmp_stream.tell()
        self.header.index_size = end - self.header.index_offset

        # Go back and write header
        tmp_stream.seek(0, SEEK_SET)
        self.header.write(tmp_stream)
        if pkg_stream:
            pkg_stream.close()
        if not out_file: out_file = self.filename

        tmp_stream.close()
        shutil.move(tmp_filename,self.filename)
コード例 #2
0
ファイル: geometry.py プロジェクト: markmanching/s3py
 def set_has_normal(self, value):
     self.value = Flag.set(self.value, self.FLAG_HAS_NORMAL) if value else Flag.unset(self.value,
         self.FLAG_HAS_NORMAL)
コード例 #3
0
ファイル: geometry.py プロジェクト: garthand/s3py
 def set_has_normal(self, value):
     self.value = Flag.set(
         self.value, self.FLAG_HAS_NORMAL) if value else Flag.unset(
             self.value, self.FLAG_HAS_NORMAL)
コード例 #4
0
ファイル: geometry.py プロジェクト: markmanching/s3py
 def set_has_position(self, value):
     self.value = Flag.set(self.value, self.FLAG_HAS_POSITION) if value else Flag.unset(self.value,
         self.FLAG_HAS_POSITION)
コード例 #5
0
ファイル: geometry.py プロジェクト: garthand/s3py
 def set_has_position(self, value):
     self.value = Flag.set(
         self.value, self.FLAG_HAS_POSITION) if value else Flag.unset(
             self.value, self.FLAG_HAS_POSITION)