libpurple/protocols/novell/nmrtf.c

Wed, 13 May 2009 20:29:03 +0000

author
Marcus Lundblad <malu@pidgin.im>
date
Wed, 13 May 2009 20:29:03 +0000
changeset 27110
05ca719b901b
parent 19859
71d37b57eff2
child 33794
716cbef8d1c6
permissions
-rw-r--r--

Support custom smileys in MUCs (when all participants support BoB and a maximum
of 10 participants are in the chat).
Always announce support for BoB, since disable custom smileys will still turn
off fetching them, and BoB can be used for other purposes further on.

9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
1 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
2 * nmrtf.c
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
3 *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
4 * Copyright (c) 2004 Novell, Inc. All Rights Reserved.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
5 *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
8 * the Free Software Foundation; version 2 of the License.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
9 *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
13 * GNU General Public License for more details.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
14 *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
16 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 19832
diff changeset
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
18 *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
19 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
20
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
21 /* This code was adapted from the sample RTF reader found here:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
22 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnrtfspec/html/rtfspec.asp
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
23 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
24
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
25 #include <glib.h>
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
26 #include <stdlib.h>
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
27 #include <stdio.h>
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
28 #include <stddef.h>
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
29 #include <ctype.h>
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
30 #include <string.h>
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
31 #include "nmrtf.h"
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
32 #include "debug.h"
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
33
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
34 /* Internal RTF parser error codes */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
35 #define NMRTF_OK 0 /* Everything's fine! */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
36 #define NMRTF_STACK_UNDERFLOW 1 /* Unmatched '}' */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
37 #define NMRTF_STACK_OVERFLOW 2 /* Too many '{' -- memory exhausted */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
38 #define NMRTF_UNMATCHED_BRACE 3 /* RTF ended during an open group. */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
39 #define NMRTF_INVALID_HEX 4 /* invalid hex character found in data */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
40 #define NMRTF_BAD_TABLE 5 /* RTF table (sym or prop) invalid */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
41 #define NMRTF_ASSERTION 6 /* Assertion failure */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
42 #define NMRTF_EOF 7 /* End of file reached while reading RTF */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
43 #define NMRTF_CONVERT_ERROR 8 /* Error converting text */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
44
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
45 #define NMRTF_MAX_DEPTH 256
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
46
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
47 typedef enum
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
48 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
49 NMRTF_STATE_NORMAL,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
50 NMRTF_STATE_SKIP,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
51 NMRTF_STATE_FONTTABLE,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
52 NMRTF_STATE_BIN,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
53 NMRTF_STATE_HEX
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
54 } NMRtfState; /* Rtf State */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
55
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
56 /* Property types that we care about */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
57 typedef enum
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
58 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
59 NMRTF_PROP_FONT_IDX,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
60 NMRTF_PROP_FONT_CHARSET,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
61 NMRTF_PROP_MAX
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
62 } NMRtfProperty;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
63
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
64 typedef enum
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
65 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
66 NMRTF_SPECIAL_BIN,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
67 NMRTF_SPECIAL_HEX,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
68 NMRTF_SPECIAL_UNICODE,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
69 NMRTF_SPECIAL_SKIP
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
70 } NMRtfSpecialKwd;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
71
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
72 typedef enum
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
73 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
74 NMRTF_DEST_FONTTABLE,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
75 NMRTF_DEST_SKIP
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
76 } NMRtfDestinationType;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
77
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
78 typedef enum
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
79 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
80 NMRTF_KWD_CHAR,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
81 NMRTF_KWD_DEST,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
82 NMRTF_KWD_PROP,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
83 NMRTF_KWD_SPEC
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
84 } NMRtfKeywordType;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
85
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
86 typedef struct _NMRTFCharProp
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
87 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
88 /* All we care about for now is the font.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
89 * bold, italic, underline, etc. should be
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
90 * added here
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
91 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
92 int font_idx;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
93 int font_charset;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
94 } NMRtfCharProp;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
95
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
96 typedef struct _NMRtfStateSave
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
97 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
98 NMRtfCharProp chp;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
99 NMRtfState rds;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
100 NMRtfState ris;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
101 } NMRtfStateSave;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
102
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
103 typedef struct _NMRtfSymbol
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
104 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
105 char *keyword; /* RTF keyword */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
106 int default_val; /* default value to use */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
107 gboolean pass_default; /* true to use default value from this table */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
108 NMRtfKeywordType kwd_type; /* the type of the keyword */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
109 int action; /* property type if the keyword represents a property */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
110 /* destination type if the keyword represents a destination */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
111 /* character to print if the keyword represents a character */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
112 } NMRtfSymbol;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
113
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
114
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
115 typedef struct _NMRtfFont
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
116 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
117 int number;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
118 char *name;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
119 int charset;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
120 } NMRtfFont;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
121
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
122 /* RTF Context */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
123 struct _NMRtfContext
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
124 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
125 NMRtfState rds; /* destination state */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
126 NMRtfState ris; /* internal state */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
127 NMRtfCharProp chp; /* current character properties (ie. font, bold, italic, etc.) */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
128 GSList *font_table; /* the font table */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
129 GSList *saved; /* saved state stack */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
130 int param; /* numeric parameter for the current keyword */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
131 long bytes_to_skip; /* number of bytes to skip (after encountering \bin) */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
132 int depth; /* how many groups deep are we */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
133 gboolean skip_unknown; /* if true, skip any unknown destinations (this is set after encountering '\*') */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
134 char *input; /* input string */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
135 char nextch; /* next char in input */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
136 GString *ansi; /* Temporary ansi text, will be convert/flushed to the output string */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
137 GString *output; /* The plain text UTF8 string */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
138 };
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
139
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
140 static int rtf_parse(NMRtfContext *ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
141 static int rtf_push_state(NMRtfContext *ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
142 static int rtf_pop_state(NMRtfContext *ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
143 static NMRtfFont *rtf_get_font(NMRtfContext *ctx, int index);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
144 static int rtf_get_char(NMRtfContext *ctx, guchar *ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
145 static int rtf_unget_char(NMRtfContext *ctx, guchar ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
146 static int rtf_flush_data(NMRtfContext *ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
147 static int rtf_parse_keyword(NMRtfContext *ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
148 static int rtf_dispatch_control(NMRtfContext *ctx, char *keyword, int param, gboolean param_set);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
149 static int rtf_dispatch_char(NMRtfContext *ctx, guchar ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
150 static int rtf_dispatch_unicode_char(NMRtfContext *ctx, gunichar ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
151 static int rtf_print_char(NMRtfContext *ctx, guchar ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
152 static int rtf_print_unicode_char(NMRtfContext *ctx, gunichar ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
153 static int rtf_change_destination(NMRtfContext *ctx, NMRtfDestinationType dest);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
154 static int rtf_dispatch_special(NMRtfContext *ctx, NMRtfSpecialKwd special);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
155 static int rtf_apply_property(NMRtfContext *ctx, NMRtfProperty prop, int val);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
156
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
157 /* RTF parser tables */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
158
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
159 /* Keyword descriptions */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
160 NMRtfSymbol rtf_symbols[] = {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
161 /* keyword, default, pass_default, keyword_type, action */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
162 {"fonttbl", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_FONTTABLE},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
163 {"f", 0, FALSE, NMRTF_KWD_PROP, NMRTF_PROP_FONT_IDX},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
164 {"fcharset", 0, FALSE, NMRTF_KWD_PROP, NMRTF_PROP_FONT_CHARSET},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
165 {"par", 0, FALSE, NMRTF_KWD_CHAR, 0x0a},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
166 {"line", 0, FALSE, NMRTF_KWD_CHAR, 0x0a},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
167 {"\0x0a", 0, FALSE, NMRTF_KWD_CHAR, 0x0a},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
168 {"\0x0d", 0, FALSE, NMRTF_KWD_CHAR, 0x0a},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
169 {"tab", 0, FALSE, NMRTF_KWD_CHAR, 0x09},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
170 {"\r", 0, FALSE, NMRTF_KWD_CHAR, '\r'},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
171 {"\n", 0, FALSE, NMRTF_KWD_CHAR, '\n'},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
172 {"ldblquote",0, FALSE, NMRTF_KWD_CHAR, '"'},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
173 {"rdblquote",0, FALSE, NMRTF_KWD_CHAR, '"'},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
174 {"{", 0, FALSE, NMRTF_KWD_CHAR, '{'},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
175 {"}", 0, FALSE, NMRTF_KWD_CHAR, '}'},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
176 {"\\", 0, FALSE, NMRTF_KWD_CHAR, '\\'},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
177 {"bin", 0, FALSE, NMRTF_KWD_SPEC, NMRTF_SPECIAL_BIN},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
178 {"*", 0, FALSE, NMRTF_KWD_SPEC, NMRTF_SPECIAL_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
179 {"'", 0, FALSE, NMRTF_KWD_SPEC, NMRTF_SPECIAL_HEX},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
180 {"u", 0, FALSE, NMRTF_KWD_SPEC, NMRTF_SPECIAL_UNICODE},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
181 {"colortbl", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
182 {"author", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
183 {"buptim", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
184 {"comment", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
185 {"creatim", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
186 {"doccomm", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
187 {"footer", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
188 {"footerf", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
189 {"footerl", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
190 {"footerr", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
191 {"footnote", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
192 {"ftncn", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
193 {"ftnsep", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
194 {"ftnsepc", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
195 {"header", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
196 {"headerf", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
197 {"headerl", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
198 {"headerr", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
199 {"info", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
200 {"keywords", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
201 {"operator", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
202 {"pict", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
203 {"printim", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
204 {"private1", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
205 {"revtim", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
206 {"rxe", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
207 {"stylesheet", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
208 {"subject", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
209 {"tc", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
210 {"title", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
211 {"txe", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP},
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
212 {"xe", 0, FALSE, NMRTF_KWD_DEST, NMRTF_DEST_SKIP}
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
213 };
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
214 int table_size = sizeof(rtf_symbols) / sizeof(NMRtfSymbol);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
215
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
216 NMRtfContext *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
217 nm_rtf_init()
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
218 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
219 NMRtfContext *ctx = g_new0(NMRtfContext, 1);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
220 ctx->nextch = -1;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
221 ctx->ansi = g_string_new("");
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
222 ctx->output = g_string_new("");
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
223 return ctx;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
224 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
225
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
226 char *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
227 nm_rtf_strip_formatting(NMRtfContext *ctx, const char *input)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
228 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
229 int status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
230
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
231 ctx->input = (char *)input;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
232 status = rtf_parse(ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
233 if (status == NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
234 return g_strdup(ctx->output->str);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
235
19832
84b69b21672b Patch from QuLogic. Fixes #2903 ('Missing newlines in debug messages.')
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 15884
diff changeset
236 purple_debug_info("novell", "RTF parser failed with error code %d\n", status);
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
237 return NULL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
238 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
239
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
240 void
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
241 nm_rtf_deinit(NMRtfContext *ctx)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
242 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
243 GSList *node;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
244 NMRtfFont *font;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
245 NMRtfStateSave *save;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
246
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
247 if (ctx) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
248 for (node = ctx->font_table; node; node = node->next) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
249 font = node->data;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
250 g_free(font->name);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
251 g_free(font);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
252 node->data = NULL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
253 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
254 g_slist_free(ctx->font_table);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
255 for (node = ctx->saved; node; node = node->next) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
256 save = node->data;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
257 g_free(save);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
258 node->data = NULL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
259 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
260 g_slist_free(ctx->saved);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
261 g_string_free(ctx->ansi, TRUE);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
262 g_string_free(ctx->output, TRUE);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
263 g_free(ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
264 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
265 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
266
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
267 static const char *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
268 get_current_encoding(NMRtfContext *ctx)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
269 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
270 NMRtfFont *font;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
271
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
272 font = rtf_get_font(ctx, ctx->chp.font_idx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
273
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
274 switch (font->charset) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
275 case 0:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
276 return "CP1252";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
277 case 77:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
278 return "MACINTOSH";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
279 case 78:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
280 return "SJIS";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
281 case 128:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
282 return "CP932";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
283 case 129:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
284 return "CP949";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
285 case 130:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
286 return "CP1361";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
287 case 134:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
288 return "CP936";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
289 case 136:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
290 return "CP950";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
291 case 161:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
292 return "CP1253";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
293 case 162:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
294 return "CP1254";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
295 case 163:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
296 return "CP1258";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
297 case 181:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
298 case 177:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
299 return "CP1255";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
300 case 178:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
301 case 179:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
302 case 180:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
303 return "CP1256";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
304 case 186:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
305 return "CP1257";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
306 case 204:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
307 return "CP1251";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
308 case 222:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
309 return "CP874";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
310 case 238:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
311 return "CP1250";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
312 case 254:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
313 return "CP437";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
314 default:
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
315 purple_debug_info("novell", "Unhandled font charset %d\n", font->charset);
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
316 return "CP1252";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
317 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
318 return "CP1252";
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
319 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
320
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
321
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
322 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
323 * Add an entry to the font table
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
324 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
325 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
326 rtf_add_font_entry(NMRtfContext *ctx, int number, const char *name, int charset)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
327 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
328 NMRtfFont *font = g_new0(NMRtfFont, 1);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
329
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
330 font->number = number;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
331 font->name = g_strdup(name);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
332 font->charset = charset;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
333
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
334 purple_debug_info("novell", "Adding font to table: #%d\t%s\t%d\n",
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
335 font->number, font->name, font->charset);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
336
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
337 ctx->font_table = g_slist_append(ctx->font_table, font);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
338
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
339 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
340 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
341
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
342 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
343 * Return the nth entry in the font table
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
344 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
345 static NMRtfFont *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
346 rtf_get_font(NMRtfContext *ctx, int nth)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
347 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
348 NMRtfFont *font;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
349
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
350 font = g_slist_nth_data(ctx->font_table, nth);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
351
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
352 return font;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
353 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
354
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
355 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
356 * Step 1:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
357 * Isolate RTF keywords and send them to rtf_parse_keyword;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
358 * Push and pop state at the start and end of RTF groups;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
359 * Send text to rtf_dispatch_char for further processing.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
360 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
361 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
362 rtf_parse(NMRtfContext *ctx)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
363 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
364 int status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
365 guchar ch;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
366 guchar hex_byte = 0;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
367 int hex_count = 2;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
368 int len;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
369
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
370 if (ctx->input == NULL)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
371 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
372
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
373 while (rtf_get_char(ctx, &ch) == NMRTF_OK) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
374 if (ctx->depth < 0)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
375 return NMRTF_STACK_UNDERFLOW;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
376
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
377 /* if we're parsing binary data, handle it directly */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
378 if (ctx->ris == NMRTF_STATE_BIN) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
379 if ((status = rtf_dispatch_char(ctx, ch)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
380 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
381 } else {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
382 switch (ch) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
383 case '{':
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
384 if (ctx->depth > NMRTF_MAX_DEPTH)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
385 return NMRTF_STACK_OVERFLOW;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
386 rtf_flush_data(ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
387 if ((status = rtf_push_state(ctx)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
388 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
389 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
390 case '}':
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
391 rtf_flush_data(ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
392
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
393 /* for some reason there is always an unwanted '\par' at the end */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
394 if (ctx->rds == NMRTF_STATE_NORMAL) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
395 len = ctx->output->len;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
396 if (ctx->output->str[len-1] == '\n')
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
397 ctx->output = g_string_truncate(ctx->output, len-1);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
398 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
399
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
400 if ((status = rtf_pop_state(ctx)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
401 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
402
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
403 if (ctx->depth < 0)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
404 return NMRTF_STACK_OVERFLOW;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
405 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
406 case '\\':
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
407 if ((status = rtf_parse_keyword(ctx)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
408 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
409 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
410 case 0x0d:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
411 case 0x0a: /* cr and lf are noise characters... */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
412 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
413 default:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
414 if (ctx->ris == NMRTF_STATE_NORMAL) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
415 if ((status = rtf_dispatch_char(ctx, ch)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
416 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
417 } else { /* parsing a hex encoded character */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
418 if (ctx->ris != NMRTF_STATE_HEX)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
419 return NMRTF_ASSERTION;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
420
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
421 hex_byte = hex_byte << 4;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
422 if (isdigit(ch))
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
423 hex_byte += (char) ch - '0';
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
424 else {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
425 if (islower(ch)) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
426 if (ch < 'a' || ch > 'f')
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
427 return NMRTF_INVALID_HEX;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
428 hex_byte += (char) ch - 'a' + 10;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
429 } else {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
430 if (ch < 'A' || ch > 'F')
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
431 return NMRTF_INVALID_HEX;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
432 hex_byte += (char) ch - 'A' + 10;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
433 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
434 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
435 hex_count--;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
436 if (hex_count == 0) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
437 if ((status = rtf_dispatch_char(ctx, hex_byte)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
438 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
439 hex_count = 2;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
440 hex_byte = 0;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
441 ctx->ris = NMRTF_STATE_NORMAL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
442 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
443 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
444 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
445 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
446 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
447 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
448 if (ctx->depth < 0)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
449 return NMRTF_STACK_OVERFLOW;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
450 if (ctx->depth > 0)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
451 return NMRTF_UNMATCHED_BRACE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
452 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
453 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
454
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
455 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
456 * Push the current state onto stack
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
457 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
458 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
459 rtf_push_state(NMRtfContext *ctx)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
460 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
461 NMRtfStateSave *save = g_new0(NMRtfStateSave, 1);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
462 save->chp = ctx->chp;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
463 save->rds = ctx->rds;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
464 save->ris = ctx->ris;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
465 ctx->saved = g_slist_prepend(ctx->saved, save);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
466 ctx->ris = NMRTF_STATE_NORMAL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
467 (ctx->depth)++;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
468 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
469 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
470
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
471 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
472 * Restore the state at the top of the stack
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
473 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
474 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
475 rtf_pop_state(NMRtfContext *ctx)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
476 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
477 NMRtfStateSave *save_old;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
478 GSList *link_old;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
479
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
480 if (ctx->saved == NULL)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
481 return NMRTF_STACK_UNDERFLOW;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
482
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
483 save_old = ctx->saved->data;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
484 ctx->chp = save_old->chp;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
485 ctx->rds = save_old->rds;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
486 ctx->ris = save_old->ris;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
487 (ctx->depth)--;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
488
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
489 g_free(save_old);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
490 link_old = ctx->saved;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
491 ctx->saved = g_slist_remove_link(ctx->saved, link_old);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
492 g_slist_free_1(link_old);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
493 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
494 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
495
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
496 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
497 * Step 2:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
498 * Get a control word (and its associated value) and
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
499 * dispatch the control.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
500 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
501 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
502 rtf_parse_keyword(NMRtfContext *ctx)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
503 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
504 int status = NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
505 guchar ch;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
506 gboolean param_set = FALSE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
507 gboolean is_neg = FALSE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
508 int param = 0;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
509 char keyword[30];
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
510 char parameter[20];
9804
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
511 int i;
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
512
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
513 keyword[0] = '\0';
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
514 parameter[0] = '\0';
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
515 if ((status = rtf_get_char(ctx, &ch)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
516 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
517
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
518 if (!isalpha(ch)) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
519 /* a control symbol; no delimiter. */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
520 keyword[0] = (char) ch;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
521 keyword[1] = '\0';
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
522 return rtf_dispatch_control(ctx, keyword, 0, param_set);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
523 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
524
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
525 /* parse keyword */
9804
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
526 for (i = 0; isalpha(ch) && (i < sizeof(keyword) - 1); rtf_get_char(ctx, &ch)) {
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
527 keyword[i] = (char) ch;
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
528 i++;
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
529 }
9804
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
530 keyword[i] = '\0';
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
531
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
532 /* check for '-' indicated a negative parameter value */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
533 if (ch == '-') {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
534 is_neg = TRUE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
535 if ((status = rtf_get_char(ctx, &ch)) != NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
536 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
537 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
538
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
539 /* check for numerical param */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
540 if (isdigit(ch)) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
541
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
542 param_set = TRUE;
9804
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
543 for (i = 0; isdigit(ch) && (i < sizeof(parameter) - 1); rtf_get_char(ctx, &ch)) {
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
544 parameter[i] = (char) ch;
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
545 i++;
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
546 }
9804
1fbe747c77aa [gaim-migrate @ 10672]
Mark Doliner <markdoliner@pidgin.im>
parents: 9268
diff changeset
547 parameter[i] = '\0';
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
548
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
549 ctx->param = param = atoi(parameter);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
550 if (is_neg)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
551 ctx->param = param = -param;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
552 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
553
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
554 /* space after control is optional, put character back if it is not a space */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
555 if (ch != ' ')
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
556 rtf_unget_char(ctx, ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
557
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
558 return rtf_dispatch_control(ctx, keyword, param, param_set);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
559 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
560
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
561 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
562 * Route the character to the appropriate destination
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
563 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
564 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
565 rtf_dispatch_char(NMRtfContext *ctx, guchar ch)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
566 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
567 if (ctx->ris == NMRTF_STATE_BIN && --(ctx->bytes_to_skip) <= 0)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
568 ctx->ris = NMRTF_STATE_NORMAL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
569
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
570 switch (ctx->rds) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
571 case NMRTF_STATE_SKIP:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
572 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
573 case NMRTF_STATE_NORMAL:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
574 return rtf_print_char(ctx, ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
575 case NMRTF_STATE_FONTTABLE:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
576 if (ch == ';') {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
577 rtf_add_font_entry(ctx, ctx->chp.font_idx,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
578 ctx->ansi->str, ctx->chp.font_charset);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
579 g_string_truncate(ctx->ansi, 0);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
580 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
581 else {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
582 return rtf_print_char(ctx, ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
583 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
584 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
585 default:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
586 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
587 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
588 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
589
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
590 /* Handle a unicode character */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
591 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
592 rtf_dispatch_unicode_char(NMRtfContext *ctx, gunichar ch)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
593 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
594 switch (ctx->rds) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
595 case NMRTF_STATE_SKIP:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
596 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
597 case NMRTF_STATE_NORMAL:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
598 case NMRTF_STATE_FONTTABLE:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
599 return rtf_print_unicode_char(ctx, ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
600 default:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
601 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
602 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
603 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
604
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
605 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
606 * Output a character
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
607 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
608 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
609 rtf_print_char(NMRtfContext *ctx, guchar ch)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
610 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
611
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
612 ctx->ansi = g_string_append_c(ctx->ansi, ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
613
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
614 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
615 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
616
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
617 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
618 * Output a unicode character
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
619 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
620 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
621 rtf_print_unicode_char(NMRtfContext *ctx, gunichar ch)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
622 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
623 char buf[7];
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
624 int num;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
625
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
626 /* convert and flush the ansi buffer to the utf8 buffer */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
627 rtf_flush_data(ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
628
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
629 /* convert the unicode character to utf8 and add directly to the output buffer */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
630 num = g_unichar_to_utf8((gunichar) ch, buf);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
631 buf[num] = 0;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
632 purple_debug_info("novell", "converted unichar 0x%X to utf8 char %s\n", ch, buf);
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
633
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
634 ctx->output = g_string_append(ctx->output, buf);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
635 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
636 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
637
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
638 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
639 * Flush the output text
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
640 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
641 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
642 rtf_flush_data(NMRtfContext *ctx)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
643 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
644 int status = NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
645 char *conv_data = NULL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
646 const char *enc = NULL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
647 GError *gerror = NULL;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
648
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
649 if (ctx->rds == NMRTF_STATE_NORMAL && ctx->ansi->len > 0) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
650 enc = get_current_encoding(ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
651 conv_data = g_convert(ctx->ansi->str, ctx->ansi->len, "UTF-8", enc,
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
652 NULL, NULL, &gerror);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
653 if (conv_data) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
654 ctx->output = g_string_append(ctx->output, conv_data);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
655 g_free(conv_data);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
656 ctx->ansi = g_string_truncate(ctx->ansi, 0);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
657 } else {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
658 status = NMRTF_CONVERT_ERROR;
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
659 purple_debug_info("novell", "failed to convert data! error code = %d msg = %s\n",
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
660 gerror->code, gerror->message);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
661 g_free(gerror);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
662 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
663 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
664
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
665 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
666 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
667
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
668 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
669 * Handle a property change
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
670 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
671 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
672 rtf_apply_property(NMRtfContext *ctx, NMRtfProperty prop, int val)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
673 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
674 if (ctx->rds == NMRTF_STATE_SKIP) /* If we're skipping text, */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
675 return NMRTF_OK; /* don't do anything. */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
676
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
677 /* Need to flush any temporary data before a property change*/
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
678 rtf_flush_data(ctx);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
679
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
680 switch (prop) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
681 case NMRTF_PROP_FONT_IDX:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
682 ctx->chp.font_idx = val;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
683 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
684 case NMRTF_PROP_FONT_CHARSET:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
685 ctx->chp.font_charset = val;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
686 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
687 default:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
688 return NMRTF_BAD_TABLE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
689 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
690
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
691 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
692 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
693
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
694 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
695 * Step 3.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
696 * Search the table for keyword and evaluate it appropriately.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
697 *
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
698 * Inputs:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
699 * keyword: The RTF control to evaluate.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
700 * param: The parameter of the RTF control.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
701 * param_set: TRUE if the control had a parameter; (that is, if param is valid)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
702 * FALSE if it did not.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
703 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
704 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
705 rtf_dispatch_control(NMRtfContext *ctx, char *keyword, int param, gboolean param_set)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
706 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
707 int idx;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
708
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
709 for (idx = 0; idx < table_size; idx++) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
710 if (strcmp(keyword, rtf_symbols[idx].keyword) == 0)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
711 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
712 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
713
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
714 if (idx == table_size) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
715 if (ctx->skip_unknown)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
716 ctx->rds = NMRTF_STATE_SKIP;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
717 ctx->skip_unknown = FALSE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
718 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
719 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
720
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
721 /* found it! use kwd_type and action to determine what to do with it. */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
722 ctx->skip_unknown = FALSE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
723 switch (rtf_symbols[idx].kwd_type) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
724 case NMRTF_KWD_PROP:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
725 if (rtf_symbols[idx].pass_default || !param_set)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
726 param = rtf_symbols[idx].default_val;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
727 return rtf_apply_property(ctx, rtf_symbols[idx].action, param);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
728 case NMRTF_KWD_CHAR:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
729 return rtf_dispatch_char(ctx, rtf_symbols[idx].action);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
730 case NMRTF_KWD_DEST:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
731 return rtf_change_destination(ctx, rtf_symbols[idx].action);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
732 case NMRTF_KWD_SPEC:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
733 return rtf_dispatch_special(ctx, rtf_symbols[idx].action);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
734 default:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
735 return NMRTF_BAD_TABLE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
736 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
737 return NMRTF_BAD_TABLE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
738 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
739
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
740 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
741 * Change to the destination specified.
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
742 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
743 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
744 rtf_change_destination(NMRtfContext *ctx, NMRtfDestinationType type)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
745 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
746 /* if we're skipping text, don't do anything */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
747 if (ctx->rds == NMRTF_STATE_SKIP)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
748 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
749
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
750 switch (type) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
751 case NMRTF_DEST_FONTTABLE:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
752 ctx->rds = NMRTF_STATE_FONTTABLE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
753 g_string_truncate(ctx->ansi, 0);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
754 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
755 default:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
756 ctx->rds = NMRTF_STATE_SKIP; /* when in doubt, skip it... */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
757 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
758 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
759 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
760 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
761
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
762 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
763 * Dispatch an RTF control that needs special processing
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
764 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
765 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
766 rtf_dispatch_special(NMRtfContext *ctx, NMRtfSpecialKwd type)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
767 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
768 int status = NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
769 guchar ch;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
770
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
771 if (ctx->rds == NMRTF_STATE_SKIP && type != NMRTF_SPECIAL_BIN) /* if we're skipping, and it's not */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
772 return NMRTF_OK; /* the \bin keyword, ignore it. */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
773
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
774 switch (type) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
775 case NMRTF_SPECIAL_BIN:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
776 ctx->ris = NMRTF_STATE_BIN;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
777 ctx->bytes_to_skip = ctx->param;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
778 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
779 case NMRTF_SPECIAL_SKIP:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
780 ctx->skip_unknown = TRUE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
781 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
782 case NMRTF_SPECIAL_HEX:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
783 ctx->ris = NMRTF_STATE_HEX;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
784 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
785 case NMRTF_SPECIAL_UNICODE:
15884
4de1981757fc sed -ie 's/gaim/purple/g'
Sean Egan <seanegan@pidgin.im>
parents: 15435
diff changeset
786 purple_debug_info("novell", "parsing unichar\n");
9268
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
787 status = rtf_dispatch_unicode_char(ctx, ctx->param);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
788 /* Skip next char */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
789 if (status == NMRTF_OK)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
790 status = rtf_get_char(ctx, &ch);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
791 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
792 default:
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
793 status = NMRTF_BAD_TABLE;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
794 break;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
795 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
796
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
797 return status;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
798 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
799
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
800 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
801 * Get the next character from the input stream
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
802 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
803 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
804 rtf_get_char(NMRtfContext *ctx, guchar *ch)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
805 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
806 if (ctx->nextch >= 0) {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
807 *ch = ctx->nextch;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
808 ctx->nextch = -1;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
809 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
810 else {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
811 *ch = *(ctx->input);
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
812 ctx->input++;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
813 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
814
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
815 if (*ch)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
816 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
817 else
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
818 return NMRTF_EOF;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
819 }
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
820
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
821 /*
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
822 * Move a character back into the input stream
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
823 */
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
824 static int
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
825 rtf_unget_char(NMRtfContext *ctx, guchar ch)
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
826 {
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
827 ctx->nextch = ch;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
828 return NMRTF_OK;
196cbf2cae4c [gaim-migrate @ 10069]
Mike Stoddard <mistoddard@novell.com>
parents:
diff changeset
829 }

mercurial