home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_932 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  25.2 KB  |  586 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import struct
  5. import zlib
  6. import StringIO
  7. import codecs
  8. import os
  9. from pylrfopt import tagListOptimizer
  10. PYLRF_VERSION = '1.0'
  11.  
  12. class LrfError(Exception):
  13.     pass
  14.  
  15.  
  16. def writeByte(f, byte):
  17.     f.write(struct.pack('<B', byte))
  18.  
  19.  
  20. def writeWord(f, word):
  21.     if int(word) > 65535:
  22.         raise LrfError('Cannot encode a number greater than 65535 in a word.')
  23.     int(word) > 65535
  24.     if int(word) < 0:
  25.         raise LrfError('Cannot encode a number < 0 in a word: ' + str(word))
  26.     int(word) < 0
  27.     f.write(struct.pack('<H', int(word)))
  28.  
  29.  
  30. def writeSignedWord(f, sword):
  31.     f.write(struct.pack('<h', int(float(sword))))
  32.  
  33.  
  34. def writeWords(f, *words):
  35.     f.write(struct.pack('<%dH' % len(words), *words))
  36.  
  37.  
  38. def writeDWord(f, dword):
  39.     f.write(struct.pack('<I', int(dword)))
  40.  
  41.  
  42. def writeDWords(f, *dwords):
  43.     f.write(struct.pack('<%dI' % len(dwords), *dwords))
  44.  
  45.  
  46. def writeQWord(f, qword):
  47.     f.write(struct.pack('<Q', qword))
  48.  
  49.  
  50. def writeZeros(f, nZeros):
  51.     f.write('\x00' * nZeros)
  52.  
  53.  
  54. def writeString(f, str):
  55.     f.write(str)
  56.  
  57.  
  58. def writeIdList(f, idList):
  59.     writeWord(f, len(idList))
  60.     writeDWords(f, *idList)
  61.  
  62.  
  63. def writeColor(f, color):
  64.     f.write(struct.pack('>I', int(color, 0)))
  65.  
  66.  
  67. def writeLineWidth(f, width):
  68.     writeWord(f, int(width))
  69.  
  70.  
  71. def writeUnicode(f, string, encoding):
  72.     if isinstance(string, str):
  73.         string = string.decode(encoding)
  74.     
  75.     string = string.encode('utf-16-le')
  76.     length = len(string)
  77.     if length > 65535:
  78.         raise LrfError('Cannot write strings longer than 65535 characters.')
  79.     length > 65535
  80.     writeWord(f, length)
  81.     writeString(f, string)
  82.  
  83.  
  84. def writeRaw(f, string, encoding):
  85.     if isinstance(string, str):
  86.         string = string.decode(encoding)
  87.     
  88.     string = string.encode('utf-16-le')
  89.     writeString(f, string)
  90.  
  91.  
  92. def writeRubyAA(f, rubyAA):
  93.     (ralign, radjust) = rubyAA
  94.     radjust = {
  95.         'line-edge': 16,
  96.         'none': 0 }[radjust]
  97.     ralign = {
  98.         'start': 1,
  99.         'center': 2 }[ralign]
  100.     writeWord(f, ralign | radjust)
  101.  
  102.  
  103. def writeBgImage(f, bgInfo):
  104.     (imode, iid) = bgInfo
  105.     imode = {
  106.         'pfix': 0,
  107.         'fix': 1,
  108.         'tile': 2,
  109.         'centering': 3 }[imode]
  110.     writeWord(f, imode)
  111.     writeDWord(f, iid)
  112.  
  113.  
  114. def writeEmpDots(f, dotsInfo, encoding):
  115.     (refDotsFont, dotsFontName, dotsCode) = dotsInfo
  116.     writeDWord(f, refDotsFont)
  117.     LrfTag('fontfacename', dotsFontName).write(f, encoding)
  118.     writeWord(f, int(dotsCode, 0))
  119.  
  120.  
  121. def writeRuledLine(f, lineInfo):
  122.     (lineLength, lineType, lineWidth, lineColor) = lineInfo
  123.     writeWord(f, lineLength)
  124.     writeWord(f, LINE_TYPE_ENCODING[lineType])
  125.     writeWord(f, lineWidth)
  126.     writeColor(f, lineColor)
  127.  
  128. LRF_SIGNATURE = 'L\x00R\x00F\x00\x00\x00'
  129. XOR_KEY = 65024
  130. LRF_VERSION = 1000
  131. IMAGE_TYPE_ENCODING = dict(GIF = 20, PNG = 18, BMP = 19, JPEG = 17, JPG = 17)
  132. OBJECT_TYPE_ENCODING = dict(PageTree = 1, Page = 2, Header = 3, Footer = 4, PageAtr = 5, PageStyle = 5, Block = 6, BlockAtr = 7, BlockStyle = 7, MiniPage = 8, TextBlock = 10, Text = 10, TextAtr = 11, TextStyle = 11, ImageBlock = 12, Image = 12, Canvas = 13, ESound = 14, ImageStream = 17, Import = 18, Button = 19, Window = 20, PopUpWindow = 21, Sound = 22, SoundStream = 23, Font = 25, ObjectInfo = 26, BookAtr = 28, BookStyle = 28, SimpleTextBlock = 29, TOC = 30)
  133. LINE_TYPE_ENCODING = {
  134.     'none': 0,
  135.     'solid': 16,
  136.     'dashed': 32,
  137.     'double': 48,
  138.     'dotted': 64 }
  139. BINDING_DIRECTION_ENCODING = dict(Lr = 1, Rl = 16)
  140. TAG_INFO = dict(rawtext = (0, writeRaw), ObjectStart = (62720, '<IH'), ObjectEnd = (62721,), Link = (62723, '<I'), StreamSize = (62724, writeDWord), StreamData = (62725, writeString), StreamEnd = (62726,), oddheaderid = (62727, writeDWord), evenheaderid = (62728, writeDWord), oddfooterid = (62729, writeDWord), evenfooterid = (62730, writeDWord), ObjectList = (62731, writeIdList), fontsize = (62737, writeSignedWord), fontwidth = (62738, writeSignedWord), fontescapement = (62739, writeSignedWord), fontorientation = (62740, writeSignedWord), fontweight = (62741, writeWord), fontfacename = (62742, writeUnicode), textcolor = (62743, writeColor), textbgcolor = (62744, writeColor), wordspace = (62745, writeSignedWord), letterspace = (62746, writeSignedWord), baselineskip = (62747, writeSignedWord), linespace = (62748, writeSignedWord), parindent = (62749, writeSignedWord), parskip = (62750, writeSignedWord), topmargin = (62753, writeWord), headheight = (62754, writeWord), headsep = (62755, writeWord), oddsidemargin = (62756, writeWord), textheight = (62757, writeWord), textwidth = (62758, writeWord), canvaswidth = (62801, writeWord), canvasheight = (62802, writeWord), footspace = (62759, writeWord), footheight = (62760, writeWord), bgimage = (62761, writeBgImage), setemptyview = (62762, {
  141.     'show': 1,
  142.     'empty': 0 }, writeWord), pageposition = (62763, {
  143.     'any': 0,
  144.     'upper': 1,
  145.     'lower': 2 }, writeWord), evensidemargin = (62764, writeWord), framemode = (62766, {
  146.     'None': 0,
  147.     'curve': 2,
  148.     'square': 1 }, writeWord), blockwidth = (62769, writeWord), blockheight = (62770, writeWord), blockrule = (62771, {
  149.     'horz-fixed': 20,
  150.     'horz-adjustable': 18,
  151.     'vert-fixed': 65,
  152.     'vert-adjustable': 33,
  153.     'block-fixed': 68,
  154.     'block-adjustable': 34 }, writeWord), bgcolor = (62772, writeColor), layout = (62773, {
  155.     'TbRl': 65,
  156.     'LrTb': 52 }, writeWord), framewidth = (62774, writeWord), framecolor = (62775, writeColor), topskip = (62776, writeWord), sidemargin = (62777, writeWord), footskip = (62778, writeWord), align = (62780, {
  157.     'head': 1,
  158.     'center': 4,
  159.     'foot': 8 }, writeWord), column = (62781, writeWord), columnsep = (62782, writeSignedWord), minipagewidth = (62785, writeWord), minipageheight = (62786, writeWord), yspace = (62790, writeWord), xspace = (62791, writeWord), PutObj = (62793, '<HHI'), ImageRect = (62794, '<HHHH'), ImageSize = (62795, '<HH'), RefObjId = (62796, '<I'), PageDiv = (62798, '<HIHI'), StreamFlags = (62804, writeWord), Comment = (62805, writeUnicode), FontFilename = (62809, writeUnicode), PageList = (62812, writeIdList), FontFacename = (62813, writeUnicode), buttonflags = (62817, writeWord), PushButtonStart = (62822,), PushButtonEnd = (62823,), buttonactions = (62826,), endbuttonactions = (62827,), jumpto = (62828, '<II'), RuledLine = (62835, writeRuledLine), rubyaa = (62837, writeRubyAA), rubyoverhang = (62838, {
  160.     'none': 0,
  161.     'auto': 1 }, writeWord), empdotsposition = (62839, {
  162.     'before': 1,
  163.     'after': 2 }, writeWord), empdots = (62840, writeEmpDots), emplineposition = (62841, {
  164.     'before': 1,
  165.     'after': 2 }, writeWord), emplinetype = (62842, LINE_TYPE_ENCODING, writeWord), ChildPageTree = (62843, '<I'), ParentPageTree = (62844, '<I'), Italic = (62849,), ItalicEnd = (62850,), pstart = (62881, writeDWord), pend = (62882,), CharButton = (62887, writeDWord), CharButtonEnd = (62888,), Rubi = (62889,), RubiEnd = (62890,), Oyamoji = (62891,), OyamojiEnd = (62892,), Rubimoji = (62893,), RubimojiEnd = (62894,), Yoko = (62897,), YokoEnd = (62898,), Tate = (62899,), TateEnd = (62900,), Nekase = (62901,), NekaseEnd = (62902,), Sup = (62903,), SupEnd = (62904,), Sub = (62905,), SubEnd = (62906,), NoBR = (62907,), NoBREnd = (62908,), EmpDots = (62909,), EmpDotsEnd = (62910,), EmpLine = (62913,), EmpLineEnd = (62914,), DrawChar = (62915, '<H'), DrawCharEnd = (62916,), Box = (62918, LINE_TYPE_ENCODING, writeWord), BoxEnd = (62919,), Space = (62922, writeSignedWord), textstring = (62924, writeUnicode), Plot = (62929, '<HHII'), CR = (62930,), RegisterFont = (62936, writeDWord), setwaitprop = (62938, {
  166.     'replay': 1,
  167.     'noreplay': 2 }, writeWord), charspace = (62941, writeSignedWord), textlinewidth = (62961, writeLineWidth), linecolor = (62962, writeColor))
  168.  
  169. class ObjectTableEntry(object):
  170.     
  171.     def __init__(self, objId, offset, size):
  172.         self.objId = objId
  173.         self.offset = offset
  174.         self.size = size
  175.  
  176.     
  177.     def write(self, f):
  178.         writeDWords(f, self.objId, self.offset, self.size, 0)
  179.  
  180.  
  181.  
  182. class LrfTag(object):
  183.     
  184.     def __init__(self, name, *parameters):
  185.         
  186.         try:
  187.             tagInfo = TAG_INFO[name]
  188.         except KeyError:
  189.             raise LrfError, 'tag name %s not recognized' % name
  190.  
  191.         self.name = name
  192.         self.type = tagInfo[0]
  193.         self.format = tagInfo[1:]
  194.         if len(parameters) > 1:
  195.             raise LrfError('only one parameter allowed on tag %s' % name)
  196.         len(parameters) > 1
  197.         if len(parameters) == 0:
  198.             self.parameter = None
  199.         else:
  200.             self.parameter = parameters[0]
  201.  
  202.     
  203.     def write(self, lrf, encoding = None):
  204.         if self.type != 0:
  205.             writeWord(lrf, self.type)
  206.         
  207.         p = self.parameter
  208.         if p is None:
  209.             return None
  210.         for f in self.format:
  211.             if isinstance(f, dict):
  212.                 p = f[p]
  213.                 continue
  214.             p is None
  215.             if isinstance(f, str):
  216.                 if isinstance(p, tuple):
  217.                     writeString(lrf, struct.pack(f, *p))
  218.                 else:
  219.                     writeString(lrf, struct.pack(f, p))
  220.             isinstance(p, tuple)
  221.             if f in [
  222.                 writeUnicode,
  223.                 writeRaw,
  224.                 writeEmpDots]:
  225.                 if encoding is None:
  226.                     raise LrfError, 'Tag requires encoding'
  227.                 encoding is None
  228.                 f(lrf, p, encoding)
  229.                 continue
  230.             f(lrf, p)
  231.         
  232.  
  233.  
  234. STREAM_SCRAMBLED = 512
  235. STREAM_COMPRESSED = 256
  236. STREAM_FORCE_COMPRESSED = 33024
  237. STREAM_TOC = 81
  238.  
  239. class LrfStreamBase(object):
  240.     
  241.     def __init__(self, streamFlags, streamData = None):
  242.         self.streamFlags = streamFlags
  243.         self.streamData = streamData
  244.  
  245.     
  246.     def setStreamData(self, streamData):
  247.         self.streamData = streamData
  248.  
  249.     
  250.     def getStreamTags(self, optimize = False):
  251.         flags = self.streamFlags
  252.         streamBuffer = self.streamData
  253.         if flags & STREAM_FORCE_COMPRESSED == STREAM_FORCE_COMPRESSED:
  254.             optimize = False
  255.         
  256.         if flags & STREAM_COMPRESSED == STREAM_COMPRESSED:
  257.             uncompLen = len(streamBuffer)
  258.             compStreamBuffer = zlib.compress(streamBuffer)
  259.             if optimize and uncompLen <= len(compStreamBuffer) + 4:
  260.                 flags &= ~STREAM_COMPRESSED
  261.             else:
  262.                 streamBuffer = struct.pack('<I', uncompLen) + compStreamBuffer
  263.         
  264.         return [
  265.             LrfTag('StreamFlags', flags & 511),
  266.             LrfTag('StreamSize', len(streamBuffer)),
  267.             LrfTag('StreamData', streamBuffer),
  268.             LrfTag('StreamEnd')]
  269.  
  270.  
  271.  
  272. class LrfTagStream(LrfStreamBase):
  273.     
  274.     def __init__(self, streamFlags, streamTags = None):
  275.         LrfStreamBase.__init__(self, streamFlags)
  276.         if streamTags is None:
  277.             self.tags = []
  278.         else:
  279.             self.tags = streamTags[:]
  280.  
  281.     
  282.     def appendLrfTag(self, tag):
  283.         self.tags.append(tag)
  284.  
  285.     
  286.     def getStreamTags(self, encoding, optimizeTags = False, optimizeCompression = False):
  287.         stream = StringIO.StringIO()
  288.         if optimizeTags:
  289.             tagListOptimizer(self.tags)
  290.         
  291.         for tag in self.tags:
  292.             tag.write(stream, encoding)
  293.         
  294.         self.streamData = stream.getvalue()
  295.         stream.close()
  296.         return LrfStreamBase.getStreamTags(self, optimize = optimizeCompression)
  297.  
  298.  
  299.  
  300. class LrfFileStream(LrfStreamBase):
  301.     
  302.     def __init__(self, streamFlags, filename):
  303.         LrfStreamBase.__init__(self, streamFlags)
  304.         f = file(filename, 'rb')
  305.         self.streamData = f.read()
  306.         f.close()
  307.  
  308.  
  309.  
  310. class LrfObject(object):
  311.     
  312.     def __init__(self, name, objId):
  313.         if objId <= 0:
  314.             raise LrfError, 'invalid objId for ' + name
  315.         objId <= 0
  316.         self.name = name
  317.         self.objId = objId
  318.         self.tags = []
  319.         
  320.         try:
  321.             self.type = OBJECT_TYPE_ENCODING[name]
  322.         except KeyError:
  323.             raise LrfError, 'object name %s not recognized' % name
  324.  
  325.  
  326.     
  327.     def __str__(self):
  328.         return 'LRFObject: ' + self.name + ', ' + str(self.objId)
  329.  
  330.     
  331.     def appendLrfTag(self, tag):
  332.         self.tags.append(tag)
  333.  
  334.     
  335.     def appendLrfTags(self, tagList):
  336.         self.tags.extend(tagList)
  337.  
  338.     append = appendLrfTag
  339.     
  340.     def appendTagDict(self, tagDict, genClass = None):
  341.         composites = { }
  342.         for name, value in tagDict.items():
  343.             if name == 'rubyAlignAndAdjust':
  344.                 continue
  345.             
  346.             if name not in ('bgimagemode', 'bgimageid', 'rubyalign', 'rubyadjust', 'empdotscode', 'empdotsfontname', 'refempdotsfont'):
  347.                 self.append(LrfTag(name, value))
  348.                 continue
  349.             composites[name] = value
  350.         
  351.         if 'rubyalign' in composites or 'rubyadjust' in composites:
  352.             ralign = composites.get('rubyalign', 'none')
  353.             radjust = composites.get('rubyadjust', 'start')
  354.             self.append(LrfTag('rubyaa', (ralign, radjust)))
  355.         
  356.         if 'bgimagemode' in composites or 'bgimageid' in composites:
  357.             imode = composites.get('bgimagemode', 'fix')
  358.             iid = composites.get('bgimageid', 0)
  359.             if genClass == 'PageStyle' and imode == 'fix':
  360.                 imode = 'pfix'
  361.             
  362.             self.append(LrfTag('bgimage', (imode, iid)))
  363.         
  364.         if 'empdotscode' in composites and 'empdotsfontname' in composites or 'refempdotsfont' in composites:
  365.             dotscode = composites.get('empdotscode', '0x002E')
  366.             dotsfontname = composites.get('empdotsfontname', 'Dutch801 Rm BT Roman')
  367.             refdotsfont = composites.get('refempdotsfont', 0)
  368.             self.append(LrfTag('empdots', (refdotsfont, dotsfontname, dotscode)))
  369.         
  370.  
  371.     
  372.     def write(self, lrf, encoding = None):
  373.         LrfTag('ObjectStart', (self.objId, self.type)).write(lrf)
  374.         for tag in self.tags:
  375.             tag.write(lrf, encoding)
  376.         
  377.         LrfTag('ObjectEnd').write(lrf)
  378.  
  379.  
  380.  
  381. class LrfToc(LrfObject):
  382.     
  383.     def __init__(self, objId, toc, se):
  384.         LrfObject.__init__(self, 'TOC', objId)
  385.         streamData = self._makeTocStream(toc, se)
  386.         self._makeStreamTags(streamData)
  387.  
  388.     
  389.     def _makeStreamTags(self, streamData):
  390.         stream = LrfStreamBase(STREAM_TOC, streamData)
  391.         self.tags.extend(stream.getStreamTags())
  392.  
  393.     
  394.     def _makeTocStream(self, toc, se):
  395.         stream = StringIO.StringIO()
  396.         nEntries = len(toc)
  397.         writeDWord(stream, nEntries)
  398.         lastOffset = 0
  399.         writeDWord(stream, lastOffset)
  400.         for i in range(nEntries - 1):
  401.             (pageId, objId, label) = toc[i]
  402.             entryLen = 10 + len(label) * 2
  403.             lastOffset += entryLen
  404.             writeDWord(stream, lastOffset)
  405.         
  406.         for entry in toc:
  407.             (pageId, objId, label) = entry
  408.             if pageId <= 0:
  409.                 raise LrfError, 'page id invalid in toc: ' + label
  410.             pageId <= 0
  411.             if objId <= 0:
  412.                 raise LrfError, 'textblock id invalid in toc: ' + label
  413.             objId <= 0
  414.             writeDWord(stream, pageId)
  415.             writeDWord(stream, objId)
  416.             writeUnicode(stream, label, se)
  417.         
  418.         streamData = stream.getvalue()
  419.         stream.close()
  420.         return streamData
  421.  
  422.  
  423.  
  424. class LrfWriter(object):
  425.     
  426.     def __init__(self, sourceEncoding):
  427.         self.sourceEncoding = sourceEncoding
  428.         self.saveStreamTags = False
  429.         self.optimizeTags = False
  430.         self.optimizeCompression = False
  431.         self.rootObjId = 0
  432.         self.rootObj = None
  433.         self.binding = 1
  434.         self.dpi = 1600
  435.         self.width = 600
  436.         self.height = 800
  437.         self.colorDepth = 24
  438.         self.tocObjId = 0
  439.         self.docInfoXml = ''
  440.         self.thumbnailEncoding = 'JPEG'
  441.         self.thumbnailData = ''
  442.         self.objects = []
  443.         self.objectTable = []
  444.  
  445.     
  446.     def getSourceEncoding(self):
  447.         return self.sourceEncoding
  448.  
  449.     
  450.     def toUnicode(self, string):
  451.         if type(string) is str:
  452.             string = string.decode(self.sourceEncoding)
  453.         
  454.         return string
  455.  
  456.     
  457.     def getDocInfoXml(self):
  458.         return self.docInfoXml
  459.  
  460.     
  461.     def setPageTreeId(self, objId):
  462.         self.pageTreeId = objId
  463.  
  464.     
  465.     def getPageTreeId(self):
  466.         return self.pageTreeId
  467.  
  468.     
  469.     def setRootObject(self, obj):
  470.         if self.rootObjId != 0:
  471.             raise LrfError, 'root object already set'
  472.         self.rootObjId != 0
  473.         self.rootObjId = obj.objId
  474.         self.rootObj = obj
  475.  
  476.     
  477.     def registerFontId(self, id):
  478.         if self.rootObj is None:
  479.             raise LrfError, "can't register font -- no root object"
  480.         self.rootObj is None
  481.         self.rootObj.append(LrfTag('RegisterFont', id))
  482.  
  483.     
  484.     def setTocObject(self, obj):
  485.         if self.tocObjId != 0:
  486.             raise LrfError, 'toc object already set'
  487.         self.tocObjId != 0
  488.         self.tocObjId = obj.objId
  489.  
  490.     
  491.     def setThumbnailFile(self, filename, encoding = None):
  492.         f = file(filename, 'rb')
  493.         self.thumbnailData = f.read()
  494.         f.close()
  495.         if encoding is None:
  496.             encoding = os.path.splitext(filename)[1][1:]
  497.         
  498.         encoding = encoding.upper()
  499.         if encoding not in IMAGE_TYPE_ENCODING:
  500.             raise LrfError, 'unknown image type: ' + encoding
  501.         encoding not in IMAGE_TYPE_ENCODING
  502.         self.thumbnailEncoding = encoding
  503.  
  504.     
  505.     def append(self, obj):
  506.         self.objects.append(obj)
  507.  
  508.     
  509.     def addLrfObject(self, objId):
  510.         pass
  511.  
  512.     
  513.     def writeFile(self, lrf):
  514.         if self.rootObjId == 0:
  515.             raise LrfError, 'no root object has been set'
  516.         self.rootObjId == 0
  517.         self.writeHeader(lrf)
  518.         self.writeObjects(lrf)
  519.         self.updateObjectTableOffset(lrf)
  520.         self.updateTocObjectOffset(lrf)
  521.         self.writeObjectTable(lrf)
  522.  
  523.     
  524.     def writeHeader(self, lrf):
  525.         writeString(lrf, LRF_SIGNATURE)
  526.         writeWord(lrf, LRF_VERSION)
  527.         writeWord(lrf, XOR_KEY)
  528.         writeDWord(lrf, self.rootObjId)
  529.         writeQWord(lrf, len(self.objects))
  530.         writeQWord(lrf, 0)
  531.         writeZeros(lrf, 4)
  532.         writeWord(lrf, self.binding)
  533.         writeDWord(lrf, self.dpi)
  534.         writeWords(lrf, self.width, self.height, self.colorDepth)
  535.         writeZeros(lrf, 20)
  536.         writeDWord(lrf, self.tocObjId)
  537.         writeDWord(lrf, 0)
  538.         docInfoXml = codecs.BOM_LE + self.docInfoXml.encode('utf-16-le')
  539.         compDocInfo = zlib.compress(docInfoXml)
  540.         writeWord(lrf, len(compDocInfo) + 4)
  541.         writeWord(lrf, IMAGE_TYPE_ENCODING[self.thumbnailEncoding])
  542.         writeDWord(lrf, len(self.thumbnailData))
  543.         writeDWord(lrf, len(docInfoXml))
  544.         writeString(lrf, compDocInfo)
  545.         writeString(lrf, self.thumbnailData)
  546.  
  547.     
  548.     def writeObjects(self, lrf):
  549.         self.objectTable = []
  550.         for obj in self.objects:
  551.             objStart = lrf.tell()
  552.             obj.write(lrf, self.sourceEncoding)
  553.             objEnd = lrf.tell()
  554.             self.objectTable.append(ObjectTableEntry(obj.objId, objStart, objEnd - objStart))
  555.         
  556.  
  557.     
  558.     def updateObjectTableOffset(self, lrf):
  559.         tableOffset = lrf.tell()
  560.         lrf.seek(24, 0)
  561.         writeQWord(lrf, tableOffset)
  562.         lrf.seek(0, 2)
  563.  
  564.     
  565.     def updateTocObjectOffset(self, lrf):
  566.         if self.tocObjId == 0:
  567.             return None
  568.         for entry in self.objectTable:
  569.             if entry.objId == self.tocObjId:
  570.                 lrf.seek(72, 0)
  571.                 writeDWord(lrf, entry.offset)
  572.                 lrf.seek(0, 2)
  573.                 break
  574.                 continue
  575.             self.tocObjId == 0
  576.         else:
  577.             raise LrfError, 'toc object not in object table'
  578.  
  579.     
  580.     def writeObjectTable(self, lrf):
  581.         for tableEntry in self.objectTable:
  582.             tableEntry.write(lrf)
  583.         
  584.  
  585.  
  586.