StarWrite_File_Format.html (56099B)
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2 <html> 3 <head> 4 <title>StarWrite File Format</title> 5 <meta http-equiv="content-type" 6 content="text/html; charset=ISO-8859-1"> 7 </head> 8 <body> 9 <h1>StarWriter <= 5.x File Format (.sdw)</h1> 10 <h2>Overview</h2> 11 <p>The .sdw file format is an OLE2 Stream. libole2 (available as part of<a 12 href="http://www.wvware.com/"> wv</a>) can be used to access the 13 different substreams contained in the file.</p> 14 <p>All numbers given below are decimal, unless prefixed by 0x, in which 15 case they are hexadecimal.<br> 16 </p> 17 <p>Note that this documentation is far from complete!<br> 18 </p> 19 <p>The example code given below was used with a C++ Compiler, but 20 should mostly be valid C as well.</p> 21 <p>While writing the SDW Importer, I found this small utility I wrote (<a 22 href="dumpstream.c">dumpstream.c [requires libole2]</a>) (GPL) very 23 helpful. It can be used to print out the contents of a OLE2 stream. If 24 invoked like "<code>dumpstream filename.sdw</code>", it lists the 25 streams that are part of the file. If invoked like "<code>dumpstream 26 filename.sdw StarWriterDocument</code>", it prints out the contents of 27 that stream (you might want to pipe the output through <code>xxd</code> 28 to get a hexdump). Don't expect too much from this tool - it's a 29 q&d hack I've made to be able to see the contents of a stream.<br> 30 </p> 31 <p>Filepaths like <code>sw/source/...</code> are paths to the 32 OpenOffice sourcecode, relative to the root.</p> 33 <h2>Data Types</h2> 34 <p>Most types should speak for themselves (e.g. uint16 = unsigned 16 35 bit integer, sint32 = signed 32 bit integer).</p> 36 <p>There is, however, at least one special type: The Class ID, also 37 known as ClsId. It's a structure defined a follows:</p> 38 <code>struct ClsId {<br> 39 sint32 n1;<br> 40 sint16 n2, n3;<br> 41 uint8 n4, n5, n6, n7, n8, n9, n10, n11;<br> 42 };</code><br> 43 <p>The elements of the structure are stored in the file without any 44 padding and in the order in which they occur in the above struct 45 definition.</p> 46 <p>The type <code>bool</code> is a one-byte integer, where 0 means 47 false and all other values true; though usually 1 is stored.<br> 48 </p> 49 <p>Another important type is the <a name="Bytestring"></a><code>Bytestring</code>,<code></code>it 50 looks like this: First, there is an <code>uint16</code>, giving the 51 length in bytes of the following string. A <code>char[]</code> follows. 52 It is supposed to be firstly decrypted (if in the StarWriterDocument 53 stream outside the header and if the document is encrypted; see below). 54 Under the same condition, the string is in the character set specified 55 in the document header.<br> 56 </p> 57 <h2>Streams</h2> 58 The file consists of the following streams:<br> 59 <a href="#SwPageStyleSheets">SwPageStyleSheets</a><br> 60 <a href="#SwNumRules">SwNumRules</a><br> 61 <a href="#StarWriterDocument">StarWriterDocument</a> - the actual 62 document and most important stream<br> 63 <a href="#SfxWindows">SfxWindows</a> - position of windows (?)<br> 64 <a href="#SfxStyleSheets">SfxStyleSheets</a><br> 65 <a href="#SfxDocumentInfo">SfxDocumentInfo</a> - information about 66 the document, like charset, author etc<br> 67 <a href="#persist_elements">persist elements</a><br> 68 <a href="#SummaryInformation">SummaryInformation</a><br> 69 <a href="#001Ole">\001Ole</a> - ?<br> 70 <a href="#001CompObj">\001CompObj</a> - "Compatibility Object" (?), 71 contains information about the creator of the document<br> 72 <br> 73 <h3><a name="SwPageStyleSheets"></a>SwPageStyleSheets</h3> 74 <h3><a name="SwNumRules"></a> SwNumRules</h3> 75 <h3><a name="StarWriterDocument"></a> StarWriterDocument</h3> 76 <table cellpadding="2" cellspacing="2" border="1" width="790"> 77 <tbody> 78 <tr> 79 <td valign="top">Offset in Hex<br> 80 </td> 81 <td valign="top">Length<br> 82 </td> 83 <td valign="top">Type<br> 84 </td> 85 <td valign="top">Default Value<br> 86 </td> 87 <td valign="top">Description<br> 88 </td> 89 </tr> 90 <tr> 91 <td valign="top">0x00<br> 92 </td> 93 <td valign="top">7<br> 94 </td> 95 <td valign="top">char[]<br> 96 </td> 97 <td valign="top">"SW5HDR"<br> 98 </td> 99 <td valign="top">Version Indicator, null-terminated.<br> 100 Can be "SW3HDR", "SW4HDR" or "SW5HDR"<br> 101 </td> 102 </tr> 103 <tr> 104 <td valign="top">0x07<br> 105 </td> 106 <td valign="top">1<br> 107 </td> 108 <td valign="top">uint8<br> 109 </td> 110 <td valign="top">0x2e (?)<br> 111 </td> 112 <td valign="top">Length of the header, including Block Name, 113 but not including Record Sizes (if used)<br> 114 </td> 115 </tr> 116 <tr> 117 <td valign="top">0x08<br> 118 </td> 119 <td valign="top">2<br> 120 </td> 121 <td valign="top">uint16<br> 122 </td> 123 <td valign="top">0x0217<br> 124 </td> 125 <td valign="top">Document version, increased every time a new 126 feature is added.<br> 127 </td> 128 </tr> 129 <tr> 130 <td valign="top">0x0A<br> 131 </td> 132 <td valign="top">2<br> 133 </td> 134 <td valign="top">uint16<br> 135 </td> 136 <td valign="top">n/a<br> 137 </td> 138 <td valign="top">File Flags, see <a href="#File_Flags">below</a><br> 139 </td> 140 </tr> 141 <tr> 142 <td valign="top">0x0C<br> 143 </td> 144 <td valign="top">4<br> 145 </td> 146 <td valign="top">uint32<br> 147 </td> 148 <td valign="top">n/a<br> 149 </td> 150 <td valign="top">Document Flags, see <a href="#Document_Flags">below</a><br> 151 </td> 152 </tr> 153 <tr> 154 <td valign="top">0x10<br> 155 </td> 156 <td valign="top">4<br> 157 </td> 158 <td valign="top">uint32<br> 159 </td> 160 <td valign="top">0<br> 161 </td> 162 <td valign="top">nRecSzPos (?)<br> 163 </td> 164 </tr> 165 <tr> 166 <td valign="top">0x14<br> 167 </td> 168 <td valign="top">6<br> 169 </td> 170 <td valign="top">--<br> 171 </td> 172 <td valign="top">0<br> 173 </td> 174 <td valign="top">dummy bytes... actually, uint32, uint8, uint8<br> 175 </td> 176 </tr> 177 <tr> 178 <td valign="top">0x1A<br> 179 </td> 180 <td valign="top">1<br> 181 </td> 182 <td valign="top">uint8<br> 183 </td> 184 <td valign="top">0x30<br> 185 </td> 186 <td valign="top">Redline mode, see <a href="#Redline_Mode">below</a><br> 187 </td> 188 </tr> 189 <tr> 190 <td valign="top">0x1B<br> 191 </td> 192 <td valign="top">1<br> 193 </td> 194 <td valign="top">uint8<br> 195 </td> 196 <td valign="top">0x00<br> 197 </td> 198 <td valign="top">Compatibility Version. Is increased when a 199 change makes the file format incompatible with previous versions.<br> 200 </td> 201 </tr> 202 <tr> 203 <td valign="top">0x1C<br> 204 </td> 205 <td valign="top">16<br> 206 </td> 207 <td valign="top">uint8[]<br> 208 </td> 209 <td valign="top">n/a<br> 210 </td> 211 <td valign="top">Password verification data, see <a 212 href="#Password_Protection">below</a><br> 213 </td> 214 </tr> 215 <tr> 216 <td valign="top">0x2C<br> 217 </td> 218 <td valign="top">1<br> 219 </td> 220 <td valign="top">uint8<br> 221 </td> 222 <td valign="top">depends<br> 223 </td> 224 <td valign="top">The character coding of the file. <a 225 href="encodings.txt">Here</a> is a file which includes mapping of 226 StarWriter IDs to iconv names, usable a a C/C++ Header file<br> 227 </td> 228 </tr> 229 <tr> 230 <td valign="top">0x2D<br> 231 </td> 232 <td valign="top">1<br> 233 </td> 234 <td valign="top">uint8<br> 235 </td> 236 <td valign="top">0x00<br> 237 </td> 238 <td valign="top">cGui (?) "OLD: eSysType" (?) so not in use 239 anymore?<br> 240 </td> 241 </tr> 242 <tr> 243 <td valign="top">0x2E<br> 244 </td> 245 <td valign="top">4<br> 246 </td> 247 <td valign="top">uint32<br> 248 </td> 249 <td valign="top"><br> 250 </td> 251 <td valign="top">Current Date, used for Password verification 252 (see <a href="#Password_Protection">below</a>). Format: 253 20020501<br> 254 </td> 255 </tr> 256 <tr> 257 <td valign="top">0x32<br> 258 </td> 259 <td valign="top">4<br> 260 </td> 261 <td valign="top">uint32<br> 262 </td> 263 <td valign="top"><br> 264 </td> 265 <td valign="top">Current Time, also for PW Verification, Format: 266 22034800 (HHMMSS00)<br> 267 </td> 268 </tr> 269 <tr> 270 <td valign="top">0x36<br> 271 </td> 272 <td valign="top">64<br> 273 </td> 274 <td valign="top">char[]<br> 275 </td> 276 <td valign="top"><br> 277 </td> 278 <td valign="top">sBlockName (?) (in the document charset) (only 279 read if <code>SWGF_BLOCKNAME</code> flag is set!)<br> 280 </td> 281 </tr> 282 <tr> 283 <td valign="top"><br> 284 </td> 285 <td valign="top"><br> 286 </td> 287 <td valign="top"><br> 288 </td> 289 <td valign="top"><br> 290 </td> 291 <td valign="top">rec sizes... only if nRecSzPos != 0 && 292 nVersion >= SWG_RECSIZES<br> 293 see <code>sw/source/core/sw3io/sw3imp.cxx</code> lines 1070ff<br> 294 I don't know details yet<br> 295 </td> 296 </tr> 297 </tbody> 298 </table> 299 <p>After the header, the file consists of many sections. Each section 300 starts with a character (<code>char</code>) that indicates of what 301 type it is (hereafter called section id). After that, there are three 302 bytes indicating the length of the section (little-endian). (to 303 convert this to a usable integer, use for example: (<code>buf [0] | 304 (buf[1] << 8) | (buf [2] << 16))</code> where buf points to 305 the first of the three read bytes). This means that unsupported 306 Sections can easily be skipped.<br> 307 </p> 308 <p>See <a href="#Section_Types">below</a> for a list of section types.<br> 309 </p> 310 <h4><a name="File_Flags"></a>File Flags<br> 311 </h4> 312 <p>(from <code>sw/source/core/sw3io/sw3ids.hxx</code> lines 65ff)<br> 313 <code>#define SWGF_BLOCKNAME 0x0002<br> 314 </code>Header has textmodule<code><br> 315 #define SWGF_HAS_PASSWD 0x0008<br> 316 </code>Stream is password protected, see below for details.<code><br> 317 #define SWGF_HAS_PGNUMS 0x0100<br> 318 </code>Stream has pagenumbers<code><br> 319 #define SWGF_BAD_FILE 0x8000<br> 320 </code>There was an error writing the file - treat it as unusable.<br> 321 </p> 322 <h4><a name="Document_Flags"></a>Document Flags</h4> 323 <p><code>#define SWDF_BROWSEMODE1 0x1</code><br> 324 Show document in browse mode?<br> 325 <code>#define SWDF_BROWSEMODE2 0x2</code><br> 326 Same as above, only one of them need to be set<br> 327 <code>#define SWDF_HTMLMODE 0x4</code><br> 328 Document is in HTML Mode<br> 329 <code>#define SWDF_HEADINBROWSE 0x8</code><br> 330 Show headers in Browse Mode<br> 331 <code>#define SWDF_FOOTINBROWSE 0x10</code><br> 332 Show footers in browse mode<br> 333 <code>#define SWDF_GLOBALDOC 0x20</code><br> 334 Is a global document (a global document can contain chapter 335 documents... I think)<br> 336 <code>#define SWDF_GLOBALDOCSAVELINK 0x40</code><br> 337 Include sections that are linked to the global document when saving<br> 338 <code>#define SWDF_LABELDOC 0x80</code><br> 339 Is a label ("etiketten") document</p> 340 <h4><a name="Redline_Mode"></a>Redline Mode</h4> 341 <p>(from <code>sw/inc/redlenum.hxx</code> lines 83ff)</p> 342 <p><code> enum SwRedlineMode<br> 343 {<br> 344 REDLINE_NONE,<br> 345 </code>No Redline mode<code><br> 346 REDLINE_ON = 0x01,</code><code><br> 347 </code>Redlines are on<br> 348 <code> 349 REDLINE_IGNORE = 0x02,<br> 350 </code>Don't react to redlines<code><br> 351 REDLINE_SHOW_INSERT 352 = 0x10,<br> 353 </code>Show all inserts<code><br> 354 REDLINE_SHOW_DELETE 355 = 0x20,</code><br> 356 Show all deletes <br> 357 <code> 358 REDLINE_SHOW_MASK = REDLINE_SHOW_INSERT | REDLINE_SHOW_DELETE<br> 359 </code>The Default<code><br> 360 };<br> 361 </code></p> 362 <h4><a name="Password_Protection"></a>Password Protection</h4> 363 <p>(from <code>sw/source/core/sw3io/sw3imp.cxx</code> lines 2721ff and <code>sw/source/core/sw3io/crypter.cxx</code> 364 lines 77ff)<br> 365 </p> 366 <p>Firstly, to be able to en- or decrypt data, the password must be 367 encrypted in memory (see below for the actual algorithm). For this 368 encryption, this password is always used. Also, the password needs 369 to be exactly 16 characters long; if it's shorter, it needs to be 370 padded with spaces:</p> 371 <p><code>static const UT_uint8 gEncode[] =<br> 372 { 0xab, 0x9e, 0x43, 0x05, 0x38, 0x12, 0x4d, 0x44,<br> 373 0xd5, 0x7e, 0xe3, 0x84, 0x98, 0x23, 0x3f, 0xba };<br> 374 </code></p> 375 <p>The resulting string will be used as the password for actual en- or 376 decryption. (For both en- and decryption the same algorithm will be 377 used).<br> 378 </p> 379 <p>Here's the algorithm:<br> 380 </p> 381 <p><code>void SDWCryptor::Decrypt(const char* aEncrypted, char* 382 aBuffer, UT_uint32 aLen) const {<br> 383 size_t nCryptPtr = 0;<br> 384 UT_uint8 cBuf[maxPWLen];<br> 385 memcpy(cBuf, mPassword, 386 maxPWLen);<br> 387 UT_uint8* p = cBuf;<br> 388 <br> 389 if (!aLen)<br> 390 aLen = strlen(aEncrypted);<br> 391 <br> 392 while (aLen--) {<br> 393 394 *aBuffer++ = *aEncrypted++ ^ ( *p ^ (UT_uint8) ( cBuf[ 0 ] * nCryptPtr 395 ) );<br> 396 397 *p += ( nCryptPtr < (maxPWLen-1) ) ? *(p+1) : cBuf[ 0 ];<br> 398 399 if( !*p ) *p += 1;<br> 400 401 p++;<br> 402 403 if( ++nCryptPtr >= maxPWLen ) {<br> 404 405 nCryptPtr = 0;<br> 406 407 p = cBuf;<br> 408 }<br> 409 }<br> 410 }</code><br> 411 </p> 412 <p>Where:<br> 413 <code>maxPWLen</code> = 16<br> 414 <code>mPassword</code> is an array of characters, 16 bytes long, and 415 contains the password which will be used<br> 416 </p> 417 <p>To verify that the given password is actually correct, these steps 418 should be taken:<br> 419 </p> 420 <p>A new string, say <code>testString</code>, should be built, 421 consisting of the Date and Time (from the header) next to each 422 other in Hex format, padded with 0 on the left if shorter than 8 423 characters (can for example be archieved by <code>snprintf(testString, 424 sizeof(testString), "%08lx%08lx", mDate, mTime);</code>)</p> 425 <p>This string should now be encrypted with the given password, and the 426 result should be compared to the password verification data 427 mentioned above. If they are equal, the password is correct.<br> 428 </p> 429 <h4><a name="Section_Types"></a>Section Types</h4> 430 <p>(the letter in parentheses is the section id)<br> 431 </p> 432 <ul> 433 <li>SWG_CONTENTS (<code>'N'</code>)<br> 434 Actual textual content of the document. This section's header looks 435 like this:<br> 436 <ul> 437 <li>if version >= SWG_LAYFRAMES (5): one byte of flags, where 438 the lower 4 bits give the length of the flag part.</li> 439 <li>if version >= SWG_LONGIDX (0x201): <code>uint32</code> 440 giving the number of nodes (?) (<code>sw/source/core/sw3io/sw3sectn.cxx</code> 441 lines 181ff)<code></code></li> 442 <li>else<br> 443 if version >= SWG_LAYFRAMES: <code>uint16</code> = a dummy section 444 id, can be thrown away (at least that's what openoffice does)<br> 445 <code>uint16</code>, same meaning as the nodes from above, just 446 as a 2 byte integer.</li> 447 <li>flag part is over; if the length (taken from the flags as 448 stated above) hasn't been reached yet, skip the rest</li> 449 </ul> 450 After the section header, SWG_CONTENTS consists of sections like the 451 document itself. Most important seems to be<br> 452 <ul> 453 <li>SWG_TEXTNODE (<code>'T'</code>) (<code>sw/source/core/sw3io/sw3nodes.cxx</code> 454 lines 788ff)<br> 455 Firstly, textnodes contain a flag section as above (one byte of flags, 456 lower four bits give the length). I haven't looked at the possible 457 flags yet, so I just skip over them.<br> 458 A bytestring (see <a href="#Bytestring">above</a>) follows, containing 459 a paragraph of text.<br> 460 After this, a set of records follow (usually attributes (<code>'A'</code>), 461 which have the following structure) 462 <table cellpadding="2" cellspacing="2" border="1" 463 style="text-align: left; width: 100%;"> 464 <tbody> 465 <tr> 466 <td style="vertical-align: top;">offset relative to 467 record start</td> 468 <td style="vertical-align: top;">length<br> 469 </td> 470 <td style="vertical-align: top;">type<br> 471 </td> 472 <td style="vertical-align: top;">description<br> 473 </td> 474 </tr> 475 <tr> 476 <td style="vertical-align: top;">0x00<br> 477 </td> 478 <td style="vertical-align: top;">1<br> 479 </td> 480 <td style="vertical-align: top;">flag<br> 481 </td> 482 <td style="vertical-align: top;">Flag record, as above.<br> 483 </td> 484 </tr> 485 <tr> 486 <td style="vertical-align: top;">0x01<br> 487 </td> 488 <td style="vertical-align: top;">2<br> 489 </td> 490 <td style="vertical-align: top;">uint16<br> 491 </td> 492 <td style="vertical-align: top;">Which type of attribute 493 this is.<br> 494 </td> 495 </tr> 496 <tr> 497 <td style="vertical-align: top;">0x03<br> 498 </td> 499 <td style="vertical-align: top;">2<br> 500 </td> 501 <td style="vertical-align: top;">uint16<br> 502 </td> 503 <td style="vertical-align: top;">Version of the attribute 504 (I don't know details yet) (seems to be 0 usually)<br> 505 </td> 506 </tr> 507 <tr> 508 <td style="vertical-align: top;">0x05<br> 509 </td> 510 <td style="vertical-align: top;">2<br> 511 </td> 512 <td style="vertical-align: top;">uint16</td> 513 <td style="vertical-align: top;">offset of the first 514 character to which this attribute applies, relative to the start of the 515 textnode. only exists if flag 0x10 is set. zero-based.<br> 516 </td> 517 </tr> 518 <tr> 519 <td style="vertical-align: top;">0x07<br> 520 </td> 521 <td style="vertical-align: top;">2<br> 522 </td> 523 <td style="vertical-align: top;">uint16<br> 524 </td> 525 <td style="vertical-align: top;">offset of the last 526 character. only exists if flag 0x20 is set.</td> 527 </tr> 528 </tbody> 529 </table> 530 In addition, there can be an "S"-Record, which contains attributes (as 531 above) which apply to the whole paragraph.<br> 532 Known values for the attribute type:<br> 533 <table cellpadding="2" cellspacing="2" border="1" 534 style="text-align: left; width: 100%;"> 535 <tbody> 536 <tr> 537 <td style="vertical-align: top;">0x100a<br> 538 </td> 539 <td style="vertical-align: top;">Italic<br> 540 </td> 541 </tr> 542 <tr> 543 <td style="vertical-align: top;">0x100d<br> 544 </td> 545 <td style="vertical-align: top;">Underline<br> 546 </td> 547 </tr> 548 <tr> 549 <td style="vertical-align: top;">0x100e<br> 550 </td> 551 <td style="vertical-align: top;">Bold<br> 552 </td> 553 </tr> 554 </tbody> 555 </table> 556 <br> 557 </li> 558 <li>SWG_JOBSETUP (<code>'J'</code>)<br> 559 <p>This section contains informations about the selected 560 printer and paper. This only reflects the settings made in 561 File|Printer Setup, not Format|Page!</p> 562 Firstly, two defines:<br> 563 <code>#define </code><code>JOBSET_FILE364_SYSTEM</code><code> 564 (0xFFFF)</code><br> 565 <code>#define JOBSET_FILE605_SYSTEM (0xFFFE)</code><br> 566 <table cellpadding="2" cellspacing="2" border="1" width="760"> 567 <tbody> 568 <tr> 569 <td valign="top">Offset in Hex<br> 570 </td> 571 <td valign="top">Length<br> 572 </td> 573 <td valign="top">Type<br> 574 </td> 575 <td valign="top">Default Value<br> 576 </td> 577 <td valign="top">Description<br> 578 </td> 579 </tr> 580 <tr> 581 <td valign="top">0x00<br> 582 </td> 583 <td valign="top">2<br> 584 </td> 585 <td valign="top">uint16<br> 586 </td> 587 <td valign="top">TBD<br> 588 </td> 589 <td valign="top">Length [nLen]<br> 590 </td> 591 </tr> 592 <tr> 593 <td valign="top">0x02<br> 594 </td> 595 <td valign="top">2<br> 596 </td> 597 <td valign="top">uint16<br> 598 </td> 599 <td valign="top">TBD<br> 600 </td> 601 <td valign="top">System (?)<br> 602 </td> 603 </tr> 604 <tr> 605 <td valign="top">0x04<br> 606 </td> 607 <td valign="top">64<br> 608 </td> 609 <td valign="top">char[]<br> 610 </td> 611 <td valign="top"><br> 612 </td> 613 <td valign="top">Printer Name<br> 614 </td> 615 </tr> 616 <tr> 617 <td valign="top">0x44<br> 618 </td> 619 <td valign="top">32<br> 620 </td> 621 <td valign="top">char[]<br> 622 </td> 623 <td valign="top"><br> 624 </td> 625 <td valign="top">Device Name<br> 626 </td> 627 </tr> 628 <tr> 629 <td valign="top">0x64<br> 630 </td> 631 <td valign="top">32<br> 632 </td> 633 <td valign="top">char[]<br> 634 </td> 635 <td valign="top"><br> 636 </td> 637 <td valign="top">Port Name<br> 638 </td> 639 </tr> 640 <tr> 641 <td valign="top">0x84<br> 642 </td> 643 <td valign="top">32<br> 644 </td> 645 <td valign="top">char[]<br> 646 </td> 647 <td valign="top"><br> 648 </td> 649 <td valign="top">Driver Name<br> 650 </td> 651 </tr> 652 <tr> 653 <td valign="top"><br> 654 </td> 655 <td valign="top"><br> 656 </td> 657 <td valign="top"><br> 658 </td> 659 <td valign="top"><br> 660 </td> 661 <td valign="top">All further fields are only used if 662 System is <code></code><code>JOBSET_FILE364_SYSTEM</code> or <code>JOBSET_FILE605_SYSTEM</code><br> 663 </td> 664 </tr> 665 <tr> 666 <td valign="top">0xA4<br> 667 </td> 668 <td valign="top">2<br> 669 </td> 670 <td valign="top">uint16<br> 671 </td> 672 <td valign="top">TBD<br> 673 </td> 674 <td valign="top">nSize<br> 675 </td> 676 </tr> 677 <tr> 678 <td valign="top">0xA6<br> 679 </td> 680 <td valign="top">2<br> 681 </td> 682 <td valign="top">uint16<br> 683 </td> 684 <td valign="top">TBD<br> 685 </td> 686 <td valign="top">nSystem (again??)<br> 687 </td> 688 </tr> 689 <tr> 690 <td valign="top">0xA8<br> 691 </td> 692 <td valign="top">4<br> 693 </td> 694 <td valign="top">uint32<br> 695 </td> 696 <td valign="top">TBD<br> 697 </td> 698 <td valign="top">Driver Data Length<br> 699 </td> 700 </tr> 701 <tr> 702 <td valign="top">0xAC<br> 703 </td> 704 <td valign="top">2<br> 705 </td> 706 <td valign="top">enum [uint16]<br> 707 </td> 708 <td valign="top"><br> 709 </td> 710 <td valign="top">Orientation (0=Portrait, 1=Landscape)<br> 711 </td> 712 </tr> 713 <tr> 714 <td valign="top">0xAE<br> 715 </td> 716 <td valign="top">2<br> 717 </td> 718 <td valign="top">uint16<br> 719 </td> 720 <td valign="top"><br> 721 </td> 722 <td valign="top">Paper Bin<br> 723 </td> 724 </tr> 725 <tr> 726 <td valign="top">0xB0<br> 727 </td> 728 <td valign="top">2<br> 729 </td> 730 <td valign="top">enum [uint16]<br> 731 </td> 732 <td valign="top"><br> 733 </td> 734 <td valign="top">Paper Format (0=A3, 1=A4, 2=A5, 3=B4, 735 4=B5, 5=Letter, 6=Legal, 7=Tabloid, 8=User defined<br> 736 </td> 737 </tr> 738 <tr> 739 <td valign="top">0xB2<br> 740 </td> 741 <td valign="top">4<br> 742 </td> 743 <td valign="top">uint32<br> 744 </td> 745 <td valign="top"><br> 746 </td> 747 <td valign="top">Paper Width<br> 748 </td> 749 </tr> 750 <tr> 751 <td valign="top">0xB6<br> 752 </td> 753 <td valign="top">4<br> 754 </td> 755 <td valign="top">uint32<br> 756 </td> 757 <td valign="top"><br> 758 </td> 759 <td valign="top">Paper Height<br> 760 </td> 761 </tr> 762 <tr> 763 <td valign="top">0xBA<br> 764 </td> 765 <td valign="top">Driver Data Length<br> 766 </td> 767 <td valign="top">?<br> 768 </td> 769 <td valign="top"><br> 770 </td> 771 <td valign="top">Driver Data (?) 772 (vcl/source/gdi/jobset.cxx lines 383ff). Only if the Driver Data 773 Length is > 0.<br> 774 </td> 775 </tr> 776 <tr> 777 <td valign="top"><br> 778 </td> 779 <td valign="top">nLen minus already read data<br> 780 </td> 781 <td valign="top"><br> 782 </td> 783 <td valign="top"><br> 784 </td> 785 <td valign="top">Corresponding Key and Value strings 786 (ByteStrings, in UTF-8 encoding). Only if System == <code>JOBSET_FILE605_SYSTEM</code><br> 787 </td> 788 </tr> 789 </tbody> 790 </table> 791 <h5></h5> 792 The encoding of the Printer, Device, Port and Driver name is UTF-8, 793 unless the System is <code>JOBSET_FILE364_SYSTEM</code>, in which 794 case it is the same encoding as the rest of the document.<br> 795 </li> 796 <li>SWG_EOF (<code>'Z'</code>)<br> 797 Marks the end of the SWG_CONTENTS section (zero-len</li> 798 </ul> 799 </li> 800 <li>SWG_STRINGPOOL (<code>'!'</code>)<br> 801 There are two variants of the string pool, depending on the document 802 version. The old one is used if Version <= SWG_POOLIDS (0x3), 803 otherwise the new one is used.</li> 804 <ul> 805 <li>New:<br> 806 <table cellpadding="2" cellspacing="2" border="1" width="720"> 807 <tbody> 808 <tr> 809 <td valign="top">Offset in Hex<br> 810 </td> 811 <td valign="top">Length<br> 812 </td> 813 <td valign="top">Type<br> 814 </td> 815 <td valign="top">Description<br> 816 </td> 817 </tr> 818 <tr> 819 <td valign="top">0x00<br> 820 </td> 821 <td valign="top">1<br> 822 </td> 823 <td valign="top">uint8<br> 824 </td> 825 <td valign="top">Character Set for the strings<br> 826 </td> 827 </tr> 828 <tr> 829 <td valign="top">0x01<br> 830 </td> 831 <td valign="top">2<br> 832 </td> 833 <td valign="top">uint16<br> 834 </td> 835 <td valign="top">Number of strings<br> 836 </td> 837 </tr> 838 </tbody> 839 </table> 840 Now, the strings follow; each one having the following structure:<br> 841 <table cellpadding="2" cellspacing="2" border="1" width="720"> 842 <tbody> 843 <tr> 844 <td valign="top">Length<br> 845 </td> 846 <td valign="top">Type<br> 847 </td> 848 <td valign="top">Description<br> 849 </td> 850 </tr> 851 <tr> 852 <td valign="top">2<br> 853 </td> 854 <td valign="top">uint16<br> 855 </td> 856 <td valign="top">ID of the string<br> 857 </td> 858 </tr> 859 <tr> 860 <td valign="top">n/a<br> 861 </td> 862 <td valign="top">Bytestring<br> 863 </td> 864 <td valign="top">The string. Not encrypted. If ID == 865 IDX_NOCONV_FF (0xFFFC), then the 0xFF character in the string should 866 be left unconverted; else, a normal conversion can be performed.<br> 867 </td> 868 </tr> 869 </tbody> 870 </table> 871 If the version of the file is less than SWG_HTMLCOLLCHG (0x0203) (the 872 version for new HTML Pool-Template IDs), the ID is not zero and below 873 IDX_SPEC_VALUE (0xFFF0) ("from here on reserved for special values"), 874 the ID must be mapped to a new one; but before that, the actual string 875 must possibly be changed, according to this table:<br> 876 <table cellpadding="2" cellspacing="2" border="1" width="720"> 877 <tbody> 878 <tr> 879 <td valign="top">ID<br> 880 </td> 881 <td valign="top">New String<br> 882 </td> 883 </tr> 884 <tr> 885 <td valign="top">RES_POOLCOLL_HTML_LISTING_40 (0x3002)<br> 886 </td> 887 <td valign="top">"LISTING"<br> 888 </td> 889 </tr> 890 <tr> 891 <td valign="top">RES_POOLCOLL_HTML_XMP_40 (0x3003)<br> 892 </td> 893 <td valign="top">"XMP"<br> 894 </td> 895 </tr> 896 </tbody> 897 </table> 898 Afterwards, the ID must be changed according to this table (only if 899 version < SWG_HTMLCOLLCHG)<br> 900 <table cellpadding="2" cellspacing="2" border="1" width="100%"> 901 <tbody> 902 <tr> 903 <td valign="top">old ID<br> 904 </td> 905 <td valign="top">new ID<br> 906 </td> 907 </tr> 908 <tr> 909 <td valign="top">RES_POOLCOLL_HTML_LISTING_40 / 910 RES_POOLCOLL_HTML_XMP_40<br> 911 </td> 912 <td valign="top">must be or'ed with USER_FMT (1 << 15)<br> 913 </td> 914 </tr> 915 <tr> 916 <td valign="top">RES_POOLCOLL_HTML_HR_40 (0x3004)<br> 917 </td> 918 <td valign="top">RES_POOLCOLL_HTML_HR (0x3002)<br> 919 </td> 920 </tr> 921 <tr> 922 <td valign="top">RES_POOLCOLL_HTML_H6_40 (0x3005)<br> 923 </td> 924 <td valign="top">RES_POOLCOLL_HEADLINE6 (0x80f)<br> 925 </td> 926 </tr> 927 <tr> 928 <td valign="top">RES_POOLCOLL_HTML_DD_40 (0x3006)<br> 929 </td> 930 <td valign="top">RES_POOLCOLL_HTML_DD (0x3003)<br> 931 </td> 932 </tr> 933 <tr> 934 <td valign="top">RES_POOLCOLL_HTML_DT_40 (0x3007)<br> 935 </td> 936 <td valign="top">RES_POOLCOLL_HTML_DT (0x3004)<br> 937 </td> 938 </tr> 939 </tbody> 940 </table> 941 possibly interesting: sw/inc/poolfmt.hxx#L112<br> 942 I don't really know what happens with the strings there, yet.<br> 943 </li> 944 </ul> 945 <li>SWG_EOF (<code>'Z'</code>)<br> 946 Marks the end of the file and is of zero length. (XXX not sure if this 947 is actually present)<br> 948 </li> 949 </ul> 950 <h3><a name="SfxWindows"></a> SfxWindows</h3> 951 <h3><a name="SfxStyleSheets"></a> SfxStyleSheets</h3> 952 <h3><a name="SfxDocumentInfo"></a> SfxDocumentInfo</h3> 953 <p>(OpenOffice Tree: <code>sfx2/source/doc/docinf.cxx</code> lines 954 786ff)<br> 955 </p> 956 <p>offsets assume a version of 0x0B and default values (for bytestrings 957 and lengths). quotes are from openoffice code or comments<br> 958 </p> 959 <table cellpadding="2" cellspacing="2" border="1" width="820"> 960 <tbody> 961 <tr> 962 <td valign="top">present if header version ><br> 963 </td> 964 <td valign="top">Offset in Hex<br> 965 </td> 966 <td valign="top">Length<br> 967 </td> 968 <td valign="top">Type<br> 969 </td> 970 <td valign="top">Default Value<br> 971 </td> 972 <td valign="top">Description<br> 973 </td> 974 </tr> 975 <tr> 976 <td valign="top"><br> 977 </td> 978 <td valign="top">0x00<br> 979 </td> 980 <td valign="top">2<br> 981 </td> 982 <td valign="top">uint16<br> 983 </td> 984 <td valign="top">0x0F<br> 985 </td> 986 <td valign="top">Length of the following String<br> 987 </td> 988 </tr> 989 <tr> 990 <td valign="top"><br> 991 </td> 992 <td valign="top">0x02<br> 993 </td> 994 <td valign="top">15<br> 995 </td> 996 <td valign="top">char[]<br> 997 </td> 998 <td valign="top">"SfxDocumentInfo"<br> 999 </td> 1000 <td valign="top">Headerstring (stored without terminating zero)<br> 1001 </td> 1002 </tr> 1003 <tr> 1004 <td valign="top"><br> 1005 </td> 1006 <td valign="top">0x11<br> 1007 </td> 1008 <td valign="top">2<br> 1009 </td> 1010 <td valign="top">uint16<br> 1011 </td> 1012 <td valign="top">0x000B<br> 1013 </td> 1014 <td valign="top">Version<br> 1015 </td> 1016 </tr> 1017 <tr> 1018 <td valign="top"><br> 1019 </td> 1020 <td valign="top">0x13<br> 1021 </td> 1022 <td valign="top">1<br> 1023 </td> 1024 <td valign="top">bool<br> 1025 </td> 1026 <td valign="top">0x00<br> 1027 </td> 1028 <td valign="top">True if doc is pw protected<br> 1029 </td> 1030 </tr> 1031 <tr> 1032 <td valign="top"><br> 1033 </td> 1034 <td valign="top">0x14<br> 1035 </td> 1036 <td valign="top">2<br> 1037 </td> 1038 <td valign="top">uint16<br> 1039 </td> 1040 <td valign="top">0x0016 (on my system)<br> 1041 </td> 1042 <td valign="top">Charset, see below.<br> 1043 </td> 1044 </tr> 1045 <tr> 1046 <td valign="top"><br> 1047 </td> 1048 <td valign="top">0x16<br> 1049 </td> 1050 <td valign="top">1<br> 1051 </td> 1052 <td valign="top">bool<br> 1053 </td> 1054 <td valign="top">0x00<br> 1055 </td> 1056 <td valign="top">Graphics are saved portable<br> 1057 </td> 1058 </tr> 1059 <tr> 1060 <td valign="top"><br> 1061 </td> 1062 <td valign="top">0x17<br> 1063 </td> 1064 <td valign="top">1<br> 1065 </td> 1066 <td valign="top">bool<br> 1067 </td> 1068 <td valign="top">0x01<br> 1069 </td> 1070 <td valign="top">Ask the user whether the template should be 1071 reloaded<br> 1072 </td> 1073 </tr> 1074 <tr> 1075 <td valign="top"><br> 1076 </td> 1077 <td valign="top">0x18<br> 1078 </td> 1079 <td valign="top">41<br> 1080 </td> 1081 <td valign="top">Timestamp<br> 1082 </td> 1083 <td valign="top"><br> 1084 </td> 1085 <td valign="top">Creator Timestamp, see below<br> 1086 </td> 1087 </tr> 1088 <tr> 1089 <td valign="top"><br> 1090 </td> 1091 <td valign="top">0x41<br> 1092 </td> 1093 <td valign="top">41<br> 1094 </td> 1095 <td valign="top">Timestamp<br> 1096 </td> 1097 <td valign="top"><br> 1098 </td> 1099 <td valign="top">Timestamp for last Modification<br> 1100 </td> 1101 </tr> 1102 <tr> 1103 <td valign="top"><br> 1104 </td> 1105 <td valign="top">0x6a<br> 1106 </td> 1107 <td valign="top">41<br> 1108 </td> 1109 <td valign="top">Timestamp<br> 1110 </td> 1111 <td valign="top"><br> 1112 </td> 1113 <td valign="top">Timestamp for last Printing<br> 1114 </td> 1115 </tr> 1116 <tr> 1117 <td valign="top"><br> 1118 </td> 1119 <td valign="top">0x93<br> 1120 </td> 1121 <td valign="top">65<br> 1122 </td> 1123 <td valign="top">Bytestring+Padding<br> 1124 </td> 1125 <td valign="top">""<br> 1126 </td> 1127 <td valign="top">Title of the document; pad until 63 chars are 1128 read<br> 1129 </td> 1130 </tr> 1131 <tr> 1132 <td valign="top"><br> 1133 </td> 1134 <td valign="top">0xd4<br> 1135 </td> 1136 <td valign="top">65<br> 1137 </td> 1138 <td valign="top">Bytestring+Padding<br> 1139 </td> 1140 <td valign="top">""<br> 1141 </td> 1142 <td valign="top">Theme/Subject of the document, pad until 63<br> 1143 </td> 1144 </tr> 1145 <tr> 1146 <td valign="top"><br> 1147 </td> 1148 <td valign="top">0x115<br> 1149 </td> 1150 <td valign="top">257<br> 1151 </td> 1152 <td valign="top">Bytestring+Padding<br> 1153 </td> 1154 <td valign="top">""<br> 1155 </td> 1156 <td valign="top">Comment, pad until 255<br> 1157 </td> 1158 </tr> 1159 <tr> 1160 <td valign="top"><br> 1161 </td> 1162 <td valign="top">0x216<br> 1163 </td> 1164 <td valign="top">129<br> 1165 </td> 1166 <td valign="top">Bytestring+Padding<br> 1167 </td> 1168 <td valign="top">""<br> 1169 </td> 1170 <td valign="top">Keywords, pad until 127<br> 1171 </td> 1172 </tr> 1173 <tr> 1174 <td valign="top"><br> 1175 </td> 1176 <td valign="top">0x297<br> 1177 </td> 1178 <td valign="top">4*42<br> 1179 </td> 1180 <td valign="top"><br> 1181 </td> 1182 <td valign="top"><br> 1183 </td> 1184 <td valign="top">following two fields are repeated 4 times:<br> 1185 </td> 1186 </tr> 1187 <tr> 1188 <td valign="top"><br> 1189 </td> 1190 <td valign="top"><br> 1191 </td> 1192 <td valign="top">21<br> 1193 </td> 1194 <td valign="top">Bytestring+Padding <br> 1195 </td> 1196 <td valign="top">"Info0" - "Info4"<br> 1197 </td> 1198 <td valign="top">Name of user-defined field, padded until 19<br> 1199 </td> 1200 </tr> 1201 <tr> 1202 <td valign="top"><br> 1203 </td> 1204 <td valign="top"><br> 1205 </td> 1206 <td valign="top">21<br> 1207 </td> 1208 <td valign="top">Bytestring+Padding <br> 1209 </td> 1210 <td valign="top">""<br> 1211 </td> 1212 <td valign="top">content of user-defined field, padded until 19<br> 1213 </td> 1214 </tr> 1215 <tr> 1216 <td valign="top"><br> 1217 </td> 1218 <td valign="top">0x33f<br> 1219 </td> 1220 <td valign="top">--<br> 1221 </td> 1222 <td valign="top">Bytestring<br> 1223 </td> 1224 <td valign="top">""<br> 1225 </td> 1226 <td valign="top">Template Name<br> 1227 </td> 1228 </tr> 1229 <tr> 1230 <td valign="top"><br> 1231 </td> 1232 <td valign="top" rowspan="1" colspan="5">from here on, offset 1233 assumes an empty template name and filename<br> 1234 </td> 1235 </tr> 1236 <tr> 1237 <td valign="top"><br> 1238 </td> 1239 <td valign="top">0x341<br> 1240 </td> 1241 <td valign="top">--<br> 1242 </td> 1243 <td valign="top">Bytestring<br> 1244 </td> 1245 <td valign="top">""<br> 1246 </td> 1247 <td valign="top">Template Filename<br> 1248 </td> 1249 </tr> 1250 <tr> 1251 <td valign="top"><br> 1252 </td> 1253 <td valign="top">0x343<br> 1254 </td> 1255 <td valign="top">4<br> 1256 </td> 1257 <td valign="top">uint32<br> 1258 </td> 1259 <td valign="top"><br> 1260 </td> 1261 <td valign="top">Template Date (format as in Timestamp)<br> 1262 </td> 1263 </tr> 1264 <tr> 1265 <td valign="top"><br> 1266 </td> 1267 <td valign="top">0x347<br> 1268 </td> 1269 <td valign="top">4<br> 1270 </td> 1271 <td valign="top">uint32<br> 1272 </td> 1273 <td valign="top"><br> 1274 </td> 1275 <td valign="top">Template Time (format as in Timestamp)<br> 1276 </td> 1277 </tr> 1278 <tr> 1279 <td valign="top"><br> 1280 </td> 1281 <td valign="top">0x34b<br> 1282 </td> 1283 <td valign="top">2<br> 1284 </td> 1285 <td valign="top">uint16<br> 1286 </td> 1287 <td valign="top"><br> 1288 </td> 1289 <td valign="top">Mail-Adress count. Only if the stream version 1290 (of StarWriterDocument?) is <= SOFFICE_FILEFORMAT_40 (3580). Unused 1291 field.<br> 1292 </td> 1293 </tr> 1294 <tr> 1295 <td valign="top"><br> 1296 </td> 1297 <td valign="top" rowspan="1" colspan="5">following two fields are 1298 repeated number_of<small>_</small>mail_adresses times; and can be 1299 ignored<br> 1300 </td> 1301 </tr> 1302 <tr> 1303 <td valign="top"><br> 1304 </td> 1305 <td valign="top"><br> 1306 </td> 1307 <td valign="top">--<br> 1308 </td> 1309 <td valign="top">Bytestring<br> 1310 </td> 1311 <td valign="top"><br> 1312 </td> 1313 <td valign="top">the address<br> 1314 </td> 1315 </tr> 1316 <tr> 1317 <td valign="top"><br> 1318 </td> 1319 <td valign="top"><br> 1320 </td> 1321 <td valign="top">2<br> 1322 </td> 1323 <td valign="top">uint16<br> 1324 </td> 1325 <td valign="top"><br> 1326 </td> 1327 <td valign="top">flags<br> 1328 </td> 1329 </tr> 1330 <tr> 1331 <td valign="top"><br> 1332 </td> 1333 <td valign="top" rowspan="1" colspan="5">following offsets assume 1334 that the stream version is >= SOFFICE_FILEFORMAT_40 and that 1335 therefore the mail addresses aren't present<br> 1336 </td> 1337 </tr> 1338 <tr> 1339 <td valign="top"><br> 1340 </td> 1341 <td valign="top">0x34b<br> 1342 </td> 1343 <td valign="top">4<br> 1344 </td> 1345 <td valign="top">int32<br> 1346 </td> 1347 <td valign="top">?<br> 1348 </td> 1349 <td valign="top">lTime (?)<br> 1350 </td> 1351 </tr> 1352 <tr> 1353 <td valign="top">4<br> 1354 </td> 1355 <td valign="top">0x34f<br> 1356 </td> 1357 <td valign="top">2<br> 1358 </td> 1359 <td valign="top">uint16<br> 1360 </td> 1361 <td valign="top">1<br> 1362 </td> 1363 <td valign="top">Document number (seems to be the version, ie. 1364 how often the document was saved)<br> 1365 </td> 1366 </tr> 1367 <tr> 1368 <td valign="top"><br> 1369 </td> 1370 <td valign="top">0x351<br> 1371 </td> 1372 <td valign="top">2<br> 1373 </td> 1374 <td valign="top">uint16<br> 1375 </td> 1376 <td valign="top">0<br> 1377 </td> 1378 <td valign="top">user data size<br> 1379 </td> 1380 </tr> 1381 <tr> 1382 <td valign="top"><br> 1383 </td> 1384 <td valign="top">0x353<br> 1385 </td> 1386 <td valign="top">see above<br> 1387 </td> 1388 <td valign="top">byte[]<br> 1389 </td> 1390 <td valign="top"><br> 1391 </td> 1392 <td valign="top">user data "e.g. document statistic". following 1393 offsets assume that this is not present<br> 1394 </td> 1395 </tr> 1396 <tr> 1397 <td valign="top"><br> 1398 </td> 1399 <td valign="top">0x353<br> 1400 </td> 1401 <td valign="top">1<br> 1402 </td> 1403 <td valign="top">bool<br> 1404 </td> 1405 <td valign="top"><br> 1406 </td> 1407 <td valign="top">Template contains configuration<br> 1408 </td> 1409 </tr> 1410 <tr> 1411 <td valign="top">5<br> 1412 </td> 1413 <td valign="top">0x354<br> 1414 </td> 1415 <td valign="top">1<br> 1416 </td> 1417 <td valign="top">bool<br> 1418 </td> 1419 <td valign="top">false<br> 1420 </td> 1421 <td valign="top">Reload enabled?<br> 1422 </td> 1423 </tr> 1424 <tr> 1425 <td valign="top">5<br> 1426 </td> 1427 <td valign="top">0x355<br> 1428 </td> 1429 <td valign="top">--<br> 1430 </td> 1431 <td valign="top">Bytestring<br> 1432 </td> 1433 <td valign="top">""<br> 1434 </td> 1435 <td valign="top">Reload URL<br> 1436 </td> 1437 </tr> 1438 <tr> 1439 <td valign="top">5<br> 1440 </td> 1441 <td valign="top">0x357<br> 1442 </td> 1443 <td valign="top">4<br> 1444 </td> 1445 <td valign="top">uint32<br> 1446 </td> 1447 <td valign="top">60<br> 1448 </td> 1449 <td valign="top">Reload seconds<br> 1450 </td> 1451 </tr> 1452 <tr> 1453 <td valign="top">5<br> 1454 </td> 1455 <td valign="top">0x35b<br> 1456 </td> 1457 <td valign="top">--<br> 1458 </td> 1459 <td valign="top">Bytestring<br> 1460 </td> 1461 <td valign="top">""<br> 1462 </td> 1463 <td valign="top">Default Target Frame<br> 1464 </td> 1465 </tr> 1466 <tr> 1467 <td valign="top">6<br> 1468 </td> 1469 <td valign="top">0x35d<br> 1470 </td> 1471 <td valign="top">1<br> 1472 </td> 1473 <td valign="top">bool<br> 1474 </td> 1475 <td valign="top">true<br> 1476 </td> 1477 <td valign="top">Save Graphics compressed (if true, next field is 1478 also true)<br> 1479 </td> 1480 </tr> 1481 <tr> 1482 <td valign="top">7<br> 1483 </td> 1484 <td valign="top">0x35e<br> 1485 </td> 1486 <td valign="top">1<br> 1487 </td> 1488 <td valign="top">bool<br> 1489 </td> 1490 <td valign="top">true<br> 1491 </td> 1492 <td valign="top">Save Original Graphics<br> 1493 </td> 1494 </tr> 1495 <tr> 1496 <td valign="top">8<br> 1497 </td> 1498 <td valign="top">0x35f<br> 1499 </td> 1500 <td valign="top">1<br> 1501 </td> 1502 <td valign="top">bool<br> 1503 </td> 1504 <td valign="top">false<br> 1505 </td> 1506 <td valign="top">Save Version on Close (?)<br> 1507 </td> 1508 </tr> 1509 <tr> 1510 <td valign="top">8<br> 1511 </td> 1512 <td valign="top">0x360<br> 1513 </td> 1514 <td valign="top">--<br> 1515 </td> 1516 <td valign="top">Bytestring<br> 1517 </td> 1518 <td valign="top">""<br> 1519 </td> 1520 <td valign="top">Copies to<br> 1521 </td> 1522 </tr> 1523 <tr> 1524 <td valign="top">8<br> 1525 </td> 1526 <td valign="top">0x362<br> 1527 </td> 1528 <td valign="top">--<br> 1529 </td> 1530 <td valign="top">Bytestring<br> 1531 </td> 1532 <td valign="top">""<br> 1533 </td> 1534 <td valign="top">Original<br> 1535 </td> 1536 </tr> 1537 <tr> 1538 <td valign="top">8<br> 1539 </td> 1540 <td valign="top">0x364<br> 1541 </td> 1542 <td valign="top">--<br> 1543 </td> 1544 <td valign="top">Bytestring<br> 1545 </td> 1546 <td valign="top">""<br> 1547 </td> 1548 <td valign="top">References<br> 1549 </td> 1550 </tr> 1551 <tr> 1552 <td valign="top">8<br> 1553 </td> 1554 <td valign="top">0x366<br> 1555 </td> 1556 <td valign="top">--<br> 1557 </td> 1558 <td valign="top">Bytestring<br> 1559 </td> 1560 <td valign="top">""<br> 1561 </td> 1562 <td valign="top">Recipient<br> 1563 </td> 1564 </tr> 1565 <tr> 1566 <td valign="top">8<br> 1567 </td> 1568 <td valign="top">0x368<br> 1569 </td> 1570 <td valign="top">--<br> 1571 </td> 1572 <td valign="top">Bytestring<br> 1573 </td> 1574 <td valign="top">""<br> 1575 </td> 1576 <td valign="top">Reply To<br> 1577 </td> 1578 </tr> 1579 <tr> 1580 <td valign="top">8<br> 1581 </td> 1582 <td valign="top">0x36a<br> 1583 </td> 1584 <td valign="top">--<br> 1585 </td> 1586 <td valign="top">Bytestring<br> 1587 </td> 1588 <td valign="top">""<br> 1589 </td> 1590 <td valign="top">Blind Copies<br> 1591 </td> 1592 </tr> 1593 <tr> 1594 <td valign="top">8<br> 1595 </td> 1596 <td valign="top">0x36c<br> 1597 </td> 1598 <td valign="top">--<br> 1599 </td> 1600 <td valign="top">Bytestring<br> 1601 </td> 1602 <td valign="top">""<br> 1603 </td> 1604 <td valign="top">In Reply To<br> 1605 </td> 1606 </tr> 1607 <tr> 1608 <td valign="top">8<br> 1609 </td> 1610 <td valign="top">0x36e<br> 1611 </td> 1612 <td valign="top">--<br> 1613 </td> 1614 <td valign="top">Bytestring<br> 1615 </td> 1616 <td valign="top">""<br> 1617 </td> 1618 <td valign="top">Newsgroups<br> 1619 </td> 1620 </tr> 1621 <tr> 1622 <td valign="top">8<br> 1623 </td> 1624 <td valign="top">0x370<br> 1625 </td> 1626 <td valign="top">2<br> 1627 </td> 1628 <td valign="top">uint16<br> 1629 </td> 1630 <td valign="top">0x0000<br> 1631 </td> 1632 <td valign="top">Priority<br> 1633 </td> 1634 </tr> 1635 <tr> 1636 <td valign="top">9<br> 1637 </td> 1638 <td valign="top">0x372<br> 1639 </td> 1640 <td valign="top">--<br> 1641 </td> 1642 <td valign="top">Bytestring<br> 1643 </td> 1644 <td valign="top">""<br> 1645 </td> 1646 <td valign="top">Special Mime-Type<br> 1647 </td> 1648 </tr> 1649 <tr> 1650 <td valign="top">10<br> 1651 </td> 1652 <td valign="top">0x374<br> 1653 </td> 1654 <td valign="top">1<br> 1655 </td> 1656 <td valign="top">bool<br> 1657 </td> 1658 <td valign="top"><br> 1659 </td> 1660 <td valign="top">Use user data<br> 1661 </td> 1662 </tr> 1663 </tbody> 1664 </table> 1665 <p> A Timestamp has this structure:<br> 1666 </p> 1667 <table cellpadding="2" cellspacing="2" border="1" width="720"> 1668 <tbody> 1669 <tr> 1670 <td valign="top">length<br> 1671 </td> 1672 <td valign="top">type<br> 1673 </td> 1674 <td valign="top">desc<br> 1675 </td> 1676 </tr> 1677 <tr> 1678 <td valign="top">--<br> 1679 </td> 1680 <td valign="top">ByteString<br> 1681 </td> 1682 <td valign="top">name of the creator/modifier. Is less than or 1683 exactly 31 characters; after it, padding bytes follow until the total 1684 data length is 31 bytes (padding bytes = 0x20 = Spaces)<br> 1685 </td> 1686 </tr> 1687 <tr> 1688 <td valign="top">4<br> 1689 </td> 1690 <td valign="top">uint32<br> 1691 </td> 1692 <td valign="top">Modification Date (format: 1693 day+month*100+year*10000<br> 1694 </td> 1695 </tr> 1696 <tr> 1697 <td valign="top">4<br> 1698 </td> 1699 <td valign="top">uint32<br> 1700 </td> 1701 <td valign="top">Modification Time (format: 1702 centiseconds+seconds*100+minutes*10000+hours*1000000)<br> 1703 </td> 1704 </tr> 1705 </tbody> 1706 </table> 1707 <p><br> 1708 </p> 1709 <h3><a name="persist_elements"></a> persist elements</h3> 1710 <p>(In the OpenOffice tree: <code>so3/source/persist/persist.cxx</code>)</p> 1711 This stream is also known as <code>\002OlePress00</code> or<code>\001Ole10Native</code> 1712 .<br> 1713 <h3><a name="SummaryInformation"></a> SummaryInformation</h3> 1714 <h3><a name="001Ole"></a> \001Ole</h3> 1715 <p>(In the OpenOffice tree: <code>class StgOleStream</code>, <code>sot/source/sdstor/stgole.cxx</code> 1716 and <code>.hxx</code>)</p> 1717 <table cellpadding="2" cellspacing="2" border="1" width="790"> 1718 <tbody> 1719 <tr> 1720 <td valign="top">Offset in Hex<br> 1721 </td> 1722 <td valign="top">Length<br> 1723 </td> 1724 <td valign="top">Type<br> 1725 </td> 1726 <td valign="top">Default Value<br> 1727 </td> 1728 <td valign="top">Description<br> 1729 </td> 1730 </tr> 1731 <tr> 1732 <td valign="top">0x00<br> 1733 </td> 1734 <td valign="top">4<br> 1735 </td> 1736 <td valign="top">sint32<br> 1737 </td> 1738 <td valign="top">0x2000001<br> 1739 </td> 1740 <td valign="top">Version of this stream<br> 1741 </td> 1742 </tr> 1743 <tr> 1744 <td valign="top">0x04<br> 1745 </td> 1746 <td valign="top">4<br> 1747 </td> 1748 <td valign="top">uint32<br> 1749 </td> 1750 <td valign="top"><br> 1751 </td> 1752 <td valign="top">Object Flags<br> 1753 </td> 1754 </tr> 1755 <tr> 1756 <td valign="top">0x08<br> 1757 </td> 1758 <td valign="top">4<br> 1759 </td> 1760 <td valign="top">sint32<br> 1761 </td> 1762 <td valign="top">0<br> 1763 </td> 1764 <td valign="top">Update Options<br> 1765 </td> 1766 </tr> 1767 <tr> 1768 <td valign="top">0x0C<br> 1769 </td> 1770 <td valign="top">4<br> 1771 </td> 1772 <td valign="top">sint32<br> 1773 </td> 1774 <td valign="top">0<br> 1775 </td> 1776 <td valign="top">reserved<br> 1777 </td> 1778 </tr> 1779 <tr> 1780 <td valign="top">0x10<br> 1781 </td> 1782 <td valign="top">4<br> 1783 </td> 1784 <td valign="top">sint32<br> 1785 </td> 1786 <td valign="top">0<br> 1787 </td> 1788 <td valign="top">Moniker 1<br> 1789 </td> 1790 </tr> 1791 </tbody> 1792 </table> 1793 (Sorry, I don't know anything about the meaning of these fields)<br> 1794 <h3><a name="001CompObj"></a> \001CompObj</h3> 1795 <p>(In the OpenOffice tree: <code>class StgCompObjStream</code>, <code>sot/source/sdstor/stgole.cxx</code> 1796 and <code>.hxx</code>)</p> 1797 This stream is the "Compatibility Object" I suppose. Its format is 1798 this:<br> 1799 <table cellpadding="2" cellspacing="2" border="1" width="790"> 1800 <tbody> 1801 <tr> 1802 <td valign="top">Offset in Hex<br> 1803 </td> 1804 <td valign="top">Length<br> 1805 </td> 1806 <td valign="top">Type<br> 1807 </td> 1808 <td valign="top">Default Value<br> 1809 </td> 1810 <td valign="top">Description<br> 1811 </td> 1812 </tr> 1813 <tr> 1814 <td valign="top">0x00<br> 1815 </td> 1816 <td valign="top">2<br> 1817 </td> 1818 <td valign="top">uint16<br> 1819 </td> 1820 <td valign="top">0x0001<br> 1821 </td> 1822 <td valign="top">Version of the CompObj<br> 1823 </td> 1824 </tr> 1825 <tr> 1826 <td valign="top">0x02<br> 1827 </td> 1828 <td valign="top">2<br> 1829 </td> 1830 <td valign="top">uint16<br> 1831 </td> 1832 <td valign="top">0xFFFE<br> 1833 </td> 1834 <td valign="top">Byte Order<br> 1835 </td> 1836 </tr> 1837 <tr> 1838 <td valign="top">0x04<br> 1839 </td> 1840 <td valign="top">4<br> 1841 </td> 1842 <td valign="top">uint32<br> 1843 </td> 1844 <td valign="top">0x0A03<br> 1845 (=Windows 3.1)<br> 1846 </td> 1847 <td valign="top">Windows version (?)<br> 1848 </td> 1849 </tr> 1850 <tr> 1851 <td valign="top">0x08<br> 1852 </td> 1853 <td valign="top">4<br> 1854 </td> 1855 <td valign="top">sint32<br> 1856 </td> 1857 <td valign="top">0xFFFF (-1)<br> 1858 If this is -1, continue reading the stream<br> 1859 </td> 1860 <td valign="top">Marker<br> 1861 </td> 1862 </tr> 1863 <tr> 1864 <td valign="top">0x0C<br> 1865 </td> 1866 <td valign="top">16<br> 1867 </td> 1868 <td valign="top">ClsId<br> 1869 </td> 1870 <td valign="top">{C20CF9D1-85AE-11D1-AAB4-006097DA561A} <br> 1871 </td> 1872 <td valign="top">StarOffice's Class ID?<br> 1873 </td> 1874 </tr> 1875 <tr> 1876 <td valign="top">0x1C<br> 1877 </td> 1878 <td valign="top">4<br> 1879 </td> 1880 <td valign="top">uint32<br> 1881 </td> 1882 <td valign="top">5<br> 1883 </td> 1884 <td valign="top">Length of the "Username"<br> 1885 </td> 1886 </tr> 1887 <tr> 1888 <td valign="top">0x20<br> 1889 </td> 1890 <td valign="top"><br> 1891 </td> 1892 <td valign="top">char[]<br> 1893 </td> 1894 <td valign="top">"Text"<br> 1895 </td> 1896 <td valign="top">A string of characters, known as "Username"<br> 1897 </td> 1898 </tr> 1899 <tr> 1900 <td valign="top">0x20 + length of username<br> 1901 </td> 1902 <td valign="top">4<br> 1903 </td> 1904 <td valign="top">uint32<br> 1905 </td> 1906 <td valign="top">15<br> 1907 </td> 1908 <td valign="top">Length of the file format string<br> 1909 </td> 1910 </tr> 1911 <tr> 1912 <td valign="top">0x24 + length of username<br> 1913 </td> 1914 <td valign="top"><br> 1915 </td> 1916 <td valign="top">char[]<br> 1917 </td> 1918 <td valign="top">"StarWriter 5.0"<br> 1919 </td> 1920 <td valign="top">File format string. Basically, this describes 1921 the version of the file<br> 1922 </td> 1923 </tr> 1924 <tr> 1925 <td valign="top">0x24 + length1 + length2<br> 1926 </td> 1927 <td valign="top">4<br> 1928 </td> 1929 <td valign="top">uint32<br> 1930 </td> 1931 <td valign="top">0x0000<br> 1932 </td> 1933 <td valign="top">Terminator, always zero<br> 1934 </td> 1935 </tr> 1936 </tbody> 1937 </table> 1938 <h4>Notes</h4> 1939 <ol> 1940 <li>Both strings are stored with a terminating zero, and the length 1941 includes this character. If zero, no version/format string is stored 1942 in the stream.<br> 1943 </li> 1944 <li>The length of the file format string can either be -1, zero or 1945 a positive value. If it is -1, it means that the next 4 bytes should 1946 be interpreted as a Windows Clipboard format. If it's zero, see 1947 above. If it's greater than zero, the version string follows. See 1948 below.</li> 1949 <li>Star/Open Office knows about lots of version strings.(see <code>sot/source/base/exchange.cxx</code>and<code>tools/inc/solar.h</code> 1950 lines 471ff). OpenOffice uses <code>RegisterFormatName</code> 1951 (line 253ff from the first file) to get the version number from the 1952 string. (XXX There was another file, but I can't find it right now)</li> 1953 <li>Common version strings and their numbers:</li> 1954 </ol> 1955 <table cellpadding="2" cellspacing="2" border="1" width="400"> 1956 <tbody> 1957 <tr> 1958 <td valign="top">StarWriter 3.0<br> 1959 </td> 1960 <td valign="top">3450<br> 1961 </td> 1962 </tr> 1963 <tr> 1964 <td valign="top">StarWriter 4.0<br> 1965 </td> 1966 <td valign="top">3580<br> 1967 </td> 1968 </tr> 1969 <tr> 1970 <td valign="top">StarWriter 5.0<br> 1971 </td> 1972 <td valign="top">5050<br> 1973 </td> 1974 </tr> 1975 </tbody> 1976 </table> 1977 <br> 1978 <br> 1979 <br> 1980 <br> 1981 <br> 1982 <br> 1983 <br> 1984 <br> 1985 <br> 1986 <br> 1987 <br> 1988 <br> 1989 </body> 1990 </html>