1149 lines
45 KiB
Plaintext
1149 lines
45 KiB
Plaintext
<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
|
|
<!ENTITY author-name-full "Roberto Arturo Tena Sánchez">
|
|
<!ENTITY author-email "<email><arturo@directmail.org></email>">
|
|
<!ENTITY author-email-address "<address>&author-email;</address>">
|
|
|
|
<!ENTITY maintainer-name-full "Roberto Arturo Tena Sánchez">
|
|
<!ENTITY maintainer-email-ulink "<ulink URL="mailto:arturo@directmail.org"><arturo@directmail.org></ulink>">
|
|
|
|
<!-- this-release entity must have majorversion.minorversion.microversion
|
|
format -->
|
|
<!ENTITY this-release "2.0.0">
|
|
|
|
<!ENTITY deffree-link "<link linkend="deffree">free</link>">
|
|
|
|
<!ENTITY cf "Compound Files">
|
|
<!ENTITY ss "Structured Storage">
|
|
<!ENTITY ssf "Structured Storage file">
|
|
<!ENTITY license "
|
|
This document is copyright 1999 by &author-name-full;. This document is
|
|
free software; you can redistribute it and/or modify it under the terms
|
|
of the <link linkend="gpl">GNU General Public License</link>
|
|
as published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version.
|
|
">
|
|
]>
|
|
|
|
|
|
<!--
|
|
NOTES:
|
|
end tag for screen should be written immediately after the last character
|
|
in this element is written, to avoid an extra line be added.
|
|
The same goes for programlisting.
|
|
-->
|
|
|
|
|
|
|
|
<!-- I have to put index as main book's id in order to generate index.html as
|
|
the main html page! -->
|
|
<!-- Any body know how to do it cleaner? -->
|
|
<book id="index">
|
|
|
|
|
|
|
|
<bookinfo>
|
|
<title>cole Programmer Reference</title>
|
|
<subtitle>cole &this-release;</subtitle>
|
|
<authorgroup>
|
|
<author>
|
|
<firstname>Arturo</firstname>
|
|
<surname>Tena</surname>
|
|
<affiliation>
|
|
&author-email-address;
|
|
</affiliation>
|
|
</author>
|
|
</authorgroup>
|
|
<copyright>
|
|
<year>1999</year>
|
|
<holder>&author-name-full;</holder>
|
|
</copyright>
|
|
<legalnotice>
|
|
<para>
|
|
&license;
|
|
</para>
|
|
</legalnotice>
|
|
</bookinfo>
|
|
|
|
|
|
|
|
<toc></toc>
|
|
|
|
|
|
|
|
<chapter id="what-is-cole">
|
|
<title>What is cole?</title>
|
|
<para>
|
|
cole is a free C OLE library.
|
|
</para>
|
|
<para>
|
|
cole is distributed under the terms of the
|
|
<link linkend="gpl">GNU General Public License</link>
|
|
(GPL) to give an impulse to the Free Software.
|
|
</para>
|
|
<para>
|
|
Using cole, you can access Microsoft' `Structured Storage' files.
|
|
The most popular Microsoft's programs generate `Structured Storage' files,
|
|
incluiding the Microsoft' suite for offices. StarDivision' suite
|
|
(StarOffice) generate `Structured Storage' files too. FlashPix file
|
|
format is `Structured Storage' too.
|
|
</para>
|
|
<para>
|
|
What is a `Structured Storage' file?
|
|
Inside a `Structured Storage' file there is a filesystem, with
|
|
directories and files, which Microsoft calls `containers' and `streams'.
|
|
Using cole you can travel through that filesystem and read the files.
|
|
</para>
|
|
<para>
|
|
cole doesn't know about internal structure of a stream, it only reads the
|
|
raw data. You can use then the Microsoft's documentation available at
|
|
<ulink URL="http://msdn.microsoft.com">http://msdn.microsoft.com</ulink>
|
|
or the information available at <ulink URL="http://www.wotsit.org"
|
|
>http://www.wotsit.org</ulink> to read that structure. If you know
|
|
anything in the side of StarDivision email me. FlashPix is well
|
|
documented.
|
|
</para>
|
|
<para>
|
|
cole was developed using the information available at <ulink
|
|
URL="http://wwwwbs.cs.tu-berlin.de/~schwartz/pmh/guide.html"
|
|
>http://wwwwbs.cs.tu-berlin.de/~schwartz/pmh/guide.html</ulink>, and no
|
|
information from any other source (incluiding Microsoft) has been used.
|
|
</para>
|
|
</chapter> <!-- what-is-cole -->
|
|
|
|
|
|
|
|
<chapter id="source-code">
|
|
<title>Where to get cole source code</title>
|
|
<para>
|
|
You can get the most recent stable release of cole from the <ulink
|
|
URL="http://arturo.directmail.org/filtersweb/"
|
|
>Filters Project</ulink> home page or from <ulink
|
|
URL="ftp://ftp.metalab.unc.edu/pub/Linux/libs/"
|
|
>Metalab</ulink> (former SunSite) archive.
|
|
</para>
|
|
</chapter> <!-- source-code -->
|
|
|
|
|
|
|
|
<chapter id="compiling">
|
|
<title>Compiling</title>
|
|
<sect1 id="how-to-compile">
|
|
<title>How to compile</title>
|
|
<para>
|
|
A standard <filename>configure</filename> script is provided. You can
|
|
read the instructions in the file <filename>INSTALL</filename>.
|
|
A typical configuration/compilation/installation session is shown next.
|
|
</para>
|
|
<screen>
|
|
<prompt>$</prompt> <userinput>ls</userinput>
|
|
cole-&this-release;.tar.gz
|
|
<prompt>$</prompt> <userinput>gzip -d cole-&this-release;.tar.gz</userinput>
|
|
<prompt>$</prompt> <userinput>tar -xf cole-&this-release;.tar</userinput>
|
|
<prompt>$</prompt> <userinput>ls</userinput>
|
|
cole-&this-release;.tar.gz cole-&this-release;/
|
|
<prompt>$</prompt> <userinput>cd cole-&this-release;</userinput>
|
|
<prompt>$</prompt> <userinput>./configure --prefix=/usr/local</userinput>
|
|
...
|
|
Configured cole release &this-release;
|
|
<prompt>$</prompt> <userinput>make</userinput>
|
|
...
|
|
<prompt>$</prompt> <userinput>make install</userinput>
|
|
...
|
|
<prompt>$</prompt> <userinput>make clean</userinput>
|
|
...</screen>
|
|
<para>
|
|
You can add the following flags to <filename>configure</filename>:
|
|
</para>
|
|
<simplelist>
|
|
<member>
|
|
<userinput>--enable-cole-verbose</userinput>. To make cole verbose
|
|
everything. Usefull when debugging cole.
|
|
</member>
|
|
<member>
|
|
<userinput>--enable-osf-align-check</userinput>. If you have errors
|
|
while compiling under OSF1, enable this flag.
|
|
</member>
|
|
</simplelist>
|
|
<para>
|
|
Please, if you have some error with cole, send the cole's output when
|
|
compiled using <userinput>--enable-cole-verbose</userinput> to the
|
|
<link linkend="current-maintainer">maintainer</link>.
|
|
</para>
|
|
<para>
|
|
For additional instructions, read the file <filename>INSTALL</filename>.
|
|
If you have problems, you should read the <ulink
|
|
URL="http://arturo.directmail.org/filtersweb/">Filters Project</ulink>
|
|
FAQ and later email to the <link linkend="current-maintainer"
|
|
>maintainer</link>.
|
|
</para>
|
|
<para>
|
|
Only a static library is compiled by default. If you want compile a shared
|
|
library too, you have to include the flag
|
|
<userinput>--enable-shared</userinput> when
|
|
running configure, and the program that dinamically links against cole
|
|
shared library still needs to be under a license compatible with GPL.
|
|
This is because cole is under GPL license, not LGPL license.
|
|
</para>
|
|
</sect1> <!-- how-to-compile -->
|
|
<sect1 id="supported-plattforms">
|
|
<title>Supported plattforms</title>
|
|
<para>
|
|
cole has been successfully tested under (as reported by
|
|
<userinput>uname -mrsv</userinput> or with the system information):
|
|
</para>
|
|
<screen>
|
|
Linux 2.0.36 #1 Wed Feb 17 19:45:41 EST 1999 i586
|
|
Linux 2.0.35 #1 Thu Jul 23 14:01:04 EDT 1998 i586
|
|
OSF1 V5.0 564 alpha
|
|
OSF1 V4.0 564 alpha
|
|
Solaris in Ultra Sparc (sparc-sun-solaris2.5.1)
|
|
Arturo Tena <ulink URL="mailto:arturo@directmail.org"><arturo@directmail.org></ulink>
|
|
SunOS 5.6 Generic_105181-03 sun4u
|
|
Matthew Evans <ulink URL="mailto:matthewe@its.caltech.edu"><matthewe@its.caltech.edu></ulink>
|
|
Windows NT 4.0 SP4
|
|
with Cygwin b20.1
|
|
with CoolView DLL
|
|
Martin Scharpf <ulink URL="mailto:martin.scharpf@bbraun.com"><martin.scharpf@bbraun.com></ulink></screen>
|
|
<para>
|
|
If you have a different one, it will be useful to hear about you. Please,
|
|
email to the <link linkend="current-maintainer">maintainer</link>.
|
|
</para>
|
|
</sect1> <!-- supported-plattforms -->
|
|
</chapter> <!-- compiling -->
|
|
|
|
|
|
|
|
<chapter id="using">
|
|
<title>Using</title>
|
|
<para>
|
|
cole is used to access Microsoft OLE's &ss; and &cf;.
|
|
Specifically, cole extracts the structures named streams
|
|
from a &ssf;. Each stream is written to a new file.
|
|
A dynamic tree in memory is created to store the name of the streams and
|
|
the name of the files where they are written, besides other information.
|
|
</para>
|
|
<para>
|
|
cole doesn't know the structure of each stream, it only extract them to
|
|
new files. If you want to know the structure of a particular stream,
|
|
you can read the <ulink URL="http://msdn.microsoft.com/"
|
|
>Microsoft's documentation</ulink>, or seach in <ulink
|
|
URL="http://www.wotsit.org/">Wotsit</ulink>. Using that documentation, you
|
|
can read the extracted streams searching for the actual information.
|
|
</para>
|
|
<sect1 id="api">
|
|
<title>API</title>
|
|
<para>
|
|
cole has two major functions: OLEdecode and OLEcode.
|
|
The first takes an &ssf; and divide it into streams.
|
|
The last takes streams and generate an &ssf; (the
|
|
<parameter>stream_list</parameter>
|
|
structure and the streams itself must be valid, but cole doesn't provide
|
|
functions to validate them by now).
|
|
</para>
|
|
<funcsynopsis>
|
|
<funcsynopsisinfo>#include <cole/cole.h></funcsynopsisinfo>
|
|
<funcdef>int <function>OLEdecode</function></funcdef>
|
|
<paramdef>char *<parameter>OLEfilename</parameter></paramdef>
|
|
<paramdef>pps_entry **<parameter>stream_list</parameter></paramdef>
|
|
<paramdef>U32 *<parameter>root</parameter></paramdef>
|
|
<paramdef>U16 <parameter>max_level</parameter></paramdef>
|
|
</funcsynopsis>
|
|
<para>
|
|
This function extracts the streams of the file wich name is
|
|
<parameter>OLEfilename</parameter> and generate a array of
|
|
pps_entry's named <parameter>stream_list</parameter>.
|
|
The array make a tree (ie. each pps_entry have fields such as next
|
|
for brothers and dir for children pps_entry's) with root pps_entry
|
|
<parameter>root</parameter>, and this tree stores the stream's names,
|
|
the names of the temporal files where the streams were written and other
|
|
information. Only streams with level minor than or equal to
|
|
<parameter>max_level</parameter> are extracted, but all streams are
|
|
extracted if <parameter>max_level</parameter> is zero.
|
|
</para>
|
|
<para>
|
|
OLEdecode returns one of the following numbers:
|
|
</para>
|
|
<simplelist>
|
|
<member>
|
|
0. Sucess.
|
|
</member>
|
|
<member>
|
|
4. Couldn't open <parameter>OLEfilename</parameter> file
|
|
(can use <function>perror</function>(3)).
|
|
</member>
|
|
<member>
|
|
8. <parameter>OLEfilename</parameter> file seems to be a plain
|
|
text file, not a &ssf;.
|
|
</member>
|
|
<member>
|
|
9. <parameter>OLEfilename</parameter> is a binary file,
|
|
but it's not a &ssf;.
|
|
</member>
|
|
<member>
|
|
5. Error reading from file, means <parameter>OLEfilename</parameter>
|
|
file has a faulty &ss; format.
|
|
</member>
|
|
<member>
|
|
6. Error removing temporal files.
|
|
</member>
|
|
<member>
|
|
7. Error creating temporal files.
|
|
</member>
|
|
<member>
|
|
10. Error allocating memory, there's no more memory.
|
|
</member>
|
|
</simplelist>
|
|
<screen>
|
|
#include <stdio.h>
|
|
#include <cole/cole.h>
|
|
|
|
struct pps_block {
|
|
char name[0x20]; /* name of the stream */
|
|
U8 type; /* type of this pps: 5 == root of stream_list,
|
|
1 == dir, 2 == stream */
|
|
char filename[L_tmpnam]; /* temporal file name where the stream were written,
|
|
valid only if type == 2 */
|
|
U32 size; /* the size of the temporal file,
|
|
valid only if type == 2 */
|
|
U32 next; /* next pps_entry in this directory, brother pps */
|
|
U32 dir; /* pps_entry children, valid only if type != 2 */
|
|
U16 level; /* level of the pps in the tree */
|
|
U32 seconds1; /* time creation */
|
|
U32 seconds2; /* time creation */
|
|
U32 days1; /* date creation */
|
|
U32 days2; /* date creation */
|
|
/* ... */
|
|
};
|
|
typedef struct pps_block pps_entry;
|
|
</screen>
|
|
<para>
|
|
pps_entry structure describes one extrated stream.
|
|
</para>
|
|
<funcsynopsis>
|
|
<funcsynopsisinfo>#include <cole/cole.h></funcsynopsisinfo>
|
|
<funcdef>int <function>OLEcode</function></funcdef>
|
|
<paramdef>const char *<parameter>OLEfilename</parameter></paramdef>
|
|
<paramdef>int <parameter>trunc</parameter></paramdef>
|
|
<paramdef>pps_entry *<parameter>stream_list</parameter></paramdef>
|
|
<paramdef>U32 <parameter>root</parameter></paramdef>
|
|
</funcsynopsis>
|
|
<para>
|
|
This function takes the <parameter>stream_list</parameter> tree
|
|
(which have a root pps_entry <parameter>root</parameter> and
|
|
describes some existing valid streams) and generate a &ssf;
|
|
named <parameter>OLEfilename</parameter>. If <parameter>trunc</parameter>
|
|
is zero and <parameter>OLEfilename</parameter> exists, returns 2
|
|
(see below), in any other case <parameter>OLEfilename</parameter>
|
|
will be created or recreated as needed.
|
|
</para>
|
|
<para>
|
|
OLEcode returns one of the following numbers:
|
|
</para>
|
|
<simplelist>
|
|
<member>
|
|
0. All goes OK.
|
|
</member>
|
|
<member>
|
|
1. Error writting in <parameter>OLEfilename</parameter>
|
|
(can use <function>perror</function>(3)).
|
|
</member>
|
|
<member>
|
|
2. trunc is zero and <parameter>OLEfilename</parameter> exist.
|
|
</member>
|
|
<member>
|
|
3. Can't create <parameter>OLEfilename</parameter>
|
|
(can use <function>perror</function>(3)).
|
|
</member>
|
|
<member>
|
|
10. Error allocating memory, there's no more memory.
|
|
</member>
|
|
<member>
|
|
11. Error reading stream's temporal files.
|
|
</member>
|
|
<member>
|
|
12. Error reading <parameter>stream_list</parameter>, it's broken.
|
|
</member>
|
|
</simplelist>
|
|
<funcsynopsis>
|
|
<funcsynopsisinfo>#include <cole/cole.h></funcsynopsisinfo>
|
|
<funcdef>int <function>freeOLEtree</function></funcdef>
|
|
<paramdef>pps_entry *<parameter>stream_list</parameter></paramdef>
|
|
</funcsynopsis>
|
|
<para>
|
|
You must call this function at the end of processing the streams, to
|
|
free memory and remove the stream files.
|
|
</para>
|
|
<funcsynopsis>
|
|
<funcsynopsisinfo>#include <cole/cole.h></funcsynopsisinfo>
|
|
<funcdef>void <function>verbosePPSTree</function></funcdef>
|
|
<paramdef>pps_entry *<parameter>stream_list</parameter></paramdef>
|
|
<paramdef>U32 <parameter>root</parameter></paramdef>
|
|
<paramdef>int <parameter>level</parameter></paramdef>
|
|
</funcsynopsis>
|
|
<para>
|
|
You can use this function to display the tree of a &ssf;.
|
|
</para>
|
|
</sect1> <!-- api -->
|
|
<sect1 id="linking">
|
|
<title>Linking</title>
|
|
<para>
|
|
You need link your program against <filename>libcole.a</filename>.
|
|
This means is ok:
|
|
</para>
|
|
<screen>
|
|
<prompt>$</prompt> <userinput>cc yourprogram.o libcole.a -o yourprogram</userinput></screen>
|
|
<para>
|
|
If you use threads, take in count that cole is not reentrant safe
|
|
(cole 2.0.0 will be reentrant safe).
|
|
</para>
|
|
</sect1> <!-- linking -->
|
|
<sect1 id="examples-an-example">
|
|
<title>An example</title>
|
|
<para>
|
|
The following example is similar to the included file
|
|
<filename>demo.c</filename>.
|
|
It opens, display the tree and closes a &ssf;:
|
|
</para>
|
|
<screen>
|
|
#include <stdio.h>
|
|
#include <cole/cole.h></screen>
|
|
<para>
|
|
You need to include <filename>cole/cole.h</filename> header to
|
|
use the cole functions.
|
|
</para>
|
|
<screen>
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
int result;
|
|
pps_entry *stream_tree;
|
|
U32 root_stream;
|
|
U32 stream;
|
|
|
|
if (argc != 3)
|
|
{
|
|
fprintf (stderr, "cole example 1. cole is a free C OLE library.\n");
|
|
fprintf (stderr, "Usage: coleexample1 srcFILE destFILE.\n");
|
|
fprintf (stderr,
|
|
"Note: if srcFILE and destFILE are the same file, it will be overwritten.\n");
|
|
return 1;
|
|
}</screen>
|
|
<para>Just argument checks.</para>
|
|
<screen>
|
|
verbose ("Decoding ************************************");
|
|
result = OLEdecode (argv[1], &stream_tree, &root_stream, 0);</screen>
|
|
<para>
|
|
Here we call <function>OLEdecode</function> in order to extract the
|
|
structure of the &ssf; which name is stored in
|
|
<parameter>argv[1]</parameter>. The structure will be stored in
|
|
<parameter>stream_tree</parameter>, and the root of the structure
|
|
in <parameter>root_stream</parameter> (we will need the root later).
|
|
The last argument indicate the level of the structure that
|
|
<function>OLEdecode</function> will extract, if it's zero it will
|
|
extract all the levels.
|
|
</para>
|
|
<screen>
|
|
fprintf (stderr, "OLEdecode output = %d\n", result);
|
|
if (result != 0)
|
|
{
|
|
fprintf (stderr, "Decoding: ");
|
|
perror (argv[1]);
|
|
return 1;
|
|
}
|
|
else
|
|
verbose ("Success decoding");
|
|
|
|
printf ("******* Stream tree:\n");
|
|
verbosePPSTree (stream_tree, root_stream, 0);</screen>
|
|
<para>
|
|
<function>verbosePPSTree</function> is a cole function that prints
|
|
to the standard output the complete tree of a &ssf;. With the last
|
|
parameter equal to zero, we are printing all levels of the
|
|
structure.
|
|
</para>
|
|
<screen>
|
|
printf ("******* Top level no directory streams:\n");
|
|
/* travel through the top level no directory streams,
|
|
just follows next field and ignore type 1 fileds */
|
|
for (stream = stream_tree[root_stream].dir;
|
|
stream != 0xffffffff;
|
|
stream = stream_tree[stream].next)
|
|
{
|
|
if (stream_tree[stream].type != 1 && stream_tree[stream].level == 1)
|
|
if (!isprint(stream_tree[stream].name[0]))
|
|
printf ("'\\x%02x%s'\n", stream_tree[stream].name[0],
|
|
stream_tree[stream].name+1);
|
|
else
|
|
printf ("'%s'\n", stream_tree[stream].name);
|
|
}</screen>
|
|
<para>
|
|
With this code, we are traveling in the structure, which is a
|
|
tree in an array, this means it's a tree of structures with indexes
|
|
for the brothers and the children (if any). As you can see,
|
|
the actual names of the streams may begin with no printable characters.
|
|
</para>
|
|
<screen>
|
|
verbose ("Coding **************************************");
|
|
result = OLEcode (argv[2], 1, stream_tree, root_stream);</screen>
|
|
<para>
|
|
If you want to read the raw streams you only need
|
|
<function>OLEdecode</function> function. But if you want to generate
|
|
a &ssf;, you need to have the raw streams, the tree in an array
|
|
structure and the root of such tree to use <function>OLEcode</function>.
|
|
cole &this-release; doesn't provide functions to such tasks, wait
|
|
for cole 2.0.0.
|
|
</para>
|
|
<screen>
|
|
fprintf (stderr, "OLEcode output = %d\n", result);
|
|
if (result != 0)
|
|
{
|
|
fprintf (stderr, "Coding ");
|
|
perror (argv[2]);
|
|
return 1;
|
|
}
|
|
else
|
|
verbose ("Success coding\n");
|
|
|
|
|
|
verbose ("Freeing *************************************");
|
|
/* need to free all the allocated memory */
|
|
result = freeOLEtree (stream_tree);</screen>
|
|
<para>
|
|
If you used <function>OLEdecode</function>, you must use
|
|
<function>freeOLEtree</function> after process the raw stream.
|
|
</para>
|
|
<screen>
|
|
fprintf (stderr, "freeOLEtree output = %d\n", result);
|
|
|
|
return result;
|
|
}</screen>
|
|
<para>When you run this example, the following output is produced:</para>
|
|
<screen>
|
|
<prompt>$</prompt> <userinput>./coleexample1 examples/text.doc text2.doc</userinput>
|
|
OLEdecode output = 0
|
|
******* Stream tree:
|
|
DIR 00 'Root Entry'
|
|
FILE 01 98 ' CompObj'
|
|
FILE 03 312 ' SummaryInformation'
|
|
FILE 04 2381 'WordDocument'
|
|
FILE 02 20 ' Ole'
|
|
******* Top level no directory streams:
|
|
'\x01CompObj'
|
|
'\x05SummaryInformation'
|
|
'WordDocument'
|
|
'\x01Ole'
|
|
OLEcode output = 0
|
|
freeOLEtree output = 0</screen>
|
|
</sect1> <!-- examples-an-example -->
|
|
<sect1 id="examples-another-example">
|
|
<title>Another example</title>
|
|
<para>
|
|
The next example opens a file, and guess what version of
|
|
Microsoft Excel generated the file.
|
|
</para>
|
|
<screen>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <cole/cole.h>
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
pps_entry *stream_tree;
|
|
U32 root_stream;
|
|
U32 stream;
|
|
FILE * f;
|
|
unsigned char buff[6];
|
|
|
|
if (argc != 2)
|
|
{
|
|
fprintf (stderr, "cole example 2. cole is a free C OLE library.\n");
|
|
fprintf (stderr, "Usage: coleexample2 FILE.\n");
|
|
return 1;
|
|
}
|
|
|
|
if (OLEdecode (argv[1], &stream_tree, &root_stream, 0)) {
|
|
printf ("File is not a Microsoft Excel one.\n");
|
|
return 1;
|
|
}
|
|
|
|
for (stream = stream_tree[root_stream].dir;
|
|
stream != 0xffffffff;
|
|
stream = stream_tree[stream].next) {
|
|
if (stream_tree[stream].type != 1 && stream_tree[stream].level == 1)
|
|
if (!strcmp(stream_tree[stream].name, "Workbook") ||
|
|
!strcmp(stream_tree[stream].name, "Book")) {
|
|
/* Book stream found */
|
|
f = fopen (stream_tree[stream].filename, "rb");
|
|
if (f == NULL) {
|
|
perror ("Error opening temporal file");
|
|
freeOLEtree (stream_tree);
|
|
return 1;
|
|
}
|
|
if (fread (buff, 1, 6, f) != 6) {
|
|
perror ("Error reading temporal file");
|
|
fclose (f);
|
|
freeOLEtree (stream_tree);
|
|
return 1;
|
|
}
|
|
/* the next is from the internal structure of a Excel stream */
|
|
if (buff[0] != 0x09 || buff[1] != 0x08) {
|
|
printf ("File is not a Microsoft Excel one.\n");
|
|
fclose (f);
|
|
freeOLEtree (stream_tree);
|
|
return 1;
|
|
}
|
|
if (buff[4] != 0x00 || (buff[5] != 0x05 && buff[5] != 0x06)) {
|
|
printf ("File is from an unknown Microsoft Excel version.\n");
|
|
fclose (f);
|
|
freeOLEtree (stream_tree);
|
|
return 1;
|
|
}
|
|
if (buff[5] == 0x05)
|
|
printf ("File is from Microsoft Excel version 5 or 7.\n");
|
|
else
|
|
printf ("File is from Microsoft Excel version 8.\n");
|
|
|
|
fclose (f);
|
|
freeOLEtree (stream_tree);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
printf ("File is not a Microsoft Excel one.\n");
|
|
freeOLEtree (stream_tree);
|
|
return 0;
|
|
}</screen>
|
|
<para>When you run this example, the following output is produced:</para>
|
|
<screen>
|
|
<prompt>$</prompt> <userinput>coleexample2 examples/sprsheet.xls</userinput>
|
|
File is from Microsoft Excel version 5 or 7.
|
|
<prompt>$</prompt> <userinput>coleexample2 examples/text.doc</userinput>
|
|
File is not a Microsoft Excel one.
|
|
<prompt>$</prompt> <userinput>coleexample2 README</userinput>
|
|
File is not a Microsoft Excel one.</screen>
|
|
</sect1> <!-- examples-another-example -->
|
|
</chapter> <!-- using -->
|
|
|
|
|
|
|
|
<chapter id="misc">
|
|
<title>Miscelaneous issues</title>
|
|
<sect1 id="current-maintainer">
|
|
<title>Current maintainer</title>
|
|
<para>
|
|
The current cole's maintainer is
|
|
&maintainer-name-full; &maintainer-email-ulink;.
|
|
</para>
|
|
</sect1> <!-- current maintainer -->
|
|
<sect1 id="patches">
|
|
<title>Patches</title>
|
|
<sect2 id="apply-patch">
|
|
<title>How to apply a patch</title>
|
|
<para>
|
|
An example is better that an explanation. Here we will patch to upgrade
|
|
from 0.1.0 release to 1.0.0 release.
|
|
</para>
|
|
<screen>
|
|
<prompt>$</prompt> <userinput>ls</userinput>
|
|
cole-0.1.0/ cole-0.1.0-1.0.0.diff
|
|
<prompt>$</prompt> <userinput>cd cole-0.1.0</userinput>
|
|
<prompt>$</prompt> <userinput>patch -Np1 < ../cole-0.1.0-1.0.0.diff</userinput>
|
|
<prompt>$</prompt> <userinput>cd ..</userinput>
|
|
<prompt>$</prompt> <userinput>mv cole-0.1.0 cole-1.0.0</userinput>
|
|
<prompt>$</prompt> <userinput>ls</userinput>
|
|
cole-1.0.0/ cole-0.1.0-1.0.0.diff</screen>
|
|
</sect2> <!-- apply-patch -->
|
|
<sect2 id="make-patch">
|
|
<title>How to make a patch</title>
|
|
<para>
|
|
If you fix or add some code, we will very glad if you send the patch
|
|
to the <link linkend="current-maintainer">maintainer</link>.
|
|
The right way to make a patch is to have two directories: the original
|
|
(here <filename>cole-1.0.0</filename>) and another when your changes
|
|
have been made (here <filename>cole-1.0.0-myfix</filename>).
|
|
</para>
|
|
<screen>
|
|
<prompt>$</prompt> <userinput>ls</userinput>
|
|
cole-1.0.0/ cole-1.0.0-myfix/
|
|
<prompt>$</prompt> <userinput>LC_ALL=C TZ=UTC0 diff -Naur cole-1.0.0 cole-1.0.0-myfix > cole-1.0.0-patch</userinput>
|
|
<prompt>$</prompt> <userinput>ls</userinput>
|
|
cole-1.0.0/ cole-1.0.0-my-fix/ cole-1.0.0-patch
|
|
</screen>
|
|
<para>
|
|
You can then send <filename>cole-1.0.0-patch</filename> to the
|
|
<link linkend="current-maintainer">maintainer</link> explaining what did you fix
|
|
or what did you add.
|
|
</para>
|
|
</sect2> <!-- make-patch -->
|
|
</sect1> <!-- patches -->
|
|
</chapter> <!-- misc -->
|
|
|
|
|
|
|
|
<chapter id="references">
|
|
<title>References</title>
|
|
<simplelist>
|
|
<member>
|
|
<ulink URL="http://arturo.directmail.org/filtersweb/"
|
|
>cole homepage</ulink>.
|
|
</member>
|
|
<member>
|
|
<ulink URL="http://www.cs.tu-berlin.de/~schwartz/perl/"
|
|
>OLE-Storage</ulink>. (formely LAOLA).
|
|
</member>
|
|
<member>
|
|
Authors: see the file <filename>AUTHORS</filename>.
|
|
</member>
|
|
</simplelist>
|
|
</chapter> <!-- references -->
|
|
|
|
|
|
|
|
<chapter id="gpl">
|
|
<title>
|
|
GNU GENERAL PUBLIC LICENSE
|
|
</title>
|
|
<para>
|
|
Version 2, June 1991
|
|
</para>
|
|
<para>
|
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
</para>
|
|
<para>
|
|
Everyone is permitted to copy and distribute verbatim copies
|
|
of this license document, but changing it's not allowed.
|
|
</para>
|
|
<sect1 id="gpl-preamble">
|
|
<title>
|
|
Preamble
|
|
</title>
|
|
<para>
|
|
The licenses for most software are designed to take away your
|
|
freedom to share and change it. By contrast, the GNU General Public
|
|
License is intended to guarantee your freedom to share and change free
|
|
software--to make sure the software is free for all its users. This
|
|
General Public License applies to most of the Free Software
|
|
Foundation's software and to any other program whose authors commit to
|
|
using it. (Some other Free Software Foundation software is covered by
|
|
the GNU Library General Public License instead.) You can apply it to
|
|
your programs, too.
|
|
</para>
|
|
<para>
|
|
When we speak of free software, we are referring to freedom, not
|
|
price. Our General Public Licenses are designed to make sure that you
|
|
have the freedom to distribute copies of free software (and charge for
|
|
this service if you wish), that you receive source code or can get it
|
|
if you want it, that you can change the software or use pieces of it
|
|
in new free programs; and that you know you can do these things.
|
|
</para>
|
|
<para>
|
|
To protect your rights, we need to make restrictions that forbid
|
|
anyone to deny you these rights or to ask you to surrender the rights.
|
|
These restrictions translate to certain responsibilities for you if you
|
|
distribute copies of the software, or if you modify it.
|
|
</para>
|
|
<para>
|
|
For example, if you distribute copies of such a program, whether
|
|
gratis or for a fee, you must give the recipients all the rights that
|
|
you have. You must make sure that they, too, receive or can get the
|
|
source code. And you must show them these terms so they know their
|
|
rights.
|
|
</para>
|
|
<para>
|
|
We protect your rights with two steps: (1) copyright the software, and
|
|
(2) offer you this license which gives you legal permission to copy,
|
|
distribute and/or modify the software.
|
|
</para>
|
|
<para>
|
|
Also, for each author's protection and ours, we want to make certain
|
|
that everyone understands that there is no warranty for this free
|
|
software. If the software is modified by someone else and passed on, we
|
|
want its recipients to know that what they have is not the original, so
|
|
that any problems introduced by others will not reflect on the original
|
|
authors' reputations.
|
|
</para>
|
|
<para>
|
|
Finally, any free program is threatened constantly by software
|
|
patents. We wish to avoid the danger that redistributors of a free
|
|
program will individually obtain patent licenses, in effect making the
|
|
program proprietary. To prevent this, we have made it clear that any
|
|
patent must be licensed for everyone's free use or not licensed at all.
|
|
</para>
|
|
<para>
|
|
The precise terms and conditions for copying, distribution and
|
|
modification follow.
|
|
</para>
|
|
</sect1> <!-- gpl-preamble -->
|
|
<sect1 id="gpl-terms">
|
|
<title>
|
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
</title>
|
|
<para>
|
|
0. This License applies to any program or other work which contains
|
|
a notice placed by the copyright holder saying it may be distributed
|
|
under the terms of this General Public License. The "Program", below,
|
|
refers to any such program or work, and a "work based on the Program"
|
|
means either the Program or any derivative work under copyright law:
|
|
that is to say, a work containing the Program or a portion of it,
|
|
either verbatim or with modifications and/or translated into another
|
|
language. (Hereinafter, translation is included without limitation in
|
|
the term "modification".) Each licensee is addressed as "you".
|
|
</para>
|
|
<para>
|
|
Activities other than copying, distribution and modification are not
|
|
covered by this License; they are outside its scope. The act of
|
|
running the Program is not restricted, and the output from the Program
|
|
is covered only if its contents constitute a work based on the
|
|
Program (independent of having been made by running the Program).
|
|
Whether that is true depends on what the Program does.
|
|
</para>
|
|
<para>
|
|
1. You may copy and distribute verbatim copies of the Program's
|
|
source code as you receive it, in any medium, provided that you
|
|
conspicuously and appropriately publish on each copy an appropriate
|
|
copyright notice and disclaimer of warranty; keep intact all the
|
|
notices that refer to this License and to the absence of any warranty;
|
|
and give any other recipients of the Program a copy of this License
|
|
along with the Program.
|
|
</para>
|
|
<para>
|
|
You may charge a fee for the physical act of transferring a copy, and
|
|
you may at your option offer warranty protection in exchange for a fee.
|
|
</para>
|
|
<para>
|
|
2. You may modify your copy or copies of the Program or any portion
|
|
of it, thus forming a work based on the Program, and copy and
|
|
distribute such modifications or work under the terms of Section 1
|
|
above, provided that you also meet all of these conditions:
|
|
</para>
|
|
<para>
|
|
a) You must cause the modified files to carry prominent notices
|
|
stating that you changed the files and the date of any change.
|
|
</para>
|
|
<para>
|
|
b) You must cause any work that you distribute or publish, that in
|
|
whole or in part contains or is derived from the Program or any
|
|
part thereof, to be licensed as a whole at no charge to all third
|
|
parties under the terms of this License.
|
|
</para>
|
|
<para>
|
|
c) If the modified program normally reads commands interactively
|
|
when run, you must cause it, when started running for such
|
|
interactive use in the most ordinary way, to print or display an
|
|
announcement including an appropriate copyright notice and a
|
|
notice that there is no warranty (or else, saying that you provide
|
|
a warranty) and that users may redistribute the program under
|
|
these conditions, and telling the user how to view a copy of this
|
|
License. (Exception: if the Program itself is interactive but
|
|
does not normally print such an announcement, your work based on
|
|
the Program is not required to print an announcement.)
|
|
</para>
|
|
<para>
|
|
These requirements apply to the modified work as a whole. If
|
|
identifiable sections of that work are not derived from the Program,
|
|
and can be reasonably considered independent and separate works in
|
|
themselves, then this License, and its terms, do not apply to those
|
|
sections when you distribute them as separate works. But when you
|
|
distribute the same sections as part of a whole which is a work based
|
|
on the Program, the distribution of the whole must be on the terms of
|
|
this License, whose permissions for other licensees extend to the
|
|
entire whole, and thus to each and every part regardless of who wrote it.
|
|
</para>
|
|
<para>
|
|
Thus, it's not the intent of this section to claim rights or contest
|
|
your rights to work written entirely by you; rather, the intent is to
|
|
exercise the right to control the distribution of derivative or
|
|
collective works based on the Program.
|
|
</para>
|
|
<para>
|
|
In addition, mere aggregation of another work not based on the Program
|
|
with the Program (or with a work based on the Program) on a volume of
|
|
a storage or distribution medium does not bring the other work under
|
|
the scope of this License.
|
|
</para>
|
|
<para>
|
|
3. You may copy and distribute the Program (or a work based on it,
|
|
under Section 2) in object code or executable form under the terms of
|
|
Sections 1 and 2 above provided that you also do one of the following:
|
|
</para>
|
|
<para>
|
|
a) Accompany it with the complete corresponding machine-readable
|
|
source code, which must be distributed under the terms of Sections
|
|
1 and 2 above on a medium customarily used for software interchange; or,
|
|
</para>
|
|
<para>
|
|
b) Accompany it with a written offer, valid for at least three
|
|
years, to give any third party, for a charge no more than your
|
|
cost of physically performing source distribution, a complete
|
|
machine-readable copy of the corresponding source code, to be
|
|
distributed under the terms of Sections 1 and 2 above on a medium
|
|
customarily used for software interchange; or,
|
|
</para>
|
|
<para>
|
|
c) Accompany it with the information you received as to the offer
|
|
to distribute corresponding source code. (This alternative is
|
|
allowed only for noncommercial distribution and only if you
|
|
received the program in object code or executable form with such
|
|
an offer, in accord with Subsection b above.)
|
|
</para>
|
|
<para>
|
|
The source code for a work means the preferred form of the work for
|
|
making modifications to it. For an executable work, complete source
|
|
code means all the source code for all modules it contains, plus any
|
|
associated interface definition files, plus the scripts used to
|
|
control compilation and installation of the executable. However, as a
|
|
special exception, the source code distributed need not include
|
|
anything that is normally distributed (in either source or binary
|
|
form) with the major components (compiler, kernel, and so on) of the
|
|
operating system on which the executable runs, unless that component
|
|
itself accompanies the executable.
|
|
</para>
|
|
<para>
|
|
If distribution of executable or object code is made by offering
|
|
access to copy from a designated place, then offering equivalent
|
|
access to copy the source code from the same place counts as
|
|
distribution of the source code, even though third parties are not
|
|
compelled to copy the source along with the object code.
|
|
</para>
|
|
<para>
|
|
4. You may not copy, modify, sublicense, or distribute the Program
|
|
except as expressly provided under this License. Any attempt
|
|
otherwise to copy, modify, sublicense or distribute the Program is
|
|
void, and will automatically terminate your rights under this License.
|
|
However, parties who have received copies, or rights, from you under
|
|
this License will not have their licenses terminated so long as such
|
|
parties remain in full compliance.
|
|
</para>
|
|
<para>
|
|
5. You are not required to accept this License, since you have not
|
|
signed it. However, nothing else grants you permission to modify or
|
|
distribute the Program or its derivative works. These actions are
|
|
prohibited by law if you do not accept this License. Therefore, by
|
|
modifying or distributing the Program (or any work based on the
|
|
Program), you indicate your acceptance of this License to do so, and
|
|
all its terms and conditions for copying, distributing or modifying
|
|
the Program or works based on it.
|
|
</para>
|
|
<para>
|
|
6. Each time you redistribute the Program (or any work based on the
|
|
Program), the recipient automatically receives a license from the
|
|
original licensor to copy, distribute or modify the Program subject to
|
|
these terms and conditions. You may not impose any further
|
|
restrictions on the recipients' exercise of the rights granted herein.
|
|
You are not responsible for enforcing compliance by third parties to
|
|
this License.
|
|
</para>
|
|
<para>
|
|
7. If, as a consequence of a court judgment or allegation of patent
|
|
infringement or for any other reason (not limited to patent issues),
|
|
conditions are imposed on you (whether by court order, agreement or
|
|
otherwise) that contradict the conditions of this License, they do not
|
|
excuse you from the conditions of this License. If you cannot
|
|
distribute so as to satisfy simultaneously your obligations under this
|
|
License and any other pertinent obligations, then as a consequence you
|
|
may not distribute the Program at all. For example, if a patent
|
|
license would not permit royalty-free redistribution of the Program by
|
|
all those who receive copies directly or indirectly through you, then
|
|
the only way you could satisfy both it and this License would be to
|
|
refrain entirely from distribution of the Program.
|
|
</para>
|
|
<para>
|
|
If any portion of this section is held invalid or unenforceable under
|
|
any particular circumstance, the balance of the section is intended to
|
|
apply and the section as a whole is intended to apply in other
|
|
circumstances.
|
|
</para>
|
|
<para>
|
|
It is not the purpose of this section to induce you to infringe any
|
|
patents or other property right claims or to contest validity of any
|
|
such claims; this section has the sole purpose of protecting the
|
|
integrity of the free software distribution system, which is
|
|
implemented by public license practices. Many people have made
|
|
generous contributions to the wide range of software distributed
|
|
through that system in reliance on consistent application of that
|
|
system; it's up to the author/donor to decide if he or she is willing
|
|
to distribute software through any other system and a licensee cannot
|
|
impose that choice.
|
|
</para>
|
|
<para>
|
|
This section is intended to make thoroughly clear what is believed to
|
|
be a consequence of the rest of this License.
|
|
</para>
|
|
<para>
|
|
8. If the distribution and/or use of the Program is restricted in
|
|
certain countries either by patents or by copyrighted interfaces, the
|
|
original copyright holder who places the Program under this License
|
|
may add an explicit geographical distribution limitation excluding
|
|
those countries, so that distribution is permitted only in or among
|
|
countries not thus excluded. In such case, this License incorporates
|
|
the limitation as if written in the body of this License.
|
|
</para>
|
|
<para>
|
|
9. The Free Software Foundation may publish revised and/or new versions
|
|
of the General Public License from time to time. Such new versions will
|
|
be similar in spirit to the present version, but may differ in detail to
|
|
address new problems or concerns.
|
|
</para>
|
|
<para>
|
|
Each version is given a distinguishing version number. If the Program
|
|
specifies a version number of this License which applies to it and "any
|
|
later version", you have the option of following the terms and conditions
|
|
either of that version or of any later version published by the Free
|
|
Software Foundation. If the Program does not specify a version number of
|
|
this License, you may choose any version ever published by the Free Software
|
|
Foundation.
|
|
</para>
|
|
<para>
|
|
10. If you wish to incorporate parts of the Program into other free
|
|
programs whose distribution conditions are different, write to the author
|
|
to ask for permission. For software which is copyrighted by the Free
|
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
|
make exceptions for this. Our decision will be guided by the two goals
|
|
of preserving the free status of all derivatives of our free software and
|
|
of promoting the sharing and reuse of software generally.
|
|
</para>
|
|
<para>
|
|
NO WARRANTY
|
|
</para>
|
|
<para>
|
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
|
REPAIR OR CORRECTION.
|
|
</para>
|
|
<para>
|
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|
POSSIBILITY OF SUCH DAMAGES.
|
|
</para>
|
|
<para>
|
|
END OF TERMS AND CONDITIONS
|
|
</para>
|
|
</sect1> <!-- gpl-terms -->
|
|
<sect1 id="gpl-how-to-apply">
|
|
<title>
|
|
How to Apply These Terms to Your New Programs
|
|
</title>
|
|
<para>
|
|
If you develop a new program, and you want it to be of the greatest
|
|
possible use to the public, the best way to achieve this is to make it
|
|
free software which everyone can redistribute and change under these terms.
|
|
</para>
|
|
<para>
|
|
To do so, attach the following notices to the program. It is safest
|
|
to attach them to the start of each source file to most effectively
|
|
convey the exclusion of warranty; and each file should have at least
|
|
the "copyright" line and a pointer to where the full notice is found.
|
|
</para>
|
|
<screen>
|
|
<emphasis>one line to give the program's name and a brief idea of what it does.</emphasis>
|
|
Copyright (C) <emphasis>year</emphasis> <emphasis>name of author</emphasis>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</screen>
|
|
<para>
|
|
Also add information on how to contact you by electronic and paper mail.
|
|
</para>
|
|
<para>
|
|
If the program is interactive, make it output a short notice like this
|
|
when it starts in an interactive mode:
|
|
</para>
|
|
<screen>
|
|
Gnomovision version 69, Copyright (C) <emphasis>year</emphasis> <emphasis>name of author</emphasis>
|
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
|
|
type `show w'. This is free software, and you are welcome
|
|
to redistribute it under certain conditions; type `show c'
|
|
for details.</screen>
|
|
<para>
|
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
parts of the General Public License. Of course, the commands you use may
|
|
be called something other than `show w' and `show c'; they could even be
|
|
mouse-clicks or menu items--whatever suits your program.
|
|
</para>
|
|
<para>
|
|
You should also get your employer (if you work as a programmer) or your
|
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
necessary. Here is a sample; alter the names:
|
|
</para>
|
|
<screen>
|
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
|
|
<emphasis>signature of Ty Coon</emphasis>, 1 April 1989
|
|
Ty Coon, President of Vice</screen>
|
|
<para>
|
|
This General Public License does not permit incorporating your program into
|
|
proprietary programs. If your program is a subroutine library, you may
|
|
consider it more useful to permit linking proprietary applications with the
|
|
library. If this is what you want to do, use the GNU Library General
|
|
Public License instead of this License.
|
|
</para>
|
|
</sect1> <!-- gpl-how-to-apply -->
|
|
</chapter> <!-- gpl -->
|
|
|
|
|
|
|
|
<chapter id="legal-issues">
|
|
<title>Legal issues</title>
|
|
<sect1 id="trademarks">
|
|
<title>Trademarks</title>
|
|
<para>
|
|
"Microsoft Word", "Microsoft Excel", "Microsoft Publisher" and
|
|
"Microsoft Power Point" are trademarks of Microsoft Corporation.
|
|
</para>
|
|
<para>
|
|
"Free Software" is not trademark of anyone, but it's an important term in
|
|
the Free Software community, and for the Free Software Foundation.
|
|
</para>
|
|
<para>
|
|
All other trademarks are the property of their respective owners.
|
|
</para>
|
|
<para>
|
|
If there is a trademark here that needs to be listed formally above,
|
|
please email to the &maintainer-email-ulink; so it can be added.
|
|
</para>
|
|
</sect1> <!-- trademarks -->
|
|
<sect1 id="copyright-and-disclaimer">
|
|
<title>Copyright and disclaimer</title>
|
|
<para>
|
|
&license;
|
|
</para>
|
|
<para>
|
|
This document is provided as is without any express or implied warranties.
|
|
While every effort has been taken to ensure the accuracy of the information
|
|
contained in this document, the author/maintainer/contributors assume(s) no
|
|
responsibility for errors or omissions, or for damages resulting from the use
|
|
of the information contained herein.
|
|
</para>
|
|
</sect1> <!-- copyright-and-disclaimer -->
|
|
</chapter> <!-- legal-issues -->
|
|
|
|
|
|
|
|
</book>
|
|
|