-rw-r--r-- | libopie2/opiecore/device/odevice_htc.cpp | 3 | ||||
-rw-r--r-- | libopie2/opiepim/private/opimeventsortvector.cpp | 9 | ||||
-rw-r--r-- | noncore/apps/confedit/listviewitemconffile.cpp | 59 | ||||
-rw-r--r-- | noncore/apps/opie-console/io_irda.cpp | 1 | ||||
-rw-r--r-- | noncore/apps/opie-console/mainwindow.cpp | 10 | ||||
-rw-r--r-- | noncore/apps/opie-reader/CFilter.cpp | 2 | ||||
-rw-r--r-- | noncore/apps/opie-reader/CRegExp.cpp | 4 | ||||
-rw-r--r-- | noncore/apps/opie-reader/Palm2QImage.cpp | 4 | ||||
-rw-r--r-- | noncore/apps/opie-reader/QTReader.cpp | 2 | ||||
-rw-r--r-- | noncore/apps/opie-reader/plucker_base.cpp | 2 | ||||
-rw-r--r-- | noncore/apps/opie-reader/striphtml.cpp | 2 | ||||
-rw-r--r-- | noncore/apps/tinykate/libkate/document/katehighlight.cpp | 10 | ||||
-rw-r--r-- | noncore/net/ftplib/ftplib.c | 2 | ||||
-rw-r--r-- | noncore/settings/sysinfo/contrib/dhry.c | 2 |
14 files changed, 56 insertions, 56 deletions
diff --git a/libopie2/opiecore/device/odevice_htc.cpp b/libopie2/opiecore/device/odevice_htc.cpp index c21e10d..4e5200b 100644 --- a/libopie2/opiecore/device/odevice_htc.cpp +++ b/libopie2/opiecore/device/odevice_htc.cpp | |||
@@ -1,604 +1,603 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2002-2005 The Opie Team <opie-devel@handhelds.org> | 3 | Copyright (C) 2002-2005 The Opie Team <opie-devel@handhelds.org> |
4 | =. Copyright (C) 2002-2005 Michael 'Mickey' Lauer <mickey@Vanille.de> | 4 | =. Copyright (C) 2002-2005 Michael 'Mickey' Lauer <mickey@Vanille.de> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; version 2 of the License. | 11 | - . .-<_> .<> Foundation; version 2 of the License. |
12 | ._= =} : | 12 | ._= =} : |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "odevice_htc.h" | 30 | #include "odevice_htc.h" |
31 | 31 | ||
32 | /* OPIE */ | 32 | /* OPIE */ |
33 | #include <opie2/oinputsystem.h> | 33 | #include <opie2/oinputsystem.h> |
34 | #include <opie2/oresource.h> | 34 | #include <opie2/oresource.h> |
35 | 35 | ||
36 | #include <qpe/config.h> | 36 | #include <qpe/config.h> |
37 | #include <qpe/sound.h> | 37 | #include <qpe/sound.h> |
38 | 38 | ||
39 | /* QT */ | 39 | /* QT */ |
40 | #include <qapplication.h> | 40 | #include <qapplication.h> |
41 | #include <qfile.h> | 41 | #include <qfile.h> |
42 | #include <qtextstream.h> | 42 | #include <qtextstream.h> |
43 | #include <qwindowsystem_qws.h> | 43 | #include <qwindowsystem_qws.h> |
44 | #include <qcopchannel_qws.h> | 44 | #include <qcopchannel_qws.h> |
45 | 45 | ||
46 | /* STD */ | 46 | /* STD */ |
47 | #include <string.h> | 47 | #include <string.h> |
48 | #include <errno.h> | 48 | #include <errno.h> |
49 | #include <fcntl.h> | 49 | #include <fcntl.h> |
50 | #include <math.h> | 50 | #include <math.h> |
51 | #include <stdlib.h> | 51 | #include <stdlib.h> |
52 | #include <signal.h> | 52 | #include <signal.h> |
53 | #include <sys/ioctl.h> | 53 | #include <sys/ioctl.h> |
54 | #include <sys/time.h> | 54 | #include <sys/time.h> |
55 | #include <unistd.h> | 55 | #include <unistd.h> |
56 | #ifndef QT_NO_SOUND | 56 | #ifndef QT_NO_SOUND |
57 | #include <linux/soundcard.h> | 57 | #include <linux/soundcard.h> |
58 | #endif | 58 | #endif |
59 | 59 | ||
60 | using namespace Opie::Core; | 60 | using namespace Opie::Core; |
61 | using namespace Opie::Core::Internal; | 61 | using namespace Opie::Core::Internal; |
62 | 62 | ||
63 | struct htc_button htc_buttons [] = { | 63 | struct htc_button htc_buttons [] = { |
64 | { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), | 64 | { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), |
65 | "devicebuttons/z_calendar", | 65 | "devicebuttons/z_calendar", |
66 | "datebook", "nextView()", | 66 | "datebook", "nextView()", |
67 | "today", "raise()" }, | 67 | "today", "raise()" }, |
68 | { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), | 68 | { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), |
69 | "devicebuttons/z_contact", | 69 | "devicebuttons/z_contact", |
70 | "addressbook", "raise()", | 70 | "addressbook", "raise()", |
71 | "addressbook", "beamBusinessCard()" }, | 71 | "addressbook", "beamBusinessCard()" }, |
72 | { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), | 72 | { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), |
73 | "devicebuttons/z_home", | 73 | "devicebuttons/z_home", |
74 | "QPE/Launcher", "home()", | 74 | "QPE/Launcher", "home()", |
75 | "buttonsettings", "raise()" }, | 75 | "buttonsettings", "raise()" }, |
76 | { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), | 76 | { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), |
77 | "devicebuttons/z_menu", | 77 | "devicebuttons/z_menu", |
78 | "QPE/TaskBar", "toggleMenu()", | 78 | "QPE/TaskBar", "toggleMenu()", |
79 | "QPE/TaskBar", "toggleStartMenu()" }, | 79 | "QPE/TaskBar", "toggleStartMenu()" }, |
80 | { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), | 80 | { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), |
81 | "devicebuttons/z_mail", | 81 | "devicebuttons/z_mail", |
82 | "opiemail", "raise()", | 82 | "opiemail", "raise()", |
83 | "opiemail", "newMail()" }, | 83 | "opiemail", "newMail()" }, |
84 | }; | 84 | }; |
85 | 85 | ||
86 | struct htc_button htc_buttons_universal [] = { | 86 | struct htc_button htc_buttons_universal [] = { |
87 | { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), | 87 | { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), |
88 | "devicebuttons/z_calendar", | 88 | "devicebuttons/z_calendar", |
89 | "datebook", "nextView()", | 89 | "datebook", "nextView()", |
90 | "today", "raise()" }, | 90 | "today", "raise()" }, |
91 | { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), | 91 | { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), |
92 | "devicebuttons/z_contact", | 92 | "devicebuttons/z_contact", |
93 | "addressbook", "raise()", | 93 | "addressbook", "raise()", |
94 | "addressbook", "beamBusinessCard()" }, | 94 | "addressbook", "beamBusinessCard()" }, |
95 | { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), | 95 | { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), |
96 | "devicebuttons/z_home", | 96 | "devicebuttons/z_home", |
97 | "QPE/Launcher", "home()", | 97 | "QPE/Launcher", "home()", |
98 | "buttonsettings", "raise()" }, | 98 | "buttonsettings", "raise()" }, |
99 | { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), | 99 | { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), |
100 | "devicebuttons/z_menu", | 100 | "devicebuttons/z_menu", |
101 | "QPE/TaskBar", "toggleMenu()", | 101 | "QPE/TaskBar", "toggleMenu()", |
102 | "QPE/TaskBar", "toggleStartMenu()" }, | 102 | "QPE/TaskBar", "toggleStartMenu()" }, |
103 | { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), | 103 | { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), |
104 | "devicebuttons/z_mail", | 104 | "devicebuttons/z_mail", |
105 | "opiemail", "raise()", | 105 | "opiemail", "raise()", |
106 | "opiemail", "newMail()" }, | 106 | "opiemail", "newMail()" }, |
107 | 107 | ||
108 | { Qt::Key_F15, QT_TRANSLATE_NOOP("Button", "Hinge1"), | 108 | { Qt::Key_F15, QT_TRANSLATE_NOOP("Button", "Hinge1"), |
109 | "devicebuttons/z_hinge1", | 109 | "devicebuttons/z_hinge1", |
110 | "QPE/Rotation", "rotateDefault()",0}, | 110 | "QPE/Rotation", "rotateDefault()",0}, |
111 | { Qt::Key_F16, QT_TRANSLATE_NOOP("Button", "Hinge2"), | 111 | { Qt::Key_F16, QT_TRANSLATE_NOOP("Button", "Hinge2"), |
112 | "devicebuttons/z_hinge2", | 112 | "devicebuttons/z_hinge2", |
113 | "QPE/Rotation", "rotateDefault()",0}, | 113 | "QPE/Rotation", "rotateDefault()",0}, |
114 | { Qt::Key_F17, QT_TRANSLATE_NOOP("Button", "Hinge3"), | 114 | { Qt::Key_F17, QT_TRANSLATE_NOOP("Button", "Hinge3"), |
115 | "devicebuttons/z_hinge3", | 115 | "devicebuttons/z_hinge3", |
116 | "QPE/Rotation", "rotateDefault()",0}, | 116 | "QPE/Rotation", "rotateDefault()",0}, |
117 | }; | 117 | }; |
118 | 118 | ||
119 | 119 | ||
120 | // | 120 | // |
121 | // HTC-Universal (PXA-model w/ 480x640 3.6" lcd) | 121 | // HTC-Universal (PXA-model w/ 480x640 3.6" lcd) |
122 | // HTC-Alpine (PXA-model w/ 240x320 3.5" lcd) | 122 | // HTC-Alpine (PXA-model w/ 240x320 3.5" lcd) |
123 | // HTC-Apache (PXA-model w/ 240x320 2.8" lcd) | 123 | // HTC-Apache (PXA-model w/ 240x320 2.8" lcd) |
124 | // HTC-Beetles (PXA-model w/ 240x240 3.0" lcd) | 124 | // HTC-Beetles (PXA-model w/ 240x240 3.0" lcd) |
125 | // HTC-Blueangel (PXA-model w/ 240x320 3.5" lcd) | 125 | // HTC-Blueangel (PXA-model w/ 240x320 3.5" lcd) |
126 | // HTC-Himalaya (PXA-model w/ 240x320 3.5" lcd) | 126 | // HTC-Himalaya (PXA-model w/ 240x320 3.5" lcd) |
127 | // HTC-Magician (PXA-model w/ 240x320 2.8" lcd) | 127 | // HTC-Magician (PXA-model w/ 240x320 2.8" lcd) |
128 | 128 | ||
129 | void HTC::init(const QString& cpu_info) | 129 | void HTC::init(const QString& cpu_info) |
130 | { | 130 | { |
131 | qDebug( "HTC::init()" ); | 131 | qDebug( "HTC::init()" ); |
132 | // Set the time to wait until the system is really suspended | 132 | // Set the time to wait until the system is really suspended |
133 | // the delta between apm --suspend and sleeping | 133 | // the delta between apm --suspend and sleeping |
134 | setAPMTimeOut( 15000 ); | 134 | setAPMTimeOut( 15000 ); |
135 | 135 | ||
136 | d->m_vendorstr = "Xanadux Team"; | 136 | d->m_vendorstr = "Xanadux Team"; |
137 | d->m_systemstr = "Familiar"; | 137 | d->m_systemstr = "Familiar"; |
138 | d->m_system = System_Familiar; | 138 | d->m_system = System_Familiar; |
139 | 139 | ||
140 | // check the HTC model | 140 | // check the HTC model |
141 | QString model; | 141 | QString model; |
142 | int loc = cpu_info.find( ":" ); | 142 | int loc = cpu_info.find( ":" ); |
143 | if ( loc != -1 ) | 143 | if ( loc != -1 ) |
144 | model = cpu_info.mid( loc+2 ).simplifyWhiteSpace(); | 144 | model = cpu_info.mid( loc+2 ).simplifyWhiteSpace(); |
145 | else | 145 | else |
146 | model = cpu_info; | 146 | model = cpu_info; |
147 | 147 | ||
148 | d->m_model = Model_HTC_Universal; | 148 | d->m_model = Model_HTC_Universal; |
149 | d->m_modelstr = "Unknown HTC"; | 149 | d->m_modelstr = "Unknown HTC"; |
150 | 150 | ||
151 | if ( model == "HTC Universal" ) { | 151 | if ( model == "HTC Universal" ) { |
152 | d->m_model = Model_HTC_Universal; | 152 | d->m_model = Model_HTC_Universal; |
153 | d->m_modelstr = "HTC Universal"; | 153 | d->m_modelstr = "HTC Universal"; |
154 | } | 154 | } |
155 | if ( model == "HTC Alpine" ) { | 155 | if ( model == "HTC Alpine" ) { |
156 | d->m_model = Model_HTC_Alpine; | 156 | d->m_model = Model_HTC_Alpine; |
157 | d->m_modelstr = "HTC Alpine"; | 157 | d->m_modelstr = "HTC Alpine"; |
158 | } | 158 | } |
159 | if ( model == "HTC Apache" ) { | 159 | if ( model == "HTC Apache" ) { |
160 | d->m_model = Model_HTC_Apache; | 160 | d->m_model = Model_HTC_Apache; |
161 | d->m_modelstr = "HTC Apache"; | 161 | d->m_modelstr = "HTC Apache"; |
162 | } | 162 | } |
163 | if ( model == "HTC Beetles" ) { | 163 | if ( model == "HTC Beetles" ) { |
164 | d->m_model = Model_HTC_Beetles; | 164 | d->m_model = Model_HTC_Beetles; |
165 | d->m_modelstr = "HTC Beetles"; | 165 | d->m_modelstr = "HTC Beetles"; |
166 | } | 166 | } |
167 | if ( model == "HTC Blueangel" ) { | 167 | if ( model == "HTC Blueangel" ) { |
168 | d->m_model = Model_HTC_Blueangel; | 168 | d->m_model = Model_HTC_Blueangel; |
169 | d->m_modelstr = "HTC Blueangel"; | 169 | d->m_modelstr = "HTC Blueangel"; |
170 | } | 170 | } |
171 | if ( model == "HTC Himalaya" ) { | 171 | if ( model == "HTC Himalaya" ) { |
172 | d->m_model = Model_HTC_Himalaya; | 172 | d->m_model = Model_HTC_Himalaya; |
173 | d->m_modelstr = "HTC Himalaya"; | 173 | d->m_modelstr = "HTC Himalaya"; |
174 | } | 174 | } |
175 | if ( model == "HTC Magician" ) { | 175 | if ( model == "HTC Magician" ) { |
176 | d->m_model = Model_HTC_Magician; | 176 | d->m_model = Model_HTC_Magician; |
177 | d->m_modelstr = "HTC Magician"; | 177 | d->m_modelstr = "HTC Magician"; |
178 | } | 178 | } |
179 | 179 | ||
180 | 180 | ||
181 | // set path to backlight device | 181 | // set path to backlight device |
182 | switch ( d->m_model ) | 182 | switch ( d->m_model ) |
183 | { | 183 | { |
184 | case Model_HTC_Universal: | 184 | case Model_HTC_Universal: |
185 | case Model_HTC_Magician: | 185 | case Model_HTC_Magician: |
186 | case Model_HTC_Alpine: | 186 | case Model_HTC_Alpine: |
187 | case Model_HTC_Beetles: | 187 | case Model_HTC_Beetles: |
188 | case Model_HTC_Apache: | 188 | case Model_HTC_Apache: |
189 | m_backlightdev = "/sys/class/backlight/pxa2xx-fb/"; | 189 | m_backlightdev = "/sys/class/backlight/pxa2xx-fb/"; |
190 | break; | 190 | break; |
191 | case Model_HTC_Blueangel: | 191 | case Model_HTC_Blueangel: |
192 | case Model_HTC_Himalaya: | 192 | case Model_HTC_Himalaya: |
193 | m_backlightdev = "/sys/class/backlight/w100fb/"; | 193 | m_backlightdev = "/sys/class/backlight/w100fb/"; |
194 | break; | 194 | break; |
195 | default: | 195 | default: |
196 | m_backlightdev = "/sys/class/backlight/pxafb/"; | 196 | m_backlightdev = "/sys/class/backlight/pxafb/"; |
197 | } | 197 | } |
198 | 198 | ||
199 | // set initial rotation | 199 | // set initial rotation |
200 | switch( d->m_model ) | 200 | switch( d->m_model ) |
201 | { | 201 | { |
202 | case Model_HTC_Universal: | 202 | case Model_HTC_Universal: |
203 | initHingeSensor(); | 203 | initHingeSensor(); |
204 | d->m_rotation = rotation(); | 204 | d->m_rotation = rotation(); |
205 | d->m_direction = direction(); | 205 | d->m_direction = direction(); |
206 | break; | 206 | break; |
207 | default: | 207 | default: |
208 | d->m_rotation = Rot270; | 208 | d->m_rotation = Rot270; |
209 | } | 209 | } |
210 | 210 | ||
211 | // set default qte driver | 211 | // set default qte driver |
212 | switch( d->m_model ) | 212 | switch( d->m_model ) |
213 | { | 213 | { |
214 | default: | 214 | default: |
215 | d->m_qteDriver = "Transformed"; | 215 | d->m_qteDriver = "Transformed"; |
216 | } | 216 | } |
217 | 217 | ||
218 | m_leds[0] = Led_Off; | 218 | m_leds[0] = Led_Off; |
219 | 219 | ||
220 | qDebug( "HTC::init() - Using the 2.6 Xanadux on a %s", (const char*) d->m_modelstr ); | 220 | qDebug( "HTC::init() - Using the 2.6 Xanadux on a %s", (const char*) d->m_modelstr ); |
221 | } | 221 | } |
222 | 222 | ||
223 | void HTC::initButtons() | 223 | void HTC::initButtons() |
224 | { | 224 | { |
225 | qDebug( "HTC::initButtons()" ); | 225 | qDebug( "HTC::initButtons()" ); |
226 | if ( d->m_buttons ) | 226 | if ( d->m_buttons ) |
227 | return; | 227 | return; |
228 | 228 | ||
229 | d->m_buttons = new QValueList <ODeviceButton>; | 229 | d->m_buttons = new QValueList <ODeviceButton>; |
230 | 230 | ||
231 | struct htc_button * phtc_buttons; | 231 | struct htc_button * phtc_buttons; |
232 | int buttoncount; | 232 | int buttoncount; |
233 | switch ( d->m_model ) | 233 | switch ( d->m_model ) |
234 | { | 234 | { |
235 | case Model_HTC_Universal: | 235 | case Model_HTC_Universal: |
236 | if ( isQWS( ) ) | 236 | if ( isQWS( ) ) |
237 | { | 237 | { |
238 | addPreHandler(this); | 238 | addPreHandler(this); |
239 | } | 239 | } |
240 | phtc_buttons = htc_buttons_universal; | 240 | phtc_buttons = htc_buttons_universal; |
241 | buttoncount = ARRAY_SIZE(htc_buttons_universal); | 241 | buttoncount = ARRAY_SIZE(htc_buttons_universal); |
242 | break; | 242 | break; |
243 | default: | 243 | default: |
244 | phtc_buttons = htc_buttons; | 244 | phtc_buttons = htc_buttons; |
245 | buttoncount = ARRAY_SIZE(htc_buttons); | 245 | buttoncount = ARRAY_SIZE(htc_buttons); |
246 | break; | 246 | break; |
247 | } | 247 | } |
248 | 248 | ||
249 | for ( int i = 0; i < buttoncount; i++ ) { | 249 | for ( int i = 0; i < buttoncount; i++ ) { |
250 | struct htc_button *zb = phtc_buttons + i; | 250 | struct htc_button *zb = phtc_buttons + i; |
251 | ODeviceButton b; | 251 | ODeviceButton b; |
252 | 252 | ||
253 | b.setKeycode( zb->code ); | 253 | b.setKeycode( zb->code ); |
254 | b.setUserText( QObject::tr( "Button", zb->utext )); | 254 | b.setUserText( QObject::tr( "Button", zb->utext )); |
255 | b.setPixmap( OResource::loadPixmap( zb->pix )); | 255 | b.setPixmap( OResource::loadPixmap( zb->pix )); |
256 | b.setFactoryPresetPressedAction( OQCopMessage( makeChannel ( zb->fpressedservice ), zb->fpressedaction )); | 256 | b.setFactoryPresetPressedAction( OQCopMessage( makeChannel ( zb->fpressedservice ), zb->fpressedaction )); |
257 | b.setFactoryPresetHeldAction( OQCopMessage( makeChannel ( zb->fheldservice ), zb->fheldaction )); | 257 | b.setFactoryPresetHeldAction( OQCopMessage( makeChannel ( zb->fheldservice ), zb->fheldaction )); |
258 | d->m_buttons->append( b ); | 258 | d->m_buttons->append( b ); |
259 | } | 259 | } |
260 | 260 | ||
261 | reloadButtonMapping(); | 261 | reloadButtonMapping(); |
262 | } | 262 | } |
263 | 263 | ||
264 | 264 | ||
265 | 265 | ||
266 | typedef struct sharp_led_status { | 266 | typedef struct sharp_led_status { |
267 | int which; /* select which LED status is wanted. */ | 267 | int which; /* select which LED status is wanted. */ |
268 | int status; /* set new led status if you call SHARP_LED_SETSTATUS */ | 268 | int status; /* set new led status if you call SHARP_LED_SETSTATUS */ |
269 | } sharp_led_status; | 269 | } sharp_led_status; |
270 | 270 | ||
271 | void HTC::buzzer( int sound ) | 271 | void HTC::buzzer( int sound ) |
272 | { | 272 | { |
273 | #ifndef QT_NO_SOUND | 273 | #ifndef QT_NO_SOUND |
274 | Sound *snd = 0; | 274 | Sound *snd = 0; |
275 | 275 | ||
276 | // All devices except SL5500 have a DSP device | 276 | // All devices except SL5500 have a DSP device |
277 | if ( d->m_model == Model_HTC_Universal ) { | 277 | if ( d->m_model == Model_HTC_Universal ) { |
278 | 278 | ||
279 | switch ( sound ){ | 279 | switch ( sound ){ |
280 | case SHARP_BUZ_TOUCHSOUND: { | 280 | case SHARP_BUZ_TOUCHSOUND: { |
281 | static Sound touch_sound("touchsound"); | 281 | static Sound touch_sound("touchsound"); |
282 | snd = &touch_sound; | 282 | snd = &touch_sound; |
283 | } | 283 | } |
284 | break; | 284 | break; |
285 | case SHARP_BUZ_KEYSOUND: { | 285 | case SHARP_BUZ_KEYSOUND: { |
286 | static Sound key_sound( "keysound" ); | 286 | static Sound key_sound( "keysound" ); |
287 | snd = &key_sound; | 287 | snd = &key_sound; |
288 | } | 288 | } |
289 | break; | 289 | break; |
290 | case SHARP_BUZ_SCHEDULE_ALARM: | 290 | case SHARP_BUZ_SCHEDULE_ALARM: |
291 | default: { | 291 | default: { |
292 | static Sound alarm_sound("alarm"); | 292 | static Sound alarm_sound("alarm"); |
293 | snd = &alarm_sound; | 293 | snd = &alarm_sound; |
294 | } | 294 | } |
295 | break; | 295 | break; |
296 | } | 296 | } |
297 | } | 297 | } |
298 | 298 | ||
299 | // If a soundname is defined, we expect that this device has | 299 | // If a soundname is defined, we expect that this device has |
300 | // sound capabilities.. Otherwise we expect to have the buzzer | 300 | // sound capabilities.. Otherwise we expect to have the buzzer |
301 | // device.. | 301 | // device.. |
302 | if ( snd && snd->isFinished() ){ | 302 | if ( snd && snd->isFinished() ){ |
303 | changeMixerForAlarm( 0, "/dev/sound/mixer", snd ); | 303 | changeMixerForAlarm( 0, "/dev/sound/mixer", snd ); |
304 | snd->play(); | 304 | snd->play(); |
305 | } else if( !snd ) { | 305 | } else if( !snd ) { |
306 | int fd = ::open ( "/dev/sharp_buz", O_WRONLY|O_NONBLOCK ); | 306 | int fd = ::open ( "/dev/sharp_buz", O_WRONLY|O_NONBLOCK ); |
307 | 307 | ||
308 | if ( fd >= 0 ) { | 308 | if ( fd >= 0 ) { |
309 | ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound ); | 309 | ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound ); |
310 | ::close ( fd ); | 310 | ::close ( fd ); |
311 | } | 311 | } |
312 | 312 | ||
313 | } | 313 | } |
314 | #endif | 314 | #endif |
315 | } | 315 | } |
316 | 316 | ||
317 | 317 | ||
318 | void HTC::playAlarmSound() | 318 | void HTC::playAlarmSound() |
319 | { | 319 | { |
320 | buzzer( SHARP_BUZ_SCHEDULE_ALARM ); | 320 | buzzer( SHARP_BUZ_SCHEDULE_ALARM ); |
321 | } | 321 | } |
322 | 322 | ||
323 | void HTC::playTouchSound() | 323 | void HTC::playTouchSound() |
324 | { | 324 | { |
325 | buzzer( SHARP_BUZ_TOUCHSOUND ); | 325 | buzzer( SHARP_BUZ_TOUCHSOUND ); |
326 | } | 326 | } |
327 | 327 | ||
328 | void HTC::playKeySound() | 328 | void HTC::playKeySound() |
329 | { | 329 | { |
330 | buzzer( SHARP_BUZ_KEYSOUND ); | 330 | buzzer( SHARP_BUZ_KEYSOUND ); |
331 | } | 331 | } |
332 | 332 | ||
333 | 333 | ||
334 | QValueList <OLed> HTC::ledList() const | 334 | QValueList <OLed> HTC::ledList() const |
335 | { | 335 | { |
336 | QValueList <OLed> vl; | 336 | QValueList <OLed> vl; |
337 | vl << Led_Mail; | 337 | vl << Led_Mail; |
338 | return vl; | 338 | return vl; |
339 | } | 339 | } |
340 | 340 | ||
341 | QValueList <OLedState> HTC::ledStateList( OLed l ) const | 341 | QValueList <OLedState> HTC::ledStateList( OLed l ) const |
342 | { | 342 | { |
343 | QValueList <OLedState> vl; | 343 | QValueList <OLedState> vl; |
344 | 344 | ||
345 | if ( l == Led_Mail ) | 345 | if ( l == Led_Mail ) |
346 | vl << Led_Off << Led_On << Led_BlinkSlow; | 346 | vl << Led_Off << Led_On << Led_BlinkSlow; |
347 | return vl; | 347 | return vl; |
348 | } | 348 | } |
349 | 349 | ||
350 | OLedState HTC::ledState( OLed which ) const | 350 | OLedState HTC::ledState( OLed which ) const |
351 | { | 351 | { |
352 | if ( which == Led_Mail ) | 352 | if ( which == Led_Mail ) |
353 | return m_leds [0]; | 353 | return m_leds [0]; |
354 | else | 354 | else |
355 | return Led_Off; | 355 | return Led_Off; |
356 | } | 356 | } |
357 | 357 | ||
358 | bool HTC::setLedState( OLed which, OLedState st ) | 358 | bool HTC::setLedState( OLed which, OLedState st ) |
359 | { | 359 | { |
360 | qDebug( "HTC::setLedState: ODevice handling not yet implemented" ); | 360 | qDebug( "HTC::setLedState: ODevice handling not yet implemented" ); |
361 | return false; | 361 | return false; |
362 | } | 362 | } |
363 | 363 | ||
364 | int HTC::displayBrightnessResolution() const | 364 | int HTC::displayBrightnessResolution() const |
365 | { | 365 | { |
366 | int res = 1; | 366 | int res = 1; |
367 | 367 | ||
368 | int fd = ::open( m_backlightdev + "max_brightness", O_RDONLY|O_NONBLOCK ); | 368 | int fd = ::open( m_backlightdev + "max_brightness", O_RDONLY|O_NONBLOCK ); |
369 | 369 | ||
370 | if ( fd ) | 370 | if ( fd ) |
371 | { | 371 | { |
372 | char buf[100]; | 372 | char buf[100]; |
373 | if ( ::read( fd, &buf[0], sizeof buf ) ) ::sscanf( &buf[0], "%d", &res ); | 373 | if ( ::read( fd, &buf[0], sizeof buf ) ) ::sscanf( &buf[0], "%d", &res ); |
374 | ::close( fd ); | 374 | ::close( fd ); |
375 | } | 375 | } |
376 | 376 | ||
377 | return res; | 377 | return res; |
378 | } | 378 | } |
379 | 379 | ||
380 | bool HTC::setDisplayBrightness( int bright ) | 380 | bool HTC::setDisplayBrightness( int bright ) |
381 | { | 381 | { |
382 | 382 | ||
383 | //qDebug( "HTC::setDisplayBrightness( %d )", bright ); | 383 | //qDebug( "HTC::setDisplayBrightness( %d )", bright ); |
384 | bool res = false; | 384 | bool res = false; |
385 | 385 | ||
386 | if ( bright > 255 ) bright = 255; | 386 | if ( bright > 255 ) bright = 255; |
387 | if ( bright < 0 ) bright = 0; | 387 | if ( bright < 0 ) bright = 0; |
388 | 388 | ||
389 | int numberOfSteps = displayBrightnessResolution(); | 389 | int numberOfSteps = displayBrightnessResolution(); |
390 | int val = ( bright == 1 ) ? 1 : ( bright * numberOfSteps ) / 255; | 390 | int val = ( bright == 1 ) ? 1 : ( bright * numberOfSteps ) / 255; |
391 | 391 | ||
392 | int fd = ::open( m_backlightdev + "brightness", O_WRONLY|O_NONBLOCK ); | 392 | int fd = ::open( m_backlightdev + "brightness", O_WRONLY|O_NONBLOCK ); |
393 | if ( fd ) | 393 | if ( fd ) |
394 | { | 394 | { |
395 | char buf[100]; | 395 | char buf[100]; |
396 | int len = ::snprintf( &buf[0], sizeof buf, "%d", val ); | 396 | int len = ::snprintf( &buf[0], sizeof buf, "%d", val ); |
397 | res = ( ::write( fd, &buf[0], len ) == 0 ); | 397 | res = ( ::write( fd, &buf[0], len ) == 0 ); |
398 | ::close( fd ); | 398 | ::close( fd ); |
399 | } | 399 | } |
400 | return res; | 400 | return res; |
401 | } | 401 | } |
402 | 402 | ||
403 | bool HTC::setDisplayStatus( bool on ) | 403 | bool HTC::setDisplayStatus( bool on ) |
404 | { | 404 | { |
405 | 405 | ||
406 | bool res = false; | 406 | bool res = false; |
407 | 407 | ||
408 | int fd = ::open( m_backlightdev + "power", O_WRONLY|O_NONBLOCK ); | 408 | int fd = ::open( m_backlightdev + "power", O_WRONLY|O_NONBLOCK ); |
409 | if ( fd ) | 409 | if ( fd ) |
410 | { | 410 | { |
411 | char buf[10]; | 411 | char buf[10]; |
412 | buf[0] = on ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; | 412 | buf[0] = on ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; |
413 | buf[1] = '\0'; | 413 | buf[1] = '\0'; |
414 | res = ( ::write( fd, &buf[0], 2 ) == 0 ); | 414 | res = ( ::write( fd, &buf[0], 2 ) == 0 ); |
415 | ::close( fd ); | 415 | ::close( fd ); |
416 | } | 416 | } |
417 | return res; | 417 | return res; |
418 | } | 418 | } |
419 | 419 | ||
420 | Transformation HTC::rotation() const | 420 | Transformation HTC::rotation() const |
421 | { | 421 | { |
422 | qDebug( "HTC::rotation()" ); | 422 | qDebug( "HTC::rotation()" ); |
423 | Transformation rot; | 423 | Transformation rot = Rot270; |
424 | 424 | ||
425 | switch ( d->m_model ) { | 425 | switch ( d->m_model ) { |
426 | case Model_HTC_Universal: | 426 | case Model_HTC_Universal: |
427 | { | 427 | { |
428 | OHingeStatus hs = readHingeSensor(); | 428 | OHingeStatus hs = readHingeSensor(); |
429 | qDebug( "HTC::rotation() - hinge sensor = %d", (int) hs ); | 429 | qDebug( "HTC::rotation() - hinge sensor = %d", (int) hs ); |
430 | if ( hs == CASE_PORTRAIT ) rot = Rot0; | 430 | if ( hs == CASE_PORTRAIT ) rot = Rot0; |
431 | else if ( hs == CASE_UNKNOWN ) rot = Rot270; | 431 | else if ( hs == CASE_UNKNOWN ) rot = Rot270; |
432 | else rot = Rot270; | ||
433 | } | 432 | } |
434 | break; | 433 | break; |
435 | } | 434 | } |
436 | 435 | ||
437 | qDebug( "HTC::rotation() - returning '%d'", rot ); | 436 | qDebug( "HTC::rotation() - returning '%d'", rot ); |
438 | return rot; | 437 | return rot; |
439 | } | 438 | } |
440 | ODirection HTC::direction() const | 439 | ODirection HTC::direction() const |
441 | { | 440 | { |
442 | ODirection dir; | 441 | ODirection dir; |
443 | 442 | ||
444 | switch ( d->m_model ) { | 443 | switch ( d->m_model ) { |
445 | case Model_HTC_Universal: { | 444 | case Model_HTC_Universal: { |
446 | OHingeStatus hs = readHingeSensor(); | 445 | OHingeStatus hs = readHingeSensor(); |
447 | if ( hs == CASE_PORTRAIT ) dir = CCW; | 446 | if ( hs == CASE_PORTRAIT ) dir = CCW; |
448 | else if ( hs == CASE_UNKNOWN ) dir = CCW; | 447 | else if ( hs == CASE_UNKNOWN ) dir = CCW; |
449 | else dir = CW; | 448 | else dir = CW; |
450 | } | 449 | } |
451 | break; | 450 | break; |
452 | default: dir = d->m_direction; | 451 | default: dir = d->m_direction; |
453 | break; | 452 | break; |
454 | } | 453 | } |
455 | return dir; | 454 | return dir; |
456 | 455 | ||
457 | } | 456 | } |
458 | 457 | ||
459 | bool HTC::hasHingeSensor() const | 458 | bool HTC::hasHingeSensor() const |
460 | { | 459 | { |
461 | return d->m_model == Model_HTC_Universal; | 460 | return d->m_model == Model_HTC_Universal; |
462 | } | 461 | } |
463 | 462 | ||
464 | OHingeStatus HTC::readHingeSensor() const | 463 | OHingeStatus HTC::readHingeSensor() const |
465 | { | 464 | { |
466 | /* | 465 | /* |
467 | * The HTC Universal keyboard is event source 1 in kernel 2.6. | 466 | * The HTC Universal keyboard is event source 1 in kernel 2.6. |
468 | * Hinge status is reported via Input System Switchs 0 and 1 like that: | 467 | * Hinge status is reported via Input System Switchs 0 and 1 like that: |
469 | * | 468 | * |
470 | * ------------------------- | 469 | * ------------------------- |
471 | * | SW0 | SW1 | CASE | | 470 | * | SW0 | SW1 | CASE | |
472 | * |-----|-----|-----------| | 471 | * |-----|-----|-----------| |
473 | * | 0 0 Unknown | | 472 | * | 0 0 Unknown | |
474 | * | 1 0 Portrait | | 473 | * | 1 0 Portrait | |
475 | * | 0 1 Closed | | 474 | * | 0 1 Closed | |
476 | * | 1 1 Landscape | | 475 | * | 1 1 Landscape | |
477 | * ------------------------- | 476 | * ------------------------- |
478 | */ | 477 | */ |
479 | OInputDevice* keyboard = OInputSystem::instance()->device( "event1" ); | 478 | OInputDevice* keyboard = OInputSystem::instance()->device( "event1" ); |
480 | bool switch0 = true; | 479 | bool switch0 = true; |
481 | bool switch1 = false; | 480 | bool switch1 = false; |
482 | if ( keyboard ) | 481 | if ( keyboard ) |
483 | { | 482 | { |
484 | switch0 = keyboard->isHeld( OInputDevice::Switch0 ); | 483 | switch0 = keyboard->isHeld( OInputDevice::Switch0 ); |
485 | switch1 = keyboard->isHeld( OInputDevice::Switch1 ); | 484 | switch1 = keyboard->isHeld( OInputDevice::Switch1 ); |
486 | } | 485 | } |
487 | if ( switch0 ) | 486 | if ( switch0 ) |
488 | { | 487 | { |
489 | return switch1 ? CASE_LANDSCAPE : CASE_PORTRAIT; | 488 | return switch1 ? CASE_LANDSCAPE : CASE_PORTRAIT; |
490 | } | 489 | } |
491 | else | 490 | else |
492 | { | 491 | { |
493 | return switch1 ? CASE_CLOSED : CASE_UNKNOWN; | 492 | return switch1 ? CASE_CLOSED : CASE_UNKNOWN; |
494 | } | 493 | } |
495 | } | 494 | } |
496 | 495 | ||
497 | void HTC::initHingeSensor() | 496 | void HTC::initHingeSensor() |
498 | { | 497 | { |
499 | if ( m_embedix ) return; | 498 | if ( m_embedix ) return; |
500 | 499 | ||
501 | m_hinge.setName( "/dev/input/event1" ); | 500 | m_hinge.setName( "/dev/input/event1" ); |
502 | if ( !m_hinge.open( IO_ReadOnly ) ) | 501 | if ( !m_hinge.open( IO_ReadOnly ) ) |
503 | { | 502 | { |
504 | qWarning( "HTC::init() - Couldn't open /dev/input/event1 for read (%s)", strerror( errno ) ); | 503 | qWarning( "HTC::init() - Couldn't open /dev/input/event1 for read (%s)", strerror( errno ) ); |
505 | return; | 504 | return; |
506 | } | 505 | } |
507 | 506 | ||
508 | QSocketNotifier* sn = new QSocketNotifier( m_hinge.handle(), QSocketNotifier::Read, this ); | 507 | QSocketNotifier* sn = new QSocketNotifier( m_hinge.handle(), QSocketNotifier::Read, this ); |
509 | QObject::connect( sn, SIGNAL(activated(int)), this, SLOT(hingeSensorTriggered()) ); | 508 | QObject::connect( sn, SIGNAL(activated(int)), this, SLOT(hingeSensorTriggered()) ); |
510 | 509 | ||
511 | qDebug( "HTC::init() - Hinge Sensor Initialization successfully completed" ); | 510 | qDebug( "HTC::init() - Hinge Sensor Initialization successfully completed" ); |
512 | } | 511 | } |
513 | 512 | ||
514 | void HTC::hingeSensorTriggered() | 513 | void HTC::hingeSensorTriggered() |
515 | { | 514 | { |
516 | qDebug( "HTC::hingeSensorTriggered() - got event" ); | 515 | qDebug( "HTC::hingeSensorTriggered() - got event" ); |
517 | struct input_event e; | 516 | struct input_event e; |
518 | if ( ::read( m_hinge.handle(), &e, sizeof e ) > 0 ) | 517 | if ( ::read( m_hinge.handle(), &e, sizeof e ) > 0 ) |
519 | { | 518 | { |
520 | qDebug( "HTC::hingeSensorTriggered() - event has type %d, code %d, value %d", e.type, e.code, e.value ); | 519 | qDebug( "HTC::hingeSensorTriggered() - event has type %d, code %d, value %d", e.type, e.code, e.value ); |
521 | if ( e.type != EV_SW ) return; | 520 | if ( e.type != EV_SW ) return; |
522 | if ( readHingeSensor() != CASE_UNKNOWN ) | 521 | if ( readHingeSensor() != CASE_UNKNOWN ) |
523 | { | 522 | { |
524 | qDebug( "HTC::hingeSensorTriggered() - got valid switch event, calling rotateDefault()" ); | 523 | qDebug( "HTC::hingeSensorTriggered() - got valid switch event, calling rotateDefault()" ); |
525 | QCopChannel::send( "QPE/Rotation", "rotateDefault()" ); | 524 | QCopChannel::send( "QPE/Rotation", "rotateDefault()" ); |
526 | } | 525 | } |
527 | } | 526 | } |
528 | } | 527 | } |
529 | 528 | ||
530 | void HTC::systemMessage( const QCString &msg, const QByteArray & ) | 529 | void HTC::systemMessage( const QCString &msg, const QByteArray & ) |
531 | { | 530 | { |
532 | if ( msg == "deviceButtonMappingChanged()" ) { | 531 | if ( msg == "deviceButtonMappingChanged()" ) { |
533 | reloadButtonMapping(); | 532 | reloadButtonMapping(); |
534 | } | 533 | } |
535 | } | 534 | } |
536 | 535 | ||
537 | /* | 536 | /* |
538 | * Take code from iPAQ device. | 537 | * Take code from iPAQ device. |
539 | * That way we switch the cursor directions depending on status of hinge sensor, eg. hardware direction. | 538 | * That way we switch the cursor directions depending on status of hinge sensor, eg. hardware direction. |
540 | * I hope that is ok - Alwin | 539 | * I hope that is ok - Alwin |
541 | */ | 540 | */ |
542 | bool HTC::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat ) | 541 | bool HTC::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat ) |
543 | { | 542 | { |
544 | int newkeycode = keycode; | 543 | int newkeycode = keycode; |
545 | 544 | ||
546 | if ( !hasHingeSensor() ) return false; | 545 | if ( !hasHingeSensor() ) return false; |
547 | 546 | ||
548 | /* map cursor keys depending on the hinge status */ | 547 | /* map cursor keys depending on the hinge status */ |
549 | switch ( keycode ) { | 548 | switch ( keycode ) { |
550 | // Rotate cursor keys | 549 | // Rotate cursor keys |
551 | case Key_Left : | 550 | case Key_Left : |
552 | case Key_Right: | 551 | case Key_Right: |
553 | case Key_Up : | 552 | case Key_Up : |
554 | case Key_Down : | 553 | case Key_Down : |
555 | { | 554 | { |
556 | if (rotation()==Rot90) { | 555 | if (rotation()==Rot90) { |
557 | newkeycode = Key_Left + ( keycode - Key_Left + 3 ) % 4; | 556 | newkeycode = Key_Left + ( keycode - Key_Left + 3 ) % 4; |
558 | } | 557 | } |
559 | } | 558 | } |
560 | break; | 559 | break; |
561 | 560 | ||
562 | } | 561 | } |
563 | if (newkeycode!=keycode) { | 562 | if (newkeycode!=keycode) { |
564 | if ( newkeycode != Key_unknown ) { | 563 | if ( newkeycode != Key_unknown ) { |
565 | QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); | 564 | QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); |
566 | } | 565 | } |
567 | return true; | 566 | return true; |
568 | } | 567 | } |
569 | return false; | 568 | return false; |
570 | } | 569 | } |
571 | 570 | ||
572 | bool HTC::suspend() { | 571 | bool HTC::suspend() { |
573 | 572 | ||
574 | /* MV */ | 573 | /* MV */ |
575 | return false; | 574 | return false; |
576 | 575 | ||
577 | if ( !isQWS( ) ) // only qwsserver is allowed to suspend | 576 | if ( !isQWS( ) ) // only qwsserver is allowed to suspend |
578 | return false; | 577 | return false; |
579 | 578 | ||
580 | bool res = false; | 579 | bool res = false; |
581 | QCopChannel::send( "QPE/System", "aboutToSuspend()" ); | 580 | QCopChannel::send( "QPE/System", "aboutToSuspend()" ); |
582 | 581 | ||
583 | struct timeval tvs, tvn; | 582 | struct timeval tvs, tvn; |
584 | ::gettimeofday ( &tvs, 0 ); | 583 | ::gettimeofday ( &tvs, 0 ); |
585 | 584 | ||
586 | ::sync(); // flush fs caches | 585 | ::sync(); // flush fs caches |
587 | res = ( ::system ( "apm --suspend" ) == 0 ); | 586 | res = ( ::system ( "apm --suspend" ) == 0 ); |
588 | 587 | ||
589 | // This is needed because some apm implementations are asynchronous and we | 588 | // This is needed because some apm implementations are asynchronous and we |
590 | // can not be sure when exactly the device is really suspended | 589 | // can not be sure when exactly the device is really suspended |
591 | // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists. | 590 | // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists. |
592 | // on non embedix eg. 2.6 kernel line apm is synchronous so we don't need it here. | 591 | // on non embedix eg. 2.6 kernel line apm is synchronous so we don't need it here. |
593 | 592 | ||
594 | if ( res && m_embedix) { | 593 | if ( res && m_embedix) { |
595 | do { // wait at most 1.5 sec: either suspend didn't work or the device resumed | 594 | do { // wait at most 1.5 sec: either suspend didn't work or the device resumed |
596 | ::usleep ( 200 * 1000 ); | 595 | ::usleep ( 200 * 1000 ); |
597 | ::gettimeofday ( &tvn, 0 ); | 596 | ::gettimeofday ( &tvn, 0 ); |
598 | } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < m_timeOut ); | 597 | } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < m_timeOut ); |
599 | } | 598 | } |
600 | 599 | ||
601 | QCopChannel::send( "QPE/System", "returnFromSuspend()" ); | 600 | QCopChannel::send( "QPE/System", "returnFromSuspend()" ); |
602 | 601 | ||
603 | return res; | 602 | return res; |
604 | } | 603 | } |
diff --git a/libopie2/opiepim/private/opimeventsortvector.cpp b/libopie2/opiepim/private/opimeventsortvector.cpp index 4220c63..b85f848 100644 --- a/libopie2/opiepim/private/opimeventsortvector.cpp +++ b/libopie2/opiepim/private/opimeventsortvector.cpp | |||
@@ -1,134 +1,131 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of the Opie Project | 2 | This file is part of the Opie Project |
3 | Copyright (C) 2004 Stefan Eilers <stefan@eilers-online.net> | 3 | Copyright (C) 2004 Stefan Eilers <stefan@eilers-online.net> |
4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> | 4 | =. Copyright (C) The Opie Team <opie-devel@handhelds.org> |
5 | .=l. | 5 | .=l. |
6 | .>+-= | 6 | .>+-= |
7 | _;:, .> :=|. This program is free software; you can | 7 | _;:, .> :=|. This program is free software; you can |
8 | .> <`_, > . <= redistribute it and/or modify it under | 8 | .> <`_, > . <= redistribute it and/or modify it under |
9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public | 9 | :`=1 )Y*s>-.-- : the terms of the GNU Library General Public |
10 | .="- .-=="i, .._ License as published by the Free Software | 10 | .="- .-=="i, .._ License as published by the Free Software |
11 | - . .-<_> .<> Foundation; either version 2 of the License, | 11 | - . .-<_> .<> Foundation; either version 2 of the License, |
12 | ._= =} : or (at your option) any later version. | 12 | ._= =} : or (at your option) any later version. |
13 | .%`+i> _;_. | 13 | .%`+i> _;_. |
14 | .i_,=:_. -<s. This program is distributed in the hope that | 14 | .i_,=:_. -<s. This program is distributed in the hope that |
15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; | 15 | + . -:. = it will be useful, but WITHOUT ANY WARRANTY; |
16 | : .. .:, . . . without even the implied warranty of | 16 | : .. .:, . . . without even the implied warranty of |
17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A | 17 | =_ + =;=|` MERCHANTABILITY or FITNESS FOR A |
18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU | 18 | _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU |
19 | ..}^=.= = ; Library General Public License for more | 19 | ..}^=.= = ; Library General Public License for more |
20 | ++= -. .` .: details. | 20 | ++= -. .` .: details. |
21 | : = ...= . :.=- | 21 | : = ...= . :.=- |
22 | -. .:....=;==+<; You should have received a copy of the GNU | 22 | -. .:....=;==+<; You should have received a copy of the GNU |
23 | -_. . . )=. = Library General Public License along with | 23 | -_. . . )=. = Library General Public License along with |
24 | -- :-=` this library; see the file COPYING.LIB. | 24 | -- :-=` this library; see the file COPYING.LIB. |
25 | If not, write to the Free Software Foundation, | 25 | If not, write to the Free Software Foundation, |
26 | Inc., 59 Temple Place - Suite 330, | 26 | Inc., 59 Temple Place - Suite 330, |
27 | Boston, MA 02111-1307, USA. | 27 | Boston, MA 02111-1307, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include "opimeventsortvector.h" | 30 | #include "opimeventsortvector.h" |
31 | #include <opie2/ocontactaccess.h> | 31 | #include <opie2/ocontactaccess.h> |
32 | #include <opie2/opimnotifymanager.h> | 32 | #include <opie2/opimnotifymanager.h> |
33 | #include <opie2/odatebookaccess.h> | 33 | #include <opie2/odatebookaccess.h> |
34 | 34 | ||
35 | #include <qvaluelist.h> | 35 | #include <qvaluelist.h> |
36 | 36 | ||
37 | namespace Opie { | 37 | namespace Opie { |
38 | namespace Internal { | 38 | namespace Internal { |
39 | 39 | ||
40 | namespace{ | 40 | int testAlarmNotifiers( const OPimNotifyManager& leftnotifiers, const OPimNotifyManager& rightnotifiers ){ |
41 | |||
42 | inline int testAlarmNotifiers( const OPimNotifyManager& leftnotifiers, const OPimNotifyManager& rightnotifiers ){ | ||
43 | OPimNotifyManager::Alarms left_alarms = leftnotifiers.alarms(); | 41 | OPimNotifyManager::Alarms left_alarms = leftnotifiers.alarms(); |
44 | OPimNotifyManager::Alarms right_alarms = rightnotifiers.alarms(); | 42 | OPimNotifyManager::Alarms right_alarms = rightnotifiers.alarms(); |
45 | 43 | ||
46 | // Well.. How could we compare two lists of alarms? I think we should find the most early datetimes | 44 | // Well.. How could we compare two lists of alarms? I think we should find the most early datetimes |
47 | // and compare them.. (se) | 45 | // and compare them.. (se) |
48 | // Find the first alarm of the left list | 46 | // Find the first alarm of the left list |
49 | OPimNotifyManager::Alarms::Iterator it; | 47 | OPimNotifyManager::Alarms::Iterator it; |
50 | QDateTime left_earliest; // This datetime is initialized as invalid!! | 48 | QDateTime left_earliest; // This datetime is initialized as invalid!! |
51 | for ( it = left_alarms.begin(); it != left_alarms.end(); ++it ){ | 49 | for ( it = left_alarms.begin(); it != left_alarms.end(); ++it ){ |
52 | if ( !left_earliest.isValid() || left_earliest > (*it).dateTime() ){ | 50 | if ( !left_earliest.isValid() || left_earliest > (*it).dateTime() ){ |
53 | left_earliest = (*it).dateTime(); | 51 | left_earliest = (*it).dateTime(); |
54 | } | 52 | } |
55 | } | 53 | } |
56 | QDateTime right_earliest; // This datetime is initialized as invalid!! | 54 | QDateTime right_earliest; // This datetime is initialized as invalid!! |
57 | for ( it = right_alarms.begin(); it != right_alarms.end(); ++it ){ | 55 | for ( it = right_alarms.begin(); it != right_alarms.end(); ++it ){ |
58 | if ( !right_earliest.isValid() || right_earliest > (*it).dateTime() ){ | 56 | if ( !right_earliest.isValid() || right_earliest > (*it).dateTime() ){ |
59 | right_earliest = (*it).dateTime(); | 57 | right_earliest = (*it).dateTime(); |
60 | } | 58 | } |
61 | } | 59 | } |
62 | 60 | ||
63 | int ret; | 61 | int ret = 0; |
64 | 62 | ||
65 | // Now compare this found alarms | 63 | // Now compare this found alarms |
66 | if ( !left_earliest .isValid() ) ret++; | 64 | if ( !left_earliest .isValid() ) ret++; |
67 | if ( !right_earliest.isValid() ) ret--; | 65 | if ( !right_earliest.isValid() ) ret--; |
68 | 66 | ||
69 | if ( left_earliest.isValid() && right_earliest.isValid() ){ | 67 | if ( left_earliest.isValid() && right_earliest.isValid() ){ |
70 | ret += left_earliest < right_earliest ? -1 : 1; | 68 | left_earliest < right_earliest ? ret-- : ret++; |
71 | } | 69 | } |
72 | 70 | ||
73 | return ret; | 71 | return ret; |
74 | 72 | ||
75 | } | 73 | } |
76 | } | ||
77 | 74 | ||
78 | OPimEventSortVector::OPimEventSortVector( uint size, bool asc, int sort ) | 75 | OPimEventSortVector::OPimEventSortVector( uint size, bool asc, int sort ) |
79 | : OPimSortVector<OPimEvent>( size, asc, sort ) {} | 76 | : OPimSortVector<OPimEvent>( size, asc, sort ) {} |
80 | 77 | ||
81 | int OPimEventSortVector::compareItems( const OPimEvent& left, | 78 | int OPimEventSortVector::compareItems( const OPimEvent& left, |
82 | const OPimEvent& right ) { | 79 | const OPimEvent& right ) { |
83 | if ( left.uid() == right.uid() ) | 80 | if ( left.uid() == right.uid() ) |
84 | return 0; | 81 | return 0; |
85 | 82 | ||
86 | int ret = 0; | 83 | int ret = 0; |
87 | bool asc = sortAscending(); | 84 | bool asc = sortAscending(); |
88 | 85 | ||
89 | switch( sortOrder() ) { | 86 | switch( sortOrder() ) { |
90 | case ODateBookAccess::SortDescription: | 87 | case ODateBookAccess::SortDescription: |
91 | ret = testString( left.description(), right.description() ); | 88 | ret = testString( left.description(), right.description() ); |
92 | break; | 89 | break; |
93 | case ODateBookAccess::SortLocation: | 90 | case ODateBookAccess::SortLocation: |
94 | ret = testString( left.location(), right.location() ); | 91 | ret = testString( left.location(), right.location() ); |
95 | break; | 92 | break; |
96 | case ODateBookAccess::SortNote: | 93 | case ODateBookAccess::SortNote: |
97 | ret = testString( left.note(),right.note() ); | 94 | ret = testString( left.note(),right.note() ); |
98 | break; | 95 | break; |
99 | case ODateBookAccess::SortStartTime: | 96 | case ODateBookAccess::SortStartTime: |
100 | ret = testTime( left.startDateTime().time(), right.startDateTime().time() ); | 97 | ret = testTime( left.startDateTime().time(), right.startDateTime().time() ); |
101 | break; | 98 | break; |
102 | case ODateBookAccess::SortEndTime: | 99 | case ODateBookAccess::SortEndTime: |
103 | ret = testTime( left.endDateTime().time(), right.endDateTime().time() ); | 100 | ret = testTime( left.endDateTime().time(), right.endDateTime().time() ); |
104 | break; | 101 | break; |
105 | case ODateBookAccess::SortStartDate: | 102 | case ODateBookAccess::SortStartDate: |
106 | ret = testDate( left.startDateTime().date(), right.startDateTime().date() ); | 103 | ret = testDate( left.startDateTime().date(), right.startDateTime().date() ); |
107 | break; | 104 | break; |
108 | case ODateBookAccess::SortEndDate: | 105 | case ODateBookAccess::SortEndDate: |
109 | ret = testDate( left.endDateTime().date(), right.endDateTime().date() ); | 106 | ret = testDate( left.endDateTime().date(), right.endDateTime().date() ); |
110 | break; | 107 | break; |
111 | case ODateBookAccess::SortStartDateTime: | 108 | case ODateBookAccess::SortStartDateTime: |
112 | ret = testDateTime( left.startDateTime(), right.startDateTime() ); | 109 | ret = testDateTime( left.startDateTime(), right.startDateTime() ); |
113 | break; | 110 | break; |
114 | case ODateBookAccess::SortEndDateTime: | 111 | case ODateBookAccess::SortEndDateTime: |
115 | ret = testDateTime( left.endDateTime(), right.endDateTime() ); | 112 | ret = testDateTime( left.endDateTime(), right.endDateTime() ); |
116 | break; | 113 | break; |
117 | case ODateBookAccess::SortAlarmDateTime: | 114 | case ODateBookAccess::SortAlarmDateTime: |
118 | ret = testAlarmNotifiers( left.notifiers(), right.notifiers() ); | 115 | ret = testAlarmNotifiers( left.notifiers(), right.notifiers() ); |
119 | break; | 116 | break; |
120 | default: | 117 | default: |
121 | odebug << "OpimEventSortVector: Unknown sortOrder: " << sortOrder() << oendl; | 118 | odebug << "OpimEventSortVector: Unknown sortOrder: " << sortOrder() << oendl; |
122 | } | 119 | } |
123 | 120 | ||
124 | /* twist to honor ascending/descending setting as QVector only sorts ascending */ | 121 | /* twist to honor ascending/descending setting as QVector only sorts ascending */ |
125 | if ( !asc ) | 122 | if ( !asc ) |
126 | ret *= -1; | 123 | ret *= -1; |
127 | 124 | ||
128 | // Maybe differentiate as in OPimTodoSortVector ### FIXME | 125 | // Maybe differentiate as in OPimTodoSortVector ### FIXME |
129 | // if( ret ) | 126 | // if( ret ) |
130 | return ret; | 127 | return ret; |
131 | } | 128 | } |
132 | 129 | ||
133 | } | 130 | } |
134 | } | 131 | } |
diff --git a/noncore/apps/confedit/listviewitemconffile.cpp b/noncore/apps/confedit/listviewitemconffile.cpp index 2958cf5..a7d6b00 100644 --- a/noncore/apps/confedit/listviewitemconffile.cpp +++ b/noncore/apps/confedit/listviewitemconffile.cpp | |||
@@ -1,165 +1,170 @@ | |||
1 | /*************************************************************************** | 1 | /*************************************************************************** |
2 | * * | 2 | * * |
3 | * This program is free software; you can redistribute it and/or modify * | 3 | * This program is free software; you can redistribute it and/or modify * |
4 | * it under the terms of the GNU General Public License as published by * | 4 | * it under the terms of the GNU General Public License as published by * |
5 | * the Free Software Foundation; either version 2 of the License, or * | 5 | * the Free Software Foundation; either version 2 of the License, or * |
6 | * (at your option) any later version. * | 6 | * (at your option) any later version. * |
7 | * * | 7 | * * |
8 | ***************************************************************************/ | 8 | ***************************************************************************/ |
9 | // (c) 2002 Patrick S. Vogt <tille@handhelds.org> | 9 | // (c) 2002 Patrick S. Vogt <tille@handhelds.org> |
10 | 10 | ||
11 | #include "listviewitemconffile.h" | 11 | #include "listviewitemconffile.h" |
12 | #include "listviewitemconfigentry.h" | 12 | #include "listviewitemconfigentry.h" |
13 | 13 | ||
14 | /* OPIE */ | 14 | /* OPIE */ |
15 | #include <opie2/odebug.h> | 15 | #include <opie2/odebug.h> |
16 | using namespace Opie::Core; | 16 | using namespace Opie::Core; |
17 | 17 | ||
18 | /* QT */ | 18 | /* QT */ |
19 | #include <qmessagebox.h> | 19 | #include <qmessagebox.h> |
20 | #include <qtextstream.h> | 20 | #include <qtextstream.h> |
21 | 21 | ||
22 | #define tr QObject::tr | 22 | #define tr QObject::tr |
23 | 23 | ||
24 | ListViewItemConfFile::ListViewItemConfFile(QFileInfo *file, QListView *parent) | 24 | ListViewItemConfFile::ListViewItemConfFile(QFileInfo *file, QListView *parent) |
25 | : ListViewItemConf(parent), _valid(false) | 25 | : ListViewItemConf(parent), _valid(false) |
26 | { | 26 | { |
27 | confFileInfo = file; | 27 | confFileInfo = file; |
28 | // parseFile(); | 28 | // parseFile(); |
29 | displayText(); | 29 | displayText(); |
30 | } | 30 | } |
31 | 31 | ||
32 | ListViewItemConfFile::~ListViewItemConfFile() | 32 | ListViewItemConfFile::~ListViewItemConfFile() |
33 | { | 33 | { |
34 | } | 34 | } |
35 | 35 | ||
36 | 36 | ||
37 | void ListViewItemConfFile::displayText() | 37 | void ListViewItemConfFile::displayText() |
38 | { | 38 | { |
39 | setText(0,(_changed?"*":"")+confFileInfo->fileName()); | 39 | setText(0,(_changed?"*":"")+confFileInfo->fileName()); |
40 | } | 40 | } |
41 | 41 | ||
42 | QString ListViewItemConfFile::fileName() | 42 | QString ListViewItemConfFile::fileName() |
43 | { | 43 | { |
44 | return confFileInfo->fileName(); | 44 | return confFileInfo->fileName(); |
45 | } | 45 | } |
46 | 46 | ||
47 | void ListViewItemConfFile::parseFile() | 47 | void ListViewItemConfFile::parseFile() |
48 | { | 48 | { |
49 | //odebug << "ListViewItemConfFile::parseFile BEGIN" << oendl; | 49 | //odebug << "ListViewItemConfFile::parseFile BEGIN" << oendl; |
50 | QFile confFile(confFileInfo->absFilePath()); | 50 | QFile confFile(confFileInfo->absFilePath()); |
51 | if(! confFile.open(IO_ReadOnly)) | 51 | if(! confFile.open(IO_ReadOnly)) |
52 | QMessageBox::critical(0,tr("Could not open"),tr("The file ")+confFileInfo->fileName()+tr(" could not be opened."),1,0); | 52 | QMessageBox::critical(0,tr("Could not open"),tr("The file ")+confFileInfo->fileName()+tr(" could not be opened."),1,0); |
53 | QTextStream t( &confFile ); | 53 | |
54 | QString s; | 54 | QTextStream t( &confFile ); |
55 | QString s; | ||
55 | QString group; | 56 | QString group; |
56 | ListViewItemConfigEntry *groupItem; | 57 | ListViewItemConfigEntry *groupItem = 0; |
57 | ListViewItemConfigEntry *item; | 58 | ListViewItemConfigEntry *item; |
58 | while ( !t.atEnd() ) | 59 | while ( !t.atEnd() ) |
59 | { | 60 | { |
60 | s = t.readLine().stripWhiteSpace(); | 61 | s = t.readLine().stripWhiteSpace(); |
61 | //odebug << "line: >" << s.latin1() << "<\n" << oendl; | 62 | //odebug << "line: >" << s.latin1() << "<\n" << oendl; |
62 | if (s.contains("<?xml")) | 63 | if (s.contains("<?xml")) |
63 | { | 64 | { |
64 | _valid = false; | 65 | _valid = false; |
65 | break; | 66 | break; |
66 | }else | 67 | } |
67 | if ( s[0] == '[' && s[s.length()-1] == ']' ) | 68 | else if ( s[0] == '[' && s[s.length()-1] == ']' ) |
68 | { | 69 | { |
69 | // odebug << "got group"+s << oendl; | 70 | //odebug << "got group"+s << oendl; |
70 | group = s.mid(1,s.length()-2); | 71 | group = s.mid(1,s.length()-2); |
71 | if (!groupItem) groupItem = new ListViewItemConfigEntry(this, tr("no group") ); | 72 | if (!groupItem) |
73 | groupItem = new ListViewItemConfigEntry(this, tr("no group") ); | ||
74 | |||
72 | groupItem = new ListViewItemConfigEntry(this, group ); | 75 | groupItem = new ListViewItemConfigEntry(this, group ); |
73 | insertItem( groupItem ); | 76 | insertItem( groupItem ); |
74 | } else | 77 | } |
75 | if ( int pos = s.find('=') ) | 78 | else if ( int pos = s.find('=') ) |
76 | { | 79 | { |
77 | // odebug << "got key"+s << oendl; | 80 | //odebug << "got key"+s << oendl; |
78 | if (!groupItem) odebug << "PANIK NO GROUP! >" << group.latin1() << "<" << oendl; | 81 | if (!groupItem) |
79 | item = new ListViewItemConfigEntry(this, group, s ); | 82 | odebug << "PANIC! no group >" << group.latin1() << "<" << oendl; |
83 | |||
84 | item = new ListViewItemConfigEntry(this, group, s ); | ||
80 | groupItem->insertItem( item ); | 85 | groupItem->insertItem( item ); |
81 | } | 86 | } |
82 | } | 87 | } |
83 | confFile.close(); | 88 | confFile.close(); |
84 | setExpandable( _valid ); | 89 | setExpandable( _valid ); |
85 | //odebug << "ListViewItemConfFile::parseFile END" << oendl; | 90 | //odebug << "ListViewItemConfFile::parseFile END" << oendl; |
86 | } | 91 | } |
87 | 92 | ||
88 | 93 | ||
89 | void ListViewItemConfFile::remove() | 94 | void ListViewItemConfFile::remove() |
90 | { | 95 | { |
91 | QFile::remove(confFileInfo->absFilePath()); | 96 | QFile::remove(confFileInfo->absFilePath()); |
92 | QFile::remove(backupFileName()); | 97 | QFile::remove(backupFileName()); |
93 | delete this; | 98 | delete this; |
94 | } | 99 | } |
95 | 100 | ||
96 | void ListViewItemConfFile::revert() | 101 | void ListViewItemConfFile::revert() |
97 | { | 102 | { |
98 | if (!_changed) | 103 | if (!_changed) |
99 | { | 104 | { |
100 | // read the backup file | 105 | // read the backup file |
101 | QFile conf(confFileInfo->absFilePath()); | 106 | QFile conf(confFileInfo->absFilePath()); |
102 | QFile back(backupFileName()); | 107 | QFile back(backupFileName()); |
103 | 108 | ||
104 | if (!back.open(IO_ReadOnly)) return; | 109 | if (!back.open(IO_ReadOnly)) return; |
105 | if (!conf.open(IO_WriteOnly)) return; | 110 | if (!conf.open(IO_WriteOnly)) return; |
106 | 111 | ||
107 | #define SIZE 124 | 112 | #define SIZE 124 |
108 | char buf[SIZE]; | 113 | char buf[SIZE]; |
109 | while (int c = back.readBlock(buf, SIZE) ) conf.writeBlock(buf,c); | 114 | while (int c = back.readBlock(buf, SIZE) ) conf.writeBlock(buf,c); |
110 | conf.close(); | 115 | conf.close(); |
111 | back.close(); | 116 | back.close(); |
112 | } | 117 | } |
113 | parseFile(); | 118 | parseFile(); |
114 | expand(); | 119 | expand(); |
115 | } | 120 | } |
116 | 121 | ||
117 | void ListViewItemConfFile::save() | 122 | void ListViewItemConfFile::save() |
118 | { | 123 | { |
119 | if (!_changed) return; | 124 | if (!_changed) return; |
120 | QFile conf(confFileInfo->absFilePath()); | 125 | QFile conf(confFileInfo->absFilePath()); |
121 | QFile back(backupFileName()); | 126 | QFile back(backupFileName()); |
122 | 127 | ||
123 | if (!conf.open(IO_ReadOnly)) return; | 128 | if (!conf.open(IO_ReadOnly)) return; |
124 | if (!back.open(IO_WriteOnly)) return; | 129 | if (!back.open(IO_WriteOnly)) return; |
125 | 130 | ||
126 | char buf[SIZE]; | 131 | char buf[SIZE]; |
127 | while (int c = conf.readBlock(buf, SIZE) ) back.writeBlock(buf,c); | 132 | while (int c = conf.readBlock(buf, SIZE) ) back.writeBlock(buf,c); |
128 | conf.close(); | 133 | conf.close(); |
129 | back.close(); | 134 | back.close(); |
130 | 135 | ||
131 | 136 | ||
132 | if (!conf.open(IO_WriteOnly)) return; | 137 | if (!conf.open(IO_WriteOnly)) return; |
133 | QTextStream *t = new QTextStream( &conf ); | 138 | QTextStream *t = new QTextStream( &conf ); |
134 | for (QListViewItem *it = firstChild(); it!=0;it = it->nextSibling()) | 139 | for (QListViewItem *it = firstChild(); it!=0;it = it->nextSibling()) |
135 | { | 140 | { |
136 | ((ListViewItemConfigEntry*)it)->save(t); | 141 | ((ListViewItemConfigEntry*)it)->save(t); |
137 | } | 142 | } |
138 | conf.close(); | 143 | conf.close(); |
139 | unchanged(); | 144 | unchanged(); |
140 | } | 145 | } |
141 | 146 | ||
142 | 147 | ||
143 | bool ListViewItemConfFile::revertable() | 148 | bool ListViewItemConfFile::revertable() |
144 | { | 149 | { |
145 | return _changed || QFile(backupFileName()).exists(); | 150 | return _changed || QFile(backupFileName()).exists(); |
146 | } | 151 | } |
147 | 152 | ||
148 | QString ListViewItemConfFile::backupFileName() | 153 | QString ListViewItemConfFile::backupFileName() |
149 | { | 154 | { |
150 | return confFileInfo->absFilePath()+"~"; | 155 | return confFileInfo->absFilePath()+"~"; |
151 | } | 156 | } |
152 | 157 | ||
153 | 158 | ||
154 | void ListViewItemConfFile::expand() | 159 | void ListViewItemConfFile::expand() |
155 | { | 160 | { |
156 | QListViewItem *subItem = firstChild(); | 161 | QListViewItem *subItem = firstChild(); |
157 | QListViewItem *toDel; | 162 | QListViewItem *toDel; |
158 | while(subItem) | 163 | while(subItem) |
159 | { | 164 | { |
160 | toDel = subItem; | 165 | toDel = subItem; |
161 | subItem = subItem->nextSibling(); | 166 | subItem = subItem->nextSibling(); |
162 | delete toDel; | 167 | delete toDel; |
163 | } | 168 | } |
164 | parseFile(); | 169 | parseFile(); |
165 | } | 170 | } |
diff --git a/noncore/apps/opie-console/io_irda.cpp b/noncore/apps/opie-console/io_irda.cpp index 9d27c85..a0f72ae 100644 --- a/noncore/apps/opie-console/io_irda.cpp +++ b/noncore/apps/opie-console/io_irda.cpp | |||
@@ -1,64 +1,65 @@ | |||
1 | #include "io_irda.h" | 1 | #include "io_irda.h" |
2 | 2 | ||
3 | IOIrda::IOIrda( const Profile &config ) : IOSerial( config ) { | 3 | IOIrda::IOIrda( const Profile &config ) : IOSerial( config ) { |
4 | m_attach = 0; | 4 | m_attach = 0; |
5 | } | 5 | } |
6 | 6 | ||
7 | 7 | ||
8 | IOIrda::~IOIrda() { | 8 | IOIrda::~IOIrda() { |
9 | if ( m_attach ) { | 9 | if ( m_attach ) { |
10 | delete m_attach; | 10 | delete m_attach; |
11 | } | 11 | } |
12 | } | 12 | } |
13 | 13 | ||
14 | 14 | ||
15 | void IOIrda::close() { | 15 | void IOIrda::close() { |
16 | 16 | ||
17 | IOSerial::close(); | 17 | IOSerial::close(); |
18 | // still need error handling | 18 | // still need error handling |
19 | delete m_attach; | 19 | delete m_attach; |
20 | } | 20 | } |
21 | 21 | ||
22 | bool IOIrda::open() { | 22 | bool IOIrda::open() { |
23 | bool ret; | 23 | bool ret; |
24 | 24 | ||
25 | // irdaattach here | 25 | // irdaattach here |
26 | m_attach = new Opie::Core::OProcess(); | 26 | m_attach = new Opie::Core::OProcess(); |
27 | *m_attach << "irattach /dev/ttyS2 -s"; | 27 | *m_attach << "irattach /dev/ttyS2 -s"; |
28 | 28 | ||
29 | connect( m_attach, SIGNAL( processExited(Opie::Core::OProcess*) ), | 29 | connect( m_attach, SIGNAL( processExited(Opie::Core::OProcess*) ), |
30 | this, SLOT( slotExited(Opie::Core::OProcess*) ) ); | 30 | this, SLOT( slotExited(Opie::Core::OProcess*) ) ); |
31 | 31 | ||
32 | if ( m_attach->start() ) { | 32 | if ( m_attach->start() ) { |
33 | ret= IOSerial::open(); | 33 | ret= IOSerial::open(); |
34 | } else { | 34 | } else { |
35 | // emit error!!! | 35 | // emit error!!! |
36 | delete m_attach; | 36 | delete m_attach; |
37 | m_attach = 0l; | 37 | m_attach = 0l; |
38 | ret = false; | ||
38 | } | 39 | } |
39 | return ret; | 40 | return ret; |
40 | } | 41 | } |
41 | 42 | ||
42 | void IOIrda::reload( const Profile &config ) { | 43 | void IOIrda::reload( const Profile &config ) { |
43 | m_device = config.readEntry("Device", IRDA_DEFAULT_DEVICE); | 44 | m_device = config.readEntry("Device", IRDA_DEFAULT_DEVICE); |
44 | m_baud = config.readNumEntry("Baud", IRDA_DEFAULT_BAUD); | 45 | m_baud = config.readNumEntry("Baud", IRDA_DEFAULT_BAUD); |
45 | m_parity = config.readNumEntry("Parity", IRDA_DEFAULT_PARITY); | 46 | m_parity = config.readNumEntry("Parity", IRDA_DEFAULT_PARITY); |
46 | m_dbits = config.readNumEntry("DataBits", IRDA_DEFAULT_DBITS); | 47 | m_dbits = config.readNumEntry("DataBits", IRDA_DEFAULT_DBITS); |
47 | m_sbits = config.readNumEntry("StopBits", IRDA_DEFAULT_SBITS); | 48 | m_sbits = config.readNumEntry("StopBits", IRDA_DEFAULT_SBITS); |
48 | m_flow = config.readNumEntry("Flow", IRDA_DEFAULT_FLOW); | 49 | m_flow = config.readNumEntry("Flow", IRDA_DEFAULT_FLOW); |
49 | } | 50 | } |
50 | 51 | ||
51 | 52 | ||
52 | QString IOIrda::identifier() const { | 53 | QString IOIrda::identifier() const { |
53 | return "irda"; | 54 | return "irda"; |
54 | } | 55 | } |
55 | 56 | ||
56 | QString IOIrda::name() const { | 57 | QString IOIrda::name() const { |
57 | return "Irda IO Layer"; | 58 | return "Irda IO Layer"; |
58 | } | 59 | } |
59 | 60 | ||
60 | void IOIrda::slotExited(Opie::Core::OProcess* proc ){ | 61 | void IOIrda::slotExited(Opie::Core::OProcess* proc ){ |
61 | close(); | 62 | close(); |
62 | delete proc; | 63 | delete proc; |
63 | } | 64 | } |
64 | 65 | ||
diff --git a/noncore/apps/opie-console/mainwindow.cpp b/noncore/apps/opie-console/mainwindow.cpp index aba7244..a884179 100644 --- a/noncore/apps/opie-console/mainwindow.cpp +++ b/noncore/apps/opie-console/mainwindow.cpp | |||
@@ -1,835 +1,831 @@ | |||
1 | #include "TEmulation.h" | 1 | #include "TEmulation.h" |
2 | #include "profileeditordialog.h" | 2 | #include "profileeditordialog.h" |
3 | #include "configdialog.h" | 3 | #include "configdialog.h" |
4 | #include "default.h" | 4 | #include "default.h" |
5 | #include "profilemanager.h" | 5 | #include "profilemanager.h" |
6 | #include "mainwindow.h" | 6 | #include "mainwindow.h" |
7 | #include "tabwidget.h" | 7 | #include "tabwidget.h" |
8 | #include "transferdialog.h" | 8 | #include "transferdialog.h" |
9 | #include "function_keyboard.h" | 9 | #include "function_keyboard.h" |
10 | #include "emulation_handler.h" | 10 | #include "emulation_handler.h" |
11 | #include "script.h" | 11 | #include "script.h" |
12 | #include "fixit.h" | 12 | #include "fixit.h" |
13 | 13 | ||
14 | /* OPIE */ | 14 | /* OPIE */ |
15 | #include <opie2/ofiledialog.h> | 15 | #include <opie2/ofiledialog.h> |
16 | #include <opie2/oresource.h> | 16 | #include <opie2/oresource.h> |
17 | #include <qpe/filemanager.h> | 17 | #include <qpe/filemanager.h> |
18 | using namespace Opie::Ui; | 18 | using namespace Opie::Ui; |
19 | 19 | ||
20 | /* QT */ | 20 | /* QT */ |
21 | #include <qaction.h> | 21 | #include <qaction.h> |
22 | #include <qmenubar.h> | 22 | #include <qmenubar.h> |
23 | #include <qtoolbar.h> | 23 | #include <qtoolbar.h> |
24 | #include <qmessagebox.h> | 24 | #include <qmessagebox.h> |
25 | #include <qwhatsthis.h> | 25 | #include <qwhatsthis.h> |
26 | #include <qfileinfo.h> | 26 | #include <qfileinfo.h> |
27 | 27 | ||
28 | /* STD */ | 28 | /* STD */ |
29 | #include <assert.h> | 29 | #include <assert.h> |
30 | 30 | ||
31 | #include <opie2/oconfig.h> | 31 | #include <opie2/oconfig.h> |
32 | 32 | ||
33 | MainWindow::MainWindow(QWidget *parent, const char *name, WFlags) : QMainWindow(parent, name, WStyle_ContextHelp) { | 33 | MainWindow::MainWindow(QWidget *parent, const char *name, WFlags) : QMainWindow(parent, name, WStyle_ContextHelp) { |
34 | 34 | ||
35 | #ifdef FSCKED_DISTRI | 35 | #ifdef FSCKED_DISTRI |
36 | FixIt fix; | 36 | FixIt fix; |
37 | fix.fixIt(); | 37 | fix.fixIt(); |
38 | #endif | 38 | #endif |
39 | 39 | ||
40 | setCaption(QObject::tr("Opie Console") ); | 40 | setCaption(QObject::tr("Opie Console") ); |
41 | KeyTrans::loadAll(); | 41 | KeyTrans::loadAll(); |
42 | for (int i = 0; i < KeyTrans::count(); i++ ) { | 42 | for (int i = 0; i < KeyTrans::count(); i++ ) { |
43 | KeyTrans* s = KeyTrans::find(i ); | 43 | KeyTrans* s = KeyTrans::find(i ); |
44 | assert( s ); | 44 | assert( s ); |
45 | } | 45 | } |
46 | m_factory = new MetaFactory(); | 46 | m_factory = new MetaFactory(); |
47 | Default def(m_factory); | 47 | Default def(m_factory); |
48 | m_sessions.setAutoDelete( TRUE ); | 48 | m_sessions.setAutoDelete( TRUE ); |
49 | m_curSession = 0; | 49 | m_curSession = 0; |
50 | m_manager = new ProfileManager( m_factory ); | 50 | m_manager = new ProfileManager( m_factory ); |
51 | m_manager->load(); | 51 | m_manager->load(); |
52 | m_scriptsData.setAutoDelete(TRUE); | 52 | m_scriptsData.setAutoDelete(TRUE); |
53 | 53 | ||
54 | initUI(); | 54 | initUI(); |
55 | populateProfiles(); | 55 | populateProfiles(); |
56 | populateScripts(); | 56 | populateScripts(); |
57 | } | 57 | } |
58 | 58 | ||
59 | void MainWindow::initUI() { | 59 | void MainWindow::initUI() { |
60 | 60 | ||
61 | setToolBarsMovable( FALSE ); | 61 | setToolBarsMovable( FALSE ); |
62 | 62 | ||
63 | /* tool bar for the menu */ | 63 | /* tool bar for the menu */ |
64 | m_tool = new QToolBar( this ); | 64 | m_tool = new QToolBar( this ); |
65 | m_tool->setHorizontalStretchable( TRUE ); | 65 | m_tool->setHorizontalStretchable( TRUE ); |
66 | 66 | ||
67 | m_bar = new QMenuBar( m_tool ); | 67 | m_bar = new QMenuBar( m_tool ); |
68 | m_console = new QPopupMenu( this ); | 68 | m_console = new QPopupMenu( this ); |
69 | m_scripts = new QPopupMenu( this ); | 69 | m_scripts = new QPopupMenu( this ); |
70 | m_sessionsPop= new QPopupMenu( this ); | 70 | m_sessionsPop= new QPopupMenu( this ); |
71 | m_scriptsPop = new QPopupMenu( this ); | 71 | m_scriptsPop = new QPopupMenu( this ); |
72 | m_scrollbar = new QPopupMenu( this ); | 72 | m_scrollbar = new QPopupMenu( this ); |
73 | 73 | ||
74 | /* add a toolbar for icons */ | 74 | /* add a toolbar for icons */ |
75 | m_icons = new QToolBar(this); | 75 | m_icons = new QToolBar(this); |
76 | 76 | ||
77 | /* | 77 | /* |
78 | * the settings action | 78 | * the settings action |
79 | */ | 79 | */ |
80 | m_setProfiles = new QAction(tr("Configure Profiles"), | 80 | m_setProfiles = new QAction(tr("Configure Profiles"), |
81 | Opie::Core::OResource::loadPixmap( "SettingsIcon", Opie::Core::OResource::SmallIcon ), | 81 | Opie::Core::OResource::loadPixmap( "SettingsIcon", Opie::Core::OResource::SmallIcon ), |
82 | QString::null, 0, this, 0); | 82 | QString::null, 0, this, 0); |
83 | m_setProfiles->addTo( m_console ); | 83 | m_setProfiles->addTo( m_console ); |
84 | connect( m_setProfiles, SIGNAL(activated() ), | 84 | connect( m_setProfiles, SIGNAL(activated() ), |
85 | this, SLOT(slotConfigure() ) ); | 85 | this, SLOT(slotConfigure() ) ); |
86 | 86 | ||
87 | m_console->insertSeparator(); | 87 | m_console->insertSeparator(); |
88 | /* | 88 | /* |
89 | * new Action for new sessions | 89 | * new Action for new sessions |
90 | */ | 90 | */ |
91 | QAction* newCon = new QAction(tr("New Profile"), | 91 | QAction* newCon = new QAction(tr("New Profile"), |
92 | Opie::Core::OResource::loadPixmap( "new", Opie::Core::OResource::SmallIcon ), | 92 | Opie::Core::OResource::loadPixmap( "new", Opie::Core::OResource::SmallIcon ), |
93 | QString::null, 0, this, 0); | 93 | QString::null, 0, this, 0); |
94 | newCon->addTo( m_console ); | 94 | newCon->addTo( m_console ); |
95 | connect( newCon, SIGNAL(activated() ), | 95 | connect( newCon, SIGNAL(activated() ), |
96 | this, SLOT(slotNew() ) ); | 96 | this, SLOT(slotNew() ) ); |
97 | 97 | ||
98 | m_console->insertSeparator(); | 98 | m_console->insertSeparator(); |
99 | 99 | ||
100 | QAction *saveCon = new QAction( tr("Save Profile" ), | 100 | QAction *saveCon = new QAction( tr("Save Profile" ), |
101 | Opie::Core::OResource::loadPixmap( "save", Opie::Core::OResource::SmallIcon ), QString::null, | 101 | Opie::Core::OResource::loadPixmap( "save", Opie::Core::OResource::SmallIcon ), QString::null, |
102 | 0, this, 0 ); | 102 | 0, this, 0 ); |
103 | saveCon->addTo( m_console ); | 103 | saveCon->addTo( m_console ); |
104 | connect( saveCon, SIGNAL(activated() ), | 104 | connect( saveCon, SIGNAL(activated() ), |
105 | this, SLOT(slotSaveSession() ) ); | 105 | this, SLOT(slotSaveSession() ) ); |
106 | m_console->insertSeparator(); | 106 | m_console->insertSeparator(); |
107 | 107 | ||
108 | /* | 108 | /* |
109 | * connect action | 109 | * connect action |
110 | */ | 110 | */ |
111 | m_connect = new QAction( tr("Connect"), Opie::Core::OResource::loadPixmap("console/connected", | 111 | m_connect = new QAction( tr("Connect"), Opie::Core::OResource::loadPixmap("console/connected", |
112 | Opie::Core::OResource::SmallIcon ), QString::null, 0, this, 0 ); | 112 | Opie::Core::OResource::SmallIcon ), QString::null, 0, this, 0 ); |
113 | m_connect->addTo( m_console ); | 113 | m_connect->addTo( m_console ); |
114 | connect(m_connect, SIGNAL(activated() ), | 114 | connect(m_connect, SIGNAL(activated() ), |
115 | this, SLOT(slotConnect() ) ); | 115 | this, SLOT(slotConnect() ) ); |
116 | 116 | ||
117 | /* | 117 | /* |
118 | * disconnect action | 118 | * disconnect action |
119 | */ | 119 | */ |
120 | m_disconnect = new QAction( tr("Disconnect"), Opie::Core::OResource::loadPixmap("console/notconnected", | 120 | m_disconnect = new QAction( tr("Disconnect"), Opie::Core::OResource::loadPixmap("console/notconnected", |
121 | Opie::Core::OResource::SmallIcon ), QString::null, 0, this, 0 ); | 121 | Opie::Core::OResource::SmallIcon ), QString::null, 0, this, 0 ); |
122 | m_disconnect->addTo( m_console ); | 122 | m_disconnect->addTo( m_console ); |
123 | connect(m_disconnect, SIGNAL(activated() ), | 123 | connect(m_disconnect, SIGNAL(activated() ), |
124 | this, SLOT(slotDisconnect() ) ); | 124 | this, SLOT(slotDisconnect() ) ); |
125 | 125 | ||
126 | m_console->insertSeparator(); | 126 | m_console->insertSeparator(); |
127 | 127 | ||
128 | #ifndef EAST | 128 | #ifndef EAST |
129 | m_quickLaunch = new QAction( tr("QuickLaunch"), | 129 | m_quickLaunch = new QAction( tr("QuickLaunch"), |
130 | Opie::Core::OResource::loadPixmap("console/konsole_mini", Opie::Core::OResource::SmallIcon ), | 130 | Opie::Core::OResource::loadPixmap("console/konsole_mini", Opie::Core::OResource::SmallIcon ), |
131 | QString::null, 0, this, 0 ); | 131 | QString::null, 0, this, 0 ); |
132 | m_quickLaunch->addTo( m_icons ); | 132 | m_quickLaunch->addTo( m_icons ); |
133 | connect( m_quickLaunch, SIGNAL( activated() ), | 133 | connect( m_quickLaunch, SIGNAL( activated() ), |
134 | this, SLOT( slotQuickLaunch() ) ); | 134 | this, SLOT( slotQuickLaunch() ) ); |
135 | #endif | 135 | #endif |
136 | 136 | ||
137 | QWhatsThis::add( m_icons, tr( "The shell button launches the \"default\" profile. If there is none default values are taken" ) ); | 137 | QWhatsThis::add( m_icons, tr( "The shell button launches the \"default\" profile. If there is none default values are taken" ) ); |
138 | 138 | ||
139 | m_transfer = new QAction( tr("Transfer file..."), Opie::Core::OResource::loadPixmap("pass", Opie::Core::OResource::SmallIcon ), | 139 | m_transfer = new QAction( tr("Transfer file..."), Opie::Core::OResource::loadPixmap("pass", Opie::Core::OResource::SmallIcon ), |
140 | QString::null, 0, this, 0 ); | 140 | QString::null, 0, this, 0 ); |
141 | m_transfer->addTo( m_console ); | 141 | m_transfer->addTo( m_console ); |
142 | connect(m_transfer, SIGNAL(activated() ), | 142 | connect(m_transfer, SIGNAL(activated() ), |
143 | this, SLOT(slotTransfer() ) ); | 143 | this, SLOT(slotTransfer() ) ); |
144 | 144 | ||
145 | 145 | ||
146 | 146 | ||
147 | /* | 147 | /* |
148 | * immediate change of line wrap policy | 148 | * immediate change of line wrap policy |
149 | */ | 149 | */ |
150 | m_isWrapped = true; | 150 | m_isWrapped = true; |
151 | m_wrap = new QAction( tr("Line wrap"), Opie::Core::OResource::loadPixmap( "linewrap", Opie::Core::OResource::SmallIcon ), | 151 | m_wrap = new QAction( tr("Line wrap"), Opie::Core::OResource::loadPixmap( "linewrap", Opie::Core::OResource::SmallIcon ), |
152 | QString::null, 0, this, 0, true ); | 152 | QString::null, 0, this, 0, true ); |
153 | m_wrap->addTo( m_console ); | 153 | m_wrap->addTo( m_console ); |
154 | m_wrap->setOn( true ); | 154 | m_wrap->setOn( true ); |
155 | connect( m_wrap, SIGNAL( activated() ), SLOT( slotWrap() ) ); | 155 | connect( m_wrap, SIGNAL( activated() ), SLOT( slotWrap() ) ); |
156 | 156 | ||
157 | /* | 157 | /* |
158 | * fullscreen | 158 | * fullscreen |
159 | */ | 159 | */ |
160 | m_isFullscreen = false; | 160 | m_isFullscreen = false; |
161 | 161 | ||
162 | m_fullscreen = new QAction( tr("Full screen"), Opie::Core::OResource::loadPixmap( "fullscreen", | 162 | m_fullscreen = new QAction( tr("Full screen"), Opie::Core::OResource::loadPixmap( "fullscreen", |
163 | Opie::Core::OResource::SmallIcon ), QString::null, 0, this, 0 ); | 163 | Opie::Core::OResource::SmallIcon ), QString::null, 0, this, 0 ); |
164 | m_fullscreen->addTo( m_console ); | 164 | m_fullscreen->addTo( m_console ); |
165 | connect( m_fullscreen, SIGNAL( activated() ), | 165 | connect( m_fullscreen, SIGNAL( activated() ), |
166 | this, SLOT( slotFullscreen() ) ); | 166 | this, SLOT( slotFullscreen() ) ); |
167 | 167 | ||
168 | /* | 168 | /* |
169 | * scrollbar | 169 | * scrollbar |
170 | */ | 170 | */ |
171 | sm_none = m_scrollbar->insertItem(tr( "None" )); | 171 | sm_none = m_scrollbar->insertItem(tr( "None" )); |
172 | sm_left = m_scrollbar->insertItem(tr( "Left" )); | 172 | sm_left = m_scrollbar->insertItem(tr( "Left" )); |
173 | sm_right = m_scrollbar->insertItem(tr( "Right" )); | 173 | sm_right = m_scrollbar->insertItem(tr( "Right" )); |
174 | 174 | ||
175 | m_console->insertItem(tr("Scrollbar"), m_scrollbar, -1, 0); | 175 | m_console->insertItem(tr("Scrollbar"), m_scrollbar, -1, 0); |
176 | connect( m_scrollbar, SIGNAL(activated(int)), | 176 | connect( m_scrollbar, SIGNAL(activated(int)), |
177 | this, SLOT(slotScrollbarSelected(int))); | 177 | this, SLOT(slotScrollbarSelected(int))); |
178 | 178 | ||
179 | m_console->insertSeparator(); | 179 | m_console->insertSeparator(); |
180 | 180 | ||
181 | m_recordLog = new QAction(); | 181 | m_recordLog = new QAction(); |
182 | m_recordLog->setText( tr("Start log") ); | 182 | m_recordLog->setText( tr("Start log") ); |
183 | m_recordLog->addTo( m_console ); | 183 | m_recordLog->addTo( m_console ); |
184 | connect(m_recordLog, SIGNAL(activated() ), | 184 | connect(m_recordLog, SIGNAL(activated() ), |
185 | this, SLOT( slotSaveLog() ) ); | 185 | this, SLOT( slotSaveLog() ) ); |
186 | m_recordingLog = false; | 186 | m_recordingLog = false; |
187 | 187 | ||
188 | QAction *a = new QAction(); | 188 | QAction *a = new QAction(); |
189 | a->setText( tr("Save history") ); | 189 | a->setText( tr("Save history") ); |
190 | a->addTo( m_console ); | 190 | a->addTo( m_console ); |
191 | connect(a, SIGNAL(activated() ), | 191 | connect(a, SIGNAL(activated() ), |
192 | this, SLOT(slotSaveHistory() ) ); | 192 | this, SLOT(slotSaveHistory() ) ); |
193 | /* | 193 | /* |
194 | * terminate action | 194 | * terminate action |
195 | */ | 195 | */ |
196 | m_terminate = new QAction(); | 196 | m_terminate = new QAction(); |
197 | m_terminate->setText( tr("Terminate") ); | 197 | m_terminate->setText( tr("Terminate") ); |
198 | m_terminate->addTo( m_console ); | 198 | m_terminate->addTo( m_console ); |
199 | connect(m_terminate, SIGNAL(activated() ), | 199 | connect(m_terminate, SIGNAL(activated() ), |
200 | this, SLOT(slotTerminate() ) ); | 200 | this, SLOT(slotTerminate() ) ); |
201 | 201 | ||
202 | m_closewindow = new QAction(); | 202 | m_closewindow = new QAction(); |
203 | m_closewindow->setText( tr("Close Window") ); | 203 | m_closewindow->setText( tr("Close Window") ); |
204 | m_closewindow->addTo( m_console ); | 204 | m_closewindow->addTo( m_console ); |
205 | connect( m_closewindow, SIGNAL(activated() ), | 205 | connect( m_closewindow, SIGNAL(activated() ), |
206 | this, SLOT(slotClose() ) ); | 206 | this, SLOT(slotClose() ) ); |
207 | 207 | ||
208 | 208 | ||
209 | /* | 209 | /* |
210 | * script actions | 210 | * script actions |
211 | */ | 211 | */ |
212 | m_runScript_id = m_scripts->insertItem(tr("Run Script"), m_scriptsPop, -1, 0); | 212 | m_runScript_id = m_scripts->insertItem(tr("Run Script"), m_scriptsPop, -1, 0); |
213 | connect(m_scriptsPop, SIGNAL(activated(int)), this, SLOT(slotRunScript(int))); | 213 | connect(m_scriptsPop, SIGNAL(activated(int)), this, SLOT(slotRunScript(int))); |
214 | 214 | ||
215 | m_recordScript = new QAction(tr("Record Script"), QString::null, 0, this, 0); | 215 | m_recordScript = new QAction(tr("Record Script"), QString::null, 0, this, 0); |
216 | m_recordScript->addTo(m_scripts); | 216 | m_recordScript->addTo(m_scripts); |
217 | connect(m_recordScript, SIGNAL(activated()), this, SLOT(slotRecordScript())); | 217 | connect(m_recordScript, SIGNAL(activated()), this, SLOT(slotRecordScript())); |
218 | 218 | ||
219 | m_saveScript = new QAction(tr("Save Script"), QString::null, 0, this, 0); | 219 | m_saveScript = new QAction(tr("Save Script"), QString::null, 0, this, 0); |
220 | m_saveScript->addTo(m_scripts); | 220 | m_saveScript->addTo(m_scripts); |
221 | connect(m_saveScript, SIGNAL(activated()), this, SLOT(slotSaveScript())); | 221 | connect(m_saveScript, SIGNAL(activated()), this, SLOT(slotSaveScript())); |
222 | 222 | ||
223 | 223 | ||
224 | 224 | ||
225 | 225 | ||
226 | /* | 226 | /* |
227 | * action that open/closes the keyboard | 227 | * action that open/closes the keyboard |
228 | */ | 228 | */ |
229 | m_openKeys = new QAction (tr("Open Keyboard..."), | 229 | m_openKeys = new QAction (tr("Open Keyboard..."), |
230 | Opie::Core::OResource::loadPixmap( "console/keys/keyboard_icon", Opie::Core::OResource::SmallIcon ), | 230 | Opie::Core::OResource::loadPixmap( "console/keys/keyboard_icon", Opie::Core::OResource::SmallIcon ), |
231 | QString::null, 0, this, 0); | 231 | QString::null, 0, this, 0); |
232 | m_openKeys->setToggleAction(true); | 232 | m_openKeys->setToggleAction(true); |
233 | connect (m_openKeys, SIGNAL(toggled(bool)), this, SLOT(slotOpenKeb(bool))); | 233 | connect (m_openKeys, SIGNAL(toggled(bool)), this, SLOT(slotOpenKeb(bool))); |
234 | 234 | ||
235 | /* insert the submenu */ | 235 | /* insert the submenu */ |
236 | m_console->insertItem(tr("New from Profile"), m_sessionsPop, | 236 | m_console->insertItem(tr("New from Profile"), m_sessionsPop, |
237 | -1, 0); | 237 | -1, 0); |
238 | 238 | ||
239 | /* insert the connection menu */ | 239 | /* insert the connection menu */ |
240 | m_bar->insertItem( tr("Connection"), m_console ); | 240 | m_bar->insertItem( tr("Connection"), m_console ); |
241 | 241 | ||
242 | /* the scripts menu */ | 242 | /* the scripts menu */ |
243 | #ifdef EAST | 243 | #ifdef EAST |
244 | Opie::Core::OConfig cfg("opie-console"); | 244 | Opie::Core::OConfig cfg("opie-console"); |
245 | cfg.setGroup("10east"); | 245 | cfg.setGroup("10east"); |
246 | if( !cfg.readEntry("scripthide",0) ) { | 246 | if( !cfg.readEntry("scripthide",0) ) { |
247 | m_bar->insertItem( tr("Scripts"), m_scripts ); | 247 | m_bar->insertItem( tr("Scripts"), m_scripts ); |
248 | } | 248 | } |
249 | #endif | 249 | #endif |
250 | 250 | ||
251 | /* and the keyboard */ | 251 | /* and the keyboard */ |
252 | m_keyBar = new QToolBar(this); | 252 | m_keyBar = new QToolBar(this); |
253 | addToolBar( m_keyBar, "Keyboard", QMainWindow::Top, TRUE ); | 253 | addToolBar( m_keyBar, "Keyboard", QMainWindow::Top, TRUE ); |
254 | m_keyBar->setHorizontalStretchable( TRUE ); | 254 | m_keyBar->setHorizontalStretchable( TRUE ); |
255 | m_keyBar->hide(); | 255 | m_keyBar->hide(); |
256 | 256 | ||
257 | m_kb = new FunctionKeyboard(m_keyBar); | 257 | m_kb = new FunctionKeyboard(m_keyBar); |
258 | connect(m_kb, SIGNAL(keyPressed(FKey,ushort,ushort,bool)), | 258 | connect(m_kb, SIGNAL(keyPressed(FKey,ushort,ushort,bool)), |
259 | this, SLOT(slotKeyReceived(FKey,ushort,ushort,bool))); | 259 | this, SLOT(slotKeyReceived(FKey,ushort,ushort,bool))); |
260 | 260 | ||
261 | 261 | ||
262 | a = new QAction(tr("Copy"), | 262 | a = new QAction(tr("Copy"), |
263 | Opie::Core::OResource::loadPixmap("copy", Opie::Core::OResource::SmallIcon ), QString::null, | 263 | Opie::Core::OResource::loadPixmap("copy", Opie::Core::OResource::SmallIcon ), QString::null, |
264 | 0, this, 0 ); | 264 | 0, this, 0 ); |
265 | //a->addTo( m_icons ); | 265 | //a->addTo( m_icons ); |
266 | connect( a, SIGNAL(activated() ), | 266 | connect( a, SIGNAL(activated() ), |
267 | this, SLOT(slotCopy() ) ); | 267 | this, SLOT(slotCopy() ) ); |
268 | 268 | ||
269 | QAction *paste = new QAction(tr("Paste"), | 269 | QAction *paste = new QAction(tr("Paste"), |
270 | Opie::Core::OResource::loadPixmap("paste", Opie::Core::OResource::SmallIcon ), QString::null, | 270 | Opie::Core::OResource::loadPixmap("paste", Opie::Core::OResource::SmallIcon ), QString::null, |
271 | 0, this, 0 ); | 271 | 0, this, 0 ); |
272 | connect( paste, SIGNAL(activated() ), | 272 | connect( paste, SIGNAL(activated() ), |
273 | this, SLOT(slotPaste() ) ); | 273 | this, SLOT(slotPaste() ) ); |
274 | 274 | ||
275 | 275 | ||
276 | newCon->addTo( m_icons ); | 276 | newCon->addTo( m_icons ); |
277 | //m_setProfiles->addTo( m_icons ); | 277 | //m_setProfiles->addTo( m_icons ); |
278 | paste->addTo( m_icons ); | 278 | paste->addTo( m_icons ); |
279 | m_openKeys->addTo(m_icons); | 279 | m_openKeys->addTo(m_icons); |
280 | m_fullscreen->addTo( m_icons ); | 280 | m_fullscreen->addTo( m_icons ); |
281 | 281 | ||
282 | m_connect->setEnabled( false ); | 282 | m_connect->setEnabled( false ); |
283 | m_disconnect->setEnabled( false ); | 283 | m_disconnect->setEnabled( false ); |
284 | m_terminate->setEnabled( false ); | 284 | m_terminate->setEnabled( false ); |
285 | m_transfer->setEnabled( false ); | 285 | m_transfer->setEnabled( false ); |
286 | m_scripts->setItemEnabled(m_runScript_id, false); | 286 | m_scripts->setItemEnabled(m_runScript_id, false); |
287 | m_recordScript->setEnabled( false ); | 287 | m_recordScript->setEnabled( false ); |
288 | m_saveScript->setEnabled( false ); | 288 | m_saveScript->setEnabled( false ); |
289 | m_fullscreen->setEnabled( false ); | 289 | m_fullscreen->setEnabled( false ); |
290 | m_closewindow->setEnabled( false ); | 290 | m_closewindow->setEnabled( false ); |
291 | m_wrap->setEnabled( false ); | 291 | m_wrap->setEnabled( false ); |
292 | 292 | ||
293 | /* | 293 | /* |
294 | * connect to the menu activation | 294 | * connect to the menu activation |
295 | */ | 295 | */ |
296 | connect( m_sessionsPop, SIGNAL(activated(int) ), | 296 | connect( m_sessionsPop, SIGNAL(activated(int) ), |
297 | this, SLOT(slotProfile(int) ) ); | 297 | this, SLOT(slotProfile(int) ) ); |
298 | 298 | ||
299 | m_consoleWindow = new TabWidget( this, "blah"); | 299 | m_consoleWindow = new TabWidget( this, "blah"); |
300 | connect(m_consoleWindow, SIGNAL(activated(Session*) ), | 300 | connect(m_consoleWindow, SIGNAL(activated(Session*) ), |
301 | this, SLOT(slotSessionChanged(Session*) ) ); | 301 | this, SLOT(slotSessionChanged(Session*) ) ); |
302 | setCentralWidget( m_consoleWindow ); | 302 | setCentralWidget( m_consoleWindow ); |
303 | 303 | ||
304 | slotQuickLaunch(); | 304 | slotQuickLaunch(); |
305 | } | 305 | } |
306 | 306 | ||
307 | ProfileManager* MainWindow::manager() { | 307 | ProfileManager* MainWindow::manager() { |
308 | return m_manager; | 308 | return m_manager; |
309 | } | 309 | } |
310 | TabWidget* MainWindow::tabWidget() { | 310 | TabWidget* MainWindow::tabWidget() { |
311 | return m_consoleWindow; | 311 | return m_consoleWindow; |
312 | } | 312 | } |
313 | void MainWindow::populateProfiles() { | 313 | void MainWindow::populateProfiles() { |
314 | m_sessionsPop->clear(); | 314 | m_sessionsPop->clear(); |
315 | Profile::ValueList list = manager()->all(); | 315 | Profile::ValueList list = manager()->all(); |
316 | for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) { | 316 | for (Profile::ValueList::Iterator it = list.begin(); it != list.end(); ++it ) { |
317 | m_sessionsPop->insertItem( (*it).name() ); | 317 | m_sessionsPop->insertItem( (*it).name() ); |
318 | } | 318 | } |
319 | 319 | ||
320 | } | 320 | } |
321 | 321 | ||
322 | void MainWindow::populateScripts() { | 322 | void MainWindow::populateScripts() { |
323 | m_scriptsPop->clear(); | 323 | m_scriptsPop->clear(); |
324 | m_scriptsData.clear(); | 324 | m_scriptsData.clear(); |
325 | DocLnkSet files(QPEApplication::documentDir(), "text/plain"); | 325 | DocLnkSet files(QPEApplication::documentDir(), "text/plain"); |
326 | QListIterator<DocLnk> dit(files.children()); | 326 | QListIterator<DocLnk> dit(files.children()); |
327 | for (; dit.current(); ++dit) { | 327 | for (; dit.current(); ++dit) { |
328 | if (*dit && (*dit)->name().length()>0) { | 328 | if (*dit && (*dit)->name().length()>0) { |
329 | QFileInfo info((*dit)->file()); | 329 | QFileInfo info((*dit)->file()); |
330 | if (info.extension(false) == "script") { | 330 | if (info.extension(false) == "script") { |
331 | m_scriptsData.append(new DocLnk(**dit)); | 331 | m_scriptsData.append(new DocLnk(**dit)); |
332 | m_scriptsPop->insertItem((*dit)->name()); | 332 | m_scriptsPop->insertItem((*dit)->name()); |
333 | } | 333 | } |
334 | } | 334 | } |
335 | } | 335 | } |
336 | 336 | ||
337 | } | 337 | } |
338 | 338 | ||
339 | MainWindow::~MainWindow() { | 339 | MainWindow::~MainWindow() { |
340 | delete m_factory; | 340 | delete m_factory; |
341 | manager()->save(); | 341 | manager()->save(); |
342 | #ifdef FSCKED_DISTRI | 342 | #ifdef FSCKED_DISTRI |
343 | FixIt fix; | 343 | FixIt fix; |
344 | fix.breakIt(); | 344 | fix.breakIt(); |
345 | #endif | 345 | #endif |
346 | } | 346 | } |
347 | 347 | ||
348 | MetaFactory* MainWindow::factory() { | 348 | MetaFactory* MainWindow::factory() { |
349 | return m_factory; | 349 | return m_factory; |
350 | } | 350 | } |
351 | 351 | ||
352 | Session* MainWindow::currentSession() { | 352 | Session* MainWindow::currentSession() { |
353 | return m_curSession; | 353 | return m_curSession; |
354 | } | 354 | } |
355 | 355 | ||
356 | QList<Session> MainWindow::sessions() { | 356 | QList<Session> MainWindow::sessions() { |
357 | return m_sessions; | 357 | return m_sessions; |
358 | } | 358 | } |
359 | 359 | ||
360 | void MainWindow::slotNew() { | 360 | void MainWindow::slotNew() { |
361 | ProfileEditorDialog dlg(factory() ); | 361 | ProfileEditorDialog dlg(factory() ); |
362 | dlg.setCaption( tr("New Connection") ); | 362 | dlg.setCaption( tr("New Connection") ); |
363 | int ret = QPEApplication::execDialog( &dlg ); | 363 | int ret = QPEApplication::execDialog( &dlg ); |
364 | 364 | ||
365 | if ( ret == QDialog::Accepted ) { | 365 | if ( ret == QDialog::Accepted ) { |
366 | create( dlg.profile() ); | 366 | create( dlg.profile() ); |
367 | } | 367 | } |
368 | } | 368 | } |
369 | 369 | ||
370 | void MainWindow::slotRecordScript() { | 370 | void MainWindow::slotRecordScript() { |
371 | if (currentSession()) { | 371 | if (currentSession()) { |
372 | currentSession()->emulationHandler()->startRecording(); | 372 | currentSession()->emulationHandler()->startRecording(); |
373 | m_saveScript->setEnabled(true); | 373 | m_saveScript->setEnabled(true); |
374 | m_recordScript->setEnabled(false); | 374 | m_recordScript->setEnabled(false); |
375 | } | 375 | } |
376 | } | 376 | } |
377 | 377 | ||
378 | void MainWindow::slotSaveScript() { | 378 | void MainWindow::slotSaveScript() { |
379 | if (currentSession() && currentSession()->emulationHandler()->isRecording()) { | 379 | if (currentSession() && currentSession()->emulationHandler()->isRecording()) { |
380 | QMap<QString, QStringList> map; | 380 | QMap<QString, QStringList> map; |
381 | QStringList text; | 381 | QStringList text; |
382 | text << "text/plain"; | 382 | text << "text/plain"; |
383 | map.insert(tr("Script"), text ); | 383 | map.insert(tr("Script"), text ); |
384 | QString filename = OFileDialog::getSaveFileName(2, QPEApplication::documentDir(), QString::null, map); | 384 | QString filename = OFileDialog::getSaveFileName(2, QPEApplication::documentDir(), QString::null, map); |
385 | if (!filename.isEmpty()) { | 385 | if (!filename.isEmpty()) { |
386 | QFileInfo info(filename); | 386 | QFileInfo info(filename); |
387 | if (info.extension(FALSE) != "script") | 387 | if (info.extension(FALSE) != "script") |
388 | filename += ".script"; | 388 | filename += ".script"; |
389 | DocLnk nf; | 389 | DocLnk nf; |
390 | nf.setType("text/plain"); | 390 | nf.setType("text/plain"); |
391 | nf.setFile(filename); | 391 | nf.setFile(filename); |
392 | nf.setName(info.fileName()); | 392 | nf.setName(info.fileName()); |
393 | FileManager fm; | 393 | FileManager fm; |
394 | fm.saveFile(nf, currentSession()->emulationHandler()->script()->script()); | 394 | fm.saveFile(nf, currentSession()->emulationHandler()->script()->script()); |
395 | currentSession()->emulationHandler()->clearScript(); | 395 | currentSession()->emulationHandler()->clearScript(); |
396 | m_saveScript->setEnabled(false); | 396 | m_saveScript->setEnabled(false); |
397 | m_recordScript->setEnabled(true); | 397 | m_recordScript->setEnabled(true); |
398 | populateScripts(); | 398 | populateScripts(); |
399 | } | 399 | } |
400 | } | 400 | } |
401 | } | 401 | } |
402 | 402 | ||
403 | void MainWindow::slotRunScript(int id) { | 403 | void MainWindow::slotRunScript(int id) { |
404 | if (currentSession()) { | 404 | if (currentSession()) { |
405 | int index = m_scriptsPop->indexOf(id); | 405 | int index = m_scriptsPop->indexOf(id); |
406 | DocLnk *lnk = m_scriptsData.at(index); | 406 | DocLnk *lnk = m_scriptsData.at(index); |
407 | QString filePath = lnk->file(); | 407 | QString filePath = lnk->file(); |
408 | Script script(filePath); | 408 | Script script(filePath); |
409 | currentSession()->emulationHandler()->runScript(&script); | 409 | currentSession()->emulationHandler()->runScript(&script); |
410 | } | 410 | } |
411 | } | 411 | } |
412 | 412 | ||
413 | void MainWindow::slotConnect() { | 413 | void MainWindow::slotConnect() { |
414 | if ( currentSession() ) { | 414 | if ( currentSession() ) { |
415 | bool ret = currentSession()->layer()->open(); | 415 | bool ret = currentSession()->layer()->open(); |
416 | if(!ret) QMessageBox::warning(currentSession()->widgetStack(), | 416 | if(!ret) QMessageBox::warning(currentSession()->widgetStack(), |
417 | QObject::tr("Failed"), | 417 | QObject::tr("Failed"), |
418 | QObject::tr("Connecting failed for this session.")); | 418 | QObject::tr("Connecting failed for this session.")); |
419 | else { | 419 | else { |
420 | m_connect->setEnabled( false ); | 420 | m_connect->setEnabled( false ); |
421 | m_disconnect->setEnabled( true ); | 421 | m_disconnect->setEnabled( true ); |
422 | 422 | ||
423 | // if it does not support file transfer, disable the menu entry | 423 | // if it does not support file transfer, disable the menu entry |
424 | if ( ( m_curSession->layer() )->supports()[1] == 0 ) { | 424 | if ( ( m_curSession->layer() )->supports()[1] == 0 ) { |
425 | m_transfer->setEnabled( false ); | 425 | m_transfer->setEnabled( false ); |
426 | } else { | 426 | } else { |
427 | m_transfer->setEnabled( true ); | 427 | m_transfer->setEnabled( true ); |
428 | } | 428 | } |
429 | 429 | ||
430 | m_recordScript->setEnabled( true ); | 430 | m_recordScript->setEnabled( true ); |
431 | m_scripts->setItemEnabled(m_runScript_id, true); | 431 | m_scripts->setItemEnabled(m_runScript_id, true); |
432 | } | 432 | } |
433 | } | 433 | } |
434 | } | 434 | } |
435 | 435 | ||
436 | void MainWindow::slotDisconnect() { | 436 | void MainWindow::slotDisconnect() { |
437 | if ( currentSession() ) { | 437 | if ( currentSession() ) { |
438 | currentSession()->layer()->close(); | 438 | currentSession()->layer()->close(); |
439 | m_connect->setEnabled( true ); | 439 | m_connect->setEnabled( true ); |
440 | m_disconnect->setEnabled( false ); | 440 | m_disconnect->setEnabled( false ); |
441 | m_transfer->setEnabled( false ); | 441 | m_transfer->setEnabled( false ); |
442 | m_recordScript->setEnabled( false); | 442 | m_recordScript->setEnabled( false); |
443 | m_saveScript->setEnabled( false ); | 443 | m_saveScript->setEnabled( false ); |
444 | m_scripts->setItemEnabled(m_runScript_id, false); | 444 | m_scripts->setItemEnabled(m_runScript_id, false); |
445 | } | 445 | } |
446 | } | 446 | } |
447 | 447 | ||
448 | void MainWindow::slotTerminate() { | 448 | void MainWindow::slotTerminate() { |
449 | if ( currentSession() ) | 449 | if ( currentSession() ) |
450 | currentSession()->layer()->close(); | 450 | currentSession()->layer()->close(); |
451 | 451 | ||
452 | slotClose(); | 452 | slotClose(); |
453 | /* FIXME move to the next session */ | 453 | /* FIXME move to the next session */ |
454 | } | 454 | } |
455 | 455 | ||
456 | 456 | ||
457 | 457 | ||
458 | void MainWindow::slotQuickLaunch() { | 458 | void MainWindow::slotQuickLaunch() { |
459 | 459 | ||
460 | Profile prof = manager()->profile( "default" ); | 460 | Profile prof = manager()->profile( "default" ); |
461 | if ( prof.name() == "default" ) { | 461 | if ( prof.name() == "default" ) { |
462 | create( prof ); | 462 | create( prof ); |
463 | } else { | 463 | } else { |
464 | #ifndef EAST | 464 | #ifndef EAST |
465 | Profile newProf = Profile( "default", "console", "default" , 0, 3, 0 ); | 465 | Profile newProf = Profile( "default", "console", "default" , 0, 3, 0 ); |
466 | newProf.setAutoConnect( true ); | 466 | newProf.setAutoConnect( true ); |
467 | create( newProf ); | 467 | create( newProf ); |
468 | slotSaveSession(); | 468 | slotSaveSession(); |
469 | #endif | 469 | #endif |
470 | } | 470 | } |
471 | } | 471 | } |
472 | 472 | ||
473 | void MainWindow::slotConfigure() { | 473 | void MainWindow::slotConfigure() { |
474 | ConfigDialog conf( manager()->all(), factory() ); | 474 | ConfigDialog conf( manager()->all(), factory() ); |
475 | 475 | ||
476 | int ret = QPEApplication::execDialog( &conf ); | 476 | int ret = QPEApplication::execDialog( &conf ); |
477 | 477 | ||
478 | if ( QDialog::Accepted == ret ) { | 478 | if ( QDialog::Accepted == ret ) { |
479 | manager()->setProfiles( conf.list() ); | 479 | manager()->setProfiles( conf.list() ); |
480 | manager()->save(); | 480 | manager()->save(); |
481 | populateProfiles(); | 481 | populateProfiles(); |
482 | } | 482 | } |
483 | } | 483 | } |
484 | /* | 484 | /* |
485 | * we will remove | 485 | * we will remove |
486 | * this window from the tabwidget | 486 | * this window from the tabwidget |
487 | * remove it from the list | 487 | * remove it from the list |
488 | * delete it | 488 | * delete it |
489 | * and set the currentSession() | 489 | * and set the currentSession() |
490 | */ | 490 | */ |
491 | void MainWindow::slotClose() { | 491 | void MainWindow::slotClose() { |
492 | if (!currentSession() ) | 492 | if (!currentSession() ) |
493 | return; | 493 | return; |
494 | 494 | ||
495 | Session* ses = currentSession(); | 495 | Session* ses = currentSession(); |
496 | /* set to NULL to be safe, if its needed slotSessionChanged resets it automatically */ | 496 | /* set to NULL to be safe, if its needed slotSessionChanged resets it automatically */ |
497 | m_curSession = NULL; | 497 | m_curSession = NULL; |
498 | tabWidget()->remove( /*currentSession()*/ses ); | 498 | tabWidget()->remove( /*currentSession()*/ses ); |
499 | /*it's autodelete */ | 499 | /*it's autodelete */ |
500 | m_sessions.remove( ses ); | 500 | m_sessions.remove( ses ); |
501 | 501 | ||
502 | if (!currentSession() ) { | 502 | if (!currentSession() ) { |
503 | m_connect->setEnabled( false ); | 503 | m_connect->setEnabled( false ); |
504 | m_disconnect->setEnabled( false ); | 504 | m_disconnect->setEnabled( false ); |
505 | m_terminate->setEnabled( false ); | 505 | m_terminate->setEnabled( false ); |
506 | m_transfer->setEnabled( false ); | 506 | m_transfer->setEnabled( false ); |
507 | m_recordScript->setEnabled( false ); | 507 | m_recordScript->setEnabled( false ); |
508 | m_saveScript->setEnabled( false ); | 508 | m_saveScript->setEnabled( false ); |
509 | m_scripts->setItemEnabled(m_runScript_id, false); | 509 | m_scripts->setItemEnabled(m_runScript_id, false); |
510 | m_fullscreen->setEnabled( false ); | 510 | m_fullscreen->setEnabled( false ); |
511 | m_wrap->setEnabled( false ); | 511 | m_wrap->setEnabled( false ); |
512 | m_closewindow->setEnabled( false ); | 512 | m_closewindow->setEnabled( false ); |
513 | } | 513 | } |
514 | 514 | ||
515 | m_kb->loadDefaults(); | 515 | m_kb->loadDefaults(); |
516 | } | 516 | } |
517 | 517 | ||
518 | /* | 518 | /* |
519 | * We will get the name | 519 | * We will get the name |
520 | * Then the profile | 520 | * Then the profile |
521 | * and then we will make a profile | 521 | * and then we will make a profile |
522 | */ | 522 | */ |
523 | void MainWindow::slotProfile( int id) { | 523 | void MainWindow::slotProfile( int id) { |
524 | Profile prof = manager()->profile( m_sessionsPop->text( id) ); | 524 | Profile prof = manager()->profile( m_sessionsPop->text( id) ); |
525 | create( prof ); | 525 | create( prof ); |
526 | } | 526 | } |
527 | 527 | ||
528 | 528 | ||
529 | 529 | ||
530 | void MainWindow::create( const Profile& prof ) { | 530 | void MainWindow::create( const Profile& prof ) { |
531 | char *homeDir = getenv("HOME"); | 531 | char *homeDir = getenv("HOME"); |
532 | 532 | ||
533 | if ( homeDir ) | 533 | if ( homeDir ) |
534 | ::chdir( homeDir ); | 534 | ::chdir( homeDir ); |
535 | 535 | ||
536 | if(m_curSession) | 536 | if(m_curSession) |
537 | if(m_curSession->transferDialog()) m_curSession->transferDialog()->hide(); | 537 | if(m_curSession->transferDialog()) m_curSession->transferDialog()->hide(); |
538 | 538 | ||
539 | Session *ses = manager()->fromProfile( prof, tabWidget() ); | 539 | Session *ses = manager()->fromProfile( prof, tabWidget() ); |
540 | 540 | ||
541 | if((!ses) || (!ses->layer()) || (!ses->widgetStack())) | 541 | if((!ses) || (!ses->layer()) || (!ses->widgetStack())) |
542 | { | 542 | { |
543 | QMessageBox::warning(this, | 543 | QMessageBox::warning(this, |
544 | QObject::tr("Session failed"), | 544 | QObject::tr("Session failed"), |
545 | QObject::tr("<qt>Cannot open session: Not all components were found.</qt>")); | 545 | QObject::tr("<qt>Cannot open session: Not all components were found.</qt>")); |
546 | //if(ses) delete ses; | 546 | //if(ses) delete ses; |
547 | return; | 547 | return; |
548 | } | 548 | } |
549 | 549 | ||
550 | m_sessions.append( ses ); | 550 | m_sessions.append( ses ); |
551 | tabWidget()->add( ses ); | 551 | tabWidget()->add( ses ); |
552 | tabWidget()->repaint(); | 552 | tabWidget()->repaint(); |
553 | m_curSession = ses; | 553 | m_curSession = ses; |
554 | 554 | ||
555 | // dicide if its a local term ( then no connction and no tranfer), maybe make a wrapper method out of it | 555 | // dicide if its a local term ( then no connction and no tranfer), maybe make a wrapper method out of it |
556 | m_connect->setEnabled( true ); | 556 | m_connect->setEnabled( true ); |
557 | m_disconnect->setEnabled( false ); | 557 | m_disconnect->setEnabled( false ); |
558 | m_terminate->setEnabled( true ); | 558 | m_terminate->setEnabled( true ); |
559 | m_fullscreen->setEnabled( true ); | 559 | m_fullscreen->setEnabled( true ); |
560 | m_wrap->setEnabled( true ); | 560 | m_wrap->setEnabled( true ); |
561 | m_closewindow->setEnabled( true ); | 561 | m_closewindow->setEnabled( true ); |
562 | m_transfer->setEnabled( false ); | 562 | m_transfer->setEnabled( false ); |
563 | m_recordScript->setEnabled( false ); | 563 | m_recordScript->setEnabled( false ); |
564 | m_saveScript->setEnabled( false ); | 564 | m_saveScript->setEnabled( false ); |
565 | m_scripts->setItemEnabled(m_runScript_id, false); | 565 | m_scripts->setItemEnabled(m_runScript_id, false); |
566 | 566 | ||
567 | // is io_layer wants direct connection, then autoconnect | 567 | // is io_layer wants direct connection, then autoconnect |
568 | //if ( ( m_curSession->layer() )->supports()[0] == 1 ) { | 568 | //if ( ( m_curSession->layer() )->supports()[0] == 1 ) { |
569 | if (prof.autoConnect()) { | 569 | if (prof.autoConnect()) { |
570 | slotConnect(); | 570 | slotConnect(); |
571 | } | 571 | } |
572 | 572 | ||
573 | QWidget *w = currentSession()->widget(); | 573 | QWidget *w = currentSession()->widget(); |
574 | if(w) w->setFocus(); | 574 | if(w) w->setFocus(); |
575 | 575 | ||
576 | if(currentSession()->profile().readNumEntry("Wrap", 80)){ | 576 | if(currentSession()->profile().readNumEntry("Wrap", 80)){ |
577 | m_isWrapped = true; | 577 | m_isWrapped = true; |
578 | } else { | 578 | } else { |
579 | m_isWrapped = false; | 579 | m_isWrapped = false; |
580 | } | 580 | } |
581 | 581 | ||
582 | m_kb->load(currentSession()->profile()); | 582 | m_kb->load(currentSession()->profile()); |
583 | } | 583 | } |
584 | 584 | ||
585 | void MainWindow::slotTransfer() | 585 | void MainWindow::slotTransfer() |
586 | { | 586 | { |
587 | if ( currentSession() ) { | 587 | if ( currentSession() ) { |
588 | Session *mysession = currentSession(); | 588 | Session *mysession = currentSession(); |
589 | TransferDialog dlg(/*mysession->widgetStack()*/this, this); | 589 | TransferDialog dlg(/*mysession->widgetStack()*/this, this); |
590 | mysession->setTransferDialog(&dlg); | 590 | mysession->setTransferDialog(&dlg); |
591 | //dlg.reparent(mysession->widgetStack(), QPoint(0, 0)); | 591 | //dlg.reparent(mysession->widgetStack(), QPoint(0, 0)); |
592 | //dlg.showMaximized(); | 592 | //dlg.showMaximized(); |
593 | currentSession()->widgetStack()->addWidget(&dlg, -1); | 593 | currentSession()->widgetStack()->addWidget(&dlg, -1); |
594 | dlg.show(); | 594 | dlg.show(); |
595 | //dlg.exec(); | 595 | //dlg.exec(); |
596 | while(dlg.isRunning()) qApp->processEvents(); | 596 | while(dlg.isRunning()) qApp->processEvents(); |
597 | mysession->setTransferDialog(0l); | 597 | mysession->setTransferDialog(0l); |
598 | } | 598 | } |
599 | } | 599 | } |
600 | 600 | ||
601 | 601 | ||
602 | void MainWindow::slotOpenKeb(bool state) { | 602 | void MainWindow::slotOpenKeb(bool state) { |
603 | 603 | ||
604 | if (state) m_keyBar->show(); | 604 | if (state) m_keyBar->show(); |
605 | else m_keyBar->hide(); | 605 | else m_keyBar->hide(); |
606 | 606 | ||
607 | } | 607 | } |
608 | 608 | ||
609 | 609 | ||
610 | void MainWindow::slotOpenButtons( bool state ) { | 610 | void MainWindow::slotOpenButtons( bool state ) { |
611 | 611 | ||
612 | if ( state ) { | 612 | if ( state ) { |
613 | m_buttonBar->show(); | 613 | m_buttonBar->show(); |
614 | } else { | 614 | } else { |
615 | m_buttonBar->hide(); | 615 | m_buttonBar->hide(); |
616 | } | 616 | } |
617 | } | 617 | } |
618 | 618 | ||
619 | 619 | ||
620 | 620 | ||
621 | void MainWindow::slotSessionChanged( Session* ses ) { | 621 | void MainWindow::slotSessionChanged( Session* ses ) { |
622 | if(m_curSession) | 622 | if(m_curSession) |
623 | if(m_curSession->transferDialog()) m_curSession->transferDialog()->hide(); | 623 | if(m_curSession->transferDialog()) m_curSession->transferDialog()->hide(); |
624 | if(ses) | 624 | if(ses) |
625 | if(ses->transferDialog()) ses->transferDialog()->show(); | 625 | if(ses->transferDialog()) ses->transferDialog()->show(); |
626 | 626 | ||
627 | if ( ses ) { | 627 | if ( ses ) { |
628 | m_curSession = ses; | 628 | m_curSession = ses; |
629 | if ( m_curSession->layer()->isConnected() ) { | 629 | if ( m_curSession->layer()->isConnected() ) { |
630 | m_connect->setEnabled( false ); | 630 | m_connect->setEnabled( false ); |
631 | m_disconnect->setEnabled( true ); | 631 | m_disconnect->setEnabled( true ); |
632 | m_recordScript->setEnabled(!m_curSession->emulationHandler()->isRecording()); | 632 | m_recordScript->setEnabled(!m_curSession->emulationHandler()->isRecording()); |
633 | m_saveScript->setEnabled(m_curSession->emulationHandler()->isRecording()); | 633 | m_saveScript->setEnabled(m_curSession->emulationHandler()->isRecording()); |
634 | m_scripts->setItemEnabled(m_runScript_id, true); | 634 | m_scripts->setItemEnabled(m_runScript_id, true); |
635 | } else { | 635 | } else { |
636 | m_connect->setEnabled( true ); | 636 | m_connect->setEnabled( true ); |
637 | m_disconnect->setEnabled( false ); | 637 | m_disconnect->setEnabled( false ); |
638 | m_recordScript->setEnabled( false ); | 638 | m_recordScript->setEnabled( false ); |
639 | m_saveScript->setEnabled( false ); | 639 | m_saveScript->setEnabled( false ); |
640 | m_scripts->setItemEnabled(m_runScript_id, false); | 640 | m_scripts->setItemEnabled(m_runScript_id, false); |
641 | } | 641 | } |
642 | 642 | ||
643 | if ( ( currentSession()->emulationHandler()->isLogging() ) ) { | 643 | if ( ( currentSession()->emulationHandler()->isLogging() ) ) { |
644 | m_recordLog->setText( tr("Stop log") ); | 644 | m_recordLog->setText( tr("Stop log") ); |
645 | } else { | 645 | } else { |
646 | m_recordLog->setText( tr("Start log") ); | 646 | m_recordLog->setText( tr("Start log") ); |
647 | } | 647 | } |
648 | 648 | ||
649 | if ( ( m_curSession->layer() )->supports()[1] == 0 ) { | 649 | if ( ( m_curSession->layer() )->supports()[1] == 0 ) { |
650 | m_transfer->setEnabled( false ); | 650 | m_transfer->setEnabled( false ); |
651 | } else { | 651 | } else { |
652 | m_transfer->setEnabled( true ); | 652 | m_transfer->setEnabled( true ); |
653 | } | 653 | } |
654 | 654 | ||
655 | QWidget *w = m_curSession->widget(); | 655 | QWidget *w = m_curSession->widget(); |
656 | if(w) w->setFocus(); | 656 | if(w) w->setFocus(); |
657 | 657 | ||
658 | if(currentSession()->profile().readNumEntry("Wrap", 80)){ | 658 | if(currentSession()->profile().readNumEntry("Wrap", 80)){ |
659 | m_isWrapped = true; | 659 | m_isWrapped = true; |
660 | } else { | 660 | } else { |
661 | m_isWrapped = false; | 661 | m_isWrapped = false; |
662 | } | 662 | } |
663 | 663 | ||
664 | m_kb->load(currentSession()->profile()); | 664 | m_kb->load(currentSession()->profile()); |
665 | } | 665 | } |
666 | } | 666 | } |
667 | 667 | ||
668 | void MainWindow::slotWrap() | 668 | void MainWindow::slotWrap() |
669 | { | 669 | { |
670 | if(m_curSession) | 670 | if(m_curSession) |
671 | { | 671 | { |
672 | EmulationHandler *e = m_curSession->emulationHandler(); | 672 | EmulationHandler *e = m_curSession->emulationHandler(); |
673 | if(e) | 673 | if(e) |
674 | { | 674 | { |
675 | e->setWrap( m_isWrapped ? 80:0 ); | 675 | e->setWrap( m_isWrapped ? 80:0 ); |
676 | m_isWrapped = !m_isWrapped; | 676 | m_isWrapped = !m_isWrapped; |
677 | } | 677 | } |
678 | } | 678 | } |
679 | } | 679 | } |
680 | 680 | ||
681 | void MainWindow::slotFullscreen() { | 681 | void MainWindow::slotFullscreen() { |
682 | 682 | ||
683 | 683 | ||
684 | 684 | ||
685 | if ( m_isFullscreen ) { | 685 | if ( m_isFullscreen ) { |
686 | ( m_curSession->widgetStack() )->reparent( savedParentFullscreen, 0, QPoint(0,0), true ); | 686 | ( m_curSession->widgetStack() )->reparent( savedParentFullscreen, 0, QPoint(0,0), true ); |
687 | ( m_curSession->widgetStack() )->resize( savedParentFullscreen->width(), savedParentFullscreen->height() ); | 687 | ( m_curSession->widgetStack() )->resize( savedParentFullscreen->width(), savedParentFullscreen->height() ); |
688 | ( m_curSession->emulationHandler() )->cornerButton()->hide(); | 688 | ( m_curSession->emulationHandler() )->cornerButton()->hide(); |
689 | disconnect( ( m_curSession->emulationHandler() )->cornerButton(), SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) ); | 689 | disconnect( ( m_curSession->emulationHandler() )->cornerButton(), SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) ); |
690 | 690 | ||
691 | } else { | 691 | } else { |
692 | savedParentFullscreen = ( m_curSession->widgetStack() )->parentWidget(); | 692 | savedParentFullscreen = ( m_curSession->widgetStack() )->parentWidget(); |
693 | ( m_curSession->widgetStack() )->setFrameStyle( QFrame::NoFrame ); | 693 | ( m_curSession->widgetStack() )->setFrameStyle( QFrame::NoFrame ); |
694 | ( m_curSession->widgetStack() )->reparent( 0, WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop | 694 | ( m_curSession->widgetStack() )->reparent( 0, WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop |
695 | , QPoint(0,0), false ); | 695 | , QPoint(0,0), false ); |
696 | ( m_curSession->widgetStack() )->resize( qApp->desktop()->width(), qApp->desktop()->height() ); | 696 | ( m_curSession->widgetStack() )->resize( qApp->desktop()->width(), qApp->desktop()->height() ); |
697 | ( m_curSession->widgetStack() )->setFocus(); | 697 | ( m_curSession->widgetStack() )->setFocus(); |
698 | ( m_curSession->widgetStack() )->show(); | 698 | ( m_curSession->widgetStack() )->show(); |
699 | 699 | ||
700 | ( ( m_curSession->emulationHandler() )->cornerButton() )->show(); | 700 | ( ( m_curSession->emulationHandler() )->cornerButton() )->show(); |
701 | 701 | ||
702 | connect( ( m_curSession->emulationHandler() )->cornerButton(), SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) ); | 702 | connect( ( m_curSession->emulationHandler() )->cornerButton(), SIGNAL( pressed() ), this, SLOT( slotFullscreen() ) ); |
703 | } | 703 | } |
704 | 704 | ||
705 | m_isFullscreen = !m_isFullscreen; | 705 | m_isFullscreen = !m_isFullscreen; |
706 | } | 706 | } |
707 | 707 | ||
708 | void MainWindow::slotScrollbarSelected(int index) | 708 | void MainWindow::slotScrollbarSelected(int index) |
709 | { | 709 | { |
710 | int loc; | 710 | int loc = 0; |
711 | 711 | ||
712 | Config cfg( "Konsole" ); | 712 | Config cfg( "Konsole" ); |
713 | cfg.setGroup("ScrollBar"); | 713 | cfg.setGroup("ScrollBar"); |
714 | if(index == sm_none) | 714 | if(index == sm_left) |
715 | { | ||
716 | loc = 0; | ||
717 | } | ||
718 | else if(index == sm_left) | ||
719 | { | 715 | { |
720 | loc = 1; | 716 | loc = 1; |
721 | } | 717 | } |
722 | else if(index == sm_right) | 718 | else if(index == sm_right) |
723 | { | 719 | { |
724 | loc = 2; | 720 | loc = 2; |
725 | } | 721 | } |
726 | 722 | ||
727 | cfg.writeEntry("Position", loc); | 723 | cfg.writeEntry("Position", loc); |
728 | 724 | ||
729 | if (currentSession()) { | 725 | if (currentSession()) { |
730 | currentSession()->emulationHandler()->setScrollbarLocation(loc); | 726 | currentSession()->emulationHandler()->setScrollbarLocation(loc); |
731 | } | 727 | } |
732 | 728 | ||
733 | m_scrollbar->setItemChecked(sm_none, index == sm_none); | 729 | m_scrollbar->setItemChecked(sm_none, index == sm_none); |
734 | m_scrollbar->setItemChecked(sm_left, index == sm_left); | 730 | m_scrollbar->setItemChecked(sm_left, index == sm_left); |
735 | m_scrollbar->setItemChecked(sm_right, index == sm_right); | 731 | m_scrollbar->setItemChecked(sm_right, index == sm_right); |
736 | } | 732 | } |
737 | 733 | ||
738 | void MainWindow::slotKeyReceived(FKey k, ushort, ushort, bool pressed) { | 734 | void MainWindow::slotKeyReceived(FKey k, ushort, ushort, bool pressed) { |
739 | 735 | ||
740 | if ( m_curSession ) { | 736 | if ( m_curSession ) { |
741 | 737 | ||
742 | QEvent::Type state; | 738 | QEvent::Type state; |
743 | 739 | ||
744 | if (pressed) state = QEvent::KeyPress; | 740 | if (pressed) state = QEvent::KeyPress; |
745 | else state = QEvent::KeyRelease; | 741 | else state = QEvent::KeyRelease; |
746 | 742 | ||
747 | QKeyEvent ke(state, k.qcode, k.unicode, 0, QString(QChar(k.unicode))); | 743 | QKeyEvent ke(state, k.qcode, k.unicode, 0, QString(QChar(k.unicode))); |
748 | 744 | ||
749 | // is this the best way to do this? cant figure out any other way to work | 745 | // is this the best way to do this? cant figure out any other way to work |
750 | QApplication::sendEvent((QObject *)m_curSession->widget(), &ke); | 746 | QApplication::sendEvent((QObject *)m_curSession->widget(), &ke); |
751 | ke.ignore(); | 747 | ke.ignore(); |
752 | } | 748 | } |
753 | } | 749 | } |
754 | void MainWindow::slotCopy() { | 750 | void MainWindow::slotCopy() { |
755 | if (!currentSession() ) return; | 751 | if (!currentSession() ) return; |
756 | currentSession()->emulationHandler()->copy(); | 752 | currentSession()->emulationHandler()->copy(); |
757 | } | 753 | } |
758 | void MainWindow::slotPaste() { | 754 | void MainWindow::slotPaste() { |
759 | if (!currentSession() ) return; | 755 | if (!currentSession() ) return; |
760 | currentSession()->emulationHandler()->paste(); | 756 | currentSession()->emulationHandler()->paste(); |
761 | } | 757 | } |
762 | 758 | ||
763 | /* | 759 | /* |
764 | * Save the session | 760 | * Save the session |
765 | */ | 761 | */ |
766 | 762 | ||
767 | void MainWindow::slotSaveSession() { | 763 | void MainWindow::slotSaveSession() { |
768 | if (!currentSession() ) { | 764 | if (!currentSession() ) { |
769 | QMessageBox::information(this, tr("Save Connection"), | 765 | QMessageBox::information(this, tr("Save Connection"), |
770 | tr("<qt>There is no Connection.</qt>"), 1 ); | 766 | tr("<qt>There is no Connection.</qt>"), 1 ); |
771 | return; | 767 | return; |
772 | } | 768 | } |
773 | manager()->add( currentSession()->profile() ); | 769 | manager()->add( currentSession()->profile() ); |
774 | manager()->save(); | 770 | manager()->save(); |
775 | populateProfiles(); | 771 | populateProfiles(); |
776 | } | 772 | } |
777 | 773 | ||
778 | 774 | ||
779 | 775 | ||
780 | void MainWindow::slotSaveLog() { | 776 | void MainWindow::slotSaveLog() { |
781 | 777 | ||
782 | if( currentSession()->emulationHandler()->isLogging() ) { | 778 | if( currentSession()->emulationHandler()->isLogging() ) { |
783 | DocLnk nf; | 779 | DocLnk nf; |
784 | QString m_logName = currentSession()->emulationHandler()->logFileName(); | 780 | QString m_logName = currentSession()->emulationHandler()->logFileName(); |
785 | QFileInfo info(m_logName); | 781 | QFileInfo info(m_logName); |
786 | nf.setType("text/plain"); | 782 | nf.setType("text/plain"); |
787 | nf.setFile(m_logName); | 783 | nf.setFile(m_logName); |
788 | nf.setName(info.fileName()); | 784 | nf.setName(info.fileName()); |
789 | nf.writeLink(); | 785 | nf.writeLink(); |
790 | m_recordLog->setText( tr("Start log") ); | 786 | m_recordLog->setText( tr("Start log") ); |
791 | m_recordingLog = false; | 787 | m_recordingLog = false; |
792 | currentSession()->emulationHandler()->clearLog(); | 788 | currentSession()->emulationHandler()->clearLog(); |
793 | } else { | 789 | } else { |
794 | QMap<QString, QStringList> map; | 790 | QMap<QString, QStringList> map; |
795 | QStringList text; | 791 | QStringList text; |
796 | text << "text/plain"; | 792 | text << "text/plain"; |
797 | map.insert(tr("Log"), text ); | 793 | map.insert(tr("Log"), text ); |
798 | Opie::Core::OConfig cfg("opie-console"); | 794 | Opie::Core::OConfig cfg("opie-console"); |
799 | cfg.setGroup("defaults"); | 795 | cfg.setGroup("defaults"); |
800 | QString startDir = cfg.readEntry("defaultlogdir", QPEApplication::documentDir() ); | 796 | QString startDir = cfg.readEntry("defaultlogdir", QPEApplication::documentDir() ); |
801 | QString m_logName = OFileDialog::getSaveFileName(2, startDir, QString::null, map, 0, startDir); | 797 | QString m_logName = OFileDialog::getSaveFileName(2, startDir, QString::null, map, 0, startDir); |
802 | if (m_logName.isEmpty() ) return; | 798 | if (m_logName.isEmpty() ) return; |
803 | 799 | ||
804 | m_recordLog->setText( tr("Stop log") ); | 800 | m_recordLog->setText( tr("Stop log") ); |
805 | m_recordingLog = true; | 801 | m_recordingLog = true; |
806 | currentSession()->emulationHandler()->startLogging(m_logName); | 802 | currentSession()->emulationHandler()->startLogging(m_logName); |
807 | } | 803 | } |
808 | } | 804 | } |
809 | 805 | ||
810 | void MainWindow::slotSaveHistory() { | 806 | void MainWindow::slotSaveHistory() { |
811 | QMap<QString, QStringList> map; | 807 | QMap<QString, QStringList> map; |
812 | QStringList text; | 808 | QStringList text; |
813 | text << "text/plain"; | 809 | text << "text/plain"; |
814 | map.insert(tr("History"), text ); | 810 | map.insert(tr("History"), text ); |
815 | QString filename = OFileDialog::getSaveFileName(2, QPEApplication::documentDir(), QString::null, map); | 811 | QString filename = OFileDialog::getSaveFileName(2, QPEApplication::documentDir(), QString::null, map); |
816 | if (filename.isEmpty() ) return; | 812 | if (filename.isEmpty() ) return; |
817 | 813 | ||
818 | QFileInfo info(filename); | 814 | QFileInfo info(filename); |
819 | 815 | ||
820 | DocLnk nf; | 816 | DocLnk nf; |
821 | nf.setType("text/plain"); | 817 | nf.setType("text/plain"); |
822 | nf.setFile(filename); | 818 | nf.setFile(filename); |
823 | nf.setName(info.fileName()); | 819 | nf.setName(info.fileName()); |
824 | 820 | ||
825 | 821 | ||
826 | QFile file(filename); | 822 | QFile file(filename); |
827 | if ( !file.open(IO_WriteOnly ) ) return; | 823 | if ( !file.open(IO_WriteOnly ) ) return; |
828 | 824 | ||
829 | QTextStream str(&file ); | 825 | QTextStream str(&file ); |
830 | if ( currentSession() ) | 826 | if ( currentSession() ) |
831 | currentSession()->emulationHandler()->emulation()->streamHistory(&str); | 827 | currentSession()->emulationHandler()->emulation()->streamHistory(&str); |
832 | 828 | ||
833 | file.close(); | 829 | file.close(); |
834 | nf.writeLink(); | 830 | nf.writeLink(); |
835 | } | 831 | } |
diff --git a/noncore/apps/opie-reader/CFilter.cpp b/noncore/apps/opie-reader/CFilter.cpp index 25cdfae..a4ea60a 100644 --- a/noncore/apps/opie-reader/CFilter.cpp +++ b/noncore/apps/opie-reader/CFilter.cpp | |||
@@ -1,861 +1,861 @@ | |||
1 | #include <qmap.h> | 1 | #include <qmap.h> |
2 | #include <qfileinfo.h> | 2 | #include <qfileinfo.h> |
3 | #include <qtextstream.h> | 3 | #include <qtextstream.h> |
4 | #include <qdir.h> | 4 | #include <qdir.h> |
5 | 5 | ||
6 | #ifdef USEQPE | 6 | #ifdef USEQPE |
7 | #include <qpe/global.h> | 7 | #include <qpe/global.h> |
8 | #endif | 8 | #endif |
9 | #include "CDrawBuffer.h" | 9 | #include "CDrawBuffer.h" |
10 | #include "CFilter.h" | 10 | #include "CFilter.h" |
11 | #include "hrule.h" | 11 | #include "hrule.h" |
12 | 12 | ||
13 | #include <qregexp.h> | 13 | #include <qregexp.h> |
14 | #include <qimage.h> | 14 | #include <qimage.h> |
15 | #include <qpixmap.h> | 15 | #include <qpixmap.h> |
16 | //#include <qprogressdialog.h> | 16 | //#include <qprogressdialog.h> |
17 | //#include <qapplication.h> | 17 | //#include <qapplication.h> |
18 | 18 | ||
19 | void textfmt::mygetch(tchar& ch, CStyle& sty, unsigned long& pos) | 19 | void textfmt::mygetch(tchar& ch, CStyle& sty, unsigned long& pos) |
20 | { | 20 | { |
21 | if (uselast) | 21 | if (uselast) |
22 | { | 22 | { |
23 | ch = lastchar; | 23 | ch = lastchar; |
24 | uselast = false; | 24 | uselast = false; |
25 | } | 25 | } |
26 | else | 26 | else |
27 | { | 27 | { |
28 | parent->getch(ch, sty, pos); | 28 | parent->getch(ch, sty, pos); |
29 | } | 29 | } |
30 | } | 30 | } |
31 | 31 | ||
32 | void textfmt::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 32 | void textfmt::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
33 | { | 33 | { |
34 | mygetch(ch, sty, pos); | 34 | mygetch(ch, sty, pos); |
35 | do | 35 | do |
36 | { | 36 | { |
37 | sty = currentstyle; | 37 | sty = currentstyle; |
38 | switch (ch) | 38 | switch (ch) |
39 | { | 39 | { |
40 | case 10: | 40 | case 10: |
41 | currentstyle.unset(); | 41 | currentstyle.unset(); |
42 | sty = currentstyle; | 42 | sty = currentstyle; |
43 | break; | 43 | break; |
44 | // Use this if you want to replace -- by em-dash | 44 | // Use this if you want to replace -- by em-dash |
45 | case '-': | 45 | case '-': |
46 | // parent->getch(ch, sty); | 46 | // parent->getch(ch, sty); |
47 | mygetch(ch, sty, pos); | 47 | mygetch(ch, sty, pos); |
48 | if (ch == '-') | 48 | if (ch == '-') |
49 | { | 49 | { |
50 | ch = 0x2014; | 50 | ch = 0x2014; |
51 | } | 51 | } |
52 | else | 52 | else |
53 | { | 53 | { |
54 | lastchar = ch; | 54 | lastchar = ch; |
55 | uselast = true; | 55 | uselast = true; |
56 | ch = '-'; | 56 | ch = '-'; |
57 | } | 57 | } |
58 | break; | 58 | break; |
59 | case '*': | 59 | case '*': |
60 | if (currentstyle.isBold()) | 60 | if (currentstyle.isBold()) |
61 | { | 61 | { |
62 | // Already bold - time to turn it off? | 62 | // Already bold - time to turn it off? |
63 | // The next two lines ensure that * follows a character but it works better without | 63 | // The next two lines ensure that * follows a character but it works better without |
64 | // QChar c(lastchar); | 64 | // QChar c(lastchar); |
65 | // if ((lastchar != '*') && (c.isPunct() || c.isLetterOrNumber())) | 65 | // if ((lastchar != '*') && (c.isPunct() || c.isLetterOrNumber())) |
66 | if (lastchar != '*') | 66 | if (lastchar != '*') |
67 | { | 67 | { |
68 | currentstyle.unsetBold(); | 68 | currentstyle.unsetBold(); |
69 | CStyle dummy; | 69 | CStyle dummy; |
70 | // parent->getch(ch, dummy); | 70 | // parent->getch(ch, dummy); |
71 | mygetch(ch, dummy, pos); | 71 | mygetch(ch, dummy, pos); |
72 | } | 72 | } |
73 | } | 73 | } |
74 | else | 74 | else |
75 | { | 75 | { |
76 | // not bold - time to turn it on? | 76 | // not bold - time to turn it on? |
77 | CStyle dummy; | 77 | CStyle dummy; |
78 | // parent->getch(ch, dummy); | 78 | // parent->getch(ch, dummy); |
79 | mygetch(ch, dummy, pos); | 79 | mygetch(ch, dummy, pos); |
80 | QChar c(ch); | 80 | QChar c(ch); |
81 | if ((ch != '*') && (c.isPunct() || c.isLetterOrNumber())) | 81 | if ((ch != '*') && (c.isPunct() || c.isLetterOrNumber())) |
82 | { | 82 | { |
83 | currentstyle.setBold(); | 83 | currentstyle.setBold(); |
84 | } | 84 | } |
85 | else | 85 | else |
86 | { | 86 | { |
87 | lastchar = ch; | 87 | lastchar = ch; |
88 | uselast = true; | 88 | uselast = true; |
89 | ch = '*'; | 89 | ch = '*'; |
90 | } | 90 | } |
91 | 91 | ||
92 | } | 92 | } |
93 | break; | 93 | break; |
94 | case '_': | 94 | case '_': |
95 | if (currentstyle.isItalic()) | 95 | if (currentstyle.isItalic()) |
96 | { | 96 | { |
97 | // Already bold - time to turn it off? | 97 | // Already bold - time to turn it off? |
98 | // The next two lines ensure that * follows a character but it works better without | 98 | // The next two lines ensure that * follows a character but it works better without |
99 | // QChar c(lastchar); | 99 | // QChar c(lastchar); |
100 | // if ((lastchar != '_') && (c.isPunct() || c.isLetterOrNumber())) | 100 | // if ((lastchar != '_') && (c.isPunct() || c.isLetterOrNumber())) |
101 | if (lastchar != '_') | 101 | if (lastchar != '_') |
102 | { | 102 | { |
103 | currentstyle.unsetItalic(); | 103 | currentstyle.unsetItalic(); |
104 | CStyle dummy; | 104 | CStyle dummy; |
105 | // parent->getch(ch, dummy); | 105 | // parent->getch(ch, dummy); |
106 | mygetch(ch, dummy, pos); | 106 | mygetch(ch, dummy, pos); |
107 | } | 107 | } |
108 | } | 108 | } |
109 | else | 109 | else |
110 | { | 110 | { |
111 | // not bold - time to turn it on? | 111 | // not bold - time to turn it on? |
112 | CStyle dummy; | 112 | CStyle dummy; |
113 | // parent->getch(ch, dummy); | 113 | // parent->getch(ch, dummy); |
114 | mygetch(ch, dummy, pos); | 114 | mygetch(ch, dummy, pos); |
115 | QChar c(ch); | 115 | QChar c(ch); |
116 | if ((ch != '_') && (c.isPunct() || c.isLetterOrNumber())) | 116 | if ((ch != '_') && (c.isPunct() || c.isLetterOrNumber())) |
117 | { | 117 | { |
118 | currentstyle.setItalic(); | 118 | currentstyle.setItalic(); |
119 | } | 119 | } |
120 | else | 120 | else |
121 | { | 121 | { |
122 | lastchar = ch; | 122 | lastchar = ch; |
123 | uselast = true; | 123 | uselast = true; |
124 | ch = '_'; | 124 | ch = '_'; |
125 | } | 125 | } |
126 | 126 | ||
127 | } | 127 | } |
128 | break; | 128 | break; |
129 | } | 129 | } |
130 | } | 130 | } |
131 | while (sty != currentstyle); | 131 | while (sty != currentstyle); |
132 | if (!uselast) lastchar = ch; | 132 | if (!uselast) lastchar = ch; |
133 | return; | 133 | return; |
134 | } | 134 | } |
135 | 135 | ||
136 | void remap::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 136 | void remap::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
137 | { | 137 | { |
138 | if (q[offset] != 0) | 138 | if (q[offset] != 0) |
139 | { | 139 | { |
140 | q[offset++]; | 140 | q[offset++]; |
141 | sty = currentstyle; | 141 | sty = currentstyle; |
142 | return; | 142 | return; |
143 | } | 143 | } |
144 | parent->getch(ch, sty, pos); | 144 | parent->getch(ch, sty, pos); |
145 | switch (ch) | 145 | switch (ch) |
146 | { | 146 | { |
147 | case 0x201a: | 147 | case 0x201a: |
148 | ch = '\''; | 148 | ch = '\''; |
149 | break; | 149 | break; |
150 | case 0x0192: | 150 | case 0x0192: |
151 | ch = 'f'; | 151 | ch = 'f'; |
152 | break; | 152 | break; |
153 | case 0x201e: | 153 | case 0x201e: |
154 | ch = '"'; | 154 | ch = '"'; |
155 | break; | 155 | break; |
156 | case 0x2026: | 156 | case 0x2026: |
157 | offset = 0; | 157 | offset = 0; |
158 | q[0] = '.'; | 158 | q[0] = '.'; |
159 | q[1] = '.'; | 159 | q[1] = '.'; |
160 | q[2] = 0; | 160 | q[2] = 0; |
161 | ch = '.'; // should be ... | 161 | ch = '.'; // should be ... |
162 | break; | 162 | break; |
163 | case 0x0160: | 163 | case 0x0160: |
164 | ch = 'S'; | 164 | ch = 'S'; |
165 | break; | 165 | break; |
166 | case 0x2039: | 166 | case 0x2039: |
167 | ch = '<'; | 167 | ch = '<'; |
168 | break; | 168 | break; |
169 | case 0x0152: | 169 | case 0x0152: |
170 | offset = 0; | 170 | offset = 0; |
171 | q[0] = 'E'; | 171 | q[0] = 'E'; |
172 | q[1] = 0; | 172 | q[1] = 0; |
173 | ch = 'O'; | 173 | ch = 'O'; |
174 | break; | 174 | break; |
175 | case 0x017d: | 175 | case 0x017d: |
176 | ch = 'Z'; | 176 | ch = 'Z'; |
177 | break; | 177 | break; |
178 | case 0x2018: | 178 | case 0x2018: |
179 | ch = '\''; | 179 | ch = '\''; |
180 | break; | 180 | break; |
181 | case 0x2019: | 181 | case 0x2019: |
182 | ch = '\''; | 182 | ch = '\''; |
183 | break; | 183 | break; |
184 | case 0x201c: | 184 | case 0x201c: |
185 | ch = '"'; | 185 | ch = '"'; |
186 | break; | 186 | break; |
187 | case 0x201d: | 187 | case 0x201d: |
188 | ch = '"'; | 188 | ch = '"'; |
189 | break; | 189 | break; |
190 | case 0x2022: | 190 | case 0x2022: |
191 | ch = '>'; | 191 | ch = '>'; |
192 | break; | 192 | break; |
193 | case 0x2013: | 193 | case 0x2013: |
194 | ch = '-'; | 194 | ch = '-'; |
195 | break; | 195 | break; |
196 | case 0x2014: | 196 | case 0x2014: |
197 | offset = 0; | 197 | offset = 0; |
198 | q[0] = '-'; | 198 | q[0] = '-'; |
199 | q[1] = 0; | 199 | q[1] = 0; |
200 | ch = '-'; // should be -- | 200 | ch = '-'; // should be -- |
201 | break; | 201 | break; |
202 | case 0x02dc: | 202 | case 0x02dc: |
203 | ch = '~'; | 203 | ch = '~'; |
204 | break; | 204 | break; |
205 | case 0x0161: | 205 | case 0x0161: |
206 | ch = 's'; | 206 | ch = 's'; |
207 | break; | 207 | break; |
208 | case 0x203a: | 208 | case 0x203a: |
209 | ch = '>'; | 209 | ch = '>'; |
210 | break; | 210 | break; |
211 | case 0x0153: | 211 | case 0x0153: |
212 | offset = 0; | 212 | offset = 0; |
213 | q[0] = 'e'; | 213 | q[0] = 'e'; |
214 | q[1] = 0; | 214 | q[1] = 0; |
215 | ch = 'o';// should be oe | 215 | ch = 'o';// should be oe |
216 | break; | 216 | break; |
217 | /* | 217 | /* |
218 | case 0x0009: // tab | 218 | case 0x0009: // tab |
219 | offset = 0; | 219 | offset = 0; |
220 | q[0] = ' '; | 220 | q[0] = ' '; |
221 | q[1] = 0; | 221 | q[1] = 0; |
222 | ch = ' '; | 222 | ch = ' '; |
223 | break; | 223 | break; |
224 | */ | 224 | */ |
225 | case 0x017e: | 225 | case 0x017e: |
226 | ch = 'z'; | 226 | ch = 'z'; |
227 | break; | 227 | break; |
228 | case 0x0178: | 228 | case 0x0178: |
229 | ch = 'Y'; | 229 | ch = 'Y'; |
230 | break; | 230 | break; |
231 | } | 231 | } |
232 | currentstyle = sty; | 232 | currentstyle = sty; |
233 | } | 233 | } |
234 | 234 | ||
235 | void PeanutFormatter::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 235 | void PeanutFormatter::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
236 | { | 236 | { |
237 | CStyle dummy; | 237 | CStyle dummy; |
238 | currentstyle.setColour(0,0,0); | 238 | currentstyle.setColour(0,0,0); |
239 | parent->getch(ch, dummy, pos); | 239 | parent->getch(ch, dummy, pos); |
240 | while (ch == '\\') | 240 | while (ch == '\\') |
241 | { | 241 | { |
242 | parent->getch(ch, dummy, pos); | 242 | parent->getch(ch, dummy, pos); |
243 | if (ch == '\\') break; | 243 | if (ch == '\\') break; |
244 | switch(ch) | 244 | switch(ch) |
245 | { | 245 | { |
246 | case 'a': | 246 | case 'a': |
247 | { | 247 | { |
248 | int code = 0; | 248 | int code = 0; |
249 | for (int i = 0; i < 3; i++) | 249 | for (int i = 0; i < 3; i++) |
250 | { | 250 | { |
251 | parent->getch(ch, dummy, pos); | 251 | parent->getch(ch, dummy, pos); |
252 | code = 10*code + ch - '0'; | 252 | code = 10*code + ch - '0'; |
253 | } | 253 | } |
254 | ch = code; | 254 | ch = code; |
255 | } | 255 | } |
256 | break; | 256 | break; |
257 | case 'v': | 257 | case 'v': |
258 | { | 258 | { |
259 | while (1) | 259 | while (1) |
260 | { | 260 | { |
261 | parent->getch(ch, dummy, pos); | 261 | parent->getch(ch, dummy, pos); |
262 | if (ch == '\\') | 262 | if (ch == '\\') |
263 | { | 263 | { |
264 | parent->getch(ch, dummy, pos); | 264 | parent->getch(ch, dummy, pos); |
265 | if (ch == 'v') | 265 | if (ch == 'v') |
266 | { | 266 | { |
267 | parent->getch(ch, dummy, pos); | 267 | parent->getch(ch, dummy, pos); |
268 | break; | 268 | break; |
269 | } | 269 | } |
270 | } | 270 | } |
271 | } | 271 | } |
272 | } | 272 | } |
273 | break; | 273 | break; |
274 | case 's': | 274 | case 's': |
275 | case 'n': | 275 | case 'n': |
276 | currentstyle.setFontSize(0); | 276 | currentstyle.setFontSize(0); |
277 | parent->getch(ch,dummy, pos); | 277 | parent->getch(ch,dummy, pos); |
278 | break; | 278 | break; |
279 | case 'p': | 279 | case 'p': |
280 | currentstyle.unset(); | 280 | currentstyle.unset(); |
281 | // parent->getch(ch,dummy); | 281 | // parent->getch(ch,dummy); |
282 | ch = 10; | 282 | ch = 10; |
283 | break; | 283 | break; |
284 | case 'l': | 284 | case 'l': |
285 | if (currentstyle.getFontSize() == 1) | 285 | if (currentstyle.getFontSize() == 1) |
286 | { | 286 | { |
287 | currentstyle.setFontSize(0); | 287 | currentstyle.setFontSize(0); |
288 | } | 288 | } |
289 | else | 289 | else |
290 | { | 290 | { |
291 | currentstyle.setFontSize(1); | 291 | currentstyle.setFontSize(1); |
292 | } | 292 | } |
293 | parent->getch(ch, dummy, pos); | 293 | parent->getch(ch, dummy, pos); |
294 | break; | 294 | break; |
295 | case 'x': | 295 | case 'x': |
296 | if (currentstyle.getFontSize() == 0) | 296 | if (currentstyle.getFontSize() == 0) |
297 | { | 297 | { |
298 | // currentstyle.unset(); | 298 | // currentstyle.unset(); |
299 | // currentstyle.setBold(); | 299 | // currentstyle.setBold(); |
300 | currentstyle.setFontSize(1); | 300 | currentstyle.setFontSize(1); |
301 | } | 301 | } |
302 | else | 302 | else |
303 | { | 303 | { |
304 | currentstyle.unset(); | 304 | currentstyle.unset(); |
305 | } | 305 | } |
306 | // parent->getch(ch, dummy); | 306 | // parent->getch(ch, dummy); |
307 | ch = 10; | 307 | ch = 10; |
308 | break; | 308 | break; |
309 | case 'i': | 309 | case 'i': |
310 | if (currentstyle.isItalic()) | 310 | if (currentstyle.isItalic()) |
311 | { | 311 | { |
312 | currentstyle.unsetItalic(); | 312 | currentstyle.unsetItalic(); |
313 | } | 313 | } |
314 | else | 314 | else |
315 | { | 315 | { |
316 | currentstyle.setItalic(); | 316 | currentstyle.setItalic(); |
317 | } | 317 | } |
318 | parent->getch(ch, dummy, pos); | 318 | parent->getch(ch, dummy, pos); |
319 | break; | 319 | break; |
320 | case 'b': | 320 | case 'b': |
321 | case 'B': | 321 | case 'B': |
322 | if (currentstyle.isBold()) | 322 | if (currentstyle.isBold()) |
323 | { | 323 | { |
324 | currentstyle.unsetBold(); | 324 | currentstyle.unsetBold(); |
325 | } | 325 | } |
326 | else | 326 | else |
327 | { | 327 | { |
328 | currentstyle.setBold(); | 328 | currentstyle.setBold(); |
329 | } | 329 | } |
330 | parent->getch(ch, dummy, pos); | 330 | parent->getch(ch, dummy, pos); |
331 | break; | 331 | break; |
332 | case 'c': | 332 | case 'c': |
333 | if (currentstyle.getJustify() == m_AlignCentre) | 333 | if (currentstyle.getJustify() == m_AlignCentre) |
334 | { | 334 | { |
335 | currentstyle.setLeftJustify(); | 335 | currentstyle.setLeftJustify(); |
336 | } | 336 | } |
337 | else | 337 | else |
338 | { | 338 | { |
339 | currentstyle.setCentreJustify(); | 339 | currentstyle.setCentreJustify(); |
340 | } | 340 | } |
341 | parent->getch(ch, dummy, pos); | 341 | parent->getch(ch, dummy, pos); |
342 | break; | 342 | break; |
343 | case 'r': | 343 | case 'r': |
344 | if (currentstyle.getJustify() == m_AlignRight) | 344 | if (currentstyle.getJustify() == m_AlignRight) |
345 | { | 345 | { |
346 | currentstyle.setLeftJustify(); | 346 | currentstyle.setLeftJustify(); |
347 | } | 347 | } |
348 | else | 348 | else |
349 | { | 349 | { |
350 | currentstyle.setRightJustify(); | 350 | currentstyle.setRightJustify(); |
351 | } | 351 | } |
352 | parent->getch(ch, dummy, pos); | 352 | parent->getch(ch, dummy, pos); |
353 | break; | 353 | break; |
354 | default: | 354 | default: |
355 | currentstyle.setColour(255,0,0); | 355 | currentstyle.setColour(255,0,0); |
356 | } | 356 | } |
357 | } | 357 | } |
358 | sty = currentstyle; | 358 | sty = currentstyle; |
359 | } | 359 | } |
360 | 360 | ||
361 | void OnePara::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 361 | void OnePara::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
362 | { | 362 | { |
363 | parent->getch(ch, sty, pos); | 363 | parent->getch(ch, sty, pos); |
364 | if (m_lastchar == 10) | 364 | if (m_lastchar == 10) |
365 | { | 365 | { |
366 | while (ch == 10) parent->getch(ch, sty, pos); | 366 | while (ch == 10) parent->getch(ch, sty, pos); |
367 | } | 367 | } |
368 | m_lastchar = ch; | 368 | m_lastchar = ch; |
369 | } | 369 | } |
370 | 370 | ||
371 | void repalm::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 371 | void repalm::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
372 | { | 372 | { |
373 | parent->getch(ch, sty, pos); | 373 | parent->getch(ch, sty, pos); |
374 | switch (ch) | 374 | switch (ch) |
375 | { | 375 | { |
376 | case 0x80: | 376 | case 0x80: |
377 | ch = 0x20ac; | 377 | ch = 0x20ac; |
378 | break; | 378 | break; |
379 | case 0x82: | 379 | case 0x82: |
380 | ch = 0x201a; | 380 | ch = 0x201a; |
381 | break; | 381 | break; |
382 | case 0x83: | 382 | case 0x83: |
383 | ch = 0x0192; | 383 | ch = 0x0192; |
384 | break; | 384 | break; |
385 | case 0x84: | 385 | case 0x84: |
386 | ch = 0x201e; | 386 | ch = 0x201e; |
387 | break; | 387 | break; |
388 | case 0x85: | 388 | case 0x85: |
389 | ch = 0x2026; | 389 | ch = 0x2026; |
390 | break; | 390 | break; |
391 | case 0x86: | 391 | case 0x86: |
392 | ch = 0x2020; | 392 | ch = 0x2020; |
393 | break; | 393 | break; |
394 | case 0x87: | 394 | case 0x87: |
395 | ch = 0x2021; | 395 | ch = 0x2021; |
396 | break; | 396 | break; |
397 | case 0x88: | 397 | case 0x88: |
398 | ch = 0x02c6; | 398 | ch = 0x02c6; |
399 | break; | 399 | break; |
400 | case 0x89: | 400 | case 0x89: |
401 | ch = 0x2030; | 401 | ch = 0x2030; |
402 | break; | 402 | break; |
403 | case 0x8a: | 403 | case 0x8a: |
404 | ch = 0x0160; | 404 | ch = 0x0160; |
405 | break; | 405 | break; |
406 | case 0x8b: | 406 | case 0x8b: |
407 | ch = 0x2039; | 407 | ch = 0x2039; |
408 | break; | 408 | break; |
409 | case 0x8c: | 409 | case 0x8c: |
410 | ch = 0x0152; | 410 | ch = 0x0152; |
411 | break; | 411 | break; |
412 | /* | 412 | /* |
413 | case 0x8e: | 413 | case 0x8e: |
414 | ch = 0x017d; | 414 | ch = 0x017d; |
415 | break; | 415 | break; |
416 | */ | 416 | */ |
417 | case 0x91: | 417 | case 0x91: |
418 | ch = 0x2018; | 418 | ch = 0x2018; |
419 | break; | 419 | break; |
420 | case 0x92: | 420 | case 0x92: |
421 | ch = 0x2019; | 421 | ch = 0x2019; |
422 | break; | 422 | break; |
423 | case 0x93: | 423 | case 0x93: |
424 | ch = 0x201c; | 424 | ch = 0x201c; |
425 | break; | 425 | break; |
426 | case 0x94: | 426 | case 0x94: |
427 | ch = 0x201d; | 427 | ch = 0x201d; |
428 | break; | 428 | break; |
429 | case 0x95: | 429 | case 0x95: |
430 | ch = 0x2022; | 430 | ch = 0x2022; |
431 | break; | 431 | break; |
432 | case 0x96: | 432 | case 0x96: |
433 | ch = 0x2013; | 433 | ch = 0x2013; |
434 | break; | 434 | break; |
435 | case 0x97: | 435 | case 0x97: |
436 | ch = 0x2014; | 436 | ch = 0x2014; |
437 | break; | 437 | break; |
438 | case 0x98: | 438 | case 0x98: |
439 | ch = 0x02dc; | 439 | ch = 0x02dc; |
440 | break; | 440 | break; |
441 | case 0x99: | 441 | case 0x99: |
442 | ch = 0x2122; | 442 | ch = 0x2122; |
443 | break; | 443 | break; |
444 | case 0x9a: | 444 | case 0x9a: |
445 | ch = 0x0161; | 445 | ch = 0x0161; |
446 | break; | 446 | break; |
447 | case 0x9b: | 447 | case 0x9b: |
448 | ch = 0x203a; | 448 | ch = 0x203a; |
449 | break; | 449 | break; |
450 | case 0x9c: | 450 | case 0x9c: |
451 | ch = 0x0153; | 451 | ch = 0x0153; |
452 | break; | 452 | break; |
453 | case 0x9e: | 453 | case 0x9e: |
454 | ch = 0x017e; | 454 | ch = 0x017e; |
455 | break; | 455 | break; |
456 | case 0x9f: | 456 | case 0x9f: |
457 | ch = 0x0178; | 457 | ch = 0x0178; |
458 | break; | 458 | break; |
459 | case 0x18: | 459 | case 0x18: |
460 | ch = 0x2026; | 460 | ch = 0x2026; |
461 | break; | 461 | break; |
462 | case 0x19: | 462 | case 0x19: |
463 | ch = 0x2007; | 463 | ch = 0x2007; |
464 | break; | 464 | break; |
465 | case 0x8d: | 465 | case 0x8d: |
466 | ch = 0x2662; | 466 | ch = 0x2662; |
467 | break; | 467 | break; |
468 | case 0x8e: | 468 | case 0x8e: |
469 | ch = 0x2663; | 469 | ch = 0x2663; |
470 | break; | 470 | break; |
471 | case 0x8f: | 471 | case 0x8f: |
472 | ch = 0x2661; | 472 | ch = 0x2661; |
473 | break; | 473 | break; |
474 | case 0x90: | 474 | case 0x90: |
475 | ch = 0x2660; | 475 | ch = 0x2660; |
476 | break; | 476 | break; |
477 | default: | 477 | default: |
478 | break; | 478 | break; |
479 | } | 479 | } |
480 | } | 480 | } |
481 | 481 | ||
482 | //static tchar nextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 }; | 482 | //static tchar nextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 }; |
483 | //static tchar prevpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','p','r','e','v','i','o','u','s',' ','p','a','r','t',0 }; | 483 | //static tchar prevpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','p','r','e','v','i','o','u','s',' ','p','a','r','t',0 }; |
484 | 484 | ||
485 | void DePluck::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 485 | void DePluck::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
486 | { | 486 | { |
487 | if (m_buffed > 0) | 487 | if (m_buffed > 0) |
488 | { | 488 | { |
489 | sty = m_laststyle; | 489 | sty = m_laststyle; |
490 | ch = nextpart[m_current++]; | 490 | ch = nextpart[m_current++]; |
491 | if (m_current == m_buffed) | 491 | if (m_current == m_buffed) |
492 | { | 492 | { |
493 | m_current = m_buffed = 0; | 493 | m_current = m_buffed = 0; |
494 | } | 494 | } |
495 | } | 495 | } |
496 | else | 496 | else |
497 | { | 497 | { |
498 | if (m_buffer != 0) | 498 | if (m_buffer != 0) |
499 | { | 499 | { |
500 | ch = m_buffer; | 500 | ch = m_buffer; |
501 | m_buffer = 0; | 501 | m_buffer = 0; |
502 | return; | 502 | return; |
503 | } | 503 | } |
504 | unsigned long lnk, lnkoff; | 504 | unsigned long lnk = 0, lnkoff = 0; |
505 | do | 505 | do |
506 | { | 506 | { |
507 | if (nextpart[m_buffed] == 0) break; | 507 | if (nextpart[m_buffed] == 0) break; |
508 | parent->getch(ch, sty, pos); | 508 | parent->getch(ch, sty, pos); |
509 | m_laststyle = sty; | 509 | m_laststyle = sty; |
510 | if (sty.getLink()) | 510 | if (sty.getLink()) |
511 | { | 511 | { |
512 | lnk = sty.getData(); | 512 | lnk = sty.getData(); |
513 | lnkoff = sty.getOffset(); | 513 | lnkoff = sty.getOffset(); |
514 | } | 514 | } |
515 | } while (ch == nextpart[m_buffed] && sty.getLink() && ++m_buffed); | 515 | } while (ch == nextpart[m_buffed] && sty.getLink() && ++m_buffed); |
516 | m_current = 0; | 516 | m_current = 0; |
517 | if (nextpart[m_buffed] == 0) | 517 | if (nextpart[m_buffed] == 0) |
518 | { | 518 | { |
519 | m_buffed = 0; | 519 | m_buffed = 0; |
520 | QString dmy, dmy2; | 520 | QString dmy, dmy2; |
521 | parent->hyperlink(lnk, lnkoff, dmy, dmy2); | 521 | parent->hyperlink(lnk, lnkoff, dmy, dmy2); |
522 | do | 522 | do |
523 | { | 523 | { |
524 | parent->getch(ch, sty, pos); | 524 | parent->getch(ch, sty, pos); |
525 | } | 525 | } |
526 | while (ch != 10); | 526 | while (ch != 10); |
527 | parent->getch(ch, sty, pos); | 527 | parent->getch(ch, sty, pos); |
528 | } | 528 | } |
529 | else if (m_buffed > 0) | 529 | else if (m_buffed > 0) |
530 | { | 530 | { |
531 | m_buffer = ch; | 531 | m_buffer = ch; |
532 | ch = nextpart[0]; | 532 | ch = nextpart[0]; |
533 | if (m_buffed == 1) | 533 | if (m_buffed == 1) |
534 | { | 534 | { |
535 | m_buffed = 0; | 535 | m_buffed = 0; |
536 | } | 536 | } |
537 | else m_current = 1; | 537 | else m_current = 1; |
538 | } | 538 | } |
539 | } | 539 | } |
540 | 540 | ||
541 | return; | 541 | return; |
542 | } | 542 | } |
543 | 543 | ||
544 | HighlightFilter::HighlightFilter(QTReader* _p) : pReader(_p), lastpos(0), nextpos(0), red(255), green(255), blue(255) | 544 | HighlightFilter::HighlightFilter(QTReader* _p) : pReader(_p), lastpos(0), nextpos(0), red(255), green(255), blue(255) |
545 | { | 545 | { |
546 | } | 546 | } |
547 | 547 | ||
548 | #include "Bkmks.h" | 548 | #include "Bkmks.h" |
549 | #include "QTReader.h" | 549 | #include "QTReader.h" |
550 | 550 | ||
551 | void HighlightFilter::refresh(unsigned long pos) | 551 | void HighlightFilter::refresh(unsigned long pos) |
552 | { | 552 | { |
553 | bkmks = pReader->Bkmklist(); | 553 | bkmks = pReader->Bkmklist(); |
554 | 554 | ||
555 | red = green = blue = 255; | 555 | red = green = blue = 255; |
556 | 556 | ||
557 | if (bkmks == NULL) | 557 | if (bkmks == NULL) |
558 | { | 558 | { |
559 | lastpos = 0; | 559 | lastpos = 0; |
560 | nextpos = 0xffffffff; | 560 | nextpos = 0xffffffff; |
561 | } | 561 | } |
562 | else | 562 | else |
563 | { | 563 | { |
564 | lastpos = 0; | 564 | lastpos = 0; |
565 | nextpos = 0xffffffff; | 565 | nextpos = 0xffffffff; |
566 | for (CList<Bkmk>::iterator i = bkmks->begin(); i != bkmks->end(); i++) | 566 | for (CList<Bkmk>::iterator i = bkmks->begin(); i != bkmks->end(); i++) |
567 | { | 567 | { |
568 | if ((*i).value() <= pos && pos < (*i).value2()) | 568 | if ((*i).value() <= pos && pos < (*i).value2()) |
569 | { | 569 | { |
570 | red = i->red(); | 570 | red = i->red(); |
571 | green = i->green(); | 571 | green = i->green(); |
572 | blue = i->blue(); | 572 | blue = i->blue(); |
573 | lastpos = (*i).value(); | 573 | lastpos = (*i).value(); |
574 | nextpos = (*i).value2(); | 574 | nextpos = (*i).value2(); |
575 | break; | 575 | break; |
576 | } | 576 | } |
577 | if ((*i).value() > pos) | 577 | if ((*i).value() > pos) |
578 | { | 578 | { |
579 | nextpos = (*i).value(); | 579 | nextpos = (*i).value(); |
580 | break; | 580 | break; |
581 | } | 581 | } |
582 | lastpos = (*i).value(); | 582 | lastpos = (*i).value(); |
583 | } | 583 | } |
584 | } | 584 | } |
585 | } | 585 | } |
586 | 586 | ||
587 | void HighlightFilter::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 587 | void HighlightFilter::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
588 | { | 588 | { |
589 | parent->getch(ch, sty, pos); | 589 | parent->getch(ch, sty, pos); |
590 | if (bkmks != pReader->Bkmklist() || pos <= lastpos || pos >= nextpos) | 590 | if (bkmks != pReader->Bkmklist() || pos <= lastpos || pos >= nextpos) |
591 | { | 591 | { |
592 | // qDebug("Recalc <%lu, %lu, %lu>", lastpos, pos, nextpos); | 592 | // qDebug("Recalc <%lu, %lu, %lu>", lastpos, pos, nextpos); |
593 | refresh(pos); | 593 | refresh(pos); |
594 | // qDebug("Recalc(2) <%lu, %lu, %lu>", lastpos, pos, nextpos); | 594 | // qDebug("Recalc(2) <%lu, %lu, %lu>", lastpos, pos, nextpos); |
595 | } | 595 | } |
596 | int r = sty.bRed(), g = sty.bGreen(), b = sty.bBlue(); | 596 | int r = sty.bRed(), g = sty.bGreen(), b = sty.bBlue(); |
597 | if (r == 255 && g == 255 && b == 255) | 597 | if (r == 255 && g == 255 && b == 255) |
598 | { | 598 | { |
599 | sty.setBackground(red, green, blue); | 599 | sty.setBackground(red, green, blue); |
600 | } | 600 | } |
601 | } | 601 | } |
602 | 602 | ||
603 | void kern::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 603 | void kern::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
604 | { | 604 | { |
605 | if (uselast) | 605 | if (uselast) |
606 | { | 606 | { |
607 | ch = lastchar; | 607 | ch = lastchar; |
608 | sty = laststy; | 608 | sty = laststy; |
609 | uselast = false; | 609 | uselast = false; |
610 | return; | 610 | return; |
611 | } | 611 | } |
612 | else | 612 | else |
613 | { | 613 | { |
614 | parent->getch(ch, sty, pos); | 614 | parent->getch(ch, sty, pos); |
615 | } | 615 | } |
616 | switch (ch) | 616 | switch (ch) |
617 | { | 617 | { |
618 | case 'f': | 618 | case 'f': |
619 | { | 619 | { |
620 | tchar savedchar = 'f'; | 620 | tchar savedchar = 'f'; |
621 | parent->getch(ch, sty, pos); | 621 | parent->getch(ch, sty, pos); |
622 | switch (ch) | 622 | switch (ch) |
623 | { | 623 | { |
624 | case 'i': | 624 | case 'i': |
625 | ch = (251 << 8) + 1; | 625 | ch = (251 << 8) + 1; |
626 | break; | 626 | break; |
627 | case 'l': | 627 | case 'l': |
628 | ch = (251 << 8) + 2; | 628 | ch = (251 << 8) + 2; |
629 | break; | 629 | break; |
630 | default: | 630 | default: |
631 | lastchar = ch; | 631 | lastchar = ch; |
632 | uselast = true; | 632 | uselast = true; |
633 | laststy = sty; | 633 | laststy = sty; |
634 | ch = savedchar; | 634 | ch = savedchar; |
635 | } | 635 | } |
636 | } | 636 | } |
637 | break; | 637 | break; |
638 | default: | 638 | default: |
639 | break; | 639 | break; |
640 | } | 640 | } |
641 | } | 641 | } |
642 | 642 | ||
643 | class ErrorFilter : public CFilter | 643 | class ErrorFilter : public CFilter |
644 | { | 644 | { |
645 | QString error; | 645 | QString error; |
646 | int currentpos; | 646 | int currentpos; |
647 | public: | 647 | public: |
648 | ErrorFilter(const QString& _s) : error(_s), currentpos(0) {} | 648 | ErrorFilter(const QString& _s) : error(_s), currentpos(0) {} |
649 | ~ErrorFilter() {} | 649 | ~ErrorFilter() {} |
650 | void getch(tchar& ch, CStyle& sty, unsigned long& pos) | 650 | void getch(tchar& ch, CStyle& sty, unsigned long& pos) |
651 | { | 651 | { |
652 | if (currentpos == error.length()) | 652 | if (currentpos == error.length()) |
653 | { | 653 | { |
654 | ch = UEOF; | 654 | ch = UEOF; |
655 | currentpos = 0; | 655 | currentpos = 0; |
656 | } | 656 | } |
657 | else | 657 | else |
658 | { | 658 | { |
659 | ch = error[currentpos++].unicode(); | 659 | ch = error[currentpos++].unicode(); |
660 | } | 660 | } |
661 | } | 661 | } |
662 | QString about() { return parent->about(); } | 662 | QString about() { return parent->about(); } |
663 | }; | 663 | }; |
664 | 664 | ||
665 | #ifndef __STATIC | 665 | #ifndef __STATIC |
666 | ExternFilter::ExternFilter(const QString& nm, const QString& optional) : filt(NULL), handle(NULL) | 666 | ExternFilter::ExternFilter(const QString& nm, const QString& optional) : filt(NULL), handle(NULL) |
667 | { | 667 | { |
668 | #ifdef USEQPE | 668 | #ifdef USEQPE |
669 | #ifdef OPIE | 669 | #ifdef OPIE |
670 | QString filterpath(getenv("OPIEDIR")); | 670 | QString filterpath(getenv("OPIEDIR")); |
671 | #else | 671 | #else |
672 | QString filterpath(getenv("QTDIR")); | 672 | QString filterpath(getenv("QTDIR")); |
673 | #endif | 673 | #endif |
674 | filterpath += "/plugins/reader/filters/lib"; | 674 | filterpath += "/plugins/reader/filters/lib"; |
675 | #else | 675 | #else |
676 | QString filterpath(getenv("READERDIR")); | 676 | QString filterpath(getenv("READERDIR")); |
677 | filterpath += "/filters/lib"; | 677 | filterpath += "/filters/lib"; |
678 | #endif | 678 | #endif |
679 | filterpath += nm; | 679 | filterpath += nm; |
680 | filterpath += ".so"; | 680 | filterpath += ".so"; |
681 | if (QFile::exists(filterpath)) | 681 | if (QFile::exists(filterpath)) |
682 | { | 682 | { |
683 | qDebug("Filter:%s", (const char*)filterpath); | 683 | qDebug("Filter:%s", (const char*)filterpath); |
684 | handle = dlopen(filterpath, RTLD_LAZY); | 684 | handle = dlopen(filterpath, RTLD_LAZY); |
685 | if (handle == 0) | 685 | if (handle == 0) |
686 | { | 686 | { |
687 | qDebug("Can't find filter:%s", dlerror()); | 687 | qDebug("Can't find filter:%s", dlerror()); |
688 | // status = -10; | 688 | // status = -10; |
689 | filt = new ErrorFilter(QString("Can't find plugin:")+nm); | 689 | filt = new ErrorFilter(QString("Can't find plugin:")+nm); |
690 | return; | 690 | return; |
691 | } | 691 | } |
692 | CFilter* (*newfilter)(const QString&); | 692 | CFilter* (*newfilter)(const QString&); |
693 | newfilter = (CFilter* (*)(const QString&))dlsym(handle, "newfilter"); | 693 | newfilter = (CFilter* (*)(const QString&))dlsym(handle, "newfilter"); |
694 | if (newfilter == NULL) | 694 | if (newfilter == NULL) |
695 | { | 695 | { |
696 | qDebug("Can't find newfilter"); | 696 | qDebug("Can't find newfilter"); |
697 | filt = new ErrorFilter(QString("Can't find entry point in plugin:")+nm); | 697 | filt = new ErrorFilter(QString("Can't find entry point in plugin:")+nm); |
698 | return; | 698 | return; |
699 | } | 699 | } |
700 | filt = (*newfilter)(optional); | 700 | filt = (*newfilter)(optional); |
701 | } | 701 | } |
702 | else | 702 | else |
703 | { | 703 | { |
704 | qDebug("No filter path:%s", (const char*)filterpath); | 704 | qDebug("No filter path:%s", (const char*)filterpath); |
705 | filt = new ErrorFilter(QString("No filter plugins installed:")+nm); | 705 | filt = new ErrorFilter(QString("No filter plugins installed:")+nm); |
706 | } | 706 | } |
707 | if (filt == NULL) | 707 | if (filt == NULL) |
708 | { | 708 | { |
709 | qDebug("Can't do newfilter"); | 709 | qDebug("Can't do newfilter"); |
710 | filt = new ErrorFilter(QString("Filter creation failed:")+nm); | 710 | filt = new ErrorFilter(QString("Filter creation failed:")+nm); |
711 | return; | 711 | return; |
712 | } | 712 | } |
713 | } | 713 | } |
714 | #endif | 714 | #endif |
715 | 715 | ||
716 | void makeInverse::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 716 | void makeInverse::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
717 | { | 717 | { |
718 | parent->getch(ch, sty, pos); | 718 | parent->getch(ch, sty, pos); |
719 | int r,g,b; | 719 | int r,g,b; |
720 | r = 255 - sty.Red(), g = 255 - sty.Green(), b = 255 - sty.Blue(); | 720 | r = 255 - sty.Red(), g = 255 - sty.Green(), b = 255 - sty.Blue(); |
721 | sty.setColour(r,g,b); | 721 | sty.setColour(r,g,b); |
722 | r = 255 - sty.bRed(), g = 255 - sty.bGreen(), b = 255 - sty.bBlue(); | 722 | r = 255 - sty.bRed(), g = 255 - sty.bGreen(), b = 255 - sty.bBlue(); |
723 | sty.setBackground(r,g,b); | 723 | sty.setBackground(r,g,b); |
724 | r = 255 - sty.pRed(), g = 255 - sty.pGreen(), b = 255 - sty.pBlue(); | 724 | r = 255 - sty.pRed(), g = 255 - sty.pGreen(), b = 255 - sty.pBlue(); |
725 | sty.setPaper(r,g,b); | 725 | sty.setPaper(r,g,b); |
726 | } | 726 | } |
727 | /* | 727 | /* |
728 | void makeNegative::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 728 | void makeNegative::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
729 | { | 729 | { |
730 | parent->getch(ch, sty, pos); | 730 | parent->getch(ch, sty, pos); |
731 | QColor fg(sty.Red(), sty.Green(), sty.Blue()); | 731 | QColor fg(sty.Red(), sty.Green(), sty.Blue()); |
732 | int h,s,v; | 732 | int h,s,v; |
733 | fg.hsv(&h,&s,&v); | 733 | fg.hsv(&h,&s,&v); |
734 | fg.setHsv(h,s,255-v); | 734 | fg.setHsv(h,s,255-v); |
735 | int r,g,b; | 735 | int r,g,b; |
736 | fg.rgb(&r,&g,&b); | 736 | fg.rgb(&r,&g,&b); |
737 | sty.setColour(r,g,b); | 737 | sty.setColour(r,g,b); |
738 | 738 | ||
739 | fg = QColor(sty.bRed(), sty.bGreen(), sty.bBlue()); | 739 | fg = QColor(sty.bRed(), sty.bGreen(), sty.bBlue()); |
740 | fg.hsv(&h,&s,&v); | 740 | fg.hsv(&h,&s,&v); |
741 | fg.setHsv(h,s,255-v); | 741 | fg.setHsv(h,s,255-v); |
742 | fg.rgb(&r,&g,&b); | 742 | fg.rgb(&r,&g,&b); |
743 | sty.setBackground(r,g,b); | 743 | sty.setBackground(r,g,b); |
744 | } | 744 | } |
745 | */ | 745 | */ |
746 | void setbg::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 746 | void setbg::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
747 | { | 747 | { |
748 | parent->getch(ch, sty, pos); | 748 | parent->getch(ch, sty, pos); |
749 | int r = sty.pRed(), g = sty.pGreen(), b = sty.pBlue(); | 749 | int r = sty.pRed(), g = sty.pGreen(), b = sty.pBlue(); |
750 | if (r == 255 && g == 255 && b == 255) | 750 | if (r == 255 && g == 255 && b == 255) |
751 | { | 751 | { |
752 | sty.setPaper(m_r,m_g,m_b); | 752 | sty.setPaper(m_r,m_g,m_b); |
753 | } | 753 | } |
754 | else | 754 | else |
755 | { | 755 | { |
756 | qDebug("We have background [%x%x%x]", r, g, b); | 756 | qDebug("We have background [%x%x%x]", r, g, b); |
757 | } | 757 | } |
758 | r = sty.bRed(), g = sty.bGreen(), b = sty.bBlue(); | 758 | r = sty.bRed(), g = sty.bGreen(), b = sty.bBlue(); |
759 | if (r == 255 && g == 255 && b == 255) | 759 | if (r == 255 && g == 255 && b == 255) |
760 | { | 760 | { |
761 | sty.setBackground(m_r,m_g,m_b); | 761 | sty.setBackground(m_r,m_g,m_b); |
762 | } | 762 | } |
763 | else | 763 | else |
764 | { | 764 | { |
765 | qDebug("We have background [%x%x%x]", r, g, b); | 765 | qDebug("We have background [%x%x%x]", r, g, b); |
766 | } | 766 | } |
767 | } | 767 | } |
768 | 768 | ||
769 | void setfg::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 769 | void setfg::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
770 | { | 770 | { |
771 | parent->getch(ch, sty, pos); | 771 | parent->getch(ch, sty, pos); |
772 | int r = sty.Red(), g = sty.Green(), b = sty.Blue(); | 772 | int r = sty.Red(), g = sty.Green(), b = sty.Blue(); |
773 | if (r == 0 && g == 0 && b == 0) | 773 | if (r == 0 && g == 0 && b == 0) |
774 | { | 774 | { |
775 | sty.setColour(m_r,m_g,m_b); | 775 | sty.setColour(m_r,m_g,m_b); |
776 | } | 776 | } |
777 | } | 777 | } |
778 | 778 | ||
779 | #include "CRegExp.h" | 779 | #include "CRegExp.h" |
780 | 780 | ||
781 | repara::repara(const QString& pat) : tch(0) | 781 | repara::repara(const QString& pat) : tch(0) |
782 | { | 782 | { |
783 | // QString pat("{\\n[A-Z\"]}"); | 783 | // QString pat("{\\n[A-Z\"]}"); |
784 | flt = new CRegExpFilt(pat, false); | 784 | flt = new CRegExpFilt(pat, false); |
785 | qDebug("Construction done"); | 785 | qDebug("Construction done"); |
786 | } | 786 | } |
787 | 787 | ||
788 | repara::~repara() | 788 | repara::~repara() |
789 | { | 789 | { |
790 | delete flt; | 790 | delete flt; |
791 | } | 791 | } |
792 | 792 | ||
793 | void repara::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 793 | void repara::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
794 | { | 794 | { |
795 | if (flt->empty()) | 795 | if (flt->empty()) |
796 | { | 796 | { |
797 | while (flt->empty()) | 797 | while (flt->empty()) |
798 | { | 798 | { |
799 | parent->getch(ch, sty, pos); | 799 | parent->getch(ch, sty, pos); |
800 | flt->addch(ch); | 800 | flt->addch(ch); |
801 | } | 801 | } |
802 | } | 802 | } |
803 | ch = flt->pop(); | 803 | ch = flt->pop(); |
804 | /* | 804 | /* |
805 | parent->getch(ch, sty, pos); | 805 | parent->getch(ch, sty, pos); |
806 | if (ch == 10 || ch == ' ') | 806 | if (ch == 10 || ch == ' ') |
807 | { | 807 | { |
808 | if (tch == 10) | 808 | if (tch == 10) |
809 | { | 809 | { |
810 | tch = ch; | 810 | tch = ch; |
811 | ch = 10; | 811 | ch = 10; |
812 | return; | 812 | return; |
813 | } | 813 | } |
814 | else | 814 | else |
815 | { | 815 | { |
816 | tch = ch; | 816 | tch = ch; |
817 | ch = ' '; | 817 | ch = ' '; |
818 | return; | 818 | return; |
819 | } | 819 | } |
820 | } | 820 | } |
821 | tch = ch; | 821 | tch = ch; |
822 | */ | 822 | */ |
823 | return; | 823 | return; |
824 | } | 824 | } |
825 | 825 | ||
826 | void tableLink::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 826 | void tableLink::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
827 | { | 827 | { |
828 | if (offset >= (int)text.length()) | 828 | if (offset >= (int)text.length()) |
829 | { | 829 | { |
830 | offset = -1; | 830 | offset = -1; |
831 | sty.setColour(m_r, m_g, m_b); | 831 | sty.setColour(m_r, m_g, m_b); |
832 | do | 832 | do |
833 | { | 833 | { |
834 | parent->getch(ch, sty, pos); | 834 | parent->getch(ch, sty, pos); |
835 | } | 835 | } |
836 | while (sty.isTable()); | 836 | while (sty.isTable()); |
837 | return; | 837 | return; |
838 | } | 838 | } |
839 | if (offset >= 0) | 839 | if (offset >= 0) |
840 | { | 840 | { |
841 | ch = text[offset++].unicode(); | 841 | ch = text[offset++].unicode(); |
842 | return; | 842 | return; |
843 | } | 843 | } |
844 | parent->getch(ch, sty, pos); | 844 | parent->getch(ch, sty, pos); |
845 | if (sty.isTable()) | 845 | if (sty.isTable()) |
846 | { | 846 | { |
847 | offset = 1; | 847 | offset = 1; |
848 | ch = text[0].unicode(); | 848 | ch = text[0].unicode(); |
849 | m_r = sty.Red(), m_g = sty.Green(), m_b = sty.Blue(); | 849 | m_r = sty.Red(), m_g = sty.Green(), m_b = sty.Blue(); |
850 | sty.setColour(255, 0, 0); | 850 | sty.setColour(255, 0, 0); |
851 | } | 851 | } |
852 | return; | 852 | return; |
853 | } | 853 | } |
854 | 854 | ||
855 | void underlineLink::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 855 | void underlineLink::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
856 | { | 856 | { |
857 | parent->getch(ch, sty, pos); | 857 | parent->getch(ch, sty, pos); |
858 | if (sty.getLink()) sty.setUnderline(); | 858 | if (sty.getLink()) sty.setUnderline(); |
859 | //if (isLink && !sty.getLink()) sty.unsetUnderline(); | 859 | //if (isLink && !sty.getLink()) sty.unsetUnderline(); |
860 | //isLink = sty.getLink(); | 860 | //isLink = sty.getLink(); |
861 | } | 861 | } |
diff --git a/noncore/apps/opie-reader/CRegExp.cpp b/noncore/apps/opie-reader/CRegExp.cpp index 6318d28..e3194df 100644 --- a/noncore/apps/opie-reader/CRegExp.cpp +++ b/noncore/apps/opie-reader/CRegExp.cpp | |||
@@ -1,599 +1,599 @@ | |||
1 | #include "CRegExp.h" | 1 | #include "CRegExp.h" |
2 | 2 | ||
3 | //#include <stdio.h> | 3 | //#include <stdio.h> |
4 | #include <stdlib.h> | 4 | #include <stdlib.h> |
5 | //#include <string.h> | 5 | //#include <string.h> |
6 | 6 | ||
7 | 7 | ||
8 | tchar CRegExpFilt::escapedchar(tchar c) | 8 | tchar CRegExpFilt::escapedchar(tchar c) |
9 | { | 9 | { |
10 | switch (c) | 10 | switch (c) |
11 | { | 11 | { |
12 | case '\\': | 12 | case '\\': |
13 | return '\\'; | 13 | return '\\'; |
14 | break; | 14 | break; |
15 | case '"': | 15 | case '"': |
16 | return '\"'; | 16 | return '\"'; |
17 | break; | 17 | break; |
18 | case 'a': | 18 | case 'a': |
19 | return '\a'; | 19 | return '\a'; |
20 | break; | 20 | break; |
21 | case 'b': | 21 | case 'b': |
22 | return '\b'; | 22 | return '\b'; |
23 | break; | 23 | break; |
24 | case 'f': | 24 | case 'f': |
25 | return '\f'; | 25 | return '\f'; |
26 | break; | 26 | break; |
27 | case 'n': | 27 | case 'n': |
28 | return '\n'; | 28 | return '\n'; |
29 | break; | 29 | break; |
30 | case 'r': | 30 | case 'r': |
31 | return '\r'; | 31 | return '\r'; |
32 | break; | 32 | break; |
33 | case 't': | 33 | case 't': |
34 | return '\t'; | 34 | return '\t'; |
35 | break; | 35 | break; |
36 | case 'v': | 36 | case 'v': |
37 | return '\v'; | 37 | return '\v'; |
38 | break; | 38 | break; |
39 | default: | 39 | default: |
40 | return c; | 40 | return c; |
41 | break; | 41 | break; |
42 | } | 42 | } |
43 | } | 43 | } |
44 | 44 | ||
45 | void CRegExpFilt::regchar(tchar c, bool insens) | 45 | void CRegExpFilt::regchar(tchar c, bool insens) |
46 | { | 46 | { |
47 | if (insens) | 47 | if (insens) |
48 | { | 48 | { |
49 | tchar t = upper(c); | 49 | tchar t = upper(c); |
50 | CV[t] = 0; | 50 | CV[t] = 0; |
51 | t = lower(c); | 51 | t = lower(c); |
52 | CV[t] = 0; | 52 | CV[t] = 0; |
53 | } | 53 | } |
54 | else | 54 | else |
55 | { | 55 | { |
56 | CV[c] = 0; | 56 | CV[c] = 0; |
57 | } | 57 | } |
58 | } | 58 | } |
59 | 59 | ||
60 | void CRegExpFilt::prepreprocessing(const QString& pat, bool insens) | 60 | void CRegExpFilt::prepreprocessing(const QString& pat, bool insens) |
61 | { | 61 | { |
62 | for (unsigned int p = 0; p < pat.length(); p++) | 62 | for (unsigned int p = 0; p < pat.length(); p++) |
63 | { | 63 | { |
64 | #ifdef _WINDOWS | 64 | #ifdef _WINDOWS |
65 | switch (pat.at(p).unicode()) | 65 | switch (pat.at(p).unicode()) |
66 | #else | 66 | #else |
67 | switch (pat[p].unicode()) | 67 | switch (pat[p].unicode()) |
68 | #endif | 68 | #endif |
69 | { | 69 | { |
70 | case '{': | 70 | case '{': |
71 | { | 71 | { |
72 | break; | 72 | break; |
73 | } | 73 | } |
74 | case '}': | 74 | case '}': |
75 | { | 75 | { |
76 | break; | 76 | break; |
77 | } | 77 | } |
78 | case '^': | 78 | case '^': |
79 | { | 79 | { |
80 | break; | 80 | break; |
81 | } | 81 | } |
82 | case '.' : | 82 | case '.' : |
83 | { | 83 | { |
84 | break; | 84 | break; |
85 | } | 85 | } |
86 | case '#': | 86 | case '#': |
87 | { | 87 | { |
88 | p++; | 88 | p++; |
89 | #ifdef _WINDOWS | 89 | #ifdef _WINDOWS |
90 | while ('0' <= pat.at(p).unicode() && pat.at(p).unicode() <= '9') | 90 | while ('0' <= pat.at(p).unicode() && pat.at(p).unicode() <= '9') |
91 | #else | 91 | #else |
92 | while ('0' <= pat[p].unicode() && pat[p].unicode() <= '9') | 92 | while ('0' <= pat[p].unicode() && pat[p].unicode() <= '9') |
93 | #endif | 93 | #endif |
94 | { | 94 | { |
95 | } | 95 | } |
96 | p--; | 96 | p--; |
97 | break; | 97 | break; |
98 | } | 98 | } |
99 | case '\\' : | 99 | case '\\' : |
100 | { | 100 | { |
101 | #ifdef _WINDOWS | 101 | #ifdef _WINDOWS |
102 | tchar c = escapedchar(pat.at(++p).unicode()); | 102 | tchar c = escapedchar(pat.at(++p).unicode()); |
103 | #else | 103 | #else |
104 | tchar c = escapedchar(pat[++p].unicode()); | 104 | tchar c = escapedchar(pat[++p].unicode()); |
105 | #endif | 105 | #endif |
106 | regchar(c, insens); | 106 | regchar(c, insens); |
107 | break; | 107 | break; |
108 | } | 108 | } |
109 | 109 | ||
110 | case '[' : | 110 | case '[' : |
111 | { | 111 | { |
112 | tchar clast; | 112 | tchar clast = 0; |
113 | bool invert = false; | 113 | bool invert = false; |
114 | tchar c; | 114 | tchar c; |
115 | #ifdef _WINDOWS | 115 | #ifdef _WINDOWS |
116 | if (pat.at(p+1).unicode() == '^') | 116 | if (pat.at(p+1).unicode() == '^') |
117 | #else | 117 | #else |
118 | if (pat[p+1].unicode() == '^') | 118 | if (pat[p+1].unicode() == '^') |
119 | #endif | 119 | #endif |
120 | { | 120 | { |
121 | p++; | 121 | p++; |
122 | invert = true; | 122 | invert = true; |
123 | } | 123 | } |
124 | #ifdef _WINDOWS | 124 | #ifdef _WINDOWS |
125 | while ((c = pat.at(++p).unicode()) != ']') | 125 | while ((c = pat.at(++p).unicode()) != ']') |
126 | #else | 126 | #else |
127 | while ((c = pat[++p].unicode()) != ']') | 127 | while ((c = pat[++p].unicode()) != ']') |
128 | #endif | 128 | #endif |
129 | { | 129 | { |
130 | if (c == '\\') | 130 | if (c == '\\') |
131 | { | 131 | { |
132 | #ifdef _WINDOWS | 132 | #ifdef _WINDOWS |
133 | c = escapedchar(pat.at(++p).unicode()); | 133 | c = escapedchar(pat.at(++p).unicode()); |
134 | #else | 134 | #else |
135 | c = escapedchar(pat[++p].unicode()); | 135 | c = escapedchar(pat[++p].unicode()); |
136 | #endif | 136 | #endif |
137 | if (c == ']') break; | 137 | if (c == ']') break; |
138 | } | 138 | } |
139 | if (c == '-') | 139 | if (c == '-') |
140 | { | 140 | { |
141 | #ifdef _WINDOWS | 141 | #ifdef _WINDOWS |
142 | c = pat.at(++p).unicode(); | 142 | c = pat.at(++p).unicode(); |
143 | #else | 143 | #else |
144 | c = pat[++p].unicode(); | 144 | c = pat[++p].unicode(); |
145 | #endif | 145 | #endif |
146 | for (tchar j = clast; j <= c; j++) | 146 | for (tchar j = clast; j <= c; j++) |
147 | { | 147 | { |
148 | regchar(j, insens); | 148 | regchar(j, insens); |
149 | } | 149 | } |
150 | } | 150 | } |
151 | else | 151 | else |
152 | { | 152 | { |
153 | regchar(c, insens); | 153 | regchar(c, insens); |
154 | } | 154 | } |
155 | clast = c; | 155 | clast = c; |
156 | } | 156 | } |
157 | break; | 157 | break; |
158 | } | 158 | } |
159 | default : | 159 | default : |
160 | { | 160 | { |
161 | #ifdef _WINDOWS | 161 | #ifdef _WINDOWS |
162 | regchar(pat.at(p).unicode(), insens); | 162 | regchar(pat.at(p).unicode(), insens); |
163 | #else | 163 | #else |
164 | regchar(pat[p].unicode(), insens); | 164 | regchar(pat[p].unicode(), insens); |
165 | #endif | 165 | #endif |
166 | break; | 166 | break; |
167 | } | 167 | } |
168 | } | 168 | } |
169 | } | 169 | } |
170 | /* | 170 | /* |
171 | for (iter i = CV.begin(); i != CV.end(); ++i) | 171 | for (iter i = CV.begin(); i != CV.end(); ++i) |
172 | { | 172 | { |
173 | printf("Pre: [%u]\n", i.first()); | 173 | printf("Pre: [%u]\n", i.first()); |
174 | } | 174 | } |
175 | */ | 175 | */ |
176 | CV[0] = 0; | 176 | CV[0] = 0; |
177 | } | 177 | } |
178 | 178 | ||
179 | unsigned int CRegExpFilt::preprocessing(const QString& pat, bool insens) | 179 | unsigned int CRegExpFilt::preprocessing(const QString& pat, bool insens) |
180 | { | 180 | { |
181 | prepreprocessing(pat, insens); | 181 | prepreprocessing(pat, insens); |
182 | qDebug("PrePreProcessing done"); | 182 | qDebug("PrePreProcessing done"); |
183 | unsigned int p, m; | 183 | unsigned int p, m; |
184 | bool inkeep = false; | 184 | bool inkeep = false; |
185 | keep = 0; | 185 | keep = 0; |
186 | replace = 0; | 186 | replace = 0; |
187 | for (unsigned int j = 0; j < WORD_SIZE; j++) | 187 | for (unsigned int j = 0; j < WORD_SIZE; j++) |
188 | { | 188 | { |
189 | bit[j] = (1 << (WORD_SIZE -j -1)); | 189 | bit[j] = (1 << (WORD_SIZE -j -1)); |
190 | lfcnt[j] = 0; | 190 | lfcnt[j] = 0; |
191 | } | 191 | } |
192 | 192 | ||
193 | for (p = 0, m = 0; p < pat.length(); p++) | 193 | for (p = 0, m = 0; p < pat.length(); p++) |
194 | { | 194 | { |
195 | qDebug("m is %u", m); | 195 | qDebug("m is %u", m); |
196 | if (inkeep) keep |= bit[m]; | 196 | if (inkeep) keep |= bit[m]; |
197 | #ifdef _WINDOWS | 197 | #ifdef _WINDOWS |
198 | switch (pat.at(p).unicode()) | 198 | switch (pat.at(p).unicode()) |
199 | #else | 199 | #else |
200 | switch (pat[p].unicode()) | 200 | switch (pat[p].unicode()) |
201 | #endif | 201 | #endif |
202 | { | 202 | { |
203 | case '{': | 203 | case '{': |
204 | { | 204 | { |
205 | inkeep = true; | 205 | inkeep = true; |
206 | break; | 206 | break; |
207 | } | 207 | } |
208 | case '}': | 208 | case '}': |
209 | { | 209 | { |
210 | keep ^= bit[m]; | 210 | keep ^= bit[m]; |
211 | inkeep = false; | 211 | inkeep = false; |
212 | break; | 212 | break; |
213 | } | 213 | } |
214 | case '^': | 214 | case '^': |
215 | { | 215 | { |
216 | replace |= bit[m]; | 216 | replace |= bit[m]; |
217 | lfcnt[m]++; | 217 | lfcnt[m]++; |
218 | break; | 218 | break; |
219 | } | 219 | } |
220 | case '.' : | 220 | case '.' : |
221 | { | 221 | { |
222 | for (iter j = CV.begin(); j != CV.end(); ++j) CV[j.first()] |= bit[m]; | 222 | for (iter j = CV.begin(); j != CV.end(); ++j) CV[j.first()] |= bit[m]; |
223 | m++; | 223 | m++; |
224 | break; | 224 | break; |
225 | } | 225 | } |
226 | case '#': | 226 | case '#': |
227 | { | 227 | { |
228 | if (m > 0) | 228 | if (m > 0) |
229 | { | 229 | { |
230 | p++; | 230 | p++; |
231 | int count = 0; | 231 | int count = 0; |
232 | #ifdef _WINDOWS | 232 | #ifdef _WINDOWS |
233 | while ('0' <= pat.at(p).unicode() && pat.at(p).unicode() <= '9') | 233 | while ('0' <= pat.at(p).unicode() && pat.at(p).unicode() <= '9') |
234 | #else | 234 | #else |
235 | while ('0' <= pat[p].unicode() && pat[p].unicode() <= '9') | 235 | while ('0' <= pat[p].unicode() && pat[p].unicode() <= '9') |
236 | #endif | 236 | #endif |
237 | { | 237 | { |
238 | #ifdef _WINDOWS | 238 | #ifdef _WINDOWS |
239 | count = 10*count + pat.at(p++).unicode() - '0'; | 239 | count = 10*count + pat.at(p++).unicode() - '0'; |
240 | #else | 240 | #else |
241 | count = 10*count + pat[p++].unicode() - '0'; | 241 | count = 10*count + pat[p++].unicode() - '0'; |
242 | #endif | 242 | #endif |
243 | } | 243 | } |
244 | p--; | 244 | p--; |
245 | count = count-1; | 245 | count = count-1; |
246 | unsigned int mask = 0; | 246 | unsigned int mask = 0; |
247 | for (unsigned int i = m; i < m+count; i++) | 247 | for (unsigned int i = m; i < m+count; i++) |
248 | { | 248 | { |
249 | mask |= bit[i]; | 249 | mask |= bit[i]; |
250 | } | 250 | } |
251 | 251 | ||
252 | for (iter it = CV.begin(); it != CV.end(); ++it) | 252 | for (iter it = CV.begin(); it != CV.end(); ++it) |
253 | { | 253 | { |
254 | if (CV[it.first()] & bit[m-1]) | 254 | if (CV[it.first()] & bit[m-1]) |
255 | { | 255 | { |
256 | CV[it.first()] |= mask; | 256 | CV[it.first()] |= mask; |
257 | } | 257 | } |
258 | } | 258 | } |
259 | if (keep & bit[m-1]) keep |= mask; | 259 | if (keep & bit[m-1]) keep |= mask; |
260 | m += count; | 260 | m += count; |
261 | } | 261 | } |
262 | else | 262 | else |
263 | { | 263 | { |
264 | p++; | 264 | p++; |
265 | } | 265 | } |
266 | break; | 266 | break; |
267 | } | 267 | } |
268 | case '\\' : | 268 | case '\\' : |
269 | { | 269 | { |
270 | #ifdef _WINDOWS | 270 | #ifdef _WINDOWS |
271 | tchar c = escapedchar(pat.at(++p).unicode()); | 271 | tchar c = escapedchar(pat.at(++p).unicode()); |
272 | #else | 272 | #else |
273 | tchar c = escapedchar(pat[++p].unicode()); | 273 | tchar c = escapedchar(pat[++p].unicode()); |
274 | #endif | 274 | #endif |
275 | if (insens) | 275 | if (insens) |
276 | { | 276 | { |
277 | CV[upper(c)] |= bit[m]; | 277 | CV[upper(c)] |= bit[m]; |
278 | CV[lower(c)] |= bit[m]; | 278 | CV[lower(c)] |= bit[m]; |
279 | } | 279 | } |
280 | else | 280 | else |
281 | { | 281 | { |
282 | CV[c] |= bit[m]; | 282 | CV[c] |= bit[m]; |
283 | } | 283 | } |
284 | m++; | 284 | m++; |
285 | break; | 285 | break; |
286 | } | 286 | } |
287 | 287 | ||
288 | case '[' : | 288 | case '[' : |
289 | { | 289 | { |
290 | tchar c, clast; | 290 | tchar c, clast = 0; |
291 | bool invert = false; | 291 | bool invert = false; |
292 | #ifdef _WINDOWS | 292 | #ifdef _WINDOWS |
293 | if (pat.at(p+1).unicode() == '^') | 293 | if (pat.at(p+1).unicode() == '^') |
294 | #else | 294 | #else |
295 | if (pat[p+1].unicode() == '^') | 295 | if (pat[p+1].unicode() == '^') |
296 | #endif | 296 | #endif |
297 | { | 297 | { |
298 | p++; | 298 | p++; |
299 | invert = true; | 299 | invert = true; |
300 | } | 300 | } |
301 | #ifdef _WINDOWS | 301 | #ifdef _WINDOWS |
302 | while ((c = pat.at(++p).unicode()) != ']') | 302 | while ((c = pat.at(++p).unicode()) != ']') |
303 | #else | 303 | #else |
304 | while ((c = pat[++p].unicode()) != ']') | 304 | while ((c = pat[++p].unicode()) != ']') |
305 | #endif | 305 | #endif |
306 | { | 306 | { |
307 | if (c == '\\') | 307 | if (c == '\\') |
308 | { | 308 | { |
309 | #ifdef _WINDOWS | 309 | #ifdef _WINDOWS |
310 | c = escapedchar(pat.at(++p).unicode()); | 310 | c = escapedchar(pat.at(++p).unicode()); |
311 | #else | 311 | #else |
312 | c = escapedchar(pat[++p].unicode()); | 312 | c = escapedchar(pat[++p].unicode()); |
313 | #endif | 313 | #endif |
314 | if (c == ']') break; | 314 | if (c == ']') break; |
315 | } | 315 | } |
316 | if (c == '-') | 316 | if (c == '-') |
317 | { | 317 | { |
318 | #ifdef _WINDOWS | 318 | #ifdef _WINDOWS |
319 | c = pat.at(++p).unicode(); | 319 | c = pat.at(++p).unicode(); |
320 | #else | 320 | #else |
321 | c = pat[++p].unicode(); | 321 | c = pat[++p].unicode(); |
322 | #endif | 322 | #endif |
323 | for (tchar j = clast; j <= c; j++) | 323 | for (tchar j = clast; j <= c; j++) |
324 | { | 324 | { |
325 | if (insens) | 325 | if (insens) |
326 | { | 326 | { |
327 | iter it; | 327 | iter it; |
328 | if ((it = CV.find(upper(j))) != CV.end()) | 328 | if ((it = CV.find(upper(j))) != CV.end()) |
329 | CV[it] |= bit[m]; | 329 | CV[it] |= bit[m]; |
330 | else | 330 | else |
331 | CV[0] |= bit[m]; | 331 | CV[0] |= bit[m]; |
332 | if ((it = CV.find(lower(j))) != CV.end()) | 332 | if ((it = CV.find(lower(j))) != CV.end()) |
333 | CV[it] |= bit[m]; | 333 | CV[it] |= bit[m]; |
334 | else | 334 | else |
335 | CV[0] |= bit[m]; | 335 | CV[0] |= bit[m]; |
336 | } | 336 | } |
337 | else | 337 | else |
338 | { | 338 | { |
339 | iter it; | 339 | iter it; |
340 | if ((it = CV.find(j)) != CV.end()) | 340 | if ((it = CV.find(j)) != CV.end()) |
341 | CV[it] |= bit[m]; | 341 | CV[it] |= bit[m]; |
342 | else | 342 | else |
343 | { | 343 | { |
344 | CV[0] |= bit[m]; | 344 | CV[0] |= bit[m]; |
345 | } | 345 | } |
346 | } | 346 | } |
347 | } | 347 | } |
348 | } | 348 | } |
349 | else | 349 | else |
350 | { | 350 | { |
351 | if (insens) | 351 | if (insens) |
352 | { | 352 | { |
353 | iter it; | 353 | iter it; |
354 | if ((it = CV.find(upper(c))) != CV.end()) | 354 | if ((it = CV.find(upper(c))) != CV.end()) |
355 | CV[it] |= bit[m]; | 355 | CV[it] |= bit[m]; |
356 | else | 356 | else |
357 | CV[0] |= bit[m]; | 357 | CV[0] |= bit[m]; |
358 | if ((it = CV.find(lower(c))) != CV.end()) | 358 | if ((it = CV.find(lower(c))) != CV.end()) |
359 | CV[it] |= bit[m]; | 359 | CV[it] |= bit[m]; |
360 | else | 360 | else |
361 | CV[0] |= bit[m]; | 361 | CV[0] |= bit[m]; |
362 | } | 362 | } |
363 | else | 363 | else |
364 | { | 364 | { |
365 | iter it; | 365 | iter it; |
366 | if ((it = CV.find(c)) != CV.end()) | 366 | if ((it = CV.find(c)) != CV.end()) |
367 | CV[it] |= bit[m]; | 367 | CV[it] |= bit[m]; |
368 | else | 368 | else |
369 | CV[0] |= bit[m]; | 369 | CV[0] |= bit[m]; |
370 | } | 370 | } |
371 | } | 371 | } |
372 | clast = c; | 372 | clast = c; |
373 | } | 373 | } |
374 | if (invert) | 374 | if (invert) |
375 | { | 375 | { |
376 | for (iter i = CV.begin(); i != CV.end(); ++i) | 376 | for (iter i = CV.begin(); i != CV.end(); ++i) |
377 | { | 377 | { |
378 | CV[i.first()] ^= bit[m]; | 378 | CV[i.first()] ^= bit[m]; |
379 | } | 379 | } |
380 | } | 380 | } |
381 | m++; | 381 | m++; |
382 | break; | 382 | break; |
383 | } | 383 | } |
384 | default : | 384 | default : |
385 | { | 385 | { |
386 | #ifdef _WINDOWS | 386 | #ifdef _WINDOWS |
387 | tchar c = pat.at(p).unicode(); | 387 | tchar c = pat.at(p).unicode(); |
388 | #else | 388 | #else |
389 | tchar c = pat[p].unicode(); | 389 | tchar c = pat[p].unicode(); |
390 | #endif | 390 | #endif |
391 | if (insens) | 391 | if (insens) |
392 | { | 392 | { |
393 | CV[upper(c)] |= bit[m]; | 393 | CV[upper(c)] |= bit[m]; |
394 | CV[lower(c)] |= bit[m]; | 394 | CV[lower(c)] |= bit[m]; |
395 | } | 395 | } |
396 | else CV[c] |= bit[m]; | 396 | else CV[c] |= bit[m]; |
397 | m++; | 397 | m++; |
398 | break; | 398 | break; |
399 | } | 399 | } |
400 | } | 400 | } |
401 | } | 401 | } |
402 | qDebug("Returning:%u",m); | 402 | qDebug("Returning:%u",m); |
403 | return m; | 403 | return m; |
404 | } | 404 | } |
405 | 405 | ||
406 | bool CRegExpFilt::empty() | 406 | bool CRegExpFilt::empty() |
407 | { | 407 | { |
408 | return m_outQueue.empty(); | 408 | return m_outQueue.empty(); |
409 | } | 409 | } |
410 | 410 | ||
411 | tchar CRegExpFilt::pop() | 411 | tchar CRegExpFilt::pop() |
412 | { | 412 | { |
413 | return m_outQueue.pop(); | 413 | return m_outQueue.pop(); |
414 | } | 414 | } |
415 | 415 | ||
416 | bool CRegExpFilt::addch(tchar ch) | 416 | bool CRegExpFilt::addch(tchar ch) |
417 | { | 417 | { |
418 | word[cur] = ch; | 418 | word[cur] = ch; |
419 | cur = (cur+1)%patlength; | 419 | cur = (cur+1)%patlength; |
420 | if (len < patlength) len++; | 420 | if (len < patlength) len++; |
421 | 421 | ||
422 | unsigned int cv = 0; | 422 | unsigned int cv = 0; |
423 | iter it; | 423 | iter it; |
424 | if ((it = CV.find(ch)) == CV.end()) | 424 | if ((it = CV.find(ch)) == CV.end()) |
425 | { | 425 | { |
426 | cv = CV[0]; | 426 | cv = CV[0]; |
427 | } | 427 | } |
428 | else | 428 | else |
429 | { | 429 | { |
430 | cv = CV[it]; | 430 | cv = CV[it]; |
431 | } | 431 | } |
432 | 432 | ||
433 | R = ((R >> 1) | bit_0) & cv; /* Exact matches */ | 433 | R = ((R >> 1) | bit_0) & cv; /* Exact matches */ |
434 | if (R & endpos) | 434 | if (R & endpos) |
435 | { | 435 | { |
436 | for (unsigned int i = 0; i < patlength; i++) | 436 | for (unsigned int i = 0; i < patlength; i++) |
437 | { | 437 | { |
438 | if (replace & bit[i]) | 438 | if (replace & bit[i]) |
439 | { | 439 | { |
440 | for (unsigned int j = 0; j < lfcnt[i]; j++) | 440 | for (unsigned int j = 0; j < lfcnt[i]; j++) |
441 | { | 441 | { |
442 | m_outQueue.push(10); | 442 | m_outQueue.push(10); |
443 | } | 443 | } |
444 | } | 444 | } |
445 | if (keep & bit[i]) | 445 | if (keep & bit[i]) |
446 | { | 446 | { |
447 | m_outQueue.push(word[(cur+i)%patlength]); | 447 | m_outQueue.push(word[(cur+i)%patlength]); |
448 | // putchar('*'); | 448 | // putchar('*'); |
449 | // putchar(i + '0'); | 449 | // putchar(i + '0'); |
450 | } | 450 | } |
451 | len = 0; | 451 | len = 0; |
452 | } | 452 | } |
453 | return true; | 453 | return true; |
454 | } | 454 | } |
455 | else | 455 | else |
456 | { | 456 | { |
457 | if (len == patlength) | 457 | if (len == patlength) |
458 | { | 458 | { |
459 | tchar ch = word[cur]; | 459 | tchar ch = word[cur]; |
460 | if (ch == 10) ch = ' '; | 460 | if (ch == 10) ch = ' '; |
461 | m_outQueue.push(ch); | 461 | m_outQueue.push(ch); |
462 | } | 462 | } |
463 | return false; | 463 | return false; |
464 | } | 464 | } |
465 | } | 465 | } |
466 | 466 | ||
467 | void CRegExpFilt::restart() | 467 | void CRegExpFilt::restart() |
468 | { | 468 | { |
469 | R = 0; | 469 | R = 0; |
470 | len = 0; | 470 | len = 0; |
471 | } | 471 | } |
472 | 472 | ||
473 | CRegExpFilt::CRegExpFilt(const QString& pat, bool insensflag) : CV(300) | 473 | CRegExpFilt::CRegExpFilt(const QString& pat, bool insensflag) : CV(300) |
474 | { | 474 | { |
475 | cur = 0; | 475 | cur = 0; |
476 | patlength = preprocessing(pat, insensflag); | 476 | patlength = preprocessing(pat, insensflag); |
477 | qDebug("Preprocesing done:%u", patlength); | 477 | qDebug("Preprocesing done:%u", patlength); |
478 | endpos = bit[patlength-1]; | 478 | endpos = bit[patlength-1]; |
479 | bit_0 = bit[0]; | 479 | bit_0 = bit[0]; |
480 | 480 | ||
481 | restart(); | 481 | restart(); |
482 | 482 | ||
483 | qDebug("Pattern: %s:%u", (const char*)pat, patlength); | 483 | qDebug("Pattern: %s:%u", (const char*)pat, patlength); |
484 | 484 | ||
485 | } | 485 | } |
486 | 486 | ||
487 | 487 | ||
488 | CRegExpFilt::~CRegExpFilt() | 488 | CRegExpFilt::~CRegExpFilt() |
489 | { | 489 | { |
490 | } | 490 | } |
491 | 491 | ||
492 | #ifdef NOWAYISTHISDEFINED | 492 | #ifdef NOWAYISTHISDEFINED |
493 | void reportmatch(tchar *line, /*tchar *text,*/ unsigned int mtype, unsigned int lino) | 493 | void reportmatch(tchar *line, /*tchar *text,*/ unsigned int mtype, unsigned int lino) |
494 | { | 494 | { |
495 | /* | 495 | /* |
496 | tchar *text = line + strlen(line); | 496 | tchar *text = line + strlen(line); |
497 | 497 | ||
498 | tchar *ptr = line; | 498 | tchar *ptr = line; |
499 | if (mtype == 0) | 499 | if (mtype == 0) |
500 | printf("Exact match at line number %u.\n", lino); | 500 | printf("Exact match at line number %u.\n", lino); |
501 | else | 501 | else |
502 | printf("%u error match at line number %u.\n", mtype, lino); | 502 | printf("%u error match at line number %u.\n", mtype, lino); |
503 | while (ptr < text) putchar(*ptr++); | 503 | while (ptr < text) putchar(*ptr++); |
504 | printf("%c[4m^%c[24m%s\n", 27, 27, ptr); | 504 | printf("%c[4m^%c[24m%s\n", 27, 27, ptr); |
505 | */ | 505 | */ |
506 | } | 506 | } |
507 | 507 | ||
508 | 508 | ||
509 | void usage(void) | 509 | void usage(void) |
510 | { | 510 | { |
511 | printf("Usage: CRegExpFilt [-i] pattern/a file\n"); | 511 | printf("Usage: CRegExpFilt [-i] pattern/a file\n"); |
512 | } | 512 | } |
513 | 513 | ||
514 | int getline(tchar *s,int lim,FILE *f) | 514 | int getline(tchar *s,int lim,FILE *f) |
515 | { | 515 | { |
516 | int c, i; | 516 | int c, i; |
517 | 517 | ||
518 | for (i = 0; i < lim-1 && (c = getc(f)) != EOF && c != '\n'; ) | 518 | for (i = 0; i < lim-1 && (c = getc(f)) != EOF && c != '\n'; ) |
519 | { | 519 | { |
520 | s[i++] = (tchar)c; | 520 | s[i++] = (tchar)c; |
521 | } | 521 | } |
522 | s[i] = '\0'; | 522 | s[i] = '\0'; |
523 | return ((c == EOF && i == 0) ? -1 : i); | 523 | return ((c == EOF && i == 0) ? -1 : i); |
524 | } | 524 | } |
525 | 525 | ||
526 | #define BUF_SIZE256 | 526 | #define BUF_SIZE256 |
527 | 527 | ||
528 | int main(int argc, char **argv) | 528 | int main(int argc, char **argv) |
529 | { | 529 | { |
530 | unsigned int lino = 0; | 530 | unsigned int lino = 0; |
531 | unsigned int blino = 0; | 531 | unsigned int blino = 0; |
532 | bool insens = false; | 532 | bool insens = false; |
533 | int len; | 533 | int len; |
534 | tchar line[BUF_SIZE]; | 534 | tchar line[BUF_SIZE]; |
535 | FILE *inf; | 535 | FILE *inf; |
536 | 536 | ||
537 | /* Error checking of cmd ln args! */ | 537 | /* Error checking of cmd ln args! */ |
538 | if (argc < 3) | 538 | if (argc < 3) |
539 | {usage(); return 10; } | 539 | {usage(); return 10; } |
540 | /* Corresponds to requiring a minimum of 3 matches */ | 540 | /* Corresponds to requiring a minimum of 3 matches */ |
541 | for (len = 1; len < argc-2; len++) | 541 | for (len = 1; len < argc-2; len++) |
542 | { | 542 | { |
543 | if (argv[len][0] != '-') | 543 | if (argv[len][0] != '-') |
544 | {usage(); return 10; } | 544 | {usage(); return 10; } |
545 | else switch (argv[len][1]) | 545 | else switch (argv[len][1]) |
546 | { | 546 | { |
547 | case 'i' : | 547 | case 'i' : |
548 | { | 548 | { |
549 | insens = true; | 549 | insens = true; |
550 | break; | 550 | break; |
551 | } | 551 | } |
552 | default : | 552 | default : |
553 | {usage(); return 10;} | 553 | {usage(); return 10;} |
554 | } | 554 | } |
555 | } | 555 | } |
556 | 556 | ||
557 | tchar* pattern = new tchar[strlen(argv[argc-2])+1]; | 557 | tchar* pattern = new tchar[strlen(argv[argc-2])+1]; |
558 | 558 | ||
559 | for (int i = 0; (pattern[i] = argv[argc-2][i]) != 0; i++); | 559 | for (int i = 0; (pattern[i] = argv[argc-2][i]) != 0; i++); |
560 | 560 | ||
561 | 561 | ||
562 | 562 | ||
563 | CRegExpFilt test(pattern, insens); | 563 | CRegExpFilt test(pattern, insens); |
564 | 564 | ||
565 | delete [] pattern; | 565 | delete [] pattern; |
566 | 566 | ||
567 | inf = fopen(argv[argc-1], "r"); | 567 | inf = fopen(argv[argc-1], "r"); |
568 | if (!inf) | 568 | if (!inf) |
569 | { | 569 | { |
570 | printf("file not found\n"); | 570 | printf("file not found\n"); |
571 | return 10; | 571 | return 10; |
572 | } | 572 | } |
573 | 573 | ||
574 | while ((len = getline(line, BUF_SIZE, inf)) >= 0) | 574 | while ((len = getline(line, BUF_SIZE, inf)) >= 0) |
575 | { | 575 | { |
576 | lino++; | 576 | lino++; |
577 | bool ret = false; | 577 | bool ret = false; |
578 | 578 | ||
579 | { | 579 | { |
580 | tchar *textend = line+len; | 580 | tchar *textend = line+len; |
581 | tchar *text = line; | 581 | tchar *text = line; |
582 | while (text < textend) | 582 | while (text < textend) |
583 | { | 583 | { |
584 | ret |= test.addch(*text++); | 584 | ret |= test.addch(*text++); |
585 | } | 585 | } |
586 | ret |= test.addch('\n'); | 586 | ret |= test.addch('\n'); |
587 | while (!test.empty()) | 587 | while (!test.empty()) |
588 | { | 588 | { |
589 | putchar(test.pop()); | 589 | putchar(test.pop()); |
590 | } | 590 | } |
591 | } | 591 | } |
592 | // inswt = test.addch(line, len); | 592 | // inswt = test.addch(line, len); |
593 | if (ret) reportmatch(line, 0, lino); | 593 | if (ret) reportmatch(line, 0, lino); |
594 | } | 594 | } |
595 | fclose(inf); | 595 | fclose(inf); |
596 | //CloseSTDLIB(); | 596 | //CloseSTDLIB(); |
597 | return 0; | 597 | return 0; |
598 | } | 598 | } |
599 | #endif | 599 | #endif |
diff --git a/noncore/apps/opie-reader/Palm2QImage.cpp b/noncore/apps/opie-reader/Palm2QImage.cpp index 361755f..09cad1c 100644 --- a/noncore/apps/opie-reader/Palm2QImage.cpp +++ b/noncore/apps/opie-reader/Palm2QImage.cpp | |||
@@ -1,299 +1,299 @@ | |||
1 | /* -*- mode: c; indent-tabs-mode: nil; -*- */ | 1 | /* -*- mode: c; indent-tabs-mode: nil; -*- */ |
2 | 2 | ||
3 | #include <stdio.h> | 3 | #include <stdio.h> |
4 | #include <stdlib.h> | 4 | #include <stdlib.h> |
5 | #include <string.h> | 5 | #include <string.h> |
6 | #ifndef _WINDOWS | 6 | #ifndef _WINDOWS |
7 | #include <unistd.h> /* for link */ | 7 | #include <unistd.h> /* for link */ |
8 | #endif | 8 | #endif |
9 | #include <sys/types.h> | 9 | #include <sys/types.h> |
10 | #include <sys/stat.h> | 10 | #include <sys/stat.h> |
11 | #include <stdarg.h> | 11 | #include <stdarg.h> |
12 | 12 | ||
13 | #include <qimage.h> | 13 | #include <qimage.h> |
14 | 14 | ||
15 | /***********************************************************************/ | 15 | /***********************************************************************/ |
16 | /***********************************************************************/ | 16 | /***********************************************************************/ |
17 | /***** *****/ | 17 | /***** *****/ |
18 | /***** Code to decode the Palm image format to JPEG *****/ | 18 | /***** Code to decode the Palm image format to JPEG *****/ |
19 | /***** *****/ | 19 | /***** *****/ |
20 | /***********************************************************************/ | 20 | /***********************************************************************/ |
21 | /***********************************************************************/ | 21 | /***********************************************************************/ |
22 | 22 | ||
23 | #define READ_BIGENDIAN_SHORT(p) (((p)[0] << 8)|((p)[1])) | 23 | #define READ_BIGENDIAN_SHORT(p) (((p)[0] << 8)|((p)[1])) |
24 | #define READ_BIGENDIAN_LONG(p) (((p)[0] << 24)|((p)[1] << 16)|((p)[2] << 8)|((p)[3])) | 24 | #define READ_BIGENDIAN_LONG(p) (((p)[0] << 24)|((p)[1] << 16)|((p)[2] << 8)|((p)[3])) |
25 | 25 | ||
26 | #define PALM_IS_COMPRESSED_FLAG 0x8000 | 26 | #define PALM_IS_COMPRESSED_FLAG 0x8000 |
27 | #define PALM_HAS_COLORMAP_FLAG 0x4000 | 27 | #define PALM_HAS_COLORMAP_FLAG 0x4000 |
28 | #define PALM_HAS_TRANSPARENCY_FLAG 0x2000 | 28 | #define PALM_HAS_TRANSPARENCY_FLAG 0x2000 |
29 | #define PALM_DIRECT_COLOR_FLAG 0x0400 | 29 | #define PALM_DIRECT_COLOR_FLAG 0x0400 |
30 | #define PALM_4_BYTE_FIELD_FLAG 0x0200 | 30 | #define PALM_4_BYTE_FIELD_FLAG 0x0200 |
31 | 31 | ||
32 | #define PALM_COMPRESSION_SCANLINE 0x00 | 32 | #define PALM_COMPRESSION_SCANLINE 0x00 |
33 | #define PALM_COMPRESSION_RLE 0x01 | 33 | #define PALM_COMPRESSION_RLE 0x01 |
34 | #define PALM_COMPRESSION_PACKBITS 0x02 | 34 | #define PALM_COMPRESSION_PACKBITS 0x02 |
35 | #define PALM_COMPRESSION_NONE 0xFF | 35 | #define PALM_COMPRESSION_NONE 0xFF |
36 | 36 | ||
37 | #define PALM_COLORMAP_SIZE 232 | 37 | #define PALM_COLORMAP_SIZE 232 |
38 | 38 | ||
39 | typedef struct { | 39 | typedef struct { |
40 | unsigned char red; | 40 | unsigned char red; |
41 | unsigned char green; | 41 | unsigned char green; |
42 | unsigned char blue; | 42 | unsigned char blue; |
43 | } ColorMapEntry; | 43 | } ColorMapEntry; |
44 | 44 | ||
45 | static ColorMapEntry Palm8BitColormap[] = { | 45 | static ColorMapEntry Palm8BitColormap[] = { |
46 | { 255, 255, 255 }, { 255, 204, 255 }, { 255, 153, 255 }, { 255, 102, 255 }, | 46 | { 255, 255, 255 }, { 255, 204, 255 }, { 255, 153, 255 }, { 255, 102, 255 }, |
47 | { 255, 51, 255 }, { 255, 0, 255 }, { 255, 255, 204 }, { 255, 204, 204 }, | 47 | { 255, 51, 255 }, { 255, 0, 255 }, { 255, 255, 204 }, { 255, 204, 204 }, |
48 | { 255, 153, 204 }, { 255, 102, 204 }, { 255, 51, 204 }, { 255, 0, 204 }, | 48 | { 255, 153, 204 }, { 255, 102, 204 }, { 255, 51, 204 }, { 255, 0, 204 }, |
49 | { 255, 255, 153 }, { 255, 204, 153 }, { 255, 153, 153 }, { 255, 102, 153 }, | 49 | { 255, 255, 153 }, { 255, 204, 153 }, { 255, 153, 153 }, { 255, 102, 153 }, |
50 | { 255, 51, 153 }, { 255, 0, 153 }, { 204, 255, 255 }, { 204, 204, 255 }, | 50 | { 255, 51, 153 }, { 255, 0, 153 }, { 204, 255, 255 }, { 204, 204, 255 }, |
51 | { 204, 153, 255 }, { 204, 102, 255 }, { 204, 51, 255 }, { 204, 0, 255 }, | 51 | { 204, 153, 255 }, { 204, 102, 255 }, { 204, 51, 255 }, { 204, 0, 255 }, |
52 | { 204, 255, 204 }, { 204, 204, 204 }, { 204, 153, 204 }, { 204, 102, 204 }, | 52 | { 204, 255, 204 }, { 204, 204, 204 }, { 204, 153, 204 }, { 204, 102, 204 }, |
53 | { 204, 51, 204 }, { 204, 0, 204 }, { 204, 255, 153 }, { 204, 204, 153 }, | 53 | { 204, 51, 204 }, { 204, 0, 204 }, { 204, 255, 153 }, { 204, 204, 153 }, |
54 | { 204, 153, 153 }, { 204, 102, 153 }, { 204, 51, 153 }, { 204, 0, 153 }, | 54 | { 204, 153, 153 }, { 204, 102, 153 }, { 204, 51, 153 }, { 204, 0, 153 }, |
55 | { 153, 255, 255 }, { 153, 204, 255 }, { 153, 153, 255 }, { 153, 102, 255 }, | 55 | { 153, 255, 255 }, { 153, 204, 255 }, { 153, 153, 255 }, { 153, 102, 255 }, |
56 | { 153, 51, 255 }, { 153, 0, 255 }, { 153, 255, 204 }, { 153, 204, 204 }, | 56 | { 153, 51, 255 }, { 153, 0, 255 }, { 153, 255, 204 }, { 153, 204, 204 }, |
57 | { 153, 153, 204 }, { 153, 102, 204 }, { 153, 51, 204 }, { 153, 0, 204 }, | 57 | { 153, 153, 204 }, { 153, 102, 204 }, { 153, 51, 204 }, { 153, 0, 204 }, |
58 | { 153, 255, 153 }, { 153, 204, 153 }, { 153, 153, 153 }, { 153, 102, 153 }, | 58 | { 153, 255, 153 }, { 153, 204, 153 }, { 153, 153, 153 }, { 153, 102, 153 }, |
59 | { 153, 51, 153 }, { 153, 0, 153 }, { 102, 255, 255 }, { 102, 204, 255 }, | 59 | { 153, 51, 153 }, { 153, 0, 153 }, { 102, 255, 255 }, { 102, 204, 255 }, |
60 | { 102, 153, 255 }, { 102, 102, 255 }, { 102, 51, 255 }, { 102, 0, 255 }, | 60 | { 102, 153, 255 }, { 102, 102, 255 }, { 102, 51, 255 }, { 102, 0, 255 }, |
61 | { 102, 255, 204 }, { 102, 204, 204 }, { 102, 153, 204 }, { 102, 102, 204 }, | 61 | { 102, 255, 204 }, { 102, 204, 204 }, { 102, 153, 204 }, { 102, 102, 204 }, |
62 | { 102, 51, 204 }, { 102, 0, 204 }, { 102, 255, 153 }, { 102, 204, 153 }, | 62 | { 102, 51, 204 }, { 102, 0, 204 }, { 102, 255, 153 }, { 102, 204, 153 }, |
63 | { 102, 153, 153 }, { 102, 102, 153 }, { 102, 51, 153 }, { 102, 0, 153 }, | 63 | { 102, 153, 153 }, { 102, 102, 153 }, { 102, 51, 153 }, { 102, 0, 153 }, |
64 | { 51, 255, 255 }, { 51, 204, 255 }, { 51, 153, 255 }, { 51, 102, 255 }, | 64 | { 51, 255, 255 }, { 51, 204, 255 }, { 51, 153, 255 }, { 51, 102, 255 }, |
65 | { 51, 51, 255 }, { 51, 0, 255 }, { 51, 255, 204 }, { 51, 204, 204 }, | 65 | { 51, 51, 255 }, { 51, 0, 255 }, { 51, 255, 204 }, { 51, 204, 204 }, |
66 | { 51, 153, 204 }, { 51, 102, 204 }, { 51, 51, 204 }, { 51, 0, 204 }, | 66 | { 51, 153, 204 }, { 51, 102, 204 }, { 51, 51, 204 }, { 51, 0, 204 }, |
67 | { 51, 255, 153 }, { 51, 204, 153 }, { 51, 153, 153 }, { 51, 102, 153 }, | 67 | { 51, 255, 153 }, { 51, 204, 153 }, { 51, 153, 153 }, { 51, 102, 153 }, |
68 | { 51, 51, 153 }, { 51, 0, 153 }, { 0, 255, 255 }, { 0, 204, 255 }, | 68 | { 51, 51, 153 }, { 51, 0, 153 }, { 0, 255, 255 }, { 0, 204, 255 }, |
69 | { 0, 153, 255 }, { 0, 102, 255 }, { 0, 51, 255 }, { 0, 0, 255 }, | 69 | { 0, 153, 255 }, { 0, 102, 255 }, { 0, 51, 255 }, { 0, 0, 255 }, |
70 | { 0, 255, 204 }, { 0, 204, 204 }, { 0, 153, 204 }, { 0, 102, 204 }, | 70 | { 0, 255, 204 }, { 0, 204, 204 }, { 0, 153, 204 }, { 0, 102, 204 }, |
71 | { 0, 51, 204 }, { 0, 0, 204 }, { 0, 255, 153 }, { 0, 204, 153 }, | 71 | { 0, 51, 204 }, { 0, 0, 204 }, { 0, 255, 153 }, { 0, 204, 153 }, |
72 | { 0, 153, 153 }, { 0, 102, 153 }, { 0, 51, 153 }, { 0, 0, 153 }, | 72 | { 0, 153, 153 }, { 0, 102, 153 }, { 0, 51, 153 }, { 0, 0, 153 }, |
73 | { 255, 255, 102 }, { 255, 204, 102 }, { 255, 153, 102 }, { 255, 102, 102 }, | 73 | { 255, 255, 102 }, { 255, 204, 102 }, { 255, 153, 102 }, { 255, 102, 102 }, |
74 | { 255, 51, 102 }, { 255, 0, 102 }, { 255, 255, 51 }, { 255, 204, 51 }, | 74 | { 255, 51, 102 }, { 255, 0, 102 }, { 255, 255, 51 }, { 255, 204, 51 }, |
75 | { 255, 153, 51 }, { 255, 102, 51 }, { 255, 51, 51 }, { 255, 0, 51 }, | 75 | { 255, 153, 51 }, { 255, 102, 51 }, { 255, 51, 51 }, { 255, 0, 51 }, |
76 | { 255, 255, 0 }, { 255, 204, 0 }, { 255, 153, 0 }, { 255, 102, 0 }, | 76 | { 255, 255, 0 }, { 255, 204, 0 }, { 255, 153, 0 }, { 255, 102, 0 }, |
77 | { 255, 51, 0 }, { 255, 0, 0 }, { 204, 255, 102 }, { 204, 204, 102 }, | 77 | { 255, 51, 0 }, { 255, 0, 0 }, { 204, 255, 102 }, { 204, 204, 102 }, |
78 | { 204, 153, 102 }, { 204, 102, 102 }, { 204, 51, 102 }, { 204, 0, 102 }, | 78 | { 204, 153, 102 }, { 204, 102, 102 }, { 204, 51, 102 }, { 204, 0, 102 }, |
79 | { 204, 255, 51 }, { 204, 204, 51 }, { 204, 153, 51 }, { 204, 102, 51 }, | 79 | { 204, 255, 51 }, { 204, 204, 51 }, { 204, 153, 51 }, { 204, 102, 51 }, |
80 | { 204, 51, 51 }, { 204, 0, 51 }, { 204, 255, 0 }, { 204, 204, 0 }, | 80 | { 204, 51, 51 }, { 204, 0, 51 }, { 204, 255, 0 }, { 204, 204, 0 }, |
81 | { 204, 153, 0 }, { 204, 102, 0 }, { 204, 51, 0 }, { 204, 0, 0 }, | 81 | { 204, 153, 0 }, { 204, 102, 0 }, { 204, 51, 0 }, { 204, 0, 0 }, |
82 | { 153, 255, 102 }, { 153, 204, 102 }, { 153, 153, 102 }, { 153, 102, 102 }, | 82 | { 153, 255, 102 }, { 153, 204, 102 }, { 153, 153, 102 }, { 153, 102, 102 }, |
83 | { 153, 51, 102 }, { 153, 0, 102 }, { 153, 255, 51 }, { 153, 204, 51 }, | 83 | { 153, 51, 102 }, { 153, 0, 102 }, { 153, 255, 51 }, { 153, 204, 51 }, |
84 | { 153, 153, 51 }, { 153, 102, 51 }, { 153, 51, 51 }, { 153, 0, 51 }, | 84 | { 153, 153, 51 }, { 153, 102, 51 }, { 153, 51, 51 }, { 153, 0, 51 }, |
85 | { 153, 255, 0 }, { 153, 204, 0 }, { 153, 153, 0 }, { 153, 102, 0 }, | 85 | { 153, 255, 0 }, { 153, 204, 0 }, { 153, 153, 0 }, { 153, 102, 0 }, |
86 | { 153, 51, 0 }, { 153, 0, 0 }, { 102, 255, 102 }, { 102, 204, 102 }, | 86 | { 153, 51, 0 }, { 153, 0, 0 }, { 102, 255, 102 }, { 102, 204, 102 }, |
87 | { 102, 153, 102 }, { 102, 102, 102 }, { 102, 51, 102 }, { 102, 0, 102 }, | 87 | { 102, 153, 102 }, { 102, 102, 102 }, { 102, 51, 102 }, { 102, 0, 102 }, |
88 | { 102, 255, 51 }, { 102, 204, 51 }, { 102, 153, 51 }, { 102, 102, 51 }, | 88 | { 102, 255, 51 }, { 102, 204, 51 }, { 102, 153, 51 }, { 102, 102, 51 }, |
89 | { 102, 51, 51 }, { 102, 0, 51 }, { 102, 255, 0 }, { 102, 204, 0 }, | 89 | { 102, 51, 51 }, { 102, 0, 51 }, { 102, 255, 0 }, { 102, 204, 0 }, |
90 | { 102, 153, 0 }, { 102, 102, 0 }, { 102, 51, 0 }, { 102, 0, 0 }, | 90 | { 102, 153, 0 }, { 102, 102, 0 }, { 102, 51, 0 }, { 102, 0, 0 }, |
91 | { 51, 255, 102 }, { 51, 204, 102 }, { 51, 153, 102 }, { 51, 102, 102 }, | 91 | { 51, 255, 102 }, { 51, 204, 102 }, { 51, 153, 102 }, { 51, 102, 102 }, |
92 | { 51, 51, 102 }, { 51, 0, 102 }, { 51, 255, 51 }, { 51, 204, 51 }, | 92 | { 51, 51, 102 }, { 51, 0, 102 }, { 51, 255, 51 }, { 51, 204, 51 }, |
93 | { 51, 153, 51 }, { 51, 102, 51 }, { 51, 51, 51 }, { 51, 0, 51 }, | 93 | { 51, 153, 51 }, { 51, 102, 51 }, { 51, 51, 51 }, { 51, 0, 51 }, |
94 | { 51, 255, 0 }, { 51, 204, 0 }, { 51, 153, 0 }, { 51, 102, 0 }, | 94 | { 51, 255, 0 }, { 51, 204, 0 }, { 51, 153, 0 }, { 51, 102, 0 }, |
95 | { 51, 51, 0 }, { 51, 0, 0 }, { 0, 255, 102 }, { 0, 204, 102 }, | 95 | { 51, 51, 0 }, { 51, 0, 0 }, { 0, 255, 102 }, { 0, 204, 102 }, |
96 | { 0, 153, 102 }, { 0, 102, 102 }, { 0, 51, 102 }, { 0, 0, 102 }, | 96 | { 0, 153, 102 }, { 0, 102, 102 }, { 0, 51, 102 }, { 0, 0, 102 }, |
97 | { 0, 255, 51 }, { 0, 204, 51 }, { 0, 153, 51 }, { 0, 102, 51 }, | 97 | { 0, 255, 51 }, { 0, 204, 51 }, { 0, 153, 51 }, { 0, 102, 51 }, |
98 | { 0, 51, 51 }, { 0, 0, 51 }, { 0, 255, 0 }, { 0, 204, 0 }, | 98 | { 0, 51, 51 }, { 0, 0, 51 }, { 0, 255, 0 }, { 0, 204, 0 }, |
99 | { 0, 153, 0 }, { 0, 102, 0 }, { 0, 51, 0 }, { 17, 17, 17 }, | 99 | { 0, 153, 0 }, { 0, 102, 0 }, { 0, 51, 0 }, { 17, 17, 17 }, |
100 | { 34, 34, 34 }, { 68, 68, 68 }, { 85, 85, 85 }, { 119, 119, 119 }, | 100 | { 34, 34, 34 }, { 68, 68, 68 }, { 85, 85, 85 }, { 119, 119, 119 }, |
101 | { 136, 136, 136 }, { 170, 170, 170 }, { 187, 187, 187 }, { 221, 221, 221 }, | 101 | { 136, 136, 136 }, { 170, 170, 170 }, { 187, 187, 187 }, { 221, 221, 221 }, |
102 | { 238, 238, 238 }, { 192, 192, 192 }, { 128, 0, 0 }, { 128, 0, 128 }, | 102 | { 238, 238, 238 }, { 192, 192, 192 }, { 128, 0, 0 }, { 128, 0, 128 }, |
103 | { 0, 128, 0 }, { 0, 128, 128 }, { 0, 0, 0 }, { 0, 0, 0 }, | 103 | { 0, 128, 0 }, { 0, 128, 128 }, { 0, 0, 0 }, { 0, 0, 0 }, |
104 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, | 104 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, |
105 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, | 105 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, |
106 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, | 106 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, |
107 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, | 107 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, |
108 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, | 108 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, |
109 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }}; | 109 | { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }}; |
110 | 110 | ||
111 | static ColorMapEntry Palm1BitColormap[] = {{ 255, 255, 255 }, { 0, 0, 0 }}; | 111 | static ColorMapEntry Palm1BitColormap[] = {{ 255, 255, 255 }, { 0, 0, 0 }}; |
112 | 112 | ||
113 | static ColorMapEntry Palm2BitColormap[] = { | 113 | static ColorMapEntry Palm2BitColormap[] = { |
114 | { 255, 255, 255 }, { 192, 192, 192 }, { 128, 128, 128 }, { 0, 0, 0 }}; | 114 | { 255, 255, 255 }, { 192, 192, 192 }, { 128, 128, 128 }, { 0, 0, 0 }}; |
115 | 115 | ||
116 | static ColorMapEntry Palm4BitColormap[] = { | 116 | static ColorMapEntry Palm4BitColormap[] = { |
117 | { 255, 255, 255 }, { 238, 238, 238 }, { 221, 221, 221 }, { 204, 204, 204 }, | 117 | { 255, 255, 255 }, { 238, 238, 238 }, { 221, 221, 221 }, { 204, 204, 204 }, |
118 | { 187, 187, 187 }, { 170, 170, 170 }, { 153, 153, 153 }, { 136, 136, 136 }, | 118 | { 187, 187, 187 }, { 170, 170, 170 }, { 153, 153, 153 }, { 136, 136, 136 }, |
119 | { 119, 119, 119 }, { 102, 102, 102 }, { 85, 85, 85 }, { 68, 68, 68 }, | 119 | { 119, 119, 119 }, { 102, 102, 102 }, { 85, 85, 85 }, { 68, 68, 68 }, |
120 | { 51, 51, 51 }, { 34, 34, 34 }, { 17, 17, 17 }, { 0, 0, 0 }}; | 120 | { 51, 51, 51 }, { 34, 34, 34 }, { 17, 17, 17 }, { 0, 0, 0 }}; |
121 | 121 | ||
122 | QImage* Palm2QImage | 122 | QImage* Palm2QImage |
123 | (unsigned char *image_bytes_in, int byte_count_in) | 123 | (unsigned char *image_bytes_in, int byte_count_in) |
124 | { | 124 | { |
125 | unsigned int width, height, bytes_per_row, flags, next_depth_offset; | 125 | unsigned int width, height, bytes_per_row, flags, next_depth_offset; |
126 | unsigned int bits_per_pixel, version, transparent_index, compression_type, i, j, inval, inbit, mask, incount; | 126 | unsigned int bits_per_pixel, version, transparent_index, compression_type, i, j, inval, inbit, mask, incount; |
127 | unsigned int palm_red_bits, palm_green_bits, palm_blue_bits; | 127 | unsigned int palm_red_bits, palm_green_bits, palm_blue_bits; |
128 | unsigned char *palm_ptr, *x_ptr, *imagedata, *inbyte, *rowbuf, *lastrow, | 128 | unsigned char *palm_ptr, *x_ptr, *inbyte, *rowbuf, *lastrow, |
129 | *imagedatastart, *palmimage; | 129 | *imagedatastart, *palmimage; |
130 | ColorMapEntry *colormap; | 130 | ColorMapEntry *colormap; |
131 | 131 | ||
132 | palmimage = image_bytes_in; | 132 | palmimage = image_bytes_in; |
133 | width = READ_BIGENDIAN_SHORT(palmimage + 0); | 133 | width = READ_BIGENDIAN_SHORT(palmimage + 0); |
134 | height = READ_BIGENDIAN_SHORT(palmimage + 2); | 134 | height = READ_BIGENDIAN_SHORT(palmimage + 2); |
135 | bytes_per_row = READ_BIGENDIAN_SHORT(palmimage + 4); | 135 | bytes_per_row = READ_BIGENDIAN_SHORT(palmimage + 4); |
136 | flags = READ_BIGENDIAN_SHORT(palmimage + 6); | 136 | flags = READ_BIGENDIAN_SHORT(palmimage + 6); |
137 | bits_per_pixel = palmimage[8]; | 137 | bits_per_pixel = palmimage[8]; |
138 | version = palmimage[9]; | 138 | version = palmimage[9]; |
139 | next_depth_offset = READ_BIGENDIAN_SHORT(palmimage + 10); | 139 | next_depth_offset = READ_BIGENDIAN_SHORT(palmimage + 10); |
140 | transparent_index = palmimage[12]; | 140 | transparent_index = palmimage[12]; |
141 | compression_type = palmimage[13]; | 141 | compression_type = palmimage[13]; |
142 | /* bytes 14 and 15 are reserved by Palm and always 0 */ | 142 | /* bytes 14 and 15 are reserved by Palm and always 0 */ |
143 | 143 | ||
144 | #if 0 | 144 | #if 0 |
145 | // qDebug ("Palm image is %dx%d, %d bpp, version %d, flags 0x%x, compression %d", width, height, bits_per_pixel, version, flags, compression_type); | 145 | // qDebug ("Palm image is %dx%d, %d bpp, version %d, flags 0x%x, compression %d", width, height, bits_per_pixel, version, flags, compression_type); |
146 | #endif | 146 | #endif |
147 | 147 | ||
148 | if (compression_type == PALM_COMPRESSION_PACKBITS) { | 148 | if (compression_type == PALM_COMPRESSION_PACKBITS) { |
149 | // qDebug ("Image uses packbits compression; not yet supported"); | 149 | // qDebug ("Image uses packbits compression; not yet supported"); |
150 | return NULL; | 150 | return NULL; |
151 | } else if ((compression_type != PALM_COMPRESSION_NONE) && | 151 | } else if ((compression_type != PALM_COMPRESSION_NONE) && |
152 | (compression_type != PALM_COMPRESSION_RLE) && | 152 | (compression_type != PALM_COMPRESSION_RLE) && |
153 | (compression_type != PALM_COMPRESSION_SCANLINE)) { | 153 | (compression_type != PALM_COMPRESSION_SCANLINE)) { |
154 | // qDebug ("Image uses unknown compression, code 0x%x", compression_type); | 154 | // qDebug ("Image uses unknown compression, code 0x%x", compression_type); |
155 | return NULL; | 155 | return NULL; |
156 | } | 156 | } |
157 | 157 | ||
158 | /* as of PalmOS 4.0, there are 6 different kinds of Palm pixmaps: | 158 | /* as of PalmOS 4.0, there are 6 different kinds of Palm pixmaps: |
159 | 159 | ||
160 | 1, 2, or 4 bit grayscale | 160 | 1, 2, or 4 bit grayscale |
161 | 8-bit StaticColor using the Palm standard colormap | 161 | 8-bit StaticColor using the Palm standard colormap |
162 | 8-bit PseudoColor using a user-specified colormap | 162 | 8-bit PseudoColor using a user-specified colormap |
163 | 16-bit DirectColor using 5 bits for red, 6 for green, and 5 for blue | 163 | 16-bit DirectColor using 5 bits for red, 6 for green, and 5 for blue |
164 | 164 | ||
165 | Each of these can be compressed with one of four compression schemes, | 165 | Each of these can be compressed with one of four compression schemes, |
166 | "RLE", "Scanline", "PackBits", or none. | 166 | "RLE", "Scanline", "PackBits", or none. |
167 | 167 | ||
168 | We begin by constructing the colormap. | 168 | We begin by constructing the colormap. |
169 | */ | 169 | */ |
170 | 170 | ||
171 | if (flags & PALM_HAS_COLORMAP_FLAG) { | 171 | if (flags & PALM_HAS_COLORMAP_FLAG) { |
172 | // qDebug("Palm images with custom colormaps are not currently supported.\n"); | 172 | // qDebug("Palm images with custom colormaps are not currently supported.\n"); |
173 | return NULL; | 173 | return NULL; |
174 | } else if (bits_per_pixel == 1) { | 174 | } else if (bits_per_pixel == 1) { |
175 | colormap = Palm1BitColormap; | 175 | colormap = Palm1BitColormap; |
176 | imagedatastart = palmimage + 16; | 176 | imagedatastart = palmimage + 16; |
177 | } else if (bits_per_pixel == 2) { | 177 | } else if (bits_per_pixel == 2) { |
178 | colormap = Palm2BitColormap; | 178 | colormap = Palm2BitColormap; |
179 | imagedatastart = palmimage + 16; | 179 | imagedatastart = palmimage + 16; |
180 | } else if (bits_per_pixel == 4) { | 180 | } else if (bits_per_pixel == 4) { |
181 | colormap = Palm4BitColormap; | 181 | colormap = Palm4BitColormap; |
182 | imagedatastart = palmimage + 16; | 182 | imagedatastart = palmimage + 16; |
183 | } else if (bits_per_pixel == 8) { | 183 | } else if (bits_per_pixel == 8) { |
184 | colormap = Palm8BitColormap; | 184 | colormap = Palm8BitColormap; |
185 | imagedatastart = palmimage + 16; | 185 | imagedatastart = palmimage + 16; |
186 | } else if (bits_per_pixel == 16 && (flags & PALM_DIRECT_COLOR_FLAG)) { | 186 | } else if (bits_per_pixel == 16 && (flags & PALM_DIRECT_COLOR_FLAG)) { |
187 | colormap = NULL; | 187 | colormap = NULL; |
188 | palm_red_bits = palmimage[16]; | 188 | palm_red_bits = palmimage[16]; |
189 | palm_green_bits = palmimage[17]; | 189 | palm_green_bits = palmimage[17]; |
190 | palm_blue_bits = palmimage[18]; | 190 | palm_blue_bits = palmimage[18]; |
191 | // qDebug("Bits:%d, %d, %d", palm_red_bits, palm_green_bits, palm_blue_bits); | 191 | // qDebug("Bits:%d, %d, %d", palm_red_bits, palm_green_bits, palm_blue_bits); |
192 | if (palm_blue_bits > 8 || palm_green_bits > 8 || palm_red_bits > 8) { | 192 | if (palm_blue_bits > 8 || palm_green_bits > 8 || palm_red_bits > 8) { |
193 | // qDebug("Can't handle this format DirectColor image -- too wide in some color (%d:%d:%d)\n", palm_red_bits, palm_green_bits, palm_blue_bits); | 193 | // qDebug("Can't handle this format DirectColor image -- too wide in some color (%d:%d:%d)\n", palm_red_bits, palm_green_bits, palm_blue_bits); |
194 | return NULL; | 194 | return NULL; |
195 | } | 195 | } |
196 | if (bits_per_pixel > (8 * sizeof(unsigned long))) { | 196 | if (bits_per_pixel > (8 * sizeof(unsigned long))) { |
197 | // qDebug ("Can't handle this format DirectColor image -- too many bits per pixel (%d)\n", bits_per_pixel); | 197 | // qDebug ("Can't handle this format DirectColor image -- too many bits per pixel (%d)\n", bits_per_pixel); |
198 | return NULL; | 198 | return NULL; |
199 | } | 199 | } |
200 | imagedatastart = palmimage + 24; | 200 | imagedatastart = palmimage + 24; |
201 | } else { | 201 | } else { |
202 | // qDebug("Unknown bits-per-pixel of %d encountered.\n", bits_per_pixel); | 202 | // qDebug("Unknown bits-per-pixel of %d encountered.\n", bits_per_pixel); |
203 | return NULL; | 203 | return NULL; |
204 | } | 204 | } |
205 | 205 | ||
206 | #ifndef USEQPE | 206 | #ifndef USEQPE |
207 | QImage* qimage = new QImage(width, height, 32); | 207 | QImage* qimage = new QImage(width, height, 32); |
208 | #else | 208 | #else |
209 | QImage* qimage = new QImage(width, height, 16); | 209 | QImage* qimage = new QImage(width, height, 16); |
210 | #endif | 210 | #endif |
211 | 211 | ||
212 | /* row by row, uncompress the Palm image and copy it to the JPEG buffer */ | 212 | /* row by row, uncompress the Palm image and copy it to the JPEG buffer */ |
213 | rowbuf = new unsigned char[bytes_per_row * width]; | 213 | rowbuf = new unsigned char[bytes_per_row * width]; |
214 | lastrow = new unsigned char[bytes_per_row * width]; | 214 | lastrow = new unsigned char[bytes_per_row * width]; |
215 | 215 | ||
216 | for (i=0, palm_ptr = imagedatastart , x_ptr = imagedata; i < height; ++i) { | 216 | for (i=0, palm_ptr = imagedatastart , x_ptr = 0; i < height; ++i) { |
217 | // qDebug("inval:%x palm_ptr:%x x_ptr:%x bpr:%x", inval, palm_ptr, x_ptr, bytes_per_row); | 217 | // qDebug("inval:%x palm_ptr:%x x_ptr:%x bpr:%x", inval, palm_ptr, x_ptr, bytes_per_row); |
218 | 218 | ||
219 | /* first, uncompress the Palm image */ | 219 | /* first, uncompress the Palm image */ |
220 | if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_RLE)) { | 220 | if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_RLE)) { |
221 | for (j = 0; j < bytes_per_row; ) { | 221 | for (j = 0; j < bytes_per_row; ) { |
222 | incount = *palm_ptr++; | 222 | incount = *palm_ptr++; |
223 | inval = *palm_ptr++; | 223 | inval = *palm_ptr++; |
224 | memset(rowbuf + j, inval, incount); | 224 | memset(rowbuf + j, inval, incount); |
225 | j += incount; | 225 | j += incount; |
226 | } | 226 | } |
227 | } else if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_SCANLINE)) { | 227 | } else if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_SCANLINE)) { |
228 | for (j = 0; j < bytes_per_row; j += 8) { | 228 | for (j = 0; j < bytes_per_row; j += 8) { |
229 | incount = *palm_ptr++; | 229 | incount = *palm_ptr++; |
230 | inval = ((bytes_per_row - j) < 8) ? (bytes_per_row - j) : 8; | 230 | inval = ((bytes_per_row - j) < 8) ? (bytes_per_row - j) : 8; |
231 | for (inbit = 0; inbit < inval; inbit += 1) { | 231 | for (inbit = 0; inbit < inval; inbit += 1) { |
232 | if (incount & (1 << (7 - inbit))) | 232 | if (incount & (1 << (7 - inbit))) |
233 | rowbuf[j + inbit] = *palm_ptr++; | 233 | rowbuf[j + inbit] = *palm_ptr++; |
234 | else | 234 | else |
235 | rowbuf[j + inbit] = lastrow[j + inbit]; | 235 | rowbuf[j + inbit] = lastrow[j + inbit]; |
236 | } | 236 | } |
237 | } | 237 | } |
238 | memcpy (lastrow, rowbuf, bytes_per_row); | 238 | memcpy (lastrow, rowbuf, bytes_per_row); |
239 | } else if (((flags & PALM_IS_COMPRESSED_FLAG) && | 239 | } else if (((flags & PALM_IS_COMPRESSED_FLAG) && |
240 | (compression_type == PALM_COMPRESSION_NONE)) || | 240 | (compression_type == PALM_COMPRESSION_NONE)) || |
241 | ((flags & PALM_IS_COMPRESSED_FLAG) == 0)) | 241 | ((flags & PALM_IS_COMPRESSED_FLAG) == 0)) |
242 | { | 242 | { |
243 | memcpy (rowbuf, palm_ptr, bytes_per_row); | 243 | memcpy (rowbuf, palm_ptr, bytes_per_row); |
244 | palm_ptr += bytes_per_row; | 244 | palm_ptr += bytes_per_row; |
245 | } | 245 | } |
246 | else { | 246 | else { |
247 | qDebug("Case 4"); | 247 | qDebug("Case 4"); |
248 | qDebug("Is compressed:%s", ((flags & PALM_IS_COMPRESSED_FLAG) == 0) ? "false" : "true"); | 248 | qDebug("Is compressed:%s", ((flags & PALM_IS_COMPRESSED_FLAG) == 0) ? "false" : "true"); |
249 | qDebug("Has colourmap:%s", ((flags & PALM_HAS_COLORMAP_FLAG) == 0) ? "false" : "true"); | 249 | qDebug("Has colourmap:%s", ((flags & PALM_HAS_COLORMAP_FLAG) == 0) ? "false" : "true"); |
250 | qDebug("Has transparency:%s", ((flags & PALM_HAS_TRANSPARENCY_FLAG) == 0) ? "false" : "true"); | 250 | qDebug("Has transparency:%s", ((flags & PALM_HAS_TRANSPARENCY_FLAG) == 0) ? "false" : "true"); |
251 | qDebug("Direct colour:%s", ((flags & PALM_DIRECT_COLOR_FLAG) == 0) ? "false" : "true"); | 251 | qDebug("Direct colour:%s", ((flags & PALM_DIRECT_COLOR_FLAG) == 0) ? "false" : "true"); |
252 | qDebug("four byte field:%s", ((flags & PALM_4_BYTE_FIELD_FLAG) == 0) ? "false" : "true"); | 252 | qDebug("four byte field:%s", ((flags & PALM_4_BYTE_FIELD_FLAG) == 0) ? "false" : "true"); |
253 | memcpy (rowbuf, palm_ptr, bytes_per_row); | 253 | memcpy (rowbuf, palm_ptr, bytes_per_row); |
254 | palm_ptr += bytes_per_row; | 254 | palm_ptr += bytes_per_row; |
255 | } | 255 | } |
256 | /* next, write it to the GDK bitmap */ | 256 | /* next, write it to the GDK bitmap */ |
257 | if (colormap) { | 257 | if (colormap) { |
258 | mask = (1 << bits_per_pixel) - 1; | 258 | mask = (1 << bits_per_pixel) - 1; |
259 | for (inbit = 8 - bits_per_pixel, inbyte = rowbuf, j = 0; j < width; ++j) { | 259 | for (inbit = 8 - bits_per_pixel, inbyte = rowbuf, j = 0; j < width; ++j) { |
260 | inval = ((*inbyte) & (mask << inbit)) >> inbit; | 260 | inval = ((*inbyte) & (mask << inbit)) >> inbit; |
261 | /* correct for oddity of the 8-bit color Palm pixmap... */ | 261 | /* correct for oddity of the 8-bit color Palm pixmap... */ |
262 | if ((bits_per_pixel == 8) && (inval == 0xFF)) inval = 231; | 262 | if ((bits_per_pixel == 8) && (inval == 0xFF)) inval = 231; |
263 | /* now lookup the correct color and set the pixel in the GTK bitmap */ | 263 | /* now lookup the correct color and set the pixel in the GTK bitmap */ |
264 | QRgb colour = qRgb(colormap[inval].red, colormap[inval].green, colormap[inval].blue); | 264 | QRgb colour = qRgb(colormap[inval].red, colormap[inval].green, colormap[inval].blue); |
265 | qimage->setPixel(j, i, colour); | 265 | qimage->setPixel(j, i, colour); |
266 | if (!inbit) { | 266 | if (!inbit) { |
267 | ++inbyte; | 267 | ++inbyte; |
268 | inbit = 8 - bits_per_pixel; | 268 | inbit = 8 - bits_per_pixel; |
269 | } else { | 269 | } else { |
270 | inbit -= bits_per_pixel; | 270 | inbit -= bits_per_pixel; |
271 | } | 271 | } |
272 | } | 272 | } |
273 | } else if (!colormap && | 273 | } else if (!colormap && |
274 | bits_per_pixel == 16) { | 274 | bits_per_pixel == 16) { |
275 | for (inbyte = rowbuf, j = 0; j < width; ++j) { | 275 | for (inbyte = rowbuf, j = 0; j < width; ++j) { |
276 | inval = ((unsigned short)inbyte[0] << (unsigned short)8) | inbyte[1]; | 276 | inval = ((unsigned short)inbyte[0] << (unsigned short)8) | inbyte[1]; |
277 | 277 | ||
278 | /* | 278 | /* |
279 | qDebug ("pixel is %d,%d (%d:%d:%d)", | 279 | qDebug ("pixel is %d,%d (%d:%d:%d)", |
280 | j, i, | 280 | j, i, |
281 | ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), | 281 | ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), |
282 | ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), | 282 | ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), |
283 | ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); | 283 | ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); |
284 | */ | 284 | */ |
285 | QRgb colour = qRgb( | 285 | QRgb colour = qRgb( |
286 | ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), | 286 | ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), |
287 | ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), | 287 | ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), |
288 | ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); | 288 | ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); |
289 | qimage->setPixel(j, i, colour); | 289 | qimage->setPixel(j, i, colour); |
290 | inbyte += 2; | 290 | inbyte += 2; |
291 | } | 291 | } |
292 | } | 292 | } |
293 | } | 293 | } |
294 | 294 | ||
295 | delete [] rowbuf; | 295 | delete [] rowbuf; |
296 | delete [] lastrow; | 296 | delete [] lastrow; |
297 | 297 | ||
298 | return qimage; | 298 | return qimage; |
299 | } | 299 | } |
diff --git a/noncore/apps/opie-reader/QTReader.cpp b/noncore/apps/opie-reader/QTReader.cpp index 0c56dd4..75da8ac 100644 --- a/noncore/apps/opie-reader/QTReader.cpp +++ b/noncore/apps/opie-reader/QTReader.cpp | |||
@@ -1,3492 +1,3492 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** $Id$ | 2 | ** $Id$ |
3 | ** | 3 | ** |
4 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. | 4 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. |
5 | ** | 5 | ** |
6 | ** This file is part of an example program for Qt. This example | 6 | ** This file is part of an example program for Qt. This example |
7 | ** program may be used, distributed and modified without limitation. | 7 | ** program may be used, distributed and modified without limitation. |
8 | ** | 8 | ** |
9 | *****************************************************************************/ | 9 | *****************************************************************************/ |
10 | 10 | ||
11 | const int _SBARHEIGHT = 3; | 11 | const int _SBARHEIGHT = 3; |
12 | 12 | ||
13 | #include <qpainter.h> | 13 | #include <qpainter.h> |
14 | //#include <qdirectpainter_qws.h> | 14 | //#include <qdirectpainter_qws.h> |
15 | #include <qimage.h> | 15 | #include <qimage.h> |
16 | #include <qtimer.h> | 16 | #include <qtimer.h> |
17 | #include "config.h" | 17 | #include "config.h" |
18 | #include "QTReader.h" | 18 | #include "QTReader.h" |
19 | //#include "QTReaderApp.h" | 19 | //#include "QTReaderApp.h" |
20 | #include "CDrawBuffer.h" | 20 | #include "CDrawBuffer.h" |
21 | #ifdef USEQPE | 21 | #ifdef USEQPE |
22 | #include <qpe/qpeapplication.h> | 22 | #include <qpe/qpeapplication.h> |
23 | #endif | 23 | #endif |
24 | #include <math.h> | 24 | #include <math.h> |
25 | #include <ctype.h> | 25 | #include <ctype.h> |
26 | #include <stdio.h> //for sprintf | 26 | #include <stdio.h> //for sprintf |
27 | #ifdef USEQPE | 27 | #ifdef USEQPE |
28 | #include <qpe/config.h> | 28 | #include <qpe/config.h> |
29 | #include <qpe/applnk.h> | 29 | #include <qpe/applnk.h> |
30 | #include <qpe/global.h> | 30 | #include <qpe/global.h> |
31 | #include <qpe/qcopenvelope_qws.h> | 31 | #include <qpe/qcopenvelope_qws.h> |
32 | #endif | 32 | #endif |
33 | #include <qfileinfo.h> | 33 | #include <qfileinfo.h> |
34 | #include <qdir.h> | 34 | #include <qdir.h> |
35 | #include "TableDialog.h" | 35 | #include "TableDialog.h" |
36 | #include "outputcodec.h" | 36 | #include "outputcodec.h" |
37 | 37 | ||
38 | /* | 38 | /* |
39 | #ifdef _UNICODE | 39 | #ifdef _UNICODE |
40 | const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 }; | 40 | const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 }; |
41 | #else | 41 | #else |
42 | const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 }; | 42 | const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 }; |
43 | #endif | 43 | #endif |
44 | */ | 44 | */ |
45 | //const int QTReader::fontsizes[] = { 8, 10, 12, 14, 18, 24, 30, 40, 50, 60, 70, 80, 90, 100, 0 }; | 45 | //const int QTReader::fontsizes[] = { 8, 10, 12, 14, 18, 24, 30, 40, 50, 60, 70, 80, 90, 100, 0 }; |
46 | 46 | ||
47 | //const tchar *QTReader::fonts[] = { "unifont", "fixed", "micro", "smoothtimes", "Courier", "Times", 0 }; | 47 | //const tchar *QTReader::fonts[] = { "unifont", "fixed", "micro", "smoothtimes", "Courier", "Times", 0 }; |
48 | //const int QTReader::fontsizes[] = {10,16,17,22,0}; | 48 | //const int QTReader::fontsizes[] = {10,16,17,22,0}; |
49 | //const tchar *QTReader::fonts[] = { "verdana", "Courier", "Times", 0 }; | 49 | //const tchar *QTReader::fonts[] = { "verdana", "Courier", "Times", 0 }; |
50 | //const int QTReader::fontsizes[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,0}; | 50 | //const int QTReader::fontsizes[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,0}; |
51 | 51 | ||
52 | tchar QTReader::pluckernextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 }; | 52 | tchar QTReader::pluckernextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 }; |
53 | tchar QTReader::jplucknextpart[] = { 'N','e','x','t',' ','P','a','r','t',' ','>','>',0 }; | 53 | tchar QTReader::jplucknextpart[] = { 'N','e','x','t',' ','P','a','r','t',' ','>','>',0 }; |
54 | //tchar QTReader::jplucknextpart[] = { 10,'#',10,'N','e','x','t',' ','P','a','r','t',' ','>','>',0 }; | 54 | //tchar QTReader::jplucknextpart[] = { 10,'#',10,'N','e','x','t',' ','P','a','r','t',' ','>','>',0 }; |
55 | 55 | ||
56 | QTReader::QTReader( QWidget *parent, const char *name, WFlags f) : | 56 | QTReader::QTReader( QWidget *parent, const char *name, WFlags f) : |
57 | QWidget(parent, name, f | WRepaintNoErase | WResizeNoErase), | 57 | QWidget(parent, name, f | WRepaintNoErase | WResizeNoErase), |
58 | m_outofdate(true), | 58 | m_outofdate(true), |
59 | m_default_fg(0,0,0), | 59 | m_default_fg(0,0,0), |
60 | m_default_bg(255,255,255), | 60 | m_default_bg(255,255,255), |
61 | m_bg(255,255,255), | 61 | m_bg(255,255,255), |
62 | m_delay(100), | 62 | m_delay(100), |
63 | m_scrolldy1(0), | 63 | m_scrolldy1(0), |
64 | m_scrolldy2(0), | 64 | m_scrolldy2(0), |
65 | m_totalscroll(0), | 65 | m_totalscroll(0), |
66 | m_autoScroll(false), | 66 | m_autoScroll(false), |
67 | //textarray(NULL), | 67 | //textarray(NULL), |
68 | //locnarray(NULL), | 68 | //locnarray(NULL), |
69 | numlines(0), | 69 | numlines(0), |
70 | m_fontname("unifont"), | 70 | m_fontname("unifont"), |
71 | m_fm(NULL), | 71 | m_fm(NULL), |
72 | mouseUpOn(true), | 72 | mouseUpOn(true), |
73 | m_twotouch(true), | 73 | m_twotouch(true), |
74 | m_touchone(true), | 74 | m_touchone(true), |
75 | bDoUpdates(false), | 75 | bDoUpdates(false), |
76 | #ifdef _SCROLLPIPE | 76 | #ifdef _SCROLLPIPE |
77 | m_pipeout(NULL), | 77 | m_pipeout(NULL), |
78 | #endif | 78 | #endif |
79 | m_left_border(2), | 79 | m_left_border(2), |
80 | m_right_border(2), | 80 | m_right_border(2), |
81 | m_rotated(true), | 81 | m_rotated(true), |
82 | pBkmklist(NULL), | 82 | pBkmklist(NULL), |
83 | m_scrollpos(0), | 83 | m_scrollpos(0), |
84 | // bNegative(false), | 84 | // bNegative(false), |
85 | bInverse(false), | 85 | bInverse(false), |
86 | m_highlightfilter(NULL), | 86 | m_highlightfilter(NULL), |
87 | m_bgIsScaled(false), | 87 | m_bgIsScaled(false), |
88 | m_scrollstep(2), | 88 | m_scrollstep(2), |
89 | m_topmargin(5), | 89 | m_topmargin(5), |
90 | m_bottommargin(5), | 90 | m_bottommargin(5), |
91 | m_reparastring("{\\n[\\n ]}"), | 91 | m_reparastring("{\\n[\\n ]}"), |
92 | m_currentlinkstyle(NULL), | 92 | m_currentlinkstyle(NULL), |
93 | m_currentlinkoffset(-1), | 93 | m_currentlinkoffset(-1), |
94 | m_currentlink(-1) | 94 | m_currentlink(-1) |
95 | { | 95 | { |
96 | m_output = NULL; | 96 | m_output = NULL; |
97 | m_overlap = 1; | 97 | m_overlap = 1; |
98 | setKeyCompression ( true ); | 98 | setKeyCompression ( true ); |
99 | 99 | ||
100 | dbuff = NULL; | 100 | dbuff = NULL; |
101 | dbp = NULL; | 101 | dbp = NULL; |
102 | } | 102 | } |
103 | 103 | ||
104 | /* | 104 | /* |
105 | QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0) : | 105 | QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0) : |
106 | QWidget(parent, name, f), | 106 | QWidget(parent, name, f), |
107 | m_textfont(0), | 107 | m_textfont(0), |
108 | m_textsize(1), | 108 | m_textsize(1), |
109 | textarray(NULL), | 109 | textarray(NULL), |
110 | numlines(0), | 110 | numlines(0), |
111 | bstripcr(true), | 111 | bstripcr(true), |
112 | bunindent(false), | 112 | bunindent(false), |
113 | brepara(false), | 113 | brepara(false), |
114 | bdblspce(false), | 114 | bdblspce(false), |
115 | btight(false), | 115 | btight(false), |
116 | bindenter(0), | 116 | bindenter(0), |
117 | m_fm(NULL) | 117 | m_fm(NULL) |
118 | { | 118 | { |
119 | init(); | 119 | init(); |
120 | // // qDeb2ug("Load_file(1)"); | 120 | // // qDeb2ug("Load_file(1)"); |
121 | load_file((const tchar*)filename); | 121 | load_file((const tchar*)filename); |
122 | } | 122 | } |
123 | */ | 123 | */ |
124 | 124 | ||
125 | /* | 125 | /* |
126 | void QTReader::mouseMoveEvent(QMouseEvent* _e) | 126 | void QTReader::mouseMoveEvent(QMouseEvent* _e) |
127 | { | 127 | { |
128 | 128 | ||
129 | mouseUpOn = !(_e->pos().x() == -1); | 129 | mouseUpOn = !(_e->pos().x() == -1); |
130 | 130 | ||
131 | qDebug("MouseMove:[%d, %d]", _e->pos().x(), _e->pos().y()); | 131 | qDebug("MouseMove:[%d, %d]", _e->pos().x(), _e->pos().y()); |
132 | } | 132 | } |
133 | */ | 133 | */ |
134 | long QTReader::real_delay() | 134 | long QTReader::real_delay() |
135 | { | 135 | { |
136 | return m_scrollstep*( 8976 + m_delay ) / ( m_linespacing * m_linespacing ); | 136 | return m_scrollstep*( 8976 + m_delay ) / ( m_linespacing * m_linespacing ); |
137 | } | 137 | } |
138 | 138 | ||
139 | void QTReader::mousePressEvent( QMouseEvent* _e ) | 139 | void QTReader::mousePressEvent( QMouseEvent* _e ) |
140 | { | 140 | { |
141 | m_drageligible = false; | 141 | m_drageligible = false; |
142 | qDebug("Mouse pressed at (%u, %u)", _e->x(), _e->y()); | 142 | qDebug("Mouse pressed at (%u, %u)", _e->x(), _e->y()); |
143 | int x, y, ht, wh; | 143 | int x, y, ht, wh; |
144 | if (m_rotated) | 144 | if (m_rotated) |
145 | { | 145 | { |
146 | x = _e->y(); | 146 | x = _e->y(); |
147 | y = width()-_e->x(); | 147 | y = width()-_e->x(); |
148 | ht = width(); | 148 | ht = width(); |
149 | wh = height(); | 149 | wh = height(); |
150 | } | 150 | } |
151 | else | 151 | else |
152 | { | 152 | { |
153 | x = _e->x(); | 153 | x = _e->x(); |
154 | y = _e->y(); | 154 | y = _e->y(); |
155 | ht = height(); | 155 | ht = height(); |
156 | wh = width(); | 156 | wh = width(); |
157 | } | 157 | } |
158 | if (x >= m_left_border && x <= wh - m_right_border && y >= m_topmargin && y <= ht-m_bottommargin) | 158 | if (x >= m_left_border && x <= wh - m_right_border && y >= m_topmargin && y <= ht-m_bottommargin) |
159 | { | 159 | { |
160 | if (_e->button() == RightButton) | 160 | if (_e->button() == RightButton) |
161 | { | 161 | { |
162 | //qDebug("MousePress"); | 162 | //qDebug("MousePress"); |
163 | mouseUpOn = false; | 163 | mouseUpOn = false; |
164 | if (m_swapmouse) | 164 | if (m_swapmouse) |
165 | { | 165 | { |
166 | int lineno = 0; | 166 | int lineno = 0; |
167 | /* | 167 | /* |
168 | int hgt = textarray[0]->lineSpacing(); | 168 | int hgt = textarray[0]->lineSpacing(); |
169 | while ((hgt < y) && (lineno < numlines)) | 169 | while ((hgt < y) && (lineno < numlines)) |
170 | { | 170 | { |
171 | hgt += textarray[++lineno]->lineSpacing(); | 171 | hgt += textarray[++lineno]->lineSpacing(); |
172 | } | 172 | } |
173 | */ | 173 | */ |
174 | size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt; | 174 | size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt; |
175 | QImage* img; | 175 | QImage* img; |
176 | getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt); | 176 | getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt); |
177 | processmousewordevent(startpos, startoffset, _e, lineno); | 177 | processmousewordevent(startpos, startoffset, _e, lineno); |
178 | } | 178 | } |
179 | else | 179 | else |
180 | { | 180 | { |
181 | processmousepositionevent(_e); | 181 | processmousepositionevent(_e); |
182 | } | 182 | } |
183 | } | 183 | } |
184 | } | 184 | } |
185 | else | 185 | else |
186 | { | 186 | { |
187 | int ln = -1; | 187 | int ln = -1; |
188 | int mp; | 188 | int mp; |
189 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); | 189 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); |
190 | switch (m_scrollpos) | 190 | switch (m_scrollpos) |
191 | { | 191 | { |
192 | case 1: | 192 | case 1: |
193 | { | 193 | { |
194 | if (m_rotated) | 194 | if (m_rotated) |
195 | { | 195 | { |
196 | if (_e->x() < m_bottommargin) | 196 | if (_e->x() < m_bottommargin) |
197 | { | 197 | { |
198 | ln = height(); | 198 | ln = height(); |
199 | mp = _e->y(); | 199 | mp = _e->y(); |
200 | } | 200 | } |
201 | } | 201 | } |
202 | else | 202 | else |
203 | { | 203 | { |
204 | if (_e->y() > height()-m_bottommargin) | 204 | if (_e->y() > height()-m_bottommargin) |
205 | { | 205 | { |
206 | ln = width(); | 206 | ln = width(); |
207 | mp = _e->x(); | 207 | mp = _e->x(); |
208 | } | 208 | } |
209 | } | 209 | } |
210 | } | 210 | } |
211 | break; | 211 | break; |
212 | case 2: | 212 | case 2: |
213 | { | 213 | { |
214 | if (m_rotated) | 214 | if (m_rotated) |
215 | { | 215 | { |
216 | if (_e->y() > height() - m_right_border) | 216 | if (_e->y() > height() - m_right_border) |
217 | { | 217 | { |
218 | ln = width(); | 218 | ln = width(); |
219 | mp = width()-_e->x(); | 219 | mp = width()-_e->x(); |
220 | } | 220 | } |
221 | } | 221 | } |
222 | else | 222 | else |
223 | { | 223 | { |
224 | if (_e->x() > width() - m_right_border) | 224 | if (_e->x() > width() - m_right_border) |
225 | { | 225 | { |
226 | ln = height(); | 226 | ln = height(); |
227 | mp = _e->y(); | 227 | mp = _e->y(); |
228 | } | 228 | } |
229 | } | 229 | } |
230 | } | 230 | } |
231 | break; | 231 | break; |
232 | case 3: | 232 | case 3: |
233 | { | 233 | { |
234 | if (m_rotated) | 234 | if (m_rotated) |
235 | { | 235 | { |
236 | if (_e->y() < m_left_border) | 236 | if (_e->y() < m_left_border) |
237 | { | 237 | { |
238 | ln = width(); | 238 | ln = width(); |
239 | mp = width()-_e->x(); | 239 | mp = width()-_e->x(); |
240 | } | 240 | } |
241 | } | 241 | } |
242 | else | 242 | else |
243 | { | 243 | { |
244 | if (_e->x() < m_left_border) | 244 | if (_e->x() < m_left_border) |
245 | { | 245 | { |
246 | ln = height(); | 246 | ln = height(); |
247 | mp = _e->y(); | 247 | mp = _e->y(); |
248 | } | 248 | } |
249 | } | 249 | } |
250 | } | 250 | } |
251 | break; | 251 | break; |
252 | case 0: | 252 | case 0: |
253 | default: | 253 | default: |
254 | ln = -1; | 254 | ln = -1; |
255 | break; | 255 | break; |
256 | } | 256 | } |
257 | if (ln >= 0) | 257 | if (ln >= 0) |
258 | { | 258 | { |
259 | int dp = (sectionsize*mp+ln/2)/ln + buffdoc.startSection(); | 259 | int dp = (sectionsize*mp+ln/2)/ln + buffdoc.startSection(); |
260 | int winsize = locnarray[numlines]-locnarray[0]; | 260 | int winsize = locnarray[numlines]-locnarray[0]; |
261 | int slidersize = 10*(sectionsize+ln/2)/ln; | 261 | int slidersize = 10*(sectionsize+ln/2)/ln; |
262 | if (slidersize > winsize) | 262 | if (slidersize > winsize) |
263 | { | 263 | { |
264 | int mid = (locnarray[0] + locnarray[numlines])/2; | 264 | int mid = (locnarray[0] + locnarray[numlines])/2; |
265 | slidersize /= 2; | 265 | slidersize /= 2; |
266 | if (dp < mid-slidersize) | 266 | if (dp < mid-slidersize) |
267 | { | 267 | { |
268 | dopageup(); | 268 | dopageup(); |
269 | } | 269 | } |
270 | else if (dp > mid+slidersize) | 270 | else if (dp > mid+slidersize) |
271 | { | 271 | { |
272 | dopagedn(); | 272 | dopagedn(); |
273 | } | 273 | } |
274 | //if (mid-slidersize < dp && dp < mid+slidersize) | 274 | //if (mid-slidersize < dp && dp < mid+slidersize) |
275 | else | 275 | else |
276 | { | 276 | { |
277 | m_drageligible = true; | 277 | m_drageligible = true; |
278 | } | 278 | } |
279 | } | 279 | } |
280 | else | 280 | else |
281 | { | 281 | { |
282 | if (dp < locnarray[0]) | 282 | if (dp < locnarray[0]) |
283 | { | 283 | { |
284 | dopageup(); | 284 | dopageup(); |
285 | } | 285 | } |
286 | else if (dp > locnarray[numlines]) | 286 | else if (dp > locnarray[numlines]) |
287 | { | 287 | { |
288 | dopagedn(); | 288 | dopagedn(); |
289 | } | 289 | } |
290 | //if (locnarray[0] < dp && dp < locnarray[numlines]) | 290 | //if (locnarray[0] < dp && dp < locnarray[numlines]) |
291 | else | 291 | else |
292 | { | 292 | { |
293 | m_drageligible = true; | 293 | m_drageligible = true; |
294 | } | 294 | } |
295 | } | 295 | } |
296 | qDebug("Drag eligible:%s", (m_drageligible) ? "true" : "false"); | 296 | qDebug("Drag eligible:%s", (m_drageligible) ? "true" : "false"); |
297 | } | 297 | } |
298 | else | 298 | else |
299 | { | 299 | { |
300 | if (m_scrollpos == 1) | 300 | if (m_scrollpos == 1) |
301 | { | 301 | { |
302 | if (x < m_left_border) | 302 | if (x < m_left_border) |
303 | { | 303 | { |
304 | lineUp(); | 304 | lineUp(); |
305 | } | 305 | } |
306 | if (y > ht - m_bottommargin) | 306 | if (y > ht - m_bottommargin) |
307 | { | 307 | { |
308 | lineDown(); | 308 | lineDown(); |
309 | } | 309 | } |
310 | } | 310 | } |
311 | else if (m_scrollpos != 0) | 311 | else if (m_scrollpos != 0) |
312 | { | 312 | { |
313 | if (y < m_topmargin) | 313 | if (y < m_topmargin) |
314 | { | 314 | { |
315 | lineUp(); | 315 | lineUp(); |
316 | } | 316 | } |
317 | if (y > ht - m_bottommargin) | 317 | if (y > ht - m_bottommargin) |
318 | { | 318 | { |
319 | lineDown(); | 319 | lineDown(); |
320 | } | 320 | } |
321 | } | 321 | } |
322 | } | 322 | } |
323 | } | 323 | } |
324 | } | 324 | } |
325 | 325 | ||
326 | void QTReader::processmousepositionevent( QMouseEvent* _e ) | 326 | void QTReader::processmousepositionevent( QMouseEvent* _e ) |
327 | { | 327 | { |
328 | int x, y, ht, wh; | 328 | int x, y, ht, wh; |
329 | if (m_rotated) | 329 | if (m_rotated) |
330 | { | 330 | { |
331 | x = _e->y(); | 331 | x = _e->y(); |
332 | y = width()-_e->x(); | 332 | y = width()-_e->x(); |
333 | ht = width(); | 333 | ht = width(); |
334 | wh = height(); | 334 | wh = height(); |
335 | } | 335 | } |
336 | else | 336 | else |
337 | { | 337 | { |
338 | x = _e->x(); | 338 | x = _e->x(); |
339 | y = _e->y(); | 339 | y = _e->y(); |
340 | ht = height(); | 340 | ht = height(); |
341 | wh = width(); | 341 | wh = width(); |
342 | } | 342 | } |
343 | if (buffdoc.hasnavigation()) | 343 | if (buffdoc.hasnavigation()) |
344 | { | 344 | { |
345 | if (y > (2*ht)/3) | 345 | if (y > (2*ht)/3) |
346 | { | 346 | { |
347 | goDown(); | 347 | goDown(); |
348 | } | 348 | } |
349 | else if (y < ht/3) | 349 | else if (y < ht/3) |
350 | { | 350 | { |
351 | goUp(); | 351 | goUp(); |
352 | } | 352 | } |
353 | else | 353 | else |
354 | { | 354 | { |
355 | if (x < wh/3) | 355 | if (x < wh/3) |
356 | { | 356 | { |
357 | goBack(); | 357 | goBack(); |
358 | } | 358 | } |
359 | else if (x > (2*wh)/3) | 359 | else if (x > (2*wh)/3) |
360 | { | 360 | { |
361 | goForward(); | 361 | goForward(); |
362 | } | 362 | } |
363 | else | 363 | else |
364 | { | 364 | { |
365 | goHome(); | 365 | goHome(); |
366 | } | 366 | } |
367 | } | 367 | } |
368 | } | 368 | } |
369 | else | 369 | else |
370 | { | 370 | { |
371 | if (y > ht/2) | 371 | if (y > ht/2) |
372 | { | 372 | { |
373 | goDown(); | 373 | goDown(); |
374 | } | 374 | } |
375 | else | 375 | else |
376 | { | 376 | { |
377 | goUp(); | 377 | goUp(); |
378 | } | 378 | } |
379 | } | 379 | } |
380 | } | 380 | } |
381 | 381 | ||
382 | void QTReader::goHome() | 382 | void QTReader::goHome() |
383 | { | 383 | { |
384 | if (buffdoc.hasnavigation()) | 384 | if (buffdoc.hasnavigation()) |
385 | { | 385 | { |
386 | size_t current=pagelocate(); | 386 | size_t current=pagelocate(); |
387 | size_t home=buffdoc.getHome(); | 387 | size_t home=buffdoc.getHome(); |
388 | if (current!=home) | 388 | if (current!=home) |
389 | { | 389 | { |
390 | buffdoc.saveposn(m_lastfile, current); | 390 | buffdoc.saveposn(m_lastfile, current); |
391 | locate(home); | 391 | locate(home); |
392 | } | 392 | } |
393 | } | 393 | } |
394 | else | 394 | else |
395 | locate(0); | 395 | locate(0); |
396 | } | 396 | } |
397 | 397 | ||
398 | void QTReader::goBack() | 398 | void QTReader::goBack() |
399 | { | 399 | { |
400 | if (buffdoc.hasnavigation()) | 400 | if (buffdoc.hasnavigation()) |
401 | { | 401 | { |
402 | size_t target = pagelocate(); | 402 | size_t target = pagelocate(); |
403 | QString nxt = m_lastfile; | 403 | QString nxt = m_lastfile; |
404 | buffdoc.writeposn(m_lastfile, target); | 404 | buffdoc.writeposn(m_lastfile, target); |
405 | linkType lt = buffdoc.back(nxt, target); | 405 | linkType lt = buffdoc.back(nxt, target); |
406 | if ((lt & eFile) != 0) | 406 | if ((lt & eFile) != 0) |
407 | { | 407 | { |
408 | if (nxt != m_lastfile) | 408 | if (nxt != m_lastfile) |
409 | { | 409 | { |
410 | emit NewFileRequest(nxt); | 410 | emit NewFileRequest(nxt); |
411 | } | 411 | } |
412 | locate(target); | 412 | locate(target); |
413 | } | 413 | } |
414 | else if ((lt & eLink) != 0) | 414 | else if ((lt & eLink) != 0) |
415 | { | 415 | { |
416 | locate(target); | 416 | locate(target); |
417 | } | 417 | } |
418 | } | 418 | } |
419 | } | 419 | } |
420 | 420 | ||
421 | void QTReader::goForward() | 421 | void QTReader::goForward() |
422 | { | 422 | { |
423 | if (buffdoc.hasnavigation()) | 423 | if (buffdoc.hasnavigation()) |
424 | { | 424 | { |
425 | size_t target = pagelocate(); | 425 | size_t target = pagelocate(); |
426 | QString nxt = m_lastfile; | 426 | QString nxt = m_lastfile; |
427 | linkType lt = buffdoc.forward(nxt, target); | 427 | linkType lt = buffdoc.forward(nxt, target); |
428 | if ((lt & eFile) != 0) | 428 | if ((lt & eFile) != 0) |
429 | { | 429 | { |
430 | if (nxt != m_lastfile) | 430 | if (nxt != m_lastfile) |
431 | { | 431 | { |
432 | emit NewFileRequest(nxt); | 432 | emit NewFileRequest(nxt); |
433 | } | 433 | } |
434 | locate(target); | 434 | locate(target); |
435 | } | 435 | } |
436 | else if ((lt & eLink) != 0) | 436 | else if ((lt & eLink) != 0) |
437 | { | 437 | { |
438 | locate(target); | 438 | locate(target); |
439 | } | 439 | } |
440 | } | 440 | } |
441 | } | 441 | } |
442 | 442 | ||
443 | linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*& img, size_t& tabtgt) | 443 | linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*& img, size_t& tabtgt) |
444 | { | 444 | { |
445 | int ht; | 445 | int ht; |
446 | if (m_scrolldy == m_topmargin) | 446 | if (m_scrolldy == m_topmargin) |
447 | { | 447 | { |
448 | lineno = 0; | 448 | lineno = 0; |
449 | ht = textarray[0]->lineSpacing()-m_scrolldy1 + m_topmargin; | 449 | ht = textarray[0]->lineSpacing()-m_scrolldy1 + m_topmargin; |
450 | } | 450 | } |
451 | else | 451 | else |
452 | { | 452 | { |
453 | if (y >= m_scrolldy) | 453 | if (y >= m_scrolldy) |
454 | { | 454 | { |
455 | lineno = 0; | 455 | lineno = 0; |
456 | ht = textarray[0]->lineSpacing()-m_scrolldy1+m_scrolldy + m_topmargin; | 456 | ht = textarray[0]->lineSpacing()-m_scrolldy1+m_scrolldy + m_topmargin; |
457 | } | 457 | } |
458 | else | 458 | else |
459 | { | 459 | { |
460 | lineno = 0; | 460 | lineno = 0; |
461 | ht = textarray[0]->lineSpacing()-m_scrolldy1+m_scrolldy+m_topmargin; | 461 | ht = textarray[0]->lineSpacing()-m_scrolldy1+m_scrolldy+m_topmargin; |
462 | while ((ht < h) && (lineno < numlines-1)) | 462 | while ((ht < h) && (lineno < numlines-1)) |
463 | { | 463 | { |
464 | ht += textarray[++lineno]->lineSpacing(); | 464 | ht += textarray[++lineno]->lineSpacing(); |
465 | } | 465 | } |
466 | ht = textarray[lineno]->lineSpacing(); | 466 | ht = textarray[lineno]->lineSpacing(); |
467 | } | 467 | } |
468 | } | 468 | } |
469 | while ((ht < y) && (lineno < numlines-1)) | 469 | while ((ht < y) && (lineno < numlines-1)) |
470 | { | 470 | { |
471 | ht += textarray[++lineno]->lineSpacing(); | 471 | ht += textarray[++lineno]->lineSpacing(); |
472 | } | 472 | } |
473 | if (ht < y && textarray[numlines]->showPartial()) lineno = numlines; | 473 | if (ht < y && textarray[numlines]->showPartial()) lineno = numlines; |
474 | start = locnarray[lineno]; | 474 | start = locnarray[lineno]; |
475 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; | 475 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; |
476 | if (m_bMonoSpaced) | 476 | if (m_bMonoSpaced) |
477 | { | 477 | { |
478 | offset = (x - textarray[lineno]->offset(w, m_left_border, m_right_border, availht))/m_charWidth; | 478 | offset = (x - textarray[lineno]->offset(w, m_left_border, m_right_border, availht))/m_charWidth; |
479 | } | 479 | } |
480 | else | 480 | else |
481 | { | 481 | { |
482 | int i; | 482 | int i; |
483 | CDrawBuffer* t = textarray[lineno]; | 483 | CDrawBuffer* t = textarray[lineno]; |
484 | x = x - t->offset(width(), m_left_border, m_right_border, availht); | 484 | x = x - t->offset(width(), m_left_border, m_right_border, availht); |
485 | for (i = t->length(); i > 0 && t->width(availht, i, true, w, m_left_border, m_right_border) > x; i--); | 485 | for (i = t->length(); i > 0 && t->width(availht, i, true, w, m_left_border, m_right_border) > x; i--); |
486 | offset = i; | 486 | offset = i; |
487 | } | 487 | } |
488 | return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img, tabtgt); | 488 | return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img, tabtgt); |
489 | } | 489 | } |
490 | 490 | ||
491 | void QTReader::suspend() | 491 | void QTReader::suspend() |
492 | { | 492 | { |
493 | buffdoc.suspend(); | 493 | buffdoc.suspend(); |
494 | /*#ifdef OPIE | 494 | /*#ifdef OPIE |
495 | if (memcmp("/mnt/", m_lastfile.latin1(), 5) == 0) buffdoc.suspend(); | 495 | if (memcmp("/mnt/", m_lastfile.latin1(), 5) == 0) buffdoc.suspend(); |
496 | #else | 496 | #else |
497 | if (memcmp("/usr/mnt.rom/", m_lastfile.latin1(), 13) == 0) buffdoc.suspend(); | 497 | if (memcmp("/usr/mnt.rom/", m_lastfile.latin1(), 13) == 0) buffdoc.suspend(); |
498 | #endif | 498 | #endif |
499 | */ | 499 | */ |
500 | } | 500 | } |
501 | 501 | ||
502 | void QTReader::setDoubleBuffer(bool _b) | 502 | void QTReader::setDoubleBuffer(bool _b) |
503 | { | 503 | { |
504 | m_doubleBuffered = _b; | 504 | m_doubleBuffered = _b; |
505 | if (_b || m_rotated) | 505 | if (_b || m_rotated) |
506 | { | 506 | { |
507 | if (dbuff == NULL) | 507 | if (dbuff == NULL) |
508 | { | 508 | { |
509 | dbuff = new QPixmap(); | 509 | dbuff = new QPixmap(); |
510 | dbp = new QPainter(); | 510 | dbp = new QPainter(); |
511 | } | 511 | } |
512 | if (m_rotated) | 512 | if (m_rotated) |
513 | { | 513 | { |
514 | dbuff->resize(height(), width()); | 514 | dbuff->resize(height(), width()); |
515 | } | 515 | } |
516 | else | 516 | else |
517 | { | 517 | { |
518 | dbuff->resize(width(), height()); | 518 | dbuff->resize(width(), height()); |
519 | } | 519 | } |
520 | m_outofdate = true; | 520 | m_outofdate = true; |
521 | } | 521 | } |
522 | else | 522 | else |
523 | { | 523 | { |
524 | if (dbuff != NULL) | 524 | if (dbuff != NULL) |
525 | { | 525 | { |
526 | delete dbuff; | 526 | delete dbuff; |
527 | delete dbp; | 527 | delete dbp; |
528 | } | 528 | } |
529 | dbuff = NULL; | 529 | dbuff = NULL; |
530 | dbp = NULL; | 530 | dbp = NULL; |
531 | } | 531 | } |
532 | } | 532 | } |
533 | 533 | ||
534 | void QTReader::setTwoTouch(bool _b) | 534 | void QTReader::setTwoTouch(bool _b) |
535 | { | 535 | { |
536 | setBackgroundColor( m_bg ); | 536 | setBackgroundColor( m_bg ); |
537 | m_twotouch = m_touchone = _b; | 537 | m_twotouch = m_touchone = _b; |
538 | } | 538 | } |
539 | 539 | ||
540 | void QTReader::setContinuous(bool _b) | 540 | void QTReader::setContinuous(bool _b) |
541 | { | 541 | { |
542 | buffdoc.setContinuous(m_continuousDocument = _b); | 542 | buffdoc.setContinuous(m_continuousDocument = _b); |
543 | } | 543 | } |
544 | 544 | ||
545 | void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouseEvent* _e, int lineno) | 545 | void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouseEvent* _e, int lineno) |
546 | { | 546 | { |
547 | unsigned long wrdstart, wrdend; | 547 | unsigned long wrdstart = 0, wrdend = 0; |
548 | QString wrd; | 548 | QString wrd; |
549 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; | 549 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; |
550 | if (m_twotouch) | 550 | if (m_twotouch) |
551 | { | 551 | { |
552 | if (m_touchone) | 552 | if (m_touchone) |
553 | { | 553 | { |
554 | m_touchone = false; | 554 | m_touchone = false; |
555 | m_startpos = startpos; | 555 | m_startpos = startpos; |
556 | m_startoffset = startoffset; | 556 | m_startoffset = startoffset; |
557 | setBackgroundColor( lightGray ); | 557 | setBackgroundColor( lightGray ); |
558 | } | 558 | } |
559 | else | 559 | else |
560 | { | 560 | { |
561 | m_touchone = true; | 561 | m_touchone = true; |
562 | setBackgroundColor( m_bg ); | 562 | setBackgroundColor( m_bg ); |
563 | size_t endpos, endoffset; | 563 | size_t endpos, endoffset; |
564 | endpos = startpos; | 564 | endpos = startpos; |
565 | endoffset = startoffset; | 565 | endoffset = startoffset; |
566 | size_t currentpos = locate(); | 566 | size_t currentpos = locate(); |
567 | if (endpos >= m_startpos) | 567 | if (endpos >= m_startpos) |
568 | { | 568 | { |
569 | jumpto(m_startpos); | 569 | jumpto(m_startpos); |
570 | for (int i = 0; i < m_startoffset; i++) | 570 | for (int i = 0; i < m_startoffset; i++) |
571 | { | 571 | { |
572 | getch(); | 572 | getch(); |
573 | } | 573 | } |
574 | wrdstart = buffdoc.explocate(); | 574 | wrdstart = buffdoc.explocate(); |
575 | if (m_startpos == endpos) | 575 | if (m_startpos == endpos) |
576 | { | 576 | { |
577 | for (int i = m_startoffset; i <= endoffset; i++) | 577 | for (int i = m_startoffset; i <= endoffset; i++) |
578 | { | 578 | { |
579 | wrd += QChar(getch()); | 579 | wrd += QChar(getch()); |
580 | } | 580 | } |
581 | } | 581 | } |
582 | else | 582 | else |
583 | { | 583 | { |
584 | while (buffdoc.explocate() <= endpos) | 584 | while (buffdoc.explocate() <= endpos) |
585 | { | 585 | { |
586 | wrd += QChar(getch()); | 586 | wrd += QChar(getch()); |
587 | } | 587 | } |
588 | for (int i = 0; i < endoffset; i++) | 588 | for (int i = 0; i < endoffset; i++) |
589 | { | 589 | { |
590 | wrd += QChar(getch()); | 590 | wrd += QChar(getch()); |
591 | } | 591 | } |
592 | } | 592 | } |
593 | wrdend = buffdoc.explocate(); | 593 | wrdend = buffdoc.explocate(); |
594 | jumpto(currentpos); | 594 | jumpto(currentpos); |
595 | } | 595 | } |
596 | } | 596 | } |
597 | } | 597 | } |
598 | else if (m_bMonoSpaced) | 598 | else if (m_bMonoSpaced) |
599 | { | 599 | { |
600 | int chno = (m_rotated) ? | 600 | int chno = (m_rotated) ? |
601 | (_e->y()-textarray[lineno]->offset(height(), m_left_border, m_right_border, availht))/m_charWidth | 601 | (_e->y()-textarray[lineno]->offset(height(), m_left_border, m_right_border, availht))/m_charWidth |
602 | : | 602 | : |
603 | (_e->x()-textarray[lineno]->offset(width(), m_left_border, m_right_border, availht))/m_charWidth; | 603 | (_e->x()-textarray[lineno]->offset(width(), m_left_border, m_right_border, availht))/m_charWidth; |
604 | if (chno < ustrlen(textarray[lineno]->data())) | 604 | if (chno < ustrlen(textarray[lineno]->data())) |
605 | { | 605 | { |
606 | wrd[0] = textarray[lineno]->data()[chno]; | 606 | wrd[0] = textarray[lineno]->data()[chno]; |
607 | } | 607 | } |
608 | } | 608 | } |
609 | else | 609 | else |
610 | { | 610 | { |
611 | CDrawBuffer* t = textarray[lineno]; | 611 | CDrawBuffer* t = textarray[lineno]; |
612 | int first = 0; | 612 | int first = 0; |
613 | int tgt = (m_rotated) ? | 613 | int tgt = (m_rotated) ? |
614 | _e->y() - t->offset(height(), m_left_border, m_right_border, availht) : | 614 | _e->y() - t->offset(height(), m_left_border, m_right_border, availht) : |
615 | _e->x() - t->offset(width(), m_left_border, m_right_border, availht); | 615 | _e->x() - t->offset(width(), m_left_border, m_right_border, availht); |
616 | while (1) | 616 | while (1) |
617 | { | 617 | { |
618 | int i = first+1; | 618 | int i = first+1; |
619 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; | 619 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; |
620 | while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; | 620 | while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; |
621 | if (t->width(availht, i, true, (m_rotated) ? height() : width(), m_left_border, m_right_border) > tgt) | 621 | if (t->width(availht, i, true, (m_rotated) ? height() : width(), m_left_border, m_right_border) > tgt) |
622 | { | 622 | { |
623 | wrd = toQString(t->data()+first, i - first); | 623 | wrd = toQString(t->data()+first, i - first); |
624 | // qDebug("Got %s", (const char *)wrd); | 624 | // qDebug("Got %s", (const char *)wrd); |
625 | break; | 625 | break; |
626 | } | 626 | } |
627 | while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; | 627 | while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; |
628 | if ((*t)[i] == 0) break; | 628 | if ((*t)[i] == 0) break; |
629 | first = i; | 629 | first = i; |
630 | } | 630 | } |
631 | } | 631 | } |
632 | if (!wrd.isEmpty()) | 632 | if (!wrd.isEmpty()) |
633 | { | 633 | { |
634 | qDebug("Selected:%s", (const char*)wrd); | 634 | qDebug("Selected:%s", (const char*)wrd); |
635 | if (m_twotouch) | 635 | if (m_twotouch) |
636 | { | 636 | { |
637 | emit OnWordSelected(wrd, wrdstart, wrdend, wrd); | 637 | emit OnWordSelected(wrd, wrdstart, wrdend, wrd); |
638 | } | 638 | } |
639 | else | 639 | else |
640 | { | 640 | { |
641 | QString line = toQString(textarray[lineno]->data()); | 641 | QString line = toQString(textarray[lineno]->data()); |
642 | emit OnWordSelected(wrd, locnarray[lineno], locnarray[lineno]+line.length(), line); | 642 | emit OnWordSelected(wrd, locnarray[lineno], locnarray[lineno]+line.length(), line); |
643 | } | 643 | } |
644 | } | 644 | } |
645 | } | 645 | } |
646 | 646 | ||
647 | #ifdef USETIMER | 647 | #ifdef USETIMER |
648 | void QTReader::actionDrag() | 648 | void QTReader::actionDrag() |
649 | { | 649 | { |
650 | if (m_drageligible) | 650 | if (m_drageligible) |
651 | { | 651 | { |
652 | int fivepages = 5*((2*width()+m_textsize/2)/m_textsize)*((height()+m_textsize/2)/m_textsize); | 652 | int fivepages = 5*((2*width()+m_textsize/2)/m_textsize)*((height()+m_textsize/2)/m_textsize); |
653 | if (m_dragtarget > fivepages && locnarray[numlines] < m_dragtarget - fivepages) | 653 | if (m_dragtarget > fivepages && locnarray[numlines] < m_dragtarget - fivepages) |
654 | { | 654 | { |
655 | int tgt = m_dragtarget - fivepages/2; | 655 | int tgt = m_dragtarget - fivepages/2; |
656 | //qDebug("Jumping to %u (%u)", tgt, fivepages); | 656 | //qDebug("Jumping to %u (%u)", tgt, fivepages); |
657 | if (tgt < buffdoc.startSection()) | 657 | if (tgt < buffdoc.startSection()) |
658 | { | 658 | { |
659 | tgt = buffdoc.startSection(); | 659 | tgt = buffdoc.startSection(); |
660 | } | 660 | } |
661 | locate(tgt); | 661 | locate(tgt); |
662 | drawFonts(); | 662 | drawFonts(); |
663 | } | 663 | } |
664 | else if (locnarray[0] > m_dragtarget+fivepages) | 664 | else if (locnarray[0] > m_dragtarget+fivepages) |
665 | { | 665 | { |
666 | int tgt = m_dragtarget + fivepages/2; | 666 | int tgt = m_dragtarget + fivepages/2; |
667 | //qDebug("Jumping to %u (%u)", tgt, fivepages); | 667 | //qDebug("Jumping to %u (%u)", tgt, fivepages); |
668 | if (tgt > buffdoc.endSection()) | 668 | if (tgt > buffdoc.endSection()) |
669 | { | 669 | { |
670 | dopageup(); | 670 | dopageup(); |
671 | } | 671 | } |
672 | else | 672 | else |
673 | { | 673 | { |
674 | locate(tgt); | 674 | locate(tgt); |
675 | drawFonts(); | 675 | drawFonts(); |
676 | } | 676 | } |
677 | } | 677 | } |
678 | else if (locnarray[numlines] <= m_dragtarget) | 678 | else if (locnarray[numlines] <= m_dragtarget) |
679 | { | 679 | { |
680 | dopagedn(); | 680 | dopagedn(); |
681 | } | 681 | } |
682 | else if (locnarray[0] > m_dragtarget) | 682 | else if (locnarray[0] > m_dragtarget) |
683 | { | 683 | { |
684 | dopageup(); | 684 | dopageup(); |
685 | } | 685 | } |
686 | } | 686 | } |
687 | else | 687 | else |
688 | { | 688 | { |
689 | m_dragtimer->stop(); | 689 | m_dragtimer->stop(); |
690 | } | 690 | } |
691 | } | 691 | } |
692 | #endif | 692 | #endif |
693 | 693 | ||
694 | void QTReader::mouseMoveEvent( QMouseEvent* _e ) | 694 | void QTReader::mouseMoveEvent( QMouseEvent* _e ) |
695 | { | 695 | { |
696 | if (m_drageligible) | 696 | if (m_drageligible) |
697 | { | 697 | { |
698 | int ht; | 698 | int ht; |
699 | int mp; | 699 | int mp; |
700 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); | 700 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); |
701 | //qDebug("Mouse moved to (%u, %u)", _e->x(), _e->y()); | 701 | //qDebug("Mouse moved to (%u, %u)", _e->x(), _e->y()); |
702 | switch (m_scrollpos) | 702 | switch (m_scrollpos) |
703 | { | 703 | { |
704 | case 1: | 704 | case 1: |
705 | { | 705 | { |
706 | if (m_rotated) | 706 | if (m_rotated) |
707 | { | 707 | { |
708 | ht = height(); | 708 | ht = height(); |
709 | mp = _e->y(); | 709 | mp = _e->y(); |
710 | } | 710 | } |
711 | else | 711 | else |
712 | { | 712 | { |
713 | ht = width(); | 713 | ht = width(); |
714 | mp = _e->x(); | 714 | mp = _e->x(); |
715 | } | 715 | } |
716 | } | 716 | } |
717 | break; | 717 | break; |
718 | case 2: | 718 | case 2: |
719 | case 3: | 719 | case 3: |
720 | { | 720 | { |
721 | if (m_rotated) | 721 | if (m_rotated) |
722 | { | 722 | { |
723 | ht = width(); | 723 | ht = width(); |
724 | mp = width()-_e->x(); | 724 | mp = width()-_e->x(); |
725 | } | 725 | } |
726 | else | 726 | else |
727 | { | 727 | { |
728 | ht = height(); | 728 | ht = height(); |
729 | mp = _e->y(); | 729 | mp = _e->y(); |
730 | } | 730 | } |
731 | } | 731 | } |
732 | break; | 732 | break; |
733 | case 0: | 733 | case 0: |
734 | default: | 734 | default: |
735 | ht = -1; | 735 | ht = -1; |
736 | break; | 736 | break; |
737 | } | 737 | } |
738 | if (ht >= 0) | 738 | if (ht >= 0) |
739 | { | 739 | { |
740 | #ifdef USETIMER | 740 | #ifdef USETIMER |
741 | m_dragtarget = (sectionsize*mp+ht/2)/ht + buffdoc.startSection(); | 741 | m_dragtarget = (sectionsize*mp+ht/2)/ht + buffdoc.startSection(); |
742 | if (!m_dragtimer->isActive()) | 742 | if (!m_dragtimer->isActive()) |
743 | { | 743 | { |
744 | m_dragtimer->start(0, false); | 744 | m_dragtimer->start(0, false); |
745 | } | 745 | } |
746 | #else | 746 | #else |
747 | int dp = (sectionsize*mp+ht/2)/ht + buffdoc.startSection(); | 747 | int dp = (sectionsize*mp+ht/2)/ht + buffdoc.startSection(); |
748 | locate(dp); | 748 | locate(dp); |
749 | #endif | 749 | #endif |
750 | } | 750 | } |
751 | } | 751 | } |
752 | } | 752 | } |
753 | 753 | ||
754 | void QTReader::mouseReleaseEvent( QMouseEvent* _e ) | 754 | void QTReader::mouseReleaseEvent( QMouseEvent* _e ) |
755 | { | 755 | { |
756 | qDebug("Mouse released at (%u, %u)", _e->x(), _e->y()); | 756 | qDebug("Mouse released at (%u, %u)", _e->x(), _e->y()); |
757 | if (m_drageligible) | 757 | if (m_drageligible) |
758 | { | 758 | { |
759 | m_drageligible = false; | 759 | m_drageligible = false; |
760 | } | 760 | } |
761 | else | 761 | else |
762 | { | 762 | { |
763 | int x, y, ht, wh; | 763 | int x, y, ht, wh; |
764 | if (m_rotated) | 764 | if (m_rotated) |
765 | { | 765 | { |
766 | x = _e->y(); | 766 | x = _e->y(); |
767 | y = width()-_e->x(); | 767 | y = width()-_e->x(); |
768 | ht = width(); | 768 | ht = width(); |
769 | wh = height(); | 769 | wh = height(); |
770 | } | 770 | } |
771 | else | 771 | else |
772 | { | 772 | { |
773 | x = _e->x(); | 773 | x = _e->x(); |
774 | y = _e->y(); | 774 | y = _e->y(); |
775 | ht = height(); | 775 | ht = height(); |
776 | wh = width(); | 776 | wh = width(); |
777 | } | 777 | } |
778 | if (_e->button() == LeftButton) | 778 | if (_e->button() == LeftButton) |
779 | { | 779 | { |
780 | if (mouseUpOn) | 780 | if (mouseUpOn) |
781 | { | 781 | { |
782 | // qDebug("MouseRelease"); | 782 | // qDebug("MouseRelease"); |
783 | /* | 783 | /* |
784 | switch(m_scrollpos) | 784 | switch(m_scrollpos) |
785 | { | 785 | { |
786 | case 1: // Bottom | 786 | case 1: // Bottom |
787 | if (y > ht - 5) | 787 | if (y > ht - 5) |
788 | { | 788 | { |
789 | locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*x+wh/2)/wh); | 789 | locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*x+wh/2)/wh); |
790 | return; | 790 | return; |
791 | } | 791 | } |
792 | break; | 792 | break; |
793 | case 2: // right | 793 | case 2: // right |
794 | if (x > wh - m_right_border) | 794 | if (x > wh - m_right_border) |
795 | { | 795 | { |
796 | locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*y+ht/2)/ht); | 796 | locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*y+ht/2)/ht); |
797 | return; | 797 | return; |
798 | } | 798 | } |
799 | break; | 799 | break; |
800 | case 3: // left | 800 | case 3: // left |
801 | if (x < m_left_border) | 801 | if (x < m_left_border) |
802 | { | 802 | { |
803 | locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*y+ht/2)/ht); | 803 | locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*y+ht/2)/ht); |
804 | return; | 804 | return; |
805 | } | 805 | } |
806 | break; | 806 | break; |
807 | case 0: | 807 | case 0: |
808 | default: | 808 | default: |
809 | break; | 809 | break; |
810 | } | 810 | } |
811 | */ | 811 | */ |
812 | if (textarray[0] != NULL) | 812 | if (textarray[0] != NULL) |
813 | { | 813 | { |
814 | QString line; | 814 | QString line; |
815 | // int lineno = _e->y()/m_linespacing; | 815 | // int lineno = _e->y()/m_linespacing; |
816 | int lineno = 0; | 816 | int lineno = 0; |
817 | /* | 817 | /* |
818 | int ht = textarray[0]->lineSpacing(); | 818 | int ht = textarray[0]->lineSpacing(); |
819 | while ((ht < y) && (lineno < numlines)) | 819 | while ((ht < y) && (lineno < numlines)) |
820 | { | 820 | { |
821 | ht += textarray[++lineno]->lineSpacing(); | 821 | ht += textarray[++lineno]->lineSpacing(); |
822 | } | 822 | } |
823 | */ | 823 | */ |
824 | size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt; | 824 | size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt; |
825 | QImage* img; | 825 | QImage* img; |
826 | if (m_currentlinkstyle != NULL) | 826 | if (m_currentlinkstyle != NULL) |
827 | { | 827 | { |
828 | textarray[m_currentlink]->invertLink(m_currentlinkoffset); | 828 | textarray[m_currentlink]->invertLink(m_currentlinkoffset); |
829 | m_currentlinkstyle = NULL; | 829 | m_currentlinkstyle = NULL; |
830 | m_currentlink = -1; | 830 | m_currentlink = -1; |
831 | m_currentlinkoffset = -1; | 831 | m_currentlinkoffset = -1; |
832 | } | 832 | } |
833 | linkType glt = getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt); | 833 | linkType glt = getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt); |
834 | if (bNoInlineTables && ((glt & eTable) != 0)) | 834 | if (bNoInlineTables && ((glt & eTable) != 0)) |
835 | { | 835 | { |
836 | size_t currentpos = locate(); | 836 | size_t currentpos = locate(); |
837 | QString tabtext = buffdoc.getTableAsHtml(tabtgt); | 837 | QString tabtext = buffdoc.getTableAsHtml(tabtgt); |
838 | qDebug("TABLE:%u:%u:%s", currentpos, tabtgt, (const char*)tabtext); | 838 | qDebug("TABLE:%u:%u:%s", currentpos, tabtgt, (const char*)tabtext); |
839 | QFont f(m_fontname, m_fontControl.currentsize()); | 839 | QFont f(m_fontname, m_fontControl.currentsize()); |
840 | #ifdef USEQPE | 840 | #ifdef USEQPE |
841 | CTableDialog td(f, tabtext, true, this); | 841 | CTableDialog td(f, tabtext, true, this); |
842 | #else | 842 | #else |
843 | CTableDialog td(f, tabtext, false, this); | 843 | CTableDialog td(f, tabtext, false, this); |
844 | #endif | 844 | #endif |
845 | td.exec(); | 845 | td.exec(); |
846 | jumpto(currentpos); | 846 | jumpto(currentpos); |
847 | } | 847 | } |
848 | if ((glt & eLink) != 0) | 848 | if ((glt & eLink) != 0) |
849 | { | 849 | { |
850 | if ((glt & ePicture) != 0) | 850 | if ((glt & ePicture) != 0) |
851 | { | 851 | { |
852 | qDebug("Big Picture:%x", pictgt); | 852 | qDebug("Big Picture:%x", pictgt); |
853 | if (QMessageBox::warning(this, PROGNAME, "Show picture or goto link?", "Show", "Goto Link") == 0) | 853 | if (QMessageBox::warning(this, PROGNAME, "Show picture or goto link?", "Show", "Goto Link") == 0) |
854 | { | 854 | { |
855 | QImage* pm = buffdoc.getPicture(pictgt); | 855 | QImage* pm = buffdoc.getPicture(pictgt); |
856 | if (pm != NULL) | 856 | if (pm != NULL) |
857 | { | 857 | { |
858 | emit OnShowPicture(*pm); | 858 | emit OnShowPicture(*pm); |
859 | delete pm; | 859 | delete pm; |
860 | return; | 860 | return; |
861 | } | 861 | } |
862 | } | 862 | } |
863 | } | 863 | } |
864 | else if (img != NULL) | 864 | else if (img != NULL) |
865 | { | 865 | { |
866 | if (QMessageBox::warning(this, PROGNAME, "Show picture or goto link?", "Show", "Goto Link") == 0) | 866 | if (QMessageBox::warning(this, PROGNAME, "Show picture or goto link?", "Show", "Goto Link") == 0) |
867 | { | 867 | { |
868 | emit OnShowPicture(*img); | 868 | emit OnShowPicture(*img); |
869 | return; | 869 | return; |
870 | } | 870 | } |
871 | } | 871 | } |
872 | size_t saveposn = pagelocate(); | 872 | size_t saveposn = pagelocate(); |
873 | QString href, nm; | 873 | QString href, nm; |
874 | linkType lt = buffdoc.hyperlink(tgt, tgtoffset, href, nm); | 874 | linkType lt = buffdoc.hyperlink(tgt, tgtoffset, href, nm); |
875 | qDebug("URL(1):%s", (const char*)href); | 875 | qDebug("URL(1):%s", (const char*)href); |
876 | if ((lt & eFile) != 0) | 876 | if ((lt & eFile) != 0) |
877 | { | 877 | { |
878 | buffdoc.saveposn(m_lastfile, saveposn); | 878 | buffdoc.saveposn(m_lastfile, saveposn); |
879 | #ifdef USEQPE | 879 | #ifdef USEQPE |
880 | { | 880 | { |
881 | QCopEnvelope e("QPE/System", "busy()"); | 881 | QCopEnvelope e("QPE/System", "busy()"); |
882 | } | 882 | } |
883 | #endif | 883 | #endif |
884 | ResetScroll(); | 884 | ResetScroll(); |
885 | if (!href.isEmpty()) | 885 | if (!href.isEmpty()) |
886 | { | 886 | { |
887 | if (!buffdoc.getFile(href, nm)) | 887 | if (!buffdoc.getFile(href, nm)) |
888 | { | 888 | { |
889 | emit NewFileRequest(href); | 889 | emit NewFileRequest(href); |
890 | } | 890 | } |
891 | else | 891 | else |
892 | { | 892 | { |
893 | qDebug("BEFORE:%u", pagelocate()); | 893 | qDebug("BEFORE:%u", pagelocate()); |
894 | buffdoc.resetPos(); | 894 | buffdoc.resetPos(); |
895 | ResetScroll(); | 895 | ResetScroll(); |
896 | fillbuffer(); | 896 | fillbuffer(); |
897 | qDebug("AFTER:%u", pagelocate()); | 897 | qDebug("AFTER:%u", pagelocate()); |
898 | m_outofdate = true; | 898 | m_outofdate = true; |
899 | update(); | 899 | update(); |
900 | } | 900 | } |
901 | } | 901 | } |
902 | if (!nm.isEmpty()) | 902 | if (!nm.isEmpty()) |
903 | { | 903 | { |
904 | qDebug("QTReader:Finding %s", (const char*)nm); | 904 | qDebug("QTReader:Finding %s", (const char*)nm); |
905 | if (buffdoc.findanchor(nm)) | 905 | if (buffdoc.findanchor(nm)) |
906 | { | 906 | { |
907 | buffdoc.resetPos(); | 907 | buffdoc.resetPos(); |
908 | fillbuffer(); | 908 | fillbuffer(); |
909 | m_outofdate = true; | 909 | m_outofdate = true; |
910 | update(); | 910 | update(); |
911 | } | 911 | } |
912 | } | 912 | } |
913 | //fillbuffer(); | 913 | //fillbuffer(); |
914 | //update(); | 914 | //update(); |
915 | #ifdef USEQPE | 915 | #ifdef USEQPE |
916 | { | 916 | { |
917 | QCopEnvelope e("QPE/System", "notBusy()"); | 917 | QCopEnvelope e("QPE/System", "notBusy()"); |
918 | } | 918 | } |
919 | #endif | 919 | #endif |
920 | } | 920 | } |
921 | else if ((lt & eLink) != 0) | 921 | else if ((lt & eLink) != 0) |
922 | { | 922 | { |
923 | buffdoc.saveposn(m_lastfile, saveposn); | 923 | buffdoc.saveposn(m_lastfile, saveposn); |
924 | ResetScroll(); | 924 | ResetScroll(); |
925 | fillbuffer(); | 925 | fillbuffer(); |
926 | m_outofdate = true; | 926 | m_outofdate = true; |
927 | update(); | 927 | update(); |
928 | } | 928 | } |
929 | else | 929 | else |
930 | { | 930 | { |
931 | if ((lt & ePicture) != 0) | 931 | if ((lt & ePicture) != 0) |
932 | { | 932 | { |
933 | QImage* pm = buffdoc.getPicture(tgt); | 933 | QImage* pm = buffdoc.getPicture(tgt); |
934 | if (pm != NULL) | 934 | if (pm != NULL) |
935 | { | 935 | { |
936 | emit OnShowPicture(*pm); | 936 | emit OnShowPicture(*pm); |
937 | delete pm; | 937 | delete pm; |
938 | } | 938 | } |
939 | } | 939 | } |
940 | else | 940 | else |
941 | { | 941 | { |
942 | // QString anchortext = textarray[lineno]->getanchortext(startoffset); | 942 | // QString anchortext = textarray[lineno]->getanchortext(startoffset); |
943 | if (!href.isEmpty()) | 943 | if (!href.isEmpty()) |
944 | { | 944 | { |
945 | emit OnURLSelected(href, tgt); | 945 | emit OnURLSelected(href, tgt); |
946 | } | 946 | } |
947 | } | 947 | } |
948 | } | 948 | } |
949 | return; | 949 | return; |
950 | } | 950 | } |
951 | else if ((glt & ePicture) != 0) | 951 | else if ((glt & ePicture) != 0) |
952 | { | 952 | { |
953 | qDebug("Big Picture:%x", pictgt); | 953 | qDebug("Big Picture:%x", pictgt); |
954 | QImage* pm = buffdoc.getPicture(pictgt); | 954 | QImage* pm = buffdoc.getPicture(pictgt); |
955 | if (pm != NULL) | 955 | if (pm != NULL) |
956 | { | 956 | { |
957 | emit OnShowPicture(*pm); | 957 | emit OnShowPicture(*pm); |
958 | delete pm; | 958 | delete pm; |
959 | } | 959 | } |
960 | else | 960 | else |
961 | { | 961 | { |
962 | update(); | 962 | update(); |
963 | } | 963 | } |
964 | return; | 964 | return; |
965 | } | 965 | } |
966 | else if (img != NULL) | 966 | else if (img != NULL) |
967 | { | 967 | { |
968 | emit OnShowPicture(*img); | 968 | emit OnShowPicture(*img); |
969 | return; | 969 | return; |
970 | } | 970 | } |
971 | if (m_swapmouse) | 971 | if (m_swapmouse) |
972 | processmousepositionevent(_e); | 972 | processmousepositionevent(_e); |
973 | else | 973 | else |
974 | processmousewordevent(startpos, startoffset, _e, lineno); | 974 | processmousewordevent(startpos, startoffset, _e, lineno); |
975 | } | 975 | } |
976 | } | 976 | } |
977 | else | 977 | else |
978 | { | 978 | { |
979 | mouseUpOn = true; | 979 | mouseUpOn = true; |
980 | } | 980 | } |
981 | } | 981 | } |
982 | } | 982 | } |
983 | } | 983 | } |
984 | 984 | ||
985 | void QTReader::focusInEvent(QFocusEvent* e) | 985 | void QTReader::focusInEvent(QFocusEvent* e) |
986 | { | 986 | { |
987 | if (m_autoScroll && (m_scrolltype != 4)) timer->start(real_delay(), false); | 987 | if (m_autoScroll && (m_scrolltype != 4)) timer->start(real_delay(), false); |
988 | update(); | 988 | update(); |
989 | } | 989 | } |
990 | 990 | ||
991 | void QTReader::focusOutEvent(QFocusEvent* e) | 991 | void QTReader::focusOutEvent(QFocusEvent* e) |
992 | { | 992 | { |
993 | if (m_autoScroll) | 993 | if (m_autoScroll) |
994 | { | 994 | { |
995 | if (m_scrolltype != 4) | 995 | if (m_scrolltype != 4) |
996 | { | 996 | { |
997 | timer->stop(); | 997 | timer->stop(); |
998 | } | 998 | } |
999 | else | 999 | else |
1000 | { | 1000 | { |
1001 | m_autoScroll = false; | 1001 | m_autoScroll = false; |
1002 | } | 1002 | } |
1003 | //m_scrolldy1 = m_scrolldy2 = 0; | 1003 | //m_scrolldy1 = m_scrolldy2 = 0; |
1004 | } | 1004 | } |
1005 | } | 1005 | } |
1006 | 1006 | ||
1007 | #include <qapplication.h> | 1007 | #include <qapplication.h> |
1008 | #include <qdrawutil.h> | 1008 | #include <qdrawutil.h> |
1009 | #ifndef _WINDOWS | 1009 | #ifndef _WINDOWS |
1010 | #include <unistd.h> | 1010 | #include <unistd.h> |
1011 | #endif | 1011 | #endif |
1012 | 1012 | ||
1013 | void QTReader::goDown() | 1013 | void QTReader::goDown() |
1014 | { | 1014 | { |
1015 | if (m_bpagemode) | 1015 | if (m_bpagemode) |
1016 | { | 1016 | { |
1017 | dopagedn(); | 1017 | dopagedn(); |
1018 | } | 1018 | } |
1019 | else | 1019 | else |
1020 | { | 1020 | { |
1021 | lineDown(); | 1021 | lineDown(); |
1022 | } | 1022 | } |
1023 | } | 1023 | } |
1024 | 1024 | ||
1025 | void QTReader::goUp() | 1025 | void QTReader::goUp() |
1026 | { | 1026 | { |
1027 | if (m_bpagemode) | 1027 | if (m_bpagemode) |
1028 | { | 1028 | { |
1029 | dopageup(); | 1029 | dopageup(); |
1030 | } | 1030 | } |
1031 | else | 1031 | else |
1032 | { | 1032 | { |
1033 | lineUp(); | 1033 | lineUp(); |
1034 | } | 1034 | } |
1035 | } | 1035 | } |
1036 | 1036 | ||
1037 | void QTReader::NavUp() | 1037 | void QTReader::NavUp() |
1038 | { | 1038 | { |
1039 | if (buffdoc.hasnavigation()) | 1039 | if (buffdoc.hasnavigation()) |
1040 | { | 1040 | { |
1041 | /* | 1041 | /* |
1042 | size_t target = pagelocate(); | 1042 | size_t target = pagelocate(); |
1043 | if (buffdoc.back(target)) | 1043 | if (buffdoc.back(target)) |
1044 | { | 1044 | { |
1045 | locate(target); | 1045 | locate(target); |
1046 | } | 1046 | } |
1047 | */ | 1047 | */ |
1048 | locate(buffdoc.startSection()); | 1048 | locate(buffdoc.startSection()); |
1049 | } | 1049 | } |
1050 | else | 1050 | else |
1051 | { | 1051 | { |
1052 | goUp(); | 1052 | goUp(); |
1053 | } | 1053 | } |
1054 | } | 1054 | } |
1055 | 1055 | ||
1056 | void QTReader::NavDown() | 1056 | void QTReader::NavDown() |
1057 | { | 1057 | { |
1058 | if (buffdoc.hasnavigation()) | 1058 | if (buffdoc.hasnavigation()) |
1059 | { | 1059 | { |
1060 | /* | 1060 | /* |
1061 | size_t target = pagelocate(); | 1061 | size_t target = pagelocate(); |
1062 | if (buffdoc.forward(target)) | 1062 | if (buffdoc.forward(target)) |
1063 | { | 1063 | { |
1064 | locate(target); | 1064 | locate(target); |
1065 | } | 1065 | } |
1066 | */ | 1066 | */ |
1067 | dopageup(buffdoc.endSection()); | 1067 | dopageup(buffdoc.endSection()); |
1068 | } | 1068 | } |
1069 | else | 1069 | else |
1070 | { | 1070 | { |
1071 | goDown(); | 1071 | goDown(); |
1072 | } | 1072 | } |
1073 | } | 1073 | } |
1074 | 1074 | ||
1075 | void QTReader::zoomin() | 1075 | void QTReader::zoomin() |
1076 | { | 1076 | { |
1077 | if (m_fontControl.increasesize()) | 1077 | if (m_fontControl.increasesize()) |
1078 | { | 1078 | { |
1079 | bool sc = m_autoScroll; | 1079 | bool sc = m_autoScroll; |
1080 | setautoscroll(false); | 1080 | setautoscroll(false); |
1081 | setfont(); | 1081 | setfont(); |
1082 | refresh(); | 1082 | refresh(); |
1083 | setautoscroll(sc); | 1083 | setautoscroll(sc); |
1084 | } | 1084 | } |
1085 | } | 1085 | } |
1086 | 1086 | ||
1087 | void QTReader::zoomout() | 1087 | void QTReader::zoomout() |
1088 | { | 1088 | { |
1089 | if (m_fontControl.decreasesize()) | 1089 | if (m_fontControl.decreasesize()) |
1090 | { | 1090 | { |
1091 | bool sc = m_autoScroll; | 1091 | bool sc = m_autoScroll; |
1092 | setautoscroll(false); | 1092 | setautoscroll(false); |
1093 | setfont(); | 1093 | setfont(); |
1094 | refresh(); | 1094 | refresh(); |
1095 | setautoscroll(sc); | 1095 | setautoscroll(sc); |
1096 | } | 1096 | } |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | void QTReader::reduceScroll() | 1099 | void QTReader::reduceScroll() |
1100 | { | 1100 | { |
1101 | if (m_delay < 59049) | 1101 | if (m_delay < 59049) |
1102 | { | 1102 | { |
1103 | m_delay = (3*m_delay)/2; | 1103 | m_delay = (3*m_delay)/2; |
1104 | timer->changeInterval(real_delay()); | 1104 | timer->changeInterval(real_delay()); |
1105 | } | 1105 | } |
1106 | else | 1106 | else |
1107 | { | 1107 | { |
1108 | m_delay = 59049; | 1108 | m_delay = 59049; |
1109 | } | 1109 | } |
1110 | } | 1110 | } |
1111 | 1111 | ||
1112 | void QTReader::increaseScroll() | 1112 | void QTReader::increaseScroll() |
1113 | { | 1113 | { |
1114 | if (m_delay > 454) | 1114 | if (m_delay > 454) |
1115 | { | 1115 | { |
1116 | m_delay = (2*m_delay)/3; | 1116 | m_delay = (2*m_delay)/3; |
1117 | timer->changeInterval(real_delay()); | 1117 | timer->changeInterval(real_delay()); |
1118 | } | 1118 | } |
1119 | else | 1119 | else |
1120 | { | 1120 | { |
1121 | m_delay = 454; | 1121 | m_delay = 454; |
1122 | } | 1122 | } |
1123 | } | 1123 | } |
1124 | 1124 | ||
1125 | void QTReader::keyPressEvent(QKeyEvent* e) | 1125 | void QTReader::keyPressEvent(QKeyEvent* e) |
1126 | { | 1126 | { |
1127 | 1127 | ||
1128 | //((QTReaderApp*)parent()->parent())->handlekey(e); | 1128 | //((QTReaderApp*)parent()->parent())->handlekey(e); |
1129 | emit HandleKeyRequest(e); | 1129 | emit HandleKeyRequest(e); |
1130 | // e->ignore(); | 1130 | // e->ignore(); |
1131 | return; | 1131 | return; |
1132 | #ifdef _SCROLLPIPE | 1132 | #ifdef _SCROLLPIPE |
1133 | if (m_isPaused) | 1133 | if (m_isPaused) |
1134 | { | 1134 | { |
1135 | m_isPaused = false; | 1135 | m_isPaused = false; |
1136 | if (e->key() != Key_Space) | 1136 | if (e->key() != Key_Space) |
1137 | { | 1137 | { |
1138 | m_autoScroll = false; | 1138 | m_autoScroll = false; |
1139 | if (m_pipeout != NULL) | 1139 | if (m_pipeout != NULL) |
1140 | { | 1140 | { |
1141 | pclose(m_pipeout); | 1141 | pclose(m_pipeout); |
1142 | m_pipeout = NULL; | 1142 | m_pipeout = NULL; |
1143 | } | 1143 | } |
1144 | //((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); | 1144 | //((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); |
1145 | emit SetScrollState(m_autoScroll); | 1145 | emit SetScrollState(m_autoScroll); |
1146 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; | 1146 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; |
1147 | } | 1147 | } |
1148 | else | 1148 | else |
1149 | { | 1149 | { |
1150 | timer->start(real_delay(), false); | 1150 | timer->start(real_delay(), false); |
1151 | } | 1151 | } |
1152 | e->accept(); | 1152 | e->accept(); |
1153 | return; | 1153 | return; |
1154 | } | 1154 | } |
1155 | #endif | 1155 | #endif |
1156 | } | 1156 | } |
1157 | 1157 | ||
1158 | void QTReader::CalculateScrollParameters() | 1158 | void QTReader::CalculateScrollParameters() |
1159 | { | 1159 | { |
1160 | int bmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); | 1160 | int bmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); |
1161 | if (bmargin < m_bottommargin) bmargin = m_bottommargin; | 1161 | if (bmargin < m_bottommargin) bmargin = m_bottommargin; |
1162 | switch (m_scrolltype) | 1162 | switch (m_scrolltype) |
1163 | { | 1163 | { |
1164 | case 0: | 1164 | case 0: |
1165 | { | 1165 | { |
1166 | if (m_scrolldy == m_topmargin) | 1166 | if (m_scrolldy == m_topmargin) |
1167 | { | 1167 | { |
1168 | m_scrolldy1 = 0; | 1168 | m_scrolldy1 = 0; |
1169 | m_scrolldy2 = 0; | 1169 | m_scrolldy2 = 0; |
1170 | m_totalscroll = 0; | 1170 | m_totalscroll = 0; |
1171 | return; | 1171 | return; |
1172 | } | 1172 | } |
1173 | if (m_scrolldy < textarray[0]->lineSpacing()) | 1173 | if (m_scrolldy < textarray[0]->lineSpacing()) |
1174 | { | 1174 | { |
1175 | m_scrolldy2 = m_scrolldy; | 1175 | m_scrolldy2 = m_scrolldy; |
1176 | return; | 1176 | return; |
1177 | } | 1177 | } |
1178 | int ht = m_scrolldy - m_scrolldy1; | 1178 | int ht = m_scrolldy - m_scrolldy1; |
1179 | int i; | 1179 | int i; |
1180 | for (i = 0; (ht < ((m_rotated) ? width() : height())-bmargin) && (i < numlines); i++) | 1180 | for (i = 0; (ht < ((m_rotated) ? width() : height())-bmargin) && (i < numlines); i++) |
1181 | { | 1181 | { |
1182 | ht += textarray[i]->lineSpacing(); | 1182 | ht += textarray[i]->lineSpacing(); |
1183 | } | 1183 | } |
1184 | ht = 0; | 1184 | ht = 0; |
1185 | int j; | 1185 | int j; |
1186 | i--; | 1186 | i--; |
1187 | for (j = i; j < numlines; j++) | 1187 | for (j = i; j < numlines; j++) |
1188 | { | 1188 | { |
1189 | ht += textarray[j]->lineSpacing(); | 1189 | ht += textarray[j]->lineSpacing(); |
1190 | } | 1190 | } |
1191 | ht -= ( | 1191 | ht -= ( |
1192 | textarray[i]->lineExtraSpacing() | 1192 | textarray[i]->lineExtraSpacing() |
1193 | + | 1193 | + |
1194 | (i != 0) ? textarray[numlines-1]->lineExtraSpacing() : 0 | 1194 | (i != 0) ? textarray[numlines-1]->lineExtraSpacing() : 0 |
1195 | )/2-2; | 1195 | )/2-2; |
1196 | 1196 | ||
1197 | m_scrolldy2 = m_scrolldy-ht; | 1197 | m_scrolldy2 = m_scrolldy-ht; |
1198 | } | 1198 | } |
1199 | break; | 1199 | break; |
1200 | case 1: | 1200 | case 1: |
1201 | case 2: | 1201 | case 2: |
1202 | case 3: | 1202 | case 3: |
1203 | { | 1203 | { |
1204 | int ypos = m_topmargin; | 1204 | int ypos = m_topmargin; |
1205 | for (int i = 0; i < numlines; i++) | 1205 | for (int i = 0; i < numlines; i++) |
1206 | { | 1206 | { |
1207 | ypos += textarray[i]->lineSpacing(); | 1207 | ypos += textarray[i]->lineSpacing(); |
1208 | } | 1208 | } |
1209 | ypos -= ( | 1209 | ypos -= ( |
1210 | textarray[0]->lineExtraSpacing() | 1210 | textarray[0]->lineExtraSpacing() |
1211 | + | 1211 | + |
1212 | ((numlines > 1) ? textarray[numlines-1]->lineExtraSpacing() : 0) | 1212 | ((numlines > 1) ? textarray[numlines-1]->lineExtraSpacing() : 0) |
1213 | )/2 + | 1213 | )/2 + |
1214 | m_scrolldy1 - 2; | 1214 | m_scrolldy1 - 2; |
1215 | m_scrolldy2 = ((m_rotated) ? width() : height()) - ypos - bmargin; | 1215 | m_scrolldy2 = ((m_rotated) ? width() : height()) - ypos - bmargin; |
1216 | } | 1216 | } |
1217 | break; | 1217 | break; |
1218 | } | 1218 | } |
1219 | } | 1219 | } |
1220 | 1220 | ||
1221 | void QTReader::setautoscroll(bool _sc) | 1221 | void QTReader::setautoscroll(bool _sc) |
1222 | { | 1222 | { |
1223 | m_outofdate = true; | 1223 | m_outofdate = true; |
1224 | if (_sc == m_autoScroll) return; | 1224 | if (_sc == m_autoScroll) return; |
1225 | if (m_autoScroll) | 1225 | if (m_autoScroll) |
1226 | { | 1226 | { |
1227 | m_autoScroll = false; | 1227 | m_autoScroll = false; |
1228 | #ifdef USEQPE | 1228 | #ifdef USEQPE |
1229 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; | 1229 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; |
1230 | #endif | 1230 | #endif |
1231 | #ifdef _SCROLLPIPE | 1231 | #ifdef _SCROLLPIPE |
1232 | if (m_pipeout != NULL) | 1232 | if (m_pipeout != NULL) |
1233 | { | 1233 | { |
1234 | pclose(m_pipeout); | 1234 | pclose(m_pipeout); |
1235 | m_pipeout = NULL; | 1235 | m_pipeout = NULL; |
1236 | } | 1236 | } |
1237 | #endif | 1237 | #endif |
1238 | //m_scrolldy1 = 0; | 1238 | //m_scrolldy1 = 0; |
1239 | //refresh(); | 1239 | //refresh(); |
1240 | } | 1240 | } |
1241 | else | 1241 | else |
1242 | { | 1242 | { |
1243 | CDrawBuffer* reusebuffer = textarray[numlines]; | 1243 | CDrawBuffer* reusebuffer = textarray[numlines]; |
1244 | if (reusebuffer == NULL || reusebuffer->eof()) return; | 1244 | if (reusebuffer == NULL || reusebuffer->eof()) return; |
1245 | #ifndef __STATIC | 1245 | #ifndef __STATIC |
1246 | if ((m_scrolltype == 4) && !checkoutput()) return; | 1246 | if ((m_scrolltype == 4) && !checkoutput()) return; |
1247 | #endif | 1247 | #endif |
1248 | m_autoScroll = true; | 1248 | m_autoScroll = true; |
1249 | CalculateScrollParameters(); | 1249 | CalculateScrollParameters(); |
1250 | 1250 | ||
1251 | #ifdef _SCROLLPIPE | 1251 | #ifdef _SCROLLPIPE |
1252 | if (!m_pipetarget.isEmpty()) | 1252 | if (!m_pipetarget.isEmpty()) |
1253 | { | 1253 | { |
1254 | // qDebug("Opening pipe to %s", (const char*)m_pipetarget); | 1254 | // qDebug("Opening pipe to %s", (const char*)m_pipetarget); |
1255 | m_pipeout = popen((const char*)m_pipetarget, "w"); | 1255 | m_pipeout = popen((const char*)m_pipetarget, "w"); |
1256 | m_isPaused = false; | 1256 | m_isPaused = false; |
1257 | } | 1257 | } |
1258 | #endif | 1258 | #endif |
1259 | autoscroll(); | 1259 | autoscroll(); |
1260 | #ifdef USEQPE | 1260 | #ifdef USEQPE |
1261 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed | 1261 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed |
1262 | #endif | 1262 | #endif |
1263 | } | 1263 | } |
1264 | } | 1264 | } |
1265 | 1265 | ||
1266 | bool QTReader::getline(CDrawBuffer *buff) | 1266 | bool QTReader::getline(CDrawBuffer *buff) |
1267 | { | 1267 | { |
1268 | bool bRet; | 1268 | bool bRet; |
1269 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; | 1269 | int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; |
1270 | if (m_bMonoSpaced) | 1270 | if (m_bMonoSpaced) |
1271 | { | 1271 | { |
1272 | bRet = buffdoc.getline(buff ,(m_rotated) ? height() : width(), m_charWidth, m_left_border, m_right_border, availht); | 1272 | bRet = buffdoc.getline(buff ,(m_rotated) ? height() : width(), m_charWidth, m_left_border, m_right_border, availht); |
1273 | } | 1273 | } |
1274 | else | 1274 | else |
1275 | { | 1275 | { |
1276 | bRet = buffdoc.getline(buff, (m_rotated) ? height() : width(), m_left_border, m_right_border, hyphenate, availht); | 1276 | bRet = buffdoc.getline(buff, (m_rotated) ? height() : width(), m_left_border, m_right_border, hyphenate, availht); |
1277 | } | 1277 | } |
1278 | buff->resize(availht); | 1278 | buff->resize(availht); |
1279 | return bRet; | 1279 | return bRet; |
1280 | } | 1280 | } |
1281 | 1281 | ||
1282 | void QTReader::doscroll() | 1282 | void QTReader::doscroll() |
1283 | { | 1283 | { |
1284 | if (!m_autoScroll) | 1284 | if (!m_autoScroll) |
1285 | { | 1285 | { |
1286 | timer->stop(); | 1286 | timer->stop(); |
1287 | return; | 1287 | return; |
1288 | } | 1288 | } |
1289 | switch (m_scrolltype) | 1289 | switch (m_scrolltype) |
1290 | { | 1290 | { |
1291 | case 0: | 1291 | case 0: |
1292 | doinplacescroll(); | 1292 | doinplacescroll(); |
1293 | break; | 1293 | break; |
1294 | case 1: | 1294 | case 1: |
1295 | dorollingscroll(false); | 1295 | dorollingscroll(false); |
1296 | break; | 1296 | break; |
1297 | case 2: | 1297 | case 2: |
1298 | dorollingscroll(true); | 1298 | dorollingscroll(true); |
1299 | break; | 1299 | break; |
1300 | case 3: | 1300 | case 3: |
1301 | dostaticscroll(); | 1301 | dostaticscroll(); |
1302 | break; | 1302 | break; |
1303 | } | 1303 | } |
1304 | } | 1304 | } |
1305 | 1305 | ||
1306 | void QTReader::doinplacescroll() | 1306 | void QTReader::doinplacescroll() |
1307 | { | 1307 | { |
1308 | QPainter p( this ); | 1308 | QPainter p( this ); |
1309 | // p.setBackgroundMode(OpaqueMode); | 1309 | // p.setBackgroundMode(OpaqueMode); |
1310 | int wh, ht; | 1310 | int wh, ht; |
1311 | int bmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); | 1311 | int bmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); |
1312 | if (bmargin < m_bottommargin) bmargin = m_bottommargin; | 1312 | if (bmargin < m_bottommargin) bmargin = m_bottommargin; |
1313 | if (m_rotated) | 1313 | if (m_rotated) |
1314 | { | 1314 | { |
1315 | ht = width()-bmargin; | 1315 | ht = width()-bmargin; |
1316 | wh = height(); | 1316 | wh = height(); |
1317 | } | 1317 | } |
1318 | else | 1318 | else |
1319 | { | 1319 | { |
1320 | ht = height()-bmargin; | 1320 | ht = height()-bmargin; |
1321 | wh = width(); | 1321 | wh = width(); |
1322 | } | 1322 | } |
1323 | int lastdy = m_scrolldy; | 1323 | int lastdy = m_scrolldy; |
1324 | m_scrolldy += m_scrollstep; | 1324 | m_scrolldy += m_scrollstep; |
1325 | if ((m_scrolldy1 = m_scrolldy1+m_scrollstep) >= textarray[0]->lineSpacing()) | 1325 | if ((m_scrolldy1 = m_scrolldy1+m_scrollstep) >= textarray[0]->lineSpacing()) |
1326 | { | 1326 | { |
1327 | int ht = textarray[0]->lineSpacing(); | 1327 | int ht = textarray[0]->lineSpacing(); |
1328 | #ifdef _SCROLLPIPE | 1328 | #ifdef _SCROLLPIPE |
1329 | if (m_pipeout != NULL) | 1329 | if (m_pipeout != NULL) |
1330 | { | 1330 | { |
1331 | QString outstr = toQString(textarray[0]->data()); | 1331 | QString outstr = toQString(textarray[0]->data()); |
1332 | if (!outstr.isEmpty()) | 1332 | if (!outstr.isEmpty()) |
1333 | { | 1333 | { |
1334 | fprintf(m_pipeout, "%s\n", (const char*)outstr); | 1334 | fprintf(m_pipeout, "%s\n", (const char*)outstr); |
1335 | fflush(m_pipeout); | 1335 | fflush(m_pipeout); |
1336 | } | 1336 | } |
1337 | else if (m_pauseAfterEachPara) | 1337 | else if (m_pauseAfterEachPara) |
1338 | { | 1338 | { |
1339 | m_isPaused = true; | 1339 | m_isPaused = true; |
1340 | timer->stop(); | 1340 | timer->stop(); |
1341 | } | 1341 | } |
1342 | } | 1342 | } |
1343 | #endif | 1343 | #endif |
1344 | CDrawBuffer* buff = textarray[0]; | 1344 | CDrawBuffer* buff = textarray[0]; |
1345 | for (int i = 1; i <= numlines; i++) | 1345 | for (int i = 1; i <= numlines; i++) |
1346 | { | 1346 | { |
1347 | textarray[i-1] = textarray[i]; | 1347 | textarray[i-1] = textarray[i]; |
1348 | locnarray[i-1] = locnarray[i]; | 1348 | locnarray[i-1] = locnarray[i]; |
1349 | } | 1349 | } |
1350 | textarray[numlines] = buff; | 1350 | textarray[numlines] = buff; |
1351 | --numlines; | 1351 | --numlines; |
1352 | m_scrolldy1 -= ht; | 1352 | m_scrolldy1 -= ht; |
1353 | } | 1353 | } |
1354 | if ((m_scrolldy2 = m_scrolldy2+m_scrollstep) >= textarray[numlines]->lineSpacing()) | 1354 | if ((m_scrolldy2 = m_scrolldy2+m_scrollstep) >= textarray[numlines]->lineSpacing()) |
1355 | { | 1355 | { |
1356 | m_scrolldy2 -= textarray[numlines]->lineSpacing(); | 1356 | m_scrolldy2 -= textarray[numlines]->lineSpacing(); |
1357 | numlines++; | 1357 | numlines++; |
1358 | 1358 | ||
1359 | if (textarray[numlines] == NULL) | 1359 | if (textarray[numlines] == NULL) |
1360 | { | 1360 | { |
1361 | textarray[numlines] = new CDrawBuffer(&m_fontControl); | 1361 | textarray[numlines] = new CDrawBuffer(&m_fontControl); |
1362 | } | 1362 | } |
1363 | locnarray[numlines] = locate(); | 1363 | locnarray[numlines] = locate(); |
1364 | int ch = getline(textarray[numlines]); | 1364 | int ch = getline(textarray[numlines]); |
1365 | if (m_rotated) | 1365 | if (m_rotated) |
1366 | { | 1366 | { |
1367 | blitRot(width()-m_scrolldy, 0, height(), -1, textarray[numlines-1]); | 1367 | blitRot(width()-m_scrolldy, 0, height(), -1, textarray[numlines-1]); |
1368 | } | 1368 | } |
1369 | else | 1369 | else |
1370 | { | 1370 | { |
1371 | if (m_bgpm.isNull()) | 1371 | if (m_bgpm.isNull()) |
1372 | { | 1372 | { |
1373 | p.fillRect(m_left_border,m_scrolldy-textarray[numlines-1]->lineSpacing(),width()-(m_left_border+m_right_border),textarray[numlines-1]->lineSpacing(),m_bg); | 1373 | p.fillRect(m_left_border,m_scrolldy-textarray[numlines-1]->lineSpacing(),width()-(m_left_border+m_right_border),textarray[numlines-1]->lineSpacing(),m_bg); |
1374 | } | 1374 | } |
1375 | else | 1375 | else |
1376 | { | 1376 | { |
1377 | int h_tmp = textarray[numlines-1]->lineSpacing(); | 1377 | int h_tmp = textarray[numlines-1]->lineSpacing(); |
1378 | bitBlt(this, m_left_border, m_scrolldy-h_tmp, dbuff, m_left_border, m_scrolldy-h_tmp, width()-(m_left_border+m_right_border), h_tmp); | 1378 | bitBlt(this, m_left_border, m_scrolldy-h_tmp, dbuff, m_left_border, m_scrolldy-h_tmp, width()-(m_left_border+m_right_border), h_tmp); |
1379 | } | 1379 | } |
1380 | textarray[numlines-1]->render(&p, m_scrolldy -textarray[numlines-1]->lineSpacing()+ textarray[numlines-1]->ascent(), m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); | 1380 | textarray[numlines-1]->render(&p, m_scrolldy -textarray[numlines-1]->lineSpacing()+ textarray[numlines-1]->ascent(), m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); |
1381 | } | 1381 | } |
1382 | mylastpos = locate(); | 1382 | mylastpos = locate(); |
1383 | if (!ch) | 1383 | if (!ch) |
1384 | { | 1384 | { |
1385 | m_scrolldy = m_topmargin; | 1385 | m_scrolldy = m_topmargin; |
1386 | m_autoScroll = false; | 1386 | m_autoScroll = false; |
1387 | #ifdef _SCROLLPIPE | 1387 | #ifdef _SCROLLPIPE |
1388 | for (int i = 0; i < numlines; i++) | 1388 | for (int i = 0; i < numlines; i++) |
1389 | { | 1389 | { |
1390 | if (m_pipeout != NULL) | 1390 | if (m_pipeout != NULL) |
1391 | { | 1391 | { |
1392 | QString outstr = toQString(textarray[i]->data()); | 1392 | QString outstr = toQString(textarray[i]->data()); |
1393 | if (!outstr.isEmpty()) | 1393 | if (!outstr.isEmpty()) |
1394 | { | 1394 | { |
1395 | fprintf(m_pipeout, "%s\n", (const char*)outstr); | 1395 | fprintf(m_pipeout, "%s\n", (const char*)outstr); |
1396 | fflush(m_pipeout); | 1396 | fflush(m_pipeout); |
1397 | } | 1397 | } |
1398 | } | 1398 | } |
1399 | } | 1399 | } |
1400 | #endif | 1400 | #endif |
1401 | emit SetScrollState(m_autoScroll); | 1401 | emit SetScrollState(m_autoScroll); |
1402 | #ifdef USEQPE | 1402 | #ifdef USEQPE |
1403 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; | 1403 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; |
1404 | #endif | 1404 | #endif |
1405 | } | 1405 | } |
1406 | if (m_scrolldy > ht-textarray[numlines]->lineSpacing()) | 1406 | if (m_scrolldy > ht-textarray[numlines]->lineSpacing()) |
1407 | { | 1407 | { |
1408 | if (m_rotated) | 1408 | if (m_rotated) |
1409 | { | 1409 | { |
1410 | if (m_bgpm.isNull()) | 1410 | if (m_bgpm.isNull()) |
1411 | { | 1411 | { |
1412 | p.fillRect(bmargin, m_left_border, ht-m_scrolldy, wh-(m_left_border+m_right_border), m_bg); | 1412 | p.fillRect(bmargin, m_left_border, ht-m_scrolldy, wh-(m_left_border+m_right_border), m_bg); |
1413 | } | 1413 | } |
1414 | else | 1414 | else |
1415 | { | 1415 | { |
1416 | blitRot(bmargin, 0,height(), ht-m_scrolldy, NULL); | 1416 | blitRot(bmargin, 0,height(), ht-m_scrolldy, NULL); |
1417 | } | 1417 | } |
1418 | } | 1418 | } |
1419 | else | 1419 | else |
1420 | if (m_bgpm.isNull()) | 1420 | if (m_bgpm.isNull()) |
1421 | { | 1421 | { |
1422 | p.fillRect(m_left_border,m_scrolldy,width()-(m_left_border+m_right_border),height()-m_scrolldy,m_bg); | 1422 | p.fillRect(m_left_border,m_scrolldy,width()-(m_left_border+m_right_border),height()-m_scrolldy,m_bg); |
1423 | } | 1423 | } |
1424 | else | 1424 | else |
1425 | { | 1425 | { |
1426 | bitBlt(this,m_left_border,m_scrolldy,dbuff,m_left_border,m_scrolldy,width()-(m_left_border+m_right_border), height()-m_scrolldy); | 1426 | bitBlt(this,m_left_border,m_scrolldy,dbuff,m_left_border,m_scrolldy,width()-(m_left_border+m_right_border), height()-m_scrolldy); |
1427 | } | 1427 | } |
1428 | m_scrolldy = m_topmargin; | 1428 | m_scrolldy = m_topmargin; |
1429 | m_scrolldy2 = 0; | 1429 | m_scrolldy2 = 0; |
1430 | } | 1430 | } |
1431 | redrawScroll(&p); | 1431 | redrawScroll(&p); |
1432 | emitRedraw(); | 1432 | emitRedraw(); |
1433 | lastdy = -1; | 1433 | lastdy = -1; |
1434 | } | 1434 | } |
1435 | // else | 1435 | // else |
1436 | { | 1436 | { |
1437 | if (m_rotated) | 1437 | if (m_rotated) |
1438 | { | 1438 | { |
1439 | if (lastdy >= 0) | 1439 | if (lastdy >= 0) |
1440 | { | 1440 | { |
1441 | if (m_bgpm.isNull()) | 1441 | if (m_bgpm.isNull()) |
1442 | { | 1442 | { |
1443 | p.fillRect(width()-lastdy, m_left_border, m_scrollstep, wh-(m_left_border+m_right_border),m_bg); | 1443 | p.fillRect(width()-lastdy, m_left_border, m_scrollstep, wh-(m_left_border+m_right_border),m_bg); |
1444 | } | 1444 | } |
1445 | else | 1445 | else |
1446 | { | 1446 | { |
1447 | blitRot(width()-lastdy,m_left_border,wh-(m_left_border+m_right_border), m_scrollstep, NULL); | 1447 | blitRot(width()-lastdy,m_left_border,wh-(m_left_border+m_right_border), m_scrollstep, NULL); |
1448 | } | 1448 | } |
1449 | } | 1449 | } |
1450 | p.fillRect(width()-m_scrolldy, m_left_border, 1,wh-(m_left_border+m_right_border),m_scrollcolor); | 1450 | p.fillRect(width()-m_scrolldy, m_left_border, 1,wh-(m_left_border+m_right_border),m_scrollcolor); |
1451 | } | 1451 | } |
1452 | else | 1452 | else |
1453 | { | 1453 | { |
1454 | if (lastdy >= 0) | 1454 | if (lastdy >= 0) |
1455 | { | 1455 | { |
1456 | if (m_bgpm.isNull()) | 1456 | if (m_bgpm.isNull()) |
1457 | { | 1457 | { |
1458 | p.fillRect(m_left_border,lastdy,width()-(m_left_border+m_right_border),m_scrollstep,m_bg); | 1458 | p.fillRect(m_left_border,lastdy,width()-(m_left_border+m_right_border),m_scrollstep,m_bg); |
1459 | } | 1459 | } |
1460 | else | 1460 | else |
1461 | { | 1461 | { |
1462 | bitBlt(this, m_left_border, lastdy, dbuff, m_left_border, lastdy, width()-(m_left_border+m_right_border), m_scrollstep); | 1462 | bitBlt(this, m_left_border, lastdy, dbuff, m_left_border, lastdy, width()-(m_left_border+m_right_border), m_scrollstep); |
1463 | } | 1463 | } |
1464 | } | 1464 | } |
1465 | p.fillRect(m_left_border,m_scrolldy,width()-(m_left_border+m_right_border),1,m_scrollcolor); | 1465 | p.fillRect(m_left_border,m_scrolldy,width()-(m_left_border+m_right_border),1,m_scrollcolor); |
1466 | } | 1466 | } |
1467 | } | 1467 | } |
1468 | } | 1468 | } |
1469 | 1469 | ||
1470 | void QTReader::dorollingscroll(bool _statbord) | 1470 | void QTReader::dorollingscroll(bool _statbord) |
1471 | { | 1471 | { |
1472 | bool bredrawscroll = false; | 1472 | bool bredrawscroll = false; |
1473 | QPainter p( this ); | 1473 | QPainter p( this ); |
1474 | // 2 = right, 3 = left | 1474 | // 2 = right, 3 = left |
1475 | int tmargin = (_statbord) ? m_topmargin : 0; | 1475 | int tmargin = (_statbord) ? m_topmargin : 0; |
1476 | int lmargin = (m_scrollpos == 3 || _statbord) ? m_left_border : 0; | 1476 | int lmargin = (m_scrollpos == 3 || _statbord) ? m_left_border : 0; |
1477 | int rmargin = (m_scrollpos == 2 || _statbord) ? m_right_border : 0; | 1477 | int rmargin = (m_scrollpos == 2 || _statbord) ? m_right_border : 0; |
1478 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); | 1478 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); |
1479 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; | 1479 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; |
1480 | if (m_rotated) | 1480 | if (m_rotated) |
1481 | { | 1481 | { |
1482 | m_totalscroll = (m_totalscroll+m_scrollstep) % width(); | 1482 | m_totalscroll = (m_totalscroll+m_scrollstep) % width(); |
1483 | bitBlt(this, m_scrollstep+hmargin, lmargin, this, hmargin, lmargin, width()-tmargin-hmargin, height()-(lmargin+rmargin)); | 1483 | bitBlt(this, m_scrollstep+hmargin, lmargin, this, hmargin, lmargin, width()-tmargin-hmargin, height()-(lmargin+rmargin)); |
1484 | if (!m_bgpm.isNull()) | 1484 | if (!m_bgpm.isNull()) |
1485 | { | 1485 | { |
1486 | blitRot(hmargin, tmargin, height(), m_scrollstep, NULL); | 1486 | blitRot(hmargin, tmargin, height(), m_scrollstep, NULL); |
1487 | } | 1487 | } |
1488 | else | 1488 | else |
1489 | { | 1489 | { |
1490 | p.fillRect(hmargin, rmargin, m_scrollstep, height()-lmargin-rmargin, m_bg); | 1490 | p.fillRect(hmargin, rmargin, m_scrollstep, height()-lmargin-rmargin, m_bg); |
1491 | } | 1491 | } |
1492 | } | 1492 | } |
1493 | else | 1493 | else |
1494 | { | 1494 | { |
1495 | m_totalscroll = (m_totalscroll+m_scrollstep) % height(); | 1495 | m_totalscroll = (m_totalscroll+m_scrollstep) % height(); |
1496 | bitBlt(this,lmargin,tmargin,this,lmargin,tmargin+m_scrollstep,width()-(lmargin+rmargin),height() - tmargin - hmargin - m_scrollstep); | 1496 | bitBlt(this,lmargin,tmargin,this,lmargin,tmargin+m_scrollstep,width()-(lmargin+rmargin),height() - tmargin - hmargin - m_scrollstep); |
1497 | if (m_bgpm.isNull()) | 1497 | if (m_bgpm.isNull()) |
1498 | { | 1498 | { |
1499 | p.fillRect(0, height() - (m_scrollstep+1) - hmargin, width(), (m_scrollstep+1), m_bg); | 1499 | p.fillRect(0, height() - (m_scrollstep+1) - hmargin, width(), (m_scrollstep+1), m_bg); |
1500 | } | 1500 | } |
1501 | else | 1501 | else |
1502 | { | 1502 | { |
1503 | int loff = (_statbord) ? 0 : m_totalscroll; | 1503 | int loff = (_statbord) ? 0 : m_totalscroll; |
1504 | bitBlt(this,0,height() - (m_scrollstep+1) - hmargin, dbuff, 0, (loff+height() - (m_scrollstep+1) - hmargin) % height(), width(), (m_scrollstep+1)); | 1504 | bitBlt(this,0,height() - (m_scrollstep+1) - hmargin, dbuff, 0, (loff+height() - (m_scrollstep+1) - hmargin) % height(), width(), (m_scrollstep+1)); |
1505 | } | 1505 | } |
1506 | } | 1506 | } |
1507 | 1507 | ||
1508 | if ((m_scrolldy1 = m_scrolldy1+m_scrollstep) >= textarray[0]->lineSpacing()) | 1508 | if ((m_scrolldy1 = m_scrolldy1+m_scrollstep) >= textarray[0]->lineSpacing()) |
1509 | { | 1509 | { |
1510 | int ht = textarray[0]->lineSpacing(); | 1510 | int ht = textarray[0]->lineSpacing(); |
1511 | bredrawscroll = true; | 1511 | bredrawscroll = true; |
1512 | #ifdef _SCROLLPIPE | 1512 | #ifdef _SCROLLPIPE |
1513 | if (m_pipeout != NULL) | 1513 | if (m_pipeout != NULL) |
1514 | { | 1514 | { |
1515 | QString outstr = toQString(textarray[0]->data()); | 1515 | QString outstr = toQString(textarray[0]->data()); |
1516 | if (!outstr.isEmpty()) | 1516 | if (!outstr.isEmpty()) |
1517 | { | 1517 | { |
1518 | fprintf(m_pipeout, "%s\n", (const char*)outstr); | 1518 | fprintf(m_pipeout, "%s\n", (const char*)outstr); |
1519 | fflush(m_pipeout); | 1519 | fflush(m_pipeout); |
1520 | } | 1520 | } |
1521 | else if (m_pauseAfterEachPara) | 1521 | else if (m_pauseAfterEachPara) |
1522 | { | 1522 | { |
1523 | m_isPaused = true; | 1523 | m_isPaused = true; |
1524 | timer->stop(); | 1524 | timer->stop(); |
1525 | } | 1525 | } |
1526 | } | 1526 | } |
1527 | #endif | 1527 | #endif |
1528 | CDrawBuffer* buff = textarray[0]; | 1528 | CDrawBuffer* buff = textarray[0]; |
1529 | for (int i = 1; i <= numlines; i++) | 1529 | for (int i = 1; i <= numlines; i++) |
1530 | { | 1530 | { |
1531 | textarray[i-1] = textarray[i]; | 1531 | textarray[i-1] = textarray[i]; |
1532 | locnarray[i-1] = locnarray[i]; | 1532 | locnarray[i-1] = locnarray[i]; |
1533 | } | 1533 | } |
1534 | textarray[numlines] = buff; | 1534 | textarray[numlines] = buff; |
1535 | --numlines; | 1535 | --numlines; |
1536 | m_scrolldy1 -= ht; | 1536 | m_scrolldy1 -= ht; |
1537 | } | 1537 | } |
1538 | if ((m_scrolldy2 = m_scrolldy2+m_scrollstep) >= textarray[numlines]->lineSpacing()) | 1538 | if ((m_scrolldy2 = m_scrolldy2+m_scrollstep) >= textarray[numlines]->lineSpacing()) |
1539 | { | 1539 | { |
1540 | bredrawscroll = true; | 1540 | bredrawscroll = true; |
1541 | m_scrolldy2 -= textarray[numlines]->lineSpacing(); | 1541 | m_scrolldy2 -= textarray[numlines]->lineSpacing(); |
1542 | numlines++; | 1542 | numlines++; |
1543 | 1543 | ||
1544 | if (textarray[numlines] == NULL) | 1544 | if (textarray[numlines] == NULL) |
1545 | { | 1545 | { |
1546 | textarray[numlines] = new CDrawBuffer(&m_fontControl); | 1546 | textarray[numlines] = new CDrawBuffer(&m_fontControl); |
1547 | } | 1547 | } |
1548 | locnarray[numlines] = locate(); | 1548 | locnarray[numlines] = locate(); |
1549 | int ch = getline(textarray[numlines]); | 1549 | int ch = getline(textarray[numlines]); |
1550 | if (m_rotated) | 1550 | if (m_rotated) |
1551 | { | 1551 | { |
1552 | blitRot(hmargin, 0, height(), -1, textarray[numlines-1]); | 1552 | blitRot(hmargin, 0, height(), -1, textarray[numlines-1]); |
1553 | } | 1553 | } |
1554 | else | 1554 | else |
1555 | { | 1555 | { |
1556 | // textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - 2 - hmargin, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg); | 1556 | // textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - 2 - hmargin, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg); |
1557 | textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - textarray[numlines-1]->lineExtraSpacing() - 1 - hmargin, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); | 1557 | textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - textarray[numlines-1]->lineExtraSpacing() - 1 - hmargin, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); |
1558 | 1558 | ||
1559 | } | 1559 | } |
1560 | mylastpos = locate(); | 1560 | mylastpos = locate(); |
1561 | if (!ch) | 1561 | if (!ch) |
1562 | { | 1562 | { |
1563 | redrawScroll(&p); | 1563 | redrawScroll(&p); |
1564 | emitRedraw(); | 1564 | emitRedraw(); |
1565 | m_autoScroll = false; | 1565 | m_autoScroll = false; |
1566 | #ifdef _SCROLLPIPE | 1566 | #ifdef _SCROLLPIPE |
1567 | for (int i = 0; i < numlines; i++) | 1567 | for (int i = 0; i < numlines; i++) |
1568 | { | 1568 | { |
1569 | if (m_pipeout != NULL) | 1569 | if (m_pipeout != NULL) |
1570 | { | 1570 | { |
1571 | QString outstr = toQString(textarray[i]->data()); | 1571 | QString outstr = toQString(textarray[i]->data()); |
1572 | if (!outstr.isEmpty()) | 1572 | if (!outstr.isEmpty()) |
1573 | { | 1573 | { |
1574 | fprintf(m_pipeout, "%s\n", (const char*)outstr); | 1574 | fprintf(m_pipeout, "%s\n", (const char*)outstr); |
1575 | fflush(m_pipeout); | 1575 | fflush(m_pipeout); |
1576 | } | 1576 | } |
1577 | } | 1577 | } |
1578 | } | 1578 | } |
1579 | #endif | 1579 | #endif |
1580 | emit SetScrollState(m_autoScroll); | 1580 | emit SetScrollState(m_autoScroll); |
1581 | #ifdef USEQPE | 1581 | #ifdef USEQPE |
1582 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; | 1582 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; |
1583 | #endif | 1583 | #endif |
1584 | return; | 1584 | return; |
1585 | } | 1585 | } |
1586 | } | 1586 | } |
1587 | if (!bredrawscroll && ((m_scrolldy2/m_scrollstep) % 10 == 5) && textarray[numlines]->showPartial()) | 1587 | if (!bredrawscroll && ((m_scrolldy2/m_scrollstep) % 10 == 5) && textarray[numlines]->showPartial()) |
1588 | { | 1588 | { |
1589 | if (m_rotated) | 1589 | if (m_rotated) |
1590 | { | 1590 | { |
1591 | blitRot(hmargin + m_scrolldy2 - textarray[numlines]->lineSpacing(), 0, height(), -1, textarray[numlines]); | 1591 | blitRot(hmargin + m_scrolldy2 - textarray[numlines]->lineSpacing(), 0, height(), -1, textarray[numlines]); |
1592 | } | 1592 | } |
1593 | else | 1593 | else |
1594 | { | 1594 | { |
1595 | textarray[numlines]->render( &p, height() + textarray[numlines]->lineSpacing() - textarray[numlines]->descent() - 2 - hmargin-m_scrolldy2, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); | 1595 | textarray[numlines]->render( &p, height() + textarray[numlines]->lineSpacing() - textarray[numlines]->descent() - 2 - hmargin-m_scrolldy2, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); |
1596 | } | 1596 | } |
1597 | } | 1597 | } |
1598 | if (m_scrollpos != 0) | 1598 | if (m_scrollpos != 0) |
1599 | { | 1599 | { |
1600 | redrawScroll(&p); | 1600 | redrawScroll(&p); |
1601 | } | 1601 | } |
1602 | if (bredrawscroll) emitRedraw(); | 1602 | if (bredrawscroll) emitRedraw(); |
1603 | } | 1603 | } |
1604 | 1604 | ||
1605 | void QTReader::dostaticscroll() | 1605 | void QTReader::dostaticscroll() |
1606 | { | 1606 | { |
1607 | redrawall(); | 1607 | redrawall(); |
1608 | bool bredraw = false; | 1608 | bool bredraw = false; |
1609 | if ((m_scrolldy1 = m_scrolldy1+m_scrollstep) >= textarray[0]->lineSpacing()) | 1609 | if ((m_scrolldy1 = m_scrolldy1+m_scrollstep) >= textarray[0]->lineSpacing()) |
1610 | { | 1610 | { |
1611 | int ht = textarray[0]->lineSpacing(); | 1611 | int ht = textarray[0]->lineSpacing(); |
1612 | bredraw = true; | 1612 | bredraw = true; |
1613 | #ifdef _SCROLLPIPE | 1613 | #ifdef _SCROLLPIPE |
1614 | if (m_pipeout != NULL) | 1614 | if (m_pipeout != NULL) |
1615 | { | 1615 | { |
1616 | QString outstr = toQString(textarray[0]->data()); | 1616 | QString outstr = toQString(textarray[0]->data()); |
1617 | if (!outstr.isEmpty()) | 1617 | if (!outstr.isEmpty()) |
1618 | { | 1618 | { |
1619 | fprintf(m_pipeout, "%s\n", (const char*)outstr); | 1619 | fprintf(m_pipeout, "%s\n", (const char*)outstr); |
1620 | fflush(m_pipeout); | 1620 | fflush(m_pipeout); |
1621 | } | 1621 | } |
1622 | else if (m_pauseAfterEachPara) | 1622 | else if (m_pauseAfterEachPara) |
1623 | { | 1623 | { |
1624 | m_isPaused = true; | 1624 | m_isPaused = true; |
1625 | timer->stop(); | 1625 | timer->stop(); |
1626 | } | 1626 | } |
1627 | } | 1627 | } |
1628 | #endif | 1628 | #endif |
1629 | CDrawBuffer* buff = textarray[0]; | 1629 | CDrawBuffer* buff = textarray[0]; |
1630 | for (int i = 1; i <= numlines; i++) | 1630 | for (int i = 1; i <= numlines; i++) |
1631 | { | 1631 | { |
1632 | textarray[i-1] = textarray[i]; | 1632 | textarray[i-1] = textarray[i]; |
1633 | locnarray[i-1] = locnarray[i]; | 1633 | locnarray[i-1] = locnarray[i]; |
1634 | } | 1634 | } |
1635 | textarray[numlines] = buff; | 1635 | textarray[numlines] = buff; |
1636 | --numlines; | 1636 | --numlines; |
1637 | m_scrolldy1 -= ht; | 1637 | m_scrolldy1 -= ht; |
1638 | } | 1638 | } |
1639 | if ((m_scrolldy2 = m_scrolldy2 + m_scrollstep) >= textarray[numlines]->lineSpacing()) | 1639 | if ((m_scrolldy2 = m_scrolldy2 + m_scrollstep) >= textarray[numlines]->lineSpacing()) |
1640 | { | 1640 | { |
1641 | bredraw = true; | 1641 | bredraw = true; |
1642 | m_scrolldy2 -= textarray[numlines]->lineSpacing(); | 1642 | m_scrolldy2 -= textarray[numlines]->lineSpacing(); |
1643 | numlines++; | 1643 | numlines++; |
1644 | 1644 | ||
1645 | if (textarray[numlines] == NULL) | 1645 | if (textarray[numlines] == NULL) |
1646 | { | 1646 | { |
1647 | textarray[numlines] = new CDrawBuffer(&m_fontControl); | 1647 | textarray[numlines] = new CDrawBuffer(&m_fontControl); |
1648 | } | 1648 | } |
1649 | locnarray[numlines] = locate(); | 1649 | locnarray[numlines] = locate(); |
1650 | int ch = getline(textarray[numlines]); | 1650 | int ch = getline(textarray[numlines]); |
1651 | mylastpos = locate(); | 1651 | mylastpos = locate(); |
1652 | if (!ch) | 1652 | if (!ch) |
1653 | { | 1653 | { |
1654 | redrawall(); | 1654 | redrawall(); |
1655 | emitRedraw(); | 1655 | emitRedraw(); |
1656 | m_autoScroll = false; | 1656 | m_autoScroll = false; |
1657 | #ifdef _SCROLLPIPE | 1657 | #ifdef _SCROLLPIPE |
1658 | for (int i = 0; i < numlines; i++) | 1658 | for (int i = 0; i < numlines; i++) |
1659 | { | 1659 | { |
1660 | if (m_pipeout != NULL) | 1660 | if (m_pipeout != NULL) |
1661 | { | 1661 | { |
1662 | QString outstr = toQString(textarray[i]->data()); | 1662 | QString outstr = toQString(textarray[i]->data()); |
1663 | if (!outstr.isEmpty()) | 1663 | if (!outstr.isEmpty()) |
1664 | { | 1664 | { |
1665 | fprintf(m_pipeout, "%s\n", (const char*)outstr); | 1665 | fprintf(m_pipeout, "%s\n", (const char*)outstr); |
1666 | fflush(m_pipeout); | 1666 | fflush(m_pipeout); |
1667 | } | 1667 | } |
1668 | } | 1668 | } |
1669 | } | 1669 | } |
1670 | #endif | 1670 | #endif |
1671 | emit SetScrollState(m_autoScroll); | 1671 | emit SetScrollState(m_autoScroll); |
1672 | #ifdef USEQPE | 1672 | #ifdef USEQPE |
1673 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; | 1673 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; |
1674 | #endif | 1674 | #endif |
1675 | return; | 1675 | return; |
1676 | } | 1676 | } |
1677 | } | 1677 | } |
1678 | if (bredraw) emitRedraw(); | 1678 | if (bredraw) emitRedraw(); |
1679 | } | 1679 | } |
1680 | 1680 | ||
1681 | void QTReader::redrawScroll(QPainter* p) | 1681 | void QTReader::redrawScroll(QPainter* p) |
1682 | { | 1682 | { |
1683 | int offset = (m_scrolltype == 1) ? m_totalscroll : 0; | 1683 | int offset = (m_scrolltype == 1) ? m_totalscroll : 0; |
1684 | switch (m_scrollpos) | 1684 | switch (m_scrollpos) |
1685 | { | 1685 | { |
1686 | case 1: | 1686 | case 1: |
1687 | { | 1687 | { |
1688 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); | 1688 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); |
1689 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; | 1689 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; |
1690 | if (m_rotated) | 1690 | if (m_rotated) |
1691 | { | 1691 | { |
1692 | if (m_bgpm.isNull()) | 1692 | if (m_bgpm.isNull()) |
1693 | { | 1693 | { |
1694 | p->fillRect(0,0,hmargin,height(),m_bg); | 1694 | p->fillRect(0,0,hmargin,height(),m_bg); |
1695 | } | 1695 | } |
1696 | else | 1696 | else |
1697 | { | 1697 | { |
1698 | blitRot(0,0, height(), hmargin, NULL); | 1698 | blitRot(0,0, height(), hmargin, NULL); |
1699 | } | 1699 | } |
1700 | } | 1700 | } |
1701 | else | 1701 | else |
1702 | { | 1702 | { |
1703 | if (m_bgpm.isNull()) | 1703 | if (m_bgpm.isNull()) |
1704 | { | 1704 | { |
1705 | p->fillRect(0,height() - hmargin,width(),hmargin,m_bg); | 1705 | p->fillRect(0,height() - hmargin,width(),hmargin,m_bg); |
1706 | } | 1706 | } |
1707 | else | 1707 | else |
1708 | { | 1708 | { |
1709 | int toffset = (offset+height()-hmargin) % height(); | 1709 | int toffset = (offset+height()-hmargin) % height(); |
1710 | if (toffset+hmargin > height()) | 1710 | if (toffset+hmargin > height()) |
1711 | { | 1711 | { |
1712 | int fp = height()-toffset; | 1712 | int fp = height()-toffset; |
1713 | bitBlt(this, | 1713 | bitBlt(this, |
1714 | 0,height() - hmargin, | 1714 | 0,height() - hmargin, |
1715 | dbuff, | 1715 | dbuff, |
1716 | 0, toffset, width(), fp); | 1716 | 0, toffset, width(), fp); |
1717 | bitBlt(this, | 1717 | bitBlt(this, |
1718 | 0,height()-hmargin+fp, | 1718 | 0,height()-hmargin+fp, |
1719 | dbuff, | 1719 | dbuff, |
1720 | 0, 0, width(), hmargin-fp); | 1720 | 0, 0, width(), hmargin-fp); |
1721 | } | 1721 | } |
1722 | else | 1722 | else |
1723 | { | 1723 | { |
1724 | bitBlt(this, | 1724 | bitBlt(this, |
1725 | 0,height() - hmargin, | 1725 | 0,height() - hmargin, |
1726 | dbuff, | 1726 | dbuff, |
1727 | 0, toffset, width(), hmargin); | 1727 | 0, toffset, width(), hmargin); |
1728 | } | 1728 | } |
1729 | } | 1729 | } |
1730 | } | 1730 | } |
1731 | } | 1731 | } |
1732 | break; | 1732 | break; |
1733 | case 2: //right | 1733 | case 2: //right |
1734 | if (m_rotated) | 1734 | if (m_rotated) |
1735 | { | 1735 | { |
1736 | if (m_bgpm.isNull()) | 1736 | if (m_bgpm.isNull()) |
1737 | { | 1737 | { |
1738 | p->fillRect(0,height()-m_right_border,width(),m_right_border,m_bg); | 1738 | p->fillRect(0,height()-m_right_border,width(),m_right_border,m_bg); |
1739 | } | 1739 | } |
1740 | else | 1740 | else |
1741 | { | 1741 | { |
1742 | blitRot(0,height()-m_right_border, m_right_border, width(), NULL); | 1742 | blitRot(0,height()-m_right_border, m_right_border, width(), NULL); |
1743 | } | 1743 | } |
1744 | } | 1744 | } |
1745 | else | 1745 | else |
1746 | { | 1746 | { |
1747 | if (m_bgpm.isNull()) | 1747 | if (m_bgpm.isNull()) |
1748 | { | 1748 | { |
1749 | p->fillRect(width()-m_right_border,0,m_right_border,height(),m_bg); | 1749 | p->fillRect(width()-m_right_border,0,m_right_border,height(),m_bg); |
1750 | } | 1750 | } |
1751 | else | 1751 | else |
1752 | { | 1752 | { |
1753 | int x = width() - m_right_border; | 1753 | int x = width() - m_right_border; |
1754 | int fp = height()-offset; | 1754 | int fp = height()-offset; |
1755 | bitBlt(this, x, 0, dbuff, x, offset, m_right_border, fp); | 1755 | bitBlt(this, x, 0, dbuff, x, offset, m_right_border, fp); |
1756 | bitBlt(this, x, fp, dbuff, x, 0, m_right_border, height()-fp); | 1756 | bitBlt(this, x, fp, dbuff, x, 0, m_right_border, height()-fp); |
1757 | } | 1757 | } |
1758 | } | 1758 | } |
1759 | break; | 1759 | break; |
1760 | case 3: //left | 1760 | case 3: //left |
1761 | if (m_rotated) | 1761 | if (m_rotated) |
1762 | { | 1762 | { |
1763 | if (m_bgpm.isNull()) | 1763 | if (m_bgpm.isNull()) |
1764 | { | 1764 | { |
1765 | p->fillRect(0,0,width(),m_left_border,m_bg); | 1765 | p->fillRect(0,0,width(),m_left_border,m_bg); |
1766 | } | 1766 | } |
1767 | else | 1767 | else |
1768 | { | 1768 | { |
1769 | blitRot(0,0, m_left_border, width(), NULL); | 1769 | blitRot(0,0, m_left_border, width(), NULL); |
1770 | } | 1770 | } |
1771 | } | 1771 | } |
1772 | else | 1772 | else |
1773 | { | 1773 | { |
1774 | if (m_bgpm.isNull()) | 1774 | if (m_bgpm.isNull()) |
1775 | { | 1775 | { |
1776 | p->fillRect(0,0,m_left_border,height(),m_bg); | 1776 | p->fillRect(0,0,m_left_border,height(),m_bg); |
1777 | } | 1777 | } |
1778 | else | 1778 | else |
1779 | { | 1779 | { |
1780 | int fp = height()-offset; | 1780 | int fp = height()-offset; |
1781 | bitBlt(this, 0, 0, dbuff, 0, offset, m_left_border, fp); | 1781 | bitBlt(this, 0, 0, dbuff, 0, offset, m_left_border, fp); |
1782 | bitBlt(this, 0, fp, dbuff, 0, 0, m_left_border, height()-fp); | 1782 | bitBlt(this, 0, fp, dbuff, 0, 0, m_left_border, height()-fp); |
1783 | } | 1783 | } |
1784 | } | 1784 | } |
1785 | break; | 1785 | break; |
1786 | case 0: | 1786 | case 0: |
1787 | default: | 1787 | default: |
1788 | break; | 1788 | break; |
1789 | } | 1789 | } |
1790 | if (m_scrollpos != 0) DrawScroll(p, width(), height()); | 1790 | if (m_scrollpos != 0) DrawScroll(p, width(), height()); |
1791 | } | 1791 | } |
1792 | 1792 | ||
1793 | void QTReader::autoscroll() | 1793 | void QTReader::autoscroll() |
1794 | { | 1794 | { |
1795 | if (m_scrolltype == 4) | 1795 | if (m_scrolltype == 4) |
1796 | { | 1796 | { |
1797 | readAloud(); | 1797 | readAloud(); |
1798 | } | 1798 | } |
1799 | else | 1799 | else |
1800 | { | 1800 | { |
1801 | if (dbuff != NULL) | 1801 | if (dbuff != NULL) |
1802 | { | 1802 | { |
1803 | dbp->begin(dbuff); | 1803 | dbp->begin(dbuff); |
1804 | drawBackground(dbp); | 1804 | drawBackground(dbp); |
1805 | dbp->end(); | 1805 | dbp->end(); |
1806 | } | 1806 | } |
1807 | timer->start(real_delay(), false); | 1807 | timer->start(real_delay(), false); |
1808 | } | 1808 | } |
1809 | } | 1809 | } |
1810 | 1810 | ||
1811 | void QTReader::setfont() | 1811 | void QTReader::setfont() |
1812 | { | 1812 | { |
1813 | // m_fontControl.Change | 1813 | // m_fontControl.Change |
1814 | m_charWidth = (m_charpc*m_fontControl.currentsize())/100; | 1814 | m_charWidth = (m_charpc*m_fontControl.currentsize())/100; |
1815 | if (m_charWidth <= 0) m_charWidth = 1; | 1815 | if (m_charWidth <= 0) m_charWidth = 1; |
1816 | m_ascent = m_fontControl.ascent(); | 1816 | m_ascent = m_fontControl.ascent(); |
1817 | m_descent = m_fontControl.descent(); | 1817 | m_descent = m_fontControl.descent(); |
1818 | m_linespacing = m_fontControl.lineSpacing(); | 1818 | m_linespacing = m_fontControl.lineSpacing(); |
1819 | } | 1819 | } |
1820 | 1820 | ||
1821 | void QTReader::DrawStraight(QPainter* p, int w, int h) | 1821 | void QTReader::DrawStraight(QPainter* p, int w, int h) |
1822 | { | 1822 | { |
1823 | if (m_scrolldy == m_topmargin) | 1823 | if (m_scrolldy == m_topmargin) |
1824 | { | 1824 | { |
1825 | int ypos = textarray[0]->ascent()-m_scrolldy1+m_topmargin; | 1825 | int ypos = textarray[0]->ascent()-m_scrolldy1+m_topmargin; |
1826 | textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); | 1826 | textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); |
1827 | int i; | 1827 | int i; |
1828 | for (i = 1; i < numlines; i++) | 1828 | for (i = 1; i < numlines; i++) |
1829 | { | 1829 | { |
1830 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ | 1830 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ |
1831 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; | 1831 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; |
1832 | textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); | 1832 | textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); |
1833 | } | 1833 | } |
1834 | if (textarray[i]->showPartial()) | 1834 | if (textarray[i]->showPartial()) |
1835 | { | 1835 | { |
1836 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ | 1836 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ |
1837 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; | 1837 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; |
1838 | textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); | 1838 | textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); |
1839 | } | 1839 | } |
1840 | } | 1840 | } |
1841 | else | 1841 | else |
1842 | { | 1842 | { |
1843 | int ypos = textarray[0]->ascent()-m_scrolldy1+m_scrolldy+m_topmargin; | 1843 | int ypos = textarray[0]->ascent()-m_scrolldy1+m_scrolldy+m_topmargin; |
1844 | textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); | 1844 | textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); |
1845 | // p->fillRect(m_border, 0, w-2*m_border, m_scrolldy, m_bg); | 1845 | // p->fillRect(m_border, 0, w-2*m_border, m_scrolldy, m_bg); |
1846 | for (int i = 1; i < numlines; i++) | 1846 | for (int i = 1; i < numlines; i++) |
1847 | { | 1847 | { |
1848 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ | 1848 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ |
1849 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; | 1849 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; |
1850 | if (ypos+textarray[i]->descent() > h) | 1850 | if (ypos+textarray[i]->descent() > h) |
1851 | { | 1851 | { |
1852 | ypos = textarray[i]->ascent(); | 1852 | ypos = textarray[i]->ascent(); |
1853 | } | 1853 | } |
1854 | textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); | 1854 | textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, w, m_left_border, m_right_border, m_bg, h-m_topmargin-m_bottommargin); |
1855 | } | 1855 | } |
1856 | p->fillRect(m_left_border,m_scrolldy,w-(m_left_border+m_right_border),1,m_scrollcolor); | 1856 | p->fillRect(m_left_border,m_scrolldy,w-(m_left_border+m_right_border),1,m_scrollcolor); |
1857 | } | 1857 | } |
1858 | bool wasrotated = m_rotated; | 1858 | bool wasrotated = m_rotated; |
1859 | m_rotated = false; | 1859 | m_rotated = false; |
1860 | DrawScroll(p, w, h); | 1860 | DrawScroll(p, w, h); |
1861 | m_rotated = wasrotated; | 1861 | m_rotated = wasrotated; |
1862 | 1862 | ||
1863 | } | 1863 | } |
1864 | 1864 | ||
1865 | void QTReader::redrawall() | 1865 | void QTReader::redrawall() |
1866 | { | 1866 | { |
1867 | if (m_rotated) | 1867 | if (m_rotated) |
1868 | { | 1868 | { |
1869 | if (dbuff != NULL) | 1869 | if (dbuff != NULL) |
1870 | { | 1870 | { |
1871 | dbp->begin(dbuff); | 1871 | dbp->begin(dbuff); |
1872 | drawBackground(dbp); | 1872 | drawBackground(dbp); |
1873 | DrawStraight(dbp, height(), width()); | 1873 | DrawStraight(dbp, height(), width()); |
1874 | dbp->end(); | 1874 | dbp->end(); |
1875 | 1875 | ||
1876 | QWMatrix m; | 1876 | QWMatrix m; |
1877 | m.rotate(90); | 1877 | m.rotate(90); |
1878 | QPixmap rp = dbuff->xForm(m); | 1878 | QPixmap rp = dbuff->xForm(m); |
1879 | bitBlt(this, 0,0,&rp,0,0,-1,-1); | 1879 | bitBlt(this, 0,0,&rp,0,0,-1,-1); |
1880 | } | 1880 | } |
1881 | else | 1881 | else |
1882 | { | 1882 | { |
1883 | qDebug("This shouldn't happen but it doesn't matter if it does (rotated == double buffered)"); | 1883 | qDebug("This shouldn't happen but it doesn't matter if it does (rotated == double buffered)"); |
1884 | QPixmap dbuff(height(), width()); | 1884 | QPixmap dbuff(height(), width()); |
1885 | QPainter dbp(&dbuff); | 1885 | QPainter dbp(&dbuff); |
1886 | 1886 | ||
1887 | drawBackground(&dbp); | 1887 | drawBackground(&dbp); |
1888 | DrawStraight(&dbp, height(), width()); | 1888 | DrawStraight(&dbp, height(), width()); |
1889 | 1889 | ||
1890 | QWMatrix m; | 1890 | QWMatrix m; |
1891 | m.rotate(90); | 1891 | m.rotate(90); |
1892 | QPixmap rp = dbuff.xForm(m); | 1892 | QPixmap rp = dbuff.xForm(m); |
1893 | bitBlt(this, 0,0,&rp,0,0,-1,-1); | 1893 | bitBlt(this, 0,0,&rp,0,0,-1,-1); |
1894 | } | 1894 | } |
1895 | } | 1895 | } |
1896 | else | 1896 | else |
1897 | { | 1897 | { |
1898 | if (dbuff != NULL) | 1898 | if (dbuff != NULL) |
1899 | { | 1899 | { |
1900 | dbp->begin(dbuff); | 1900 | dbp->begin(dbuff); |
1901 | drawBackground(dbp); | 1901 | drawBackground(dbp); |
1902 | DrawStraight(dbp, width(), height()); | 1902 | DrawStraight(dbp, width(), height()); |
1903 | dbp->end(); | 1903 | dbp->end(); |
1904 | bitBlt(this, 0,0,dbuff,0,0,-1,-1); | 1904 | bitBlt(this, 0,0,dbuff,0,0,-1,-1); |
1905 | } | 1905 | } |
1906 | else | 1906 | else |
1907 | { | 1907 | { |
1908 | QPainter p(this); | 1908 | QPainter p(this); |
1909 | drawBackground(&p); | 1909 | drawBackground(&p); |
1910 | DrawStraight(&p, width(), height()); | 1910 | DrawStraight(&p, width(), height()); |
1911 | } | 1911 | } |
1912 | } | 1912 | } |
1913 | } | 1913 | } |
1914 | 1914 | ||
1915 | void QTReader::drawFonts() | 1915 | void QTReader::drawFonts() |
1916 | { | 1916 | { |
1917 | if (bDoUpdates) | 1917 | if (bDoUpdates) |
1918 | { | 1918 | { |
1919 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); | 1919 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); |
1920 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; | 1920 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; |
1921 | //qDebug("How refreshing..."); | 1921 | //qDebug("How refreshing..."); |
1922 | if (buffdoc.empty()) | 1922 | if (buffdoc.empty()) |
1923 | { | 1923 | { |
1924 | if (dbuff != NULL) | 1924 | if (dbuff != NULL) |
1925 | { | 1925 | { |
1926 | dbp->begin(dbuff); | 1926 | dbp->begin(dbuff); |
1927 | drawBackground(dbp); | 1927 | drawBackground(dbp); |
1928 | dbp->end(); | 1928 | dbp->end(); |
1929 | } | 1929 | } |
1930 | else | 1930 | else |
1931 | { | 1931 | { |
1932 | QPainter p(this); | 1932 | QPainter p(this); |
1933 | drawBackground(&p); | 1933 | drawBackground(&p); |
1934 | } | 1934 | } |
1935 | return; | 1935 | return; |
1936 | } | 1936 | } |
1937 | setfont(); | 1937 | setfont(); |
1938 | //if (!m_autoScroll) m_scrolldy1 = 0; | 1938 | //if (!m_autoScroll) m_scrolldy1 = 0; |
1939 | if (dbuff != NULL && (dbuff->width() != width() || dbuff->height() != height())) | 1939 | if (dbuff != NULL && (dbuff->width() != width() || dbuff->height() != height())) |
1940 | { | 1940 | { |
1941 | qDebug("Oh no! A resize event was missed..."); | 1941 | qDebug("Oh no! A resize event was missed..."); |
1942 | if (m_rotated) | 1942 | if (m_rotated) |
1943 | { | 1943 | { |
1944 | dbuff->resize(height(), width()); | 1944 | dbuff->resize(height(), width()); |
1945 | } | 1945 | } |
1946 | else | 1946 | else |
1947 | { | 1947 | { |
1948 | dbuff->resize(width(), height()); | 1948 | dbuff->resize(width(), height()); |
1949 | } | 1949 | } |
1950 | m_lastwidth = 0; | 1950 | m_lastwidth = 0; |
1951 | } | 1951 | } |
1952 | if (m_lastwidth != ((m_rotated) ? height() : width())) | 1952 | if (m_lastwidth != ((m_rotated) ? height() : width())) |
1953 | { | 1953 | { |
1954 | m_scrolldy = m_topmargin; | 1954 | m_scrolldy = m_topmargin; |
1955 | // qDebug("Not Optimised %d", m_lastwidth); | 1955 | // qDebug("Not Optimised %d", m_lastwidth); |
1956 | m_lastwidth = ((m_rotated) ? height() : width()); | 1956 | m_lastwidth = ((m_rotated) ? height() : width()); |
1957 | m_lastheight = ((m_rotated) ? width() : height()); | 1957 | m_lastheight = ((m_rotated) ? width() : height()); |
1958 | buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border)); | 1958 | buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border)); |
1959 | buffdoc.locate(pagelocate()); | 1959 | buffdoc.locate(pagelocate()); |
1960 | fillbuffer(); | 1960 | fillbuffer(); |
1961 | redrawall(); | 1961 | redrawall(); |
1962 | // qDebug("Not Optimised %d", m_lastwidth); | 1962 | // qDebug("Not Optimised %d", m_lastwidth); |
1963 | } | 1963 | } |
1964 | else | 1964 | else |
1965 | { | 1965 | { |
1966 | int newht = ((m_rotated) ? width() : height()); | 1966 | int newht = ((m_rotated) ? width() : height()); |
1967 | if (m_lastheight > newht) | 1967 | if (m_lastheight > newht) |
1968 | { | 1968 | { |
1969 | // qDebug("Optimised < %d %d %d", numlines, m_lastheight, newht); | 1969 | // qDebug("Optimised < %d %d %d", numlines, m_lastheight, newht); |
1970 | m_scrolldy = m_topmargin; | 1970 | m_scrolldy = m_topmargin; |
1971 | int ypos = m_scrolldy1+m_topmargin; | 1971 | int ypos = m_scrolldy1+m_topmargin; |
1972 | for (int i = 0; i < numlines; i++) | 1972 | for (int i = 0; i < numlines; i++) |
1973 | { | 1973 | { |
1974 | if ((ypos += textarray[i]->lineSpacing()) > newht - hmargin) | 1974 | if ((ypos += textarray[i]->lineSpacing()) > newht - hmargin) |
1975 | { | 1975 | { |
1976 | numlines = i; | 1976 | numlines = i; |
1977 | jumpto(mylastpos = locnarray[i+1]); | 1977 | jumpto(mylastpos = locnarray[i+1]); |
1978 | break; | 1978 | break; |
1979 | } | 1979 | } |
1980 | } | 1980 | } |
1981 | // qDebug("Optimised < %d", numlines); | 1981 | // qDebug("Optimised < %d", numlines); |
1982 | m_lastheight = newht; | 1982 | m_lastheight = newht; |
1983 | } | 1983 | } |
1984 | else if (m_lastheight < newht) | 1984 | else if (m_lastheight < newht) |
1985 | { | 1985 | { |
1986 | m_scrolldy = m_topmargin; | 1986 | m_scrolldy = m_topmargin; |
1987 | // qDebug("Optimised > %d", numlines); | 1987 | // qDebug("Optimised > %d", numlines); |
1988 | int ypos = m_scrolldy1+m_topmargin; | 1988 | int ypos = m_scrolldy1+m_topmargin; |
1989 | for (int i = 0; i <= numlines; i++) | 1989 | for (int i = 0; i <= numlines; i++) |
1990 | { | 1990 | { |
1991 | ypos += textarray[i]->lineSpacing(); | 1991 | ypos += textarray[i]->lineSpacing(); |
1992 | } | 1992 | } |
1993 | fillbuffer(numlines+1, ypos, newht); | 1993 | fillbuffer(numlines+1, ypos, newht); |
1994 | // qDebug("Optimised > %d", numlines); | 1994 | // qDebug("Optimised > %d", numlines); |
1995 | } | 1995 | } |
1996 | if (numlines > 0) | 1996 | if (numlines > 0) |
1997 | { | 1997 | { |
1998 | redrawall(); | 1998 | redrawall(); |
1999 | } | 1999 | } |
2000 | } | 2000 | } |
2001 | emitRedraw(); | 2001 | emitRedraw(); |
2002 | } | 2002 | } |
2003 | /* | 2003 | /* |
2004 | else | 2004 | else |
2005 | { | 2005 | { |
2006 | qDebug("Not so refreshing..."); | 2006 | qDebug("Not so refreshing..."); |
2007 | } | 2007 | } |
2008 | */ | 2008 | */ |
2009 | } | 2009 | } |
2010 | 2010 | ||
2011 | void QTReader::DrawScroll( QPainter *p, int _w, int _h ) | 2011 | void QTReader::DrawScroll( QPainter *p, int _w, int _h ) |
2012 | { | 2012 | { |
2013 | if (!buffdoc.empty()) | 2013 | if (!buffdoc.empty()) |
2014 | { | 2014 | { |
2015 | QBrush checkered = QBrush( Dense4Pattern ); | 2015 | QBrush checkered = QBrush( Dense4Pattern ); |
2016 | checkered.setColor(m_scrollbarcolor); | 2016 | checkered.setColor(m_scrollbarcolor); |
2017 | switch (m_scrollpos) | 2017 | switch (m_scrollpos) |
2018 | { | 2018 | { |
2019 | case 1: | 2019 | case 1: |
2020 | if (m_rotated) | 2020 | if (m_rotated) |
2021 | { | 2021 | { |
2022 | p->fillRect(0, 0, 2, _h, checkered); | 2022 | p->fillRect(0, 0, 2, _h, checkered); |
2023 | } | 2023 | } |
2024 | else | 2024 | else |
2025 | { | 2025 | { |
2026 | p->fillRect(0, _h-2, _w, 2, checkered); | 2026 | p->fillRect(0, _h-2, _w, 2, checkered); |
2027 | } | 2027 | } |
2028 | break; | 2028 | break; |
2029 | case 2: | 2029 | case 2: |
2030 | if (m_rotated) | 2030 | if (m_rotated) |
2031 | { | 2031 | { |
2032 | p->fillRect(0, _h-2, _w, 2, checkered); | 2032 | p->fillRect(0, _h-2, _w, 2, checkered); |
2033 | } | 2033 | } |
2034 | else | 2034 | else |
2035 | { | 2035 | { |
2036 | p->fillRect(_w-2, 0, 2, _h, checkered); | 2036 | p->fillRect(_w-2, 0, 2, _h, checkered); |
2037 | } | 2037 | } |
2038 | break; | 2038 | break; |
2039 | case 3: | 2039 | case 3: |
2040 | if (m_rotated) | 2040 | if (m_rotated) |
2041 | { | 2041 | { |
2042 | p->fillRect(0, 0, _w, 2, checkered); | 2042 | p->fillRect(0, 0, _w, 2, checkered); |
2043 | } | 2043 | } |
2044 | else | 2044 | else |
2045 | { | 2045 | { |
2046 | p->fillRect(0, 0, 2, _h, checkered); | 2046 | p->fillRect(0, 0, 2, _h, checkered); |
2047 | } | 2047 | } |
2048 | break; | 2048 | break; |
2049 | case 0: | 2049 | case 0: |
2050 | default: | 2050 | default: |
2051 | break; | 2051 | break; |
2052 | } | 2052 | } |
2053 | switch (m_scrollpos) | 2053 | switch (m_scrollpos) |
2054 | { | 2054 | { |
2055 | case 1: | 2055 | case 1: |
2056 | { | 2056 | { |
2057 | int ht; | 2057 | int ht; |
2058 | if (m_rotated) | 2058 | if (m_rotated) |
2059 | { | 2059 | { |
2060 | ht = _h; | 2060 | ht = _h; |
2061 | } | 2061 | } |
2062 | else | 2062 | else |
2063 | { | 2063 | { |
2064 | ht = _w; | 2064 | ht = _w; |
2065 | } | 2065 | } |
2066 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); | 2066 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); |
2067 | int mid = (ht*(locnarray[numlines]+locnarray[0]-2*buffdoc.startSection())+sectionsize)/(2*sectionsize); | 2067 | int mid = (ht*(locnarray[numlines]+locnarray[0]-2*buffdoc.startSection())+sectionsize)/(2*sectionsize); |
2068 | int sliderheight = ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize; | 2068 | int sliderheight = ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize; |
2069 | int sliderpos; | 2069 | int sliderpos; |
2070 | if (sliderheight < 10) | 2070 | if (sliderheight < 10) |
2071 | { | 2071 | { |
2072 | sliderheight = 10; | 2072 | sliderheight = 10; |
2073 | sliderpos = mid-5; | 2073 | sliderpos = mid-5; |
2074 | } | 2074 | } |
2075 | else | 2075 | else |
2076 | { | 2076 | { |
2077 | sliderpos = (ht*(locnarray[0]-buffdoc.startSection())+sectionsize/2)/sectionsize; | 2077 | sliderpos = (ht*(locnarray[0]-buffdoc.startSection())+sectionsize/2)/sectionsize; |
2078 | } | 2078 | } |
2079 | if (m_rotated) | 2079 | if (m_rotated) |
2080 | { | 2080 | { |
2081 | p->fillRect(0, sliderpos, 3, sliderheight, m_scrollbarcolor); | 2081 | p->fillRect(0, sliderpos, 3, sliderheight, m_scrollbarcolor); |
2082 | } | 2082 | } |
2083 | else | 2083 | else |
2084 | { | 2084 | { |
2085 | p->fillRect(sliderpos, _h-3, sliderheight, 3, m_scrollbarcolor); | 2085 | p->fillRect(sliderpos, _h-3, sliderheight, 3, m_scrollbarcolor); |
2086 | } | 2086 | } |
2087 | } | 2087 | } |
2088 | break; | 2088 | break; |
2089 | case 2: | 2089 | case 2: |
2090 | case 3: | 2090 | case 3: |
2091 | { | 2091 | { |
2092 | int ht; | 2092 | int ht; |
2093 | if (m_rotated) | 2093 | if (m_rotated) |
2094 | { | 2094 | { |
2095 | ht = _w; | 2095 | ht = _w; |
2096 | } | 2096 | } |
2097 | else | 2097 | else |
2098 | { | 2098 | { |
2099 | ht = _h; | 2099 | ht = _h; |
2100 | } | 2100 | } |
2101 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); | 2101 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); |
2102 | int mid = (ht*(locnarray[numlines]+locnarray[0]-2*buffdoc.startSection())+sectionsize)/(2*sectionsize); | 2102 | int mid = (ht*(locnarray[numlines]+locnarray[0]-2*buffdoc.startSection())+sectionsize)/(2*sectionsize); |
2103 | int sliderheight = ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize; | 2103 | int sliderheight = ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize; |
2104 | int sliderpos; | 2104 | int sliderpos; |
2105 | if (sliderheight < 10) | 2105 | if (sliderheight < 10) |
2106 | { | 2106 | { |
2107 | sliderheight = 10; | 2107 | sliderheight = 10; |
2108 | sliderpos = mid-5; | 2108 | sliderpos = mid-5; |
2109 | } | 2109 | } |
2110 | else | 2110 | else |
2111 | { | 2111 | { |
2112 | sliderpos = (ht*(locnarray[0]-buffdoc.startSection())+sectionsize/2)/sectionsize; | 2112 | sliderpos = (ht*(locnarray[0]-buffdoc.startSection())+sectionsize/2)/sectionsize; |
2113 | } | 2113 | } |
2114 | if (m_rotated) | 2114 | if (m_rotated) |
2115 | { | 2115 | { |
2116 | int hoff; | 2116 | int hoff; |
2117 | if (m_scrollpos == 2) //right | 2117 | if (m_scrollpos == 2) //right |
2118 | { | 2118 | { |
2119 | hoff = _h-3; | 2119 | hoff = _h-3; |
2120 | } | 2120 | } |
2121 | else | 2121 | else |
2122 | { | 2122 | { |
2123 | hoff = 0; | 2123 | hoff = 0; |
2124 | } | 2124 | } |
2125 | p->fillRect(ht-sliderpos-sliderheight, hoff, sliderheight, 3, m_scrollbarcolor); | 2125 | p->fillRect(ht-sliderpos-sliderheight, hoff, sliderheight, 3, m_scrollbarcolor); |
2126 | } | 2126 | } |
2127 | else | 2127 | else |
2128 | { | 2128 | { |
2129 | int hoff; | 2129 | int hoff; |
2130 | if (m_scrollpos == 2) //right | 2130 | if (m_scrollpos == 2) //right |
2131 | { | 2131 | { |
2132 | hoff = _w-3; | 2132 | hoff = _w-3; |
2133 | } | 2133 | } |
2134 | else | 2134 | else |
2135 | { | 2135 | { |
2136 | hoff = 0; | 2136 | hoff = 0; |
2137 | } | 2137 | } |
2138 | p->fillRect(hoff, sliderpos, 3, sliderheight, m_scrollbarcolor); | 2138 | p->fillRect(hoff, sliderpos, 3, sliderheight, m_scrollbarcolor); |
2139 | } | 2139 | } |
2140 | } | 2140 | } |
2141 | break; | 2141 | break; |
2142 | case 0: | 2142 | case 0: |
2143 | default: | 2143 | default: |
2144 | break; | 2144 | break; |
2145 | } | 2145 | } |
2146 | } | 2146 | } |
2147 | } | 2147 | } |
2148 | 2148 | ||
2149 | /* | 2149 | /* |
2150 | void QTReader::DrawScroll( QPainter *p ) | 2150 | void QTReader::DrawScroll( QPainter *p ) |
2151 | { | 2151 | { |
2152 | if (m_border > 5 && !buffdoc.empty()) | 2152 | if (m_border > 5 && !buffdoc.empty()) |
2153 | { | 2153 | { |
2154 | int ht, wh; | 2154 | int ht, wh; |
2155 | if (m_rotated) | 2155 | if (m_rotated) |
2156 | { | 2156 | { |
2157 | ht = width(); | 2157 | ht = width(); |
2158 | wh = height()g; | 2158 | wh = height()g; |
2159 | p->fillRect(0, wh-2, ht, 2, cyan); | 2159 | p->fillRect(0, wh-2, ht, 2, cyan); |
2160 | } | 2160 | } |
2161 | else | 2161 | else |
2162 | { | 2162 | { |
2163 | ht = height(); | 2163 | ht = height(); |
2164 | wh = width(); | 2164 | wh = width(); |
2165 | p->fillRect(wh-2, 0, 2, ht, cyan); | 2165 | p->fillRect(wh-2, 0, 2, ht, cyan); |
2166 | } | 2166 | } |
2167 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); | 2167 | int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); |
2168 | int mid = (ht*(locnarray[numlines]+locnarray[0]-2*buffdoc.startSection())+sectionsize)/(2*sectionsize); | 2168 | int mid = (ht*(locnarray[numlines]+locnarray[0]-2*buffdoc.startSection())+sectionsize)/(2*sectionsize); |
2169 | if (m_rotated) | 2169 | if (m_rotated) |
2170 | { | 2170 | { |
2171 | p->fillRect(ht-mid-5, wh-2, 10, 2, yellow); | 2171 | p->fillRect(ht-mid-5, wh-2, 10, 2, yellow); |
2172 | p->fillRect(ht-(ht*(locnarray[numlines]-buffdoc.startSection())+sectionsize/2)/sectionsize, wh-2, ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize, 2, magenta); | 2172 | p->fillRect(ht-(ht*(locnarray[numlines]-buffdoc.startSection())+sectionsize/2)/sectionsize, wh-2, ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize, 2, magenta); |
2173 | } | 2173 | } |
2174 | else | 2174 | else |
2175 | { | 2175 | { |
2176 | p->fillRect(wh-2, mid-5, 2, 10, yellow); | 2176 | p->fillRect(wh-2, mid-5, 2, 10, yellow); |
2177 | p->fillRect(wh-2, (ht*(locnarray[0]-buffdoc.startSection())+sectionsize/2)/sectionsize, 2, ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize, magenta); | 2177 | p->fillRect(wh-2, (ht*(locnarray[0]-buffdoc.startSection())+sectionsize/2)/sectionsize, 2, ((locnarray[numlines]-locnarray[0])*ht+sectionsize/2)/sectionsize, magenta); |
2178 | } | 2178 | } |
2179 | } | 2179 | } |
2180 | } | 2180 | } |
2181 | */ | 2181 | */ |
2182 | QString QTReader::firstword() | 2182 | QString QTReader::firstword() |
2183 | { | 2183 | { |
2184 | if (m_bMonoSpaced) | 2184 | if (m_bMonoSpaced) |
2185 | { | 2185 | { |
2186 | return toQString(textarray[0]->data()); | 2186 | return toQString(textarray[0]->data()); |
2187 | } | 2187 | } |
2188 | else | 2188 | else |
2189 | { | 2189 | { |
2190 | int start, end, len, j; | 2190 | int start, end, len, j; |
2191 | for (j = 0; j < numlines; j++) | 2191 | for (j = 0; j < numlines; j++) |
2192 | { | 2192 | { |
2193 | len = textarray[j]->length(); | 2193 | len = textarray[j]->length(); |
2194 | for (start = 0; start < len && !isalpha((*textarray[j])[start]); start++); | 2194 | for (start = 0; start < len && !isalpha((*textarray[j])[start]); start++); |
2195 | if (start < len) break; | 2195 | if (start < len) break; |
2196 | } | 2196 | } |
2197 | if (j < numlines) | 2197 | if (j < numlines) |
2198 | { | 2198 | { |
2199 | QString ret = ""; | 2199 | QString ret = ""; |
2200 | for (end = start; end < len && isalpha((*textarray[j])[end]); end++) | 2200 | for (end = start; end < len && isalpha((*textarray[j])[end]); end++) |
2201 | ret += (*textarray[j])[end]; | 2201 | ret += (*textarray[j])[end]; |
2202 | if (ret.isEmpty()) ret = "Current position"; | 2202 | if (ret.isEmpty()) ret = "Current position"; |
2203 | return ret; | 2203 | return ret; |
2204 | } | 2204 | } |
2205 | else | 2205 | else |
2206 | return "Current position"; | 2206 | return "Current position"; |
2207 | } | 2207 | } |
2208 | } | 2208 | } |
2209 | 2209 | ||
2210 | // | 2210 | // |
2211 | // Construct the QTReader with buttons. | 2211 | // Construct the QTReader with buttons. |
2212 | // | 2212 | // |
2213 | 2213 | ||
2214 | bool QTReader::ChangeFont(int tgt) | 2214 | bool QTReader::ChangeFont(int tgt) |
2215 | { | 2215 | { |
2216 | return m_fontControl.ChangeFont(m_fontname, tgt); | 2216 | return m_fontControl.ChangeFont(m_fontname, tgt); |
2217 | } | 2217 | } |
2218 | 2218 | ||
2219 | void QTReader::init() | 2219 | void QTReader::init() |
2220 | { | 2220 | { |
2221 | setBackgroundColor( m_bg ); | 2221 | setBackgroundColor( m_bg ); |
2222 | buffdoc.setfilter(getfilter()); | 2222 | buffdoc.setfilter(getfilter()); |
2223 | ChangeFont(m_textsize); | 2223 | ChangeFont(m_textsize); |
2224 | setFocusPolicy(QWidget::StrongFocus); | 2224 | setFocusPolicy(QWidget::StrongFocus); |
2225 | timer = new QTimer(this); | 2225 | timer = new QTimer(this); |
2226 | connect(timer, SIGNAL(timeout()), this, SLOT(doscroll())); | 2226 | connect(timer, SIGNAL(timeout()), this, SLOT(doscroll())); |
2227 | #ifdef USETIMER | 2227 | #ifdef USETIMER |
2228 | m_dragtimer = new QTimer(this); | 2228 | m_dragtimer = new QTimer(this); |
2229 | connect(m_dragtimer, SIGNAL(timeout()), this, SLOT(actionDrag())); | 2229 | connect(m_dragtimer, SIGNAL(timeout()), this, SLOT(actionDrag())); |
2230 | #endif | 2230 | #endif |
2231 | // QMessageBox::information(this, "init", m_lastfile, 1); | 2231 | // QMessageBox::information(this, "init", m_lastfile, 1); |
2232 | setfont(); | 2232 | setfont(); |
2233 | } | 2233 | } |
2234 | 2234 | ||
2235 | // | 2235 | // |
2236 | // Clean up | 2236 | // Clean up |
2237 | // | 2237 | // |
2238 | QTReader::~QTReader() | 2238 | QTReader::~QTReader() |
2239 | { | 2239 | { |
2240 | if (m_output != NULL) | 2240 | if (m_output != NULL) |
2241 | { | 2241 | { |
2242 | delete m_output; | 2242 | delete m_output; |
2243 | } | 2243 | } |
2244 | if (dbuff != NULL) | 2244 | if (dbuff != NULL) |
2245 | { | 2245 | { |
2246 | delete dbuff; | 2246 | delete dbuff; |
2247 | delete dbp; | 2247 | delete dbp; |
2248 | } | 2248 | } |
2249 | #ifdef USEQPE | 2249 | #ifdef USEQPE |
2250 | if (m_autoScroll) | 2250 | if (m_autoScroll) |
2251 | { | 2251 | { |
2252 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; | 2252 | QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; |
2253 | } | 2253 | } |
2254 | #endif | 2254 | #endif |
2255 | #ifdef _SCROLLPIPE | 2255 | #ifdef _SCROLLPIPE |
2256 | if (m_pipeout != NULL) | 2256 | if (m_pipeout != NULL) |
2257 | { | 2257 | { |
2258 | fclose(m_pipeout); | 2258 | fclose(m_pipeout); |
2259 | } | 2259 | } |
2260 | #endif | 2260 | #endif |
2261 | } | 2261 | } |
2262 | 2262 | ||
2263 | // | 2263 | // |
2264 | // Called when the print button is clicked. | 2264 | // Called when the print button is clicked. |
2265 | // | 2265 | // |
2266 | /* | 2266 | /* |
2267 | void QTReader::printIt() | 2267 | void QTReader::printIt() |
2268 | { | 2268 | { |
2269 | #ifndef QT_NO_PRINTER | 2269 | #ifndef QT_NO_PRINTER |
2270 | if ( printer->setup( this ) ) { | 2270 | if ( printer->setup( this ) ) { |
2271 | QPainter paint; | 2271 | QPainter paint; |
2272 | if ( !paint.begin( printer ) ) | 2272 | if ( !paint.begin( printer ) ) |
2273 | return; | 2273 | return; |
2274 | drawIt( &paint ); | 2274 | drawIt( &paint ); |
2275 | } | 2275 | } |
2276 | #endif | 2276 | #endif |
2277 | } | 2277 | } |
2278 | */ | 2278 | */ |
2279 | // | 2279 | // |
2280 | // Called when the widget needs to be updated. | 2280 | // Called when the widget needs to be updated. |
2281 | // | 2281 | // |
2282 | 2282 | ||
2283 | void QTReader::paintEvent( QPaintEvent * p ) | 2283 | void QTReader::paintEvent( QPaintEvent * p ) |
2284 | { | 2284 | { |
2285 | if ((dbuff != NULL) && !m_outofdate) | 2285 | if ((dbuff != NULL) && !m_outofdate) |
2286 | { | 2286 | { |
2287 | if (m_rotated) | 2287 | if (m_rotated) |
2288 | { | 2288 | { |
2289 | if ((p->rect().width() != width()) || (p->rect().height() != height())) | 2289 | if ((p->rect().width() != width()) || (p->rect().height() != height())) |
2290 | { | 2290 | { |
2291 | qDebug("Partial paint"); | 2291 | qDebug("Partial paint"); |
2292 | QRect r; | 2292 | QRect r; |
2293 | r.setTop(width()-p->rect().right()-1); | 2293 | r.setTop(width()-p->rect().right()-1); |
2294 | r.setLeft(p->rect().top()); | 2294 | r.setLeft(p->rect().top()); |
2295 | r.setHeight(p->rect().width()); | 2295 | r.setHeight(p->rect().width()); |
2296 | r.setWidth(p->rect().height()); | 2296 | r.setWidth(p->rect().height()); |
2297 | QPixmap p1(r.width(), r.height()); | 2297 | QPixmap p1(r.width(), r.height()); |
2298 | bitBlt(&p1, QPoint(0, 0), dbuff, r); | 2298 | bitBlt(&p1, QPoint(0, 0), dbuff, r); |
2299 | QWMatrix m; | 2299 | QWMatrix m; |
2300 | m.rotate(90); | 2300 | m.rotate(90); |
2301 | QPixmap p2 = p1.xForm(m); | 2301 | QPixmap p2 = p1.xForm(m); |
2302 | bitBlt(this, p->rect().left(), p->rect().top(), &p2, 0, 0, -1, -1); | 2302 | bitBlt(this, p->rect().left(), p->rect().top(), &p2, 0, 0, -1, -1); |
2303 | } | 2303 | } |
2304 | else | 2304 | else |
2305 | { | 2305 | { |
2306 | qDebug("Full paint"); | 2306 | qDebug("Full paint"); |
2307 | QWMatrix m; | 2307 | QWMatrix m; |
2308 | m.rotate(90); | 2308 | m.rotate(90); |
2309 | QPixmap rp = dbuff->xForm(m); | 2309 | QPixmap rp = dbuff->xForm(m); |
2310 | bitBlt(this, 0,0,&rp,0,0,-1,-1); | 2310 | bitBlt(this, 0,0,&rp,0,0,-1,-1); |
2311 | } | 2311 | } |
2312 | } | 2312 | } |
2313 | else | 2313 | else |
2314 | { | 2314 | { |
2315 | //bitBlt(this, 0,0,dbuff,0,0,-1,-1); | 2315 | //bitBlt(this, 0,0,dbuff,0,0,-1,-1); |
2316 | bitBlt(this,p->rect().topLeft(),dbuff,p->rect()); | 2316 | bitBlt(this,p->rect().topLeft(),dbuff,p->rect()); |
2317 | } | 2317 | } |
2318 | } | 2318 | } |
2319 | else | 2319 | else |
2320 | { | 2320 | { |
2321 | drawFonts(); | 2321 | drawFonts(); |
2322 | } | 2322 | } |
2323 | m_outofdate = false; | 2323 | m_outofdate = false; |
2324 | } | 2324 | } |
2325 | 2325 | ||
2326 | // | 2326 | // |
2327 | // Called when the widget has been resized. | 2327 | // Called when the widget has been resized. |
2328 | // Moves the button group to the upper right corner | 2328 | // Moves the button group to the upper right corner |
2329 | // of the widget. | 2329 | // of the widget. |
2330 | 2330 | ||
2331 | /* | 2331 | /* |
2332 | void QTReader::resizeEvent( QResizeEvent * ) | 2332 | void QTReader::resizeEvent( QResizeEvent * ) |
2333 | { | 2333 | { |
2334 | // // qDebug("resize:(%u,%u)", width(), height()); | 2334 | // // qDebug("resize:(%u,%u)", width(), height()); |
2335 | // bgroup->move( width()-bgroup->width(), 0 ); | 2335 | // bgroup->move( width()-bgroup->width(), 0 ); |
2336 | } | 2336 | } |
2337 | */ | 2337 | */ |
2338 | 2338 | ||
2339 | // | 2339 | // |
2340 | // Create and display our widget. | 2340 | // Create and display our widget. |
2341 | // | 2341 | // |
2342 | /* | 2342 | /* |
2343 | int main( int argc, tchar **argv ) | 2343 | int main( int argc, tchar **argv ) |
2344 | { | 2344 | { |
2345 | QApplication app( argc, argv ); | 2345 | QApplication app( argc, argv ); |
2346 | QTReader draw; | 2346 | QTReader draw; |
2347 | app.setMainWidget( &draw ); | 2347 | app.setMainWidget( &draw ); |
2348 | draw.setCaption("Qt Example - Drawdemo"); | 2348 | draw.setCaption("Qt Example - Drawdemo"); |
2349 | draw.show(); | 2349 | draw.show(); |
2350 | return app.exec(); | 2350 | return app.exec(); |
2351 | } | 2351 | } |
2352 | */ | 2352 | */ |
2353 | 2353 | ||
2354 | 2354 | ||
2355 | bool QTReader::locate(unsigned long n) | 2355 | bool QTReader::locate(unsigned long n) |
2356 | { | 2356 | { |
2357 | m_outofdate = true; | 2357 | m_outofdate = true; |
2358 | m_lastwidth = 0; | 2358 | m_lastwidth = 0; |
2359 | locnarray[0] = n; | 2359 | locnarray[0] = n; |
2360 | ResetScroll(); | 2360 | ResetScroll(); |
2361 | update(); | 2361 | update(); |
2362 | return true; | 2362 | return true; |
2363 | } | 2363 | } |
2364 | /* | 2364 | /* |
2365 | bool QTReader::locate(unsigned long n) { | 2365 | bool QTReader::locate(unsigned long n) { |
2366 | //printf("Locate\n"); | 2366 | //printf("Locate\n"); |
2367 | buffdoc.locate(n); | 2367 | buffdoc.locate(n); |
2368 | // // qDebug("&buffdoc.located"); | 2368 | // // qDebug("&buffdoc.located"); |
2369 | ResetScroll(); | 2369 | ResetScroll(); |
2370 | fillbuffer(); | 2370 | fillbuffer(); |
2371 | m_outofdate = true; | 2371 | m_outofdate = true; |
2372 | // // qDebug("&Buffer filled"); | 2372 | // // qDebug("&Buffer filled"); |
2373 | update(); | 2373 | update(); |
2374 | // // qDebug("&Located"); | 2374 | // // qDebug("&Located"); |
2375 | emitRedraw(); | 2375 | emitRedraw(); |
2376 | return true; | 2376 | return true; |
2377 | } | 2377 | } |
2378 | */ | 2378 | */ |
2379 | unsigned int QTReader::screenlines() | 2379 | unsigned int QTReader::screenlines() |
2380 | { | 2380 | { |
2381 | // int linespacing = (tight) ? m_ascent : m_ascent+m_descent; | 2381 | // int linespacing = (tight) ? m_ascent : m_ascent+m_descent; |
2382 | // return (height()-m_descent)/(m_linespacing); | 2382 | // return (height()-m_descent)/(m_linespacing); |
2383 | return (height()-2)/(m_linespacing); | 2383 | return (height()-2)/(m_linespacing); |
2384 | }; | 2384 | }; |
2385 | 2385 | ||
2386 | bool QTReader::fillbuffer(int reuse, int ht, int newht) | 2386 | bool QTReader::fillbuffer(int reuse, int ht, int newht) |
2387 | { | 2387 | { |
2388 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); | 2388 | int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0); |
2389 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; | 2389 | if (hmargin < m_bottommargin) hmargin = m_bottommargin; |
2390 | if (ht < 0) ht = m_topmargin; | 2390 | if (ht < 0) ht = m_topmargin; |
2391 | if (buffdoc.empty()) return false; | 2391 | if (buffdoc.empty()) return false; |
2392 | if (newht < 0) | 2392 | if (newht < 0) |
2393 | m_lastheight = (m_rotated) ? width() : height(); | 2393 | m_lastheight = (m_rotated) ? width() : height(); |
2394 | else | 2394 | else |
2395 | m_lastheight = newht; | 2395 | m_lastheight = newht; |
2396 | int ch; | 2396 | int ch; |
2397 | bool ret = false; | 2397 | bool ret = false; |
2398 | unsigned int oldpagepos = locnarray[reuse]; | 2398 | unsigned int oldpagepos = locnarray[reuse]; |
2399 | int lastypos = ht, ypos = ht; | 2399 | int lastypos = ht, ypos = ht; |
2400 | numlines = reuse; | 2400 | numlines = reuse; |
2401 | while (ypos < m_lastheight - hmargin || numlines < 2) | 2401 | while (ypos < m_lastheight - hmargin || numlines < 2) |
2402 | { | 2402 | { |
2403 | lastypos = ypos; | 2403 | lastypos = ypos; |
2404 | if (textarray[numlines] == NULL) | 2404 | if (textarray[numlines] == NULL) |
2405 | { | 2405 | { |
2406 | textarray[numlines] = new CDrawBuffer(&m_fontControl); | 2406 | textarray[numlines] = new CDrawBuffer(&m_fontControl); |
2407 | } | 2407 | } |
2408 | locnarray[numlines] = locate(); | 2408 | locnarray[numlines] = locate(); |
2409 | int ch = getline(textarray[numlines]); | 2409 | int ch = getline(textarray[numlines]); |
2410 | ypos += textarray[numlines]->lineSpacing(); | 2410 | ypos += textarray[numlines]->lineSpacing(); |
2411 | /* | 2411 | /* |
2412 | QString tmp = toQString(textarray[numlines]->data()); | 2412 | QString tmp = toQString(textarray[numlines]->data()); |
2413 | printf("[%u, %u, %u](%s):%s\n", lastypos, m_lastheight-hmargin, ypos, | 2413 | printf("[%u, %u, %u](%s):%s\n", lastypos, m_lastheight-hmargin, ypos, |
2414 | ((textarray[numlines]->showPartial()) ? "TRUE" : "FALSE"), | 2414 | ((textarray[numlines]->showPartial()) ? "TRUE" : "FALSE"), |
2415 | (const char*)tmp); | 2415 | (const char*)tmp); |
2416 | */ | 2416 | */ |
2417 | numlines++; | 2417 | numlines++; |
2418 | if (!ch) | 2418 | if (!ch) |
2419 | { | 2419 | { |
2420 | if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/) | 2420 | if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/) |
2421 | { | 2421 | { |
2422 | qDebug("FALSE"); | 2422 | qDebug("FALSE"); |
2423 | if (oldpagepos < buffdoc.endSection()) | 2423 | if (oldpagepos < buffdoc.endSection()) |
2424 | locate(oldpagepos); | 2424 | locate(oldpagepos); |
2425 | else | 2425 | else |
2426 | dopageup(buffdoc.endSection()); | 2426 | dopageup(buffdoc.endSection()); |
2427 | return false; | 2427 | return false; |
2428 | } | 2428 | } |
2429 | else | 2429 | else |
2430 | { | 2430 | { |
2431 | qDebug("TRUE"); | 2431 | qDebug("TRUE"); |
2432 | --numlines; | 2432 | --numlines; |
2433 | mylastpos = locate(); | 2433 | mylastpos = locate(); |
2434 | return true; | 2434 | return true; |
2435 | } | 2435 | } |
2436 | } | 2436 | } |
2437 | if (numlines > 1 && textarray[numlines-2]->isBop()) | 2437 | if (numlines > 1 && textarray[numlines-2]->isBop()) |
2438 | { | 2438 | { |
2439 | --numlines; | 2439 | --numlines; |
2440 | mylastpos = locate(); | 2440 | mylastpos = locate(); |
2441 | return true; | 2441 | return true; |
2442 | } | 2442 | } |
2443 | } | 2443 | } |
2444 | 2444 | ||
2445 | --numlines; | 2445 | --numlines; |
2446 | mylastpos = locate(); | 2446 | mylastpos = locate(); |
2447 | m_scrollpart = m_lastheight - lastypos - hmargin; | 2447 | m_scrollpart = m_lastheight - lastypos - hmargin; |
2448 | if (m_autoScroll) | 2448 | if (m_autoScroll) |
2449 | { | 2449 | { |
2450 | CalculateScrollParameters(); | 2450 | CalculateScrollParameters(); |
2451 | } | 2451 | } |
2452 | return true; | 2452 | return true; |
2453 | } | 2453 | } |
2454 | 2454 | ||
2455 | void QTReader::dopagedn() | 2455 | void QTReader::dopagedn() |
2456 | { | 2456 | { |
2457 | // qDebug("HEIGHT(2):%d", m_lastheight); | 2457 | // qDebug("HEIGHT(2):%d", m_lastheight); |
2458 | ResetScroll(); | 2458 | ResetScroll(); |
2459 | int skip = 0, ypos = m_topmargin; | 2459 | int skip = 0, ypos = m_topmargin; |
2460 | if (locate() != mylastpos) | 2460 | if (locate() != mylastpos) |
2461 | { | 2461 | { |
2462 | jumpto(mylastpos); | 2462 | jumpto(mylastpos); |
2463 | } | 2463 | } |
2464 | CDrawBuffer* reusebuffer = textarray[numlines]; | 2464 | CDrawBuffer* reusebuffer = textarray[numlines]; |
2465 | if (reusebuffer != NULL) | 2465 | if (reusebuffer != NULL) |
2466 | { | 2466 | { |
2467 | if (reusebuffer->eof()) return; | 2467 | if (reusebuffer->eof()) return; |
2468 | for (int i = 0; i <= m_overlap; i++) | 2468 | for (int i = 0; i <= m_overlap; i++) |
2469 | { | 2469 | { |
2470 | int offset = numlines - m_overlap + i; | 2470 | int offset = numlines - m_overlap + i; |
2471 | reusebuffer = textarray[offset]; | 2471 | reusebuffer = textarray[offset]; |
2472 | size_t reuselocn = locnarray[offset]; | 2472 | size_t reuselocn = locnarray[offset]; |
2473 | textarray[offset] = textarray[i]; | 2473 | textarray[offset] = textarray[i]; |
2474 | textarray[i] = reusebuffer; | 2474 | textarray[i] = reusebuffer; |
2475 | // reusebuffer->empty(); | 2475 | // reusebuffer->empty(); |
2476 | locnarray[offset] = locnarray[i]; | 2476 | locnarray[offset] = locnarray[i]; |
2477 | locnarray[i] = reuselocn; | 2477 | locnarray[i] = reuselocn; |
2478 | ypos += textarray[i]->lineSpacing(); | 2478 | ypos += textarray[i]->lineSpacing(); |
2479 | skip++; | 2479 | skip++; |
2480 | } | 2480 | } |
2481 | } | 2481 | } |
2482 | if (numlines <= 1) | 2482 | if (numlines <= 1) |
2483 | { | 2483 | { |
2484 | skip = 0; | 2484 | skip = 0; |
2485 | ypos = 0; | 2485 | ypos = 0; |
2486 | qDebug("Doing extra skip"); | 2486 | qDebug("Doing extra skip"); |
2487 | } | 2487 | } |
2488 | if (fillbuffer(skip, ypos)) | 2488 | if (fillbuffer(skip, ypos)) |
2489 | { | 2489 | { |
2490 | drawFonts(); | 2490 | drawFonts(); |
2491 | } | 2491 | } |
2492 | } | 2492 | } |
2493 | 2493 | ||
2494 | void QTReader::dopageup() | 2494 | void QTReader::dopageup() |
2495 | { | 2495 | { |
2496 | dopageup(locnarray[(m_overlap < numlines) ? m_overlap : numlines/2]); | 2496 | dopageup(locnarray[(m_overlap < numlines) ? m_overlap : numlines/2]); |
2497 | } | 2497 | } |
2498 | 2498 | ||
2499 | bool QTReader::synch(size_t start, size_t end) | 2499 | bool QTReader::synch(size_t start, size_t end) |
2500 | { | 2500 | { |
2501 | jumpto(start); | 2501 | jumpto(start); |
2502 | while (start++ < end) | 2502 | while (start++ < end) |
2503 | { | 2503 | { |
2504 | tchar ch = getch(); | 2504 | tchar ch = getch(); |
2505 | if (ch == 10) return true; | 2505 | if (ch == 10) return true; |
2506 | if ((ch == UEOF) || (ch == 6)) | 2506 | if ((ch == UEOF) || (ch == 6)) |
2507 | { | 2507 | { |
2508 | return false; | 2508 | return false; |
2509 | } | 2509 | } |
2510 | } | 2510 | } |
2511 | return false; | 2511 | return false; |
2512 | } | 2512 | } |
2513 | 2513 | ||
2514 | void QTReader::dopageup(unsigned int target) | 2514 | void QTReader::dopageup(unsigned int target) |
2515 | { | 2515 | { |
2516 | ResetScroll(); | 2516 | ResetScroll(); |
2517 | CBufferFace<CDrawBuffer*> buff; | 2517 | CBufferFace<CDrawBuffer*> buff; |
2518 | CBufferFace<size_t> loc; | 2518 | CBufferFace<size_t> loc; |
2519 | size_t delta, guess = 2*(locate()-pagelocate()), lastdelta = 0; | 2519 | size_t delta, guess = 2*(locate()-pagelocate()), lastdelta = 0; |
2520 | qDebug("dopageup:: locate():%u pagelocate():%u guess:%u", locate(), pagelocate(), guess); | 2520 | qDebug("dopageup:: locate():%u pagelocate():%u guess:%u", locate(), pagelocate(), guess); |
2521 | bool ch = true; | 2521 | bool ch = true; |
2522 | int nbfl, ypos = m_topmargin; | 2522 | int nbfl, ypos = m_topmargin; |
2523 | if (guess < 128) guess = 128; | 2523 | if (guess < 128) guess = 128; |
2524 | while (1) | 2524 | while (1) |
2525 | { | 2525 | { |
2526 | // qDebug("Guess:%u", guess); | 2526 | // qDebug("Guess:%u", guess); |
2527 | 2527 | ||
2528 | ch = true; | 2528 | ch = true; |
2529 | if (target < guess) | 2529 | if (target < guess) |
2530 | { | 2530 | { |
2531 | delta = 0; // 0 is a flag to say don't guess any more | 2531 | delta = 0; // 0 is a flag to say don't guess any more |
2532 | jumpto( (m_continuousDocument) ? 0 : buffdoc.startSection() ); | 2532 | jumpto( (m_continuousDocument) ? 0 : buffdoc.startSection() ); |
2533 | } | 2533 | } |
2534 | else if (!m_continuousDocument && (target - guess < buffdoc.startSection())) | 2534 | else if (!m_continuousDocument && (target - guess < buffdoc.startSection())) |
2535 | { | 2535 | { |
2536 | delta = 0; // 0 is a flag to say don't guess any more | 2536 | delta = 0; // 0 is a flag to say don't guess any more |
2537 | qDebug("Jumping to startsection:%d", buffdoc.startSection()); | 2537 | qDebug("Jumping to startsection:%d", buffdoc.startSection()); |
2538 | jumpto(buffdoc.startSection()); | 2538 | jumpto(buffdoc.startSection()); |
2539 | } | 2539 | } |
2540 | else | 2540 | else |
2541 | { | 2541 | { |
2542 | delta = guess; | 2542 | delta = guess; |
2543 | if (!synch(target-delta, target-lastdelta)) | 2543 | if (!synch(target-delta, target-lastdelta)) |
2544 | { | 2544 | { |
2545 | lastdelta = delta; | 2545 | lastdelta = delta; |
2546 | if (guess < 4000) | 2546 | if (guess < 4000) |
2547 | { | 2547 | { |
2548 | guess <<= 1; | 2548 | guess <<= 1; |
2549 | continue; | 2549 | continue; |
2550 | } | 2550 | } |
2551 | else | 2551 | else |
2552 | { | 2552 | { |
2553 | jumpto(target-delta); | 2553 | jumpto(target-delta); |
2554 | } | 2554 | } |
2555 | } | 2555 | } |
2556 | } | 2556 | } |
2557 | 2557 | ||
2558 | nbfl = 0; | 2558 | nbfl = 0; |
2559 | ypos = m_topmargin; | 2559 | ypos = m_topmargin; |
2560 | 2560 | ||
2561 | while (locate() < target) | 2561 | while (locate() < target) |
2562 | { | 2562 | { |
2563 | if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); | 2563 | if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); |
2564 | loc[nbfl] = locate(); | 2564 | loc[nbfl] = locate(); |
2565 | ch = getline(buff[nbfl]); | 2565 | ch = getline(buff[nbfl]); |
2566 | ypos += buff[nbfl]->lineSpacing(); | 2566 | ypos += buff[nbfl]->lineSpacing(); |
2567 | nbfl++; | 2567 | nbfl++; |
2568 | if (!ch) break; | 2568 | if (!ch) break; |
2569 | } | 2569 | } |
2570 | if (guess < 4000 && ypos < ((m_rotated) ? width() : height())-(m_bottommargin) && (delta != 0)) | 2570 | if (guess < 4000 && ypos < ((m_rotated) ? width() : height())-(m_bottommargin) && (delta != 0)) |
2571 | { | 2571 | { |
2572 | for (int i = 0; i < nbfl; i++) | 2572 | for (int i = 0; i < nbfl; i++) |
2573 | { | 2573 | { |
2574 | delete buff[i]; | 2574 | delete buff[i]; |
2575 | buff[i] = NULL; | 2575 | buff[i] = NULL; |
2576 | } | 2576 | } |
2577 | guess <<= 1; | 2577 | guess <<= 1; |
2578 | continue; | 2578 | continue; |
2579 | } | 2579 | } |
2580 | break; | 2580 | break; |
2581 | } | 2581 | } |
2582 | if (ch) | 2582 | if (ch) |
2583 | { | 2583 | { |
2584 | if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); | 2584 | if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); |
2585 | loc[nbfl] = locate(); | 2585 | loc[nbfl] = locate(); |
2586 | int ch = getline(buff[nbfl]); | 2586 | int ch = getline(buff[nbfl]); |
2587 | nbfl++; | 2587 | nbfl++; |
2588 | } | 2588 | } |
2589 | /* | 2589 | /* |
2590 | ypos = 0; | 2590 | ypos = 0; |
2591 | numlines = 0; | 2591 | numlines = 0; |
2592 | while (ypos < height() && numlines <= nbfl-1) | 2592 | while (ypos < height() && numlines <= nbfl-1) |
2593 | { | 2593 | { |
2594 | ypos += buff[nbfl - numlines - 1]->lineSpacing(); | 2594 | ypos += buff[nbfl - numlines - 1]->lineSpacing(); |
2595 | numlines++; | 2595 | numlines++; |
2596 | } | 2596 | } |
2597 | --numlines; | 2597 | --numlines; |
2598 | */ | 2598 | */ |
2599 | 2599 | ||
2600 | ypos = m_topmargin; | 2600 | ypos = m_topmargin; |
2601 | numlines = 0; | 2601 | numlines = 0; |
2602 | while (ypos < ((m_rotated) ? width() : height())-m_bottommargin && numlines+2 <= nbfl) | 2602 | while (ypos < ((m_rotated) ? width() : height())-m_bottommargin && numlines+2 <= nbfl) |
2603 | { | 2603 | { |
2604 | ypos += buff[nbfl - numlines - 2]->lineSpacing(); | 2604 | ypos += buff[nbfl - numlines - 2]->lineSpacing(); |
2605 | numlines++; | 2605 | numlines++; |
2606 | } | 2606 | } |
2607 | if (numlines > 0) --numlines; | 2607 | if (numlines > 0) --numlines; |
2608 | if (numlines == 0 && nbfl > 1) numlines = 1; | 2608 | if (numlines == 0 && nbfl > 1) numlines = 1; |
2609 | 2609 | ||
2610 | int offset = nbfl-1; | 2610 | int offset = nbfl-1; |
2611 | offset -= numlines; | 2611 | offset -= numlines; |
2612 | ypos = m_topmargin; | 2612 | ypos = m_topmargin; |
2613 | for (int i = 0; i <= numlines; i++) | 2613 | for (int i = 0; i <= numlines; i++) |
2614 | { | 2614 | { |
2615 | delete textarray[i]; | 2615 | delete textarray[i]; |
2616 | textarray[i] = buff[offset+i]; | 2616 | textarray[i] = buff[offset+i]; |
2617 | locnarray[i] = loc[offset + i]; | 2617 | locnarray[i] = loc[offset + i]; |
2618 | ypos += textarray[i]->lineSpacing(); | 2618 | ypos += textarray[i]->lineSpacing(); |
2619 | } | 2619 | } |
2620 | #ifdef _WINDOWS | 2620 | #ifdef _WINDOWS |
2621 | for (i = 0; i < nbfl - numlines - 1; i++) | 2621 | for (i = 0; i < nbfl - numlines - 1; i++) |
2622 | #else | 2622 | #else |
2623 | for (int i = 0; i < nbfl - numlines - 1; i++) | 2623 | for (int i = 0; i < nbfl - numlines - 1; i++) |
2624 | #endif | 2624 | #endif |
2625 | { | 2625 | { |
2626 | delete buff[i]; | 2626 | delete buff[i]; |
2627 | } | 2627 | } |
2628 | 2628 | ||
2629 | while (ypos < ((m_rotated) ? width() : height())-m_bottommargin) | 2629 | while (ypos < ((m_rotated) ? width() : height())-m_bottommargin) |
2630 | { | 2630 | { |
2631 | numlines++; | 2631 | numlines++; |
2632 | locnarray[numlines] = locate(); | 2632 | locnarray[numlines] = locate(); |
2633 | if (textarray[numlines] == NULL) textarray[numlines] = new CDrawBuffer(&m_fontControl); | 2633 | if (textarray[numlines] == NULL) textarray[numlines] = new CDrawBuffer(&m_fontControl); |
2634 | if (!getline(textarray[numlines])) break; | 2634 | if (!getline(textarray[numlines])) break; |
2635 | ypos += textarray[numlines]->lineSpacing(); | 2635 | ypos += textarray[numlines]->lineSpacing(); |
2636 | } | 2636 | } |
2637 | 2637 | ||
2638 | mylastpos = locate(); | 2638 | mylastpos = locate(); |
2639 | CalculateScrollParameters(); | 2639 | CalculateScrollParameters(); |
2640 | drawFonts(); | 2640 | drawFonts(); |
2641 | // repaint(); | 2641 | // repaint(); |
2642 | } | 2642 | } |
2643 | 2643 | ||
2644 | bool QTReader::load_file(const char *newfile, unsigned int _lcn) | 2644 | bool QTReader::load_file(const char *newfile, unsigned int _lcn) |
2645 | { | 2645 | { |
2646 | // QMessageBox::information(this, "Name", name, 1); | 2646 | // QMessageBox::information(this, "Name", name, 1); |
2647 | // QMessageBox::information(this, "load_file", newfile, 1); | 2647 | // QMessageBox::information(this, "load_file", newfile, 1); |
2648 | int prog = 0; | 2648 | int prog = 0; |
2649 | bool bRC = false; | 2649 | bool bRC = false; |
2650 | unsigned int lcn = _lcn; | 2650 | unsigned int lcn = _lcn; |
2651 | bDoUpdates = false; | 2651 | bDoUpdates = false; |
2652 | ResetScroll(); | 2652 | ResetScroll(); |
2653 | if (m_lastfile == newfile && lcn == 0) | 2653 | if (m_lastfile == newfile && lcn == 0) |
2654 | { | 2654 | { |
2655 | lcn = m_lastposn; | 2655 | lcn = m_lastposn; |
2656 | } | 2656 | } |
2657 | // QMessageBox::information(0, "Opening...", newfile); | 2657 | // QMessageBox::information(0, "Opening...", newfile); |
2658 | if (m_rotated) | 2658 | if (m_rotated) |
2659 | { | 2659 | { |
2660 | m_lastwidth = height(); | 2660 | m_lastwidth = height(); |
2661 | m_lastheight = width(); | 2661 | m_lastheight = width(); |
2662 | } | 2662 | } |
2663 | else | 2663 | else |
2664 | { | 2664 | { |
2665 | m_lastwidth = width(); | 2665 | m_lastwidth = width(); |
2666 | m_lastheight = height(); | 2666 | m_lastheight = height(); |
2667 | } | 2667 | } |
2668 | if (buffdoc.openfile(this,newfile) == 0) | 2668 | if (buffdoc.openfile(this,newfile) == 0) |
2669 | { | 2669 | { |
2670 | m_lastfile = newfile; | 2670 | m_lastfile = newfile; |
2671 | buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border)); | 2671 | buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border)); |
2672 | bRC = true; | 2672 | bRC = true; |
2673 | buffdoc.setContinuous(m_continuousDocument); | 2673 | buffdoc.setContinuous(m_continuousDocument); |
2674 | qDebug("buffdoc.openfile done"); | 2674 | qDebug("buffdoc.openfile done"); |
2675 | } | 2675 | } |
2676 | setfilter(getfilter()); | 2676 | setfilter(getfilter()); |
2677 | qDebug("Updated"); | 2677 | qDebug("Updated"); |
2678 | bDoUpdates = true; | 2678 | bDoUpdates = true; |
2679 | locate(lcn); | 2679 | locate(lcn); |
2680 | return bRC; | 2680 | return bRC; |
2681 | } | 2681 | } |
2682 | 2682 | ||
2683 | void QTReader::lineDown() | 2683 | void QTReader::lineDown() |
2684 | { | 2684 | { |
2685 | int ypos = m_topmargin; | 2685 | int ypos = m_topmargin; |
2686 | ResetScroll(); | 2686 | ResetScroll(); |
2687 | int offset = numlines; | 2687 | int offset = numlines; |
2688 | 2688 | ||
2689 | for (int i = 0; i <= numlines; i++) | 2689 | for (int i = 0; i <= numlines; i++) |
2690 | { | 2690 | { |
2691 | if ((ypos += textarray[numlines-i]->lineSpacing()) > ((m_rotated) ? width() : height())) | 2691 | if ((ypos += textarray[numlines-i]->lineSpacing()) > ((m_rotated) ? width() : height())) |
2692 | { | 2692 | { |
2693 | offset = i-1; | 2693 | offset = i-1; |
2694 | break; | 2694 | break; |
2695 | } | 2695 | } |
2696 | } | 2696 | } |
2697 | offset = numlines - offset; | 2697 | offset = numlines - offset; |
2698 | #ifdef _WINDOWS | 2698 | #ifdef _WINDOWS |
2699 | for (i = offset; i <= numlines; i++) | 2699 | for (i = offset; i <= numlines; i++) |
2700 | #else | 2700 | #else |
2701 | for (int i = offset; i <= numlines; i++) | 2701 | for (int i = offset; i <= numlines; i++) |
2702 | #endif | 2702 | #endif |
2703 | { | 2703 | { |
2704 | CDrawBuffer* buff = textarray[i-offset]; | 2704 | CDrawBuffer* buff = textarray[i-offset]; |
2705 | textarray[i-offset] = textarray[i]; | 2705 | textarray[i-offset] = textarray[i]; |
2706 | locnarray[i-offset] = locnarray[i]; | 2706 | locnarray[i-offset] = locnarray[i]; |
2707 | textarray[i] = buff; | 2707 | textarray[i] = buff; |
2708 | } | 2708 | } |
2709 | numlines = numlines - offset + 1; | 2709 | numlines = numlines - offset + 1; |
2710 | locnarray[numlines] = locate(); | 2710 | locnarray[numlines] = locate(); |
2711 | if (textarray[numlines] == NULL) | 2711 | if (textarray[numlines] == NULL) |
2712 | { | 2712 | { |
2713 | textarray[numlines] = new CDrawBuffer(&m_fontControl); | 2713 | textarray[numlines] = new CDrawBuffer(&m_fontControl); |
2714 | } | 2714 | } |
2715 | getline(textarray[numlines]); | 2715 | getline(textarray[numlines]); |
2716 | mylastpos = locate(); | 2716 | mylastpos = locate(); |
2717 | m_outofdate = true; | 2717 | m_outofdate = true; |
2718 | update(); | 2718 | update(); |
2719 | } | 2719 | } |
2720 | /* | 2720 | /* |
2721 | void QTReader::lineUp() | 2721 | void QTReader::lineUp() |
2722 | { | 2722 | { |
2723 | CBuffer** buff = textarray; | 2723 | CBuffer** buff = textarray; |
2724 | unsigned int *loc = new unsigned int[numlines]; | 2724 | unsigned int *loc = new unsigned int[numlines]; |
2725 | int cbptr = 0; | 2725 | int cbptr = 0; |
2726 | if (locate() != mylastpos) jumpto(mylastpos); | 2726 | if (locate() != mylastpos) jumpto(mylastpos); |
2727 | unsigned int target = locnarray[numlines-1]; | 2727 | unsigned int target = locnarray[numlines-1]; |
2728 | if (buffdoc.hasrandomaccess()) | 2728 | if (buffdoc.hasrandomaccess()) |
2729 | { | 2729 | { |
2730 | unsigned int delta = locate()-pagelocate(); | 2730 | unsigned int delta = locate()-pagelocate(); |
2731 | if (delta < 64) delta = 64; | 2731 | if (delta < 64) delta = 64; |
2732 | do | 2732 | do |
2733 | { | 2733 | { |
2734 | delta <<= 1; | 2734 | delta <<= 1; |
2735 | if (delta >= target) | 2735 | if (delta >= target) |
2736 | { | 2736 | { |
2737 | delta = target; | 2737 | delta = target; |
2738 | jumpto(0); | 2738 | jumpto(0); |
2739 | for (int i = 0; i < numlines; i++) | 2739 | for (int i = 0; i < numlines; i++) |
2740 | { | 2740 | { |
2741 | loc[i] = locate(); | 2741 | loc[i] = locate(); |
2742 | getline(buff[i]); | 2742 | getline(buff[i]); |
2743 | } | 2743 | } |
2744 | break; | 2744 | break; |
2745 | } | 2745 | } |
2746 | jumpto(target-delta); | 2746 | jumpto(target-delta); |
2747 | do | 2747 | do |
2748 | { | 2748 | { |
2749 | buffdoc.getline(buff[0],width()); | 2749 | buffdoc.getline(buff[0],width()); |
2750 | #ifdef WS | 2750 | #ifdef WS |
2751 | //printf("Trying:%s\n",buff[0]); | 2751 | //printf("Trying:%s\n",buff[0]); |
2752 | #endif | 2752 | #endif |
2753 | if (locate() > target) continue; | 2753 | if (locate() > target) continue; |
2754 | } | 2754 | } |
2755 | while (!buffdoc.iseol()); | 2755 | while (!buffdoc.iseol()); |
2756 | for (int i = 0; i < numlines; i++) | 2756 | for (int i = 0; i < numlines; i++) |
2757 | { | 2757 | { |
2758 | loc[i] = locate(); | 2758 | loc[i] = locate(); |
2759 | buffdoc.getline(buff[i],width()); | 2759 | buffdoc.getline(buff[i],width()); |
2760 | #ifdef WS | 2760 | #ifdef WS |
2761 | //printf("Filling:%s\n",buff[i]); | 2761 | //printf("Filling:%s\n",buff[i]); |
2762 | #endif | 2762 | #endif |
2763 | } | 2763 | } |
2764 | } | 2764 | } |
2765 | while (locate() >= target && delta < 4096); | 2765 | while (locate() >= target && delta < 4096); |
2766 | #ifdef WS | 2766 | #ifdef WS |
2767 | //printf("Delta:%u\n",delta); | 2767 | //printf("Delta:%u\n",delta); |
2768 | #endif | 2768 | #endif |
2769 | } | 2769 | } |
2770 | else | 2770 | else |
2771 | { | 2771 | { |
2772 | jumpto(0); | 2772 | jumpto(0); |
2773 | for (int i = 0; i < numlines; i++) | 2773 | for (int i = 0; i < numlines; i++) |
2774 | { | 2774 | { |
2775 | loc[i] = locate(); | 2775 | loc[i] = locate(); |
2776 | buffdoc.getline(buff[i],width()); | 2776 | buffdoc.getline(buff[i],width()); |
2777 | } | 2777 | } |
2778 | } | 2778 | } |
2779 | cbptr = 0; | 2779 | cbptr = 0; |
2780 | while (locate() < target) | 2780 | while (locate() < target) |
2781 | { | 2781 | { |
2782 | loc[cbptr] = locate(); | 2782 | loc[cbptr] = locate(); |
2783 | buffdoc.getline(buff[cbptr], width()); | 2783 | buffdoc.getline(buff[cbptr], width()); |
2784 | #ifdef WS | 2784 | #ifdef WS |
2785 | //printf("Adding:%s\n",buff[cbptr]->data()); | 2785 | //printf("Adding:%s\n",buff[cbptr]->data()); |
2786 | #endif | 2786 | #endif |
2787 | cbptr = (cbptr+1) % numlines; | 2787 | cbptr = (cbptr+1) % numlines; |
2788 | } | 2788 | } |
2789 | pagepos = loc[cbptr]; | 2789 | pagepos = loc[cbptr]; |
2790 | textarray = new CBuffer*[numlines]; | 2790 | textarray = new CBuffer*[numlines]; |
2791 | for (int i = 0; i < numlines; i++) | 2791 | for (int i = 0; i < numlines; i++) |
2792 | { | 2792 | { |
2793 | int j = (cbptr+i)%numlines; | 2793 | int j = (cbptr+i)%numlines; |
2794 | textarray[i] = buff[j]; | 2794 | textarray[i] = buff[j]; |
2795 | locnarray[i] = loc[j]; | 2795 | locnarray[i] = loc[j]; |
2796 | } | 2796 | } |
2797 | delete [] buff; | 2797 | delete [] buff; |
2798 | delete [] loc; | 2798 | delete [] loc; |
2799 | mylastpos = locate(); | 2799 | mylastpos = locate(); |
2800 | update(); | 2800 | update(); |
2801 | } | 2801 | } |
2802 | */ | 2802 | */ |
2803 | 2803 | ||
2804 | void QTReader::ResetScroll() | 2804 | void QTReader::ResetScroll() |
2805 | { | 2805 | { |
2806 | m_totalscroll = 0; | 2806 | m_totalscroll = 0; |
2807 | m_scrolldy1 = 0; | 2807 | m_scrolldy1 = 0; |
2808 | m_scrolldy = m_topmargin; | 2808 | m_scrolldy = m_topmargin; |
2809 | if (m_autoScroll && ((m_scrolltype == 0) || !m_bgpm.isNull())) | 2809 | if (m_autoScroll && ((m_scrolltype == 0) || !m_bgpm.isNull())) |
2810 | { | 2810 | { |
2811 | setautoscroll(false); | 2811 | setautoscroll(false); |
2812 | } | 2812 | } |
2813 | } | 2813 | } |
2814 | 2814 | ||
2815 | void QTReader::lineUp() | 2815 | void QTReader::lineUp() |
2816 | { | 2816 | { |
2817 | dopageup(locnarray[numlines-1]); | 2817 | dopageup(locnarray[numlines-1]); |
2818 | 2818 | ||
2819 | /* | 2819 | /* |
2820 | buffdoc.unsuspend(); | 2820 | buffdoc.unsuspend(); |
2821 | ResetScroll(); | 2821 | ResetScroll(); |
2822 | 2822 | ||
2823 | CDrawBuffer* buff = textarray[numlines]; | 2823 | CDrawBuffer* buff = textarray[numlines]; |
2824 | unsigned int loc; | 2824 | unsigned int loc; |
2825 | unsigned int end = locnarray[numlines]; | 2825 | unsigned int end = locnarray[numlines]; |
2826 | int cbptr = 0; | 2826 | int cbptr = 0; |
2827 | if (locate() != mylastpos) jumpto(mylastpos); | 2827 | if (locate() != mylastpos) jumpto(mylastpos); |
2828 | unsigned int target = locnarray[0]; | 2828 | unsigned int target = locnarray[0]; |
2829 | if (target == 0) return; | 2829 | if (target == 0) return; |
2830 | if (!m_continuousDocument && (target == buffdoc.startSection())) return; | 2830 | if (!m_continuousDocument && (target == buffdoc.startSection())) return; |
2831 | if (buffdoc.hasrandomaccess()) | 2831 | if (buffdoc.hasrandomaccess()) |
2832 | { | 2832 | { |
2833 | unsigned int delta = locate()-pagelocate(); | 2833 | unsigned int delta = locate()-pagelocate(); |
2834 | if (delta < 64) delta = 64; | 2834 | if (delta < 64) delta = 64; |
2835 | do | 2835 | do |
2836 | { | 2836 | { |
2837 | delta <<= 1; | 2837 | delta <<= 1; |
2838 | if (delta >= target) | 2838 | if (delta >= target) |
2839 | { | 2839 | { |
2840 | delta = target; | 2840 | delta = target; |
2841 | jumpto(0); | 2841 | jumpto(0); |
2842 | loc = locate(); | 2842 | loc = locate(); |
2843 | getline(buff); | 2843 | getline(buff); |
2844 | break; | 2844 | break; |
2845 | } | 2845 | } |
2846 | else if (!m_continuousDocument && (target - delta < buffdoc.startSection())) | 2846 | else if (!m_continuousDocument && (target - delta < buffdoc.startSection())) |
2847 | { | 2847 | { |
2848 | delta = target-buffdoc.startSection(); | 2848 | delta = target-buffdoc.startSection(); |
2849 | jumpto(buffdoc.startSection()); | 2849 | jumpto(buffdoc.startSection()); |
2850 | loc = locate(); | 2850 | loc = locate(); |
2851 | getline(buff); | 2851 | getline(buff); |
2852 | break; | 2852 | break; |
2853 | } | 2853 | } |
2854 | jumpto(target-delta); | 2854 | jumpto(target-delta); |
2855 | do | 2855 | do |
2856 | { | 2856 | { |
2857 | getline(buff); | 2857 | getline(buff); |
2858 | #ifdef WS | 2858 | #ifdef WS |
2859 | //printf("Trying:%s\n",buff[0]); | 2859 | //printf("Trying:%s\n",buff[0]); |
2860 | #endif | 2860 | #endif |
2861 | if (locate() > target) continue; | 2861 | if (locate() > target) continue; |
2862 | } | 2862 | } |
2863 | while (!buffdoc.iseol()); | 2863 | while (!buffdoc.iseol()); |
2864 | loc = locate(); | 2864 | loc = locate(); |
2865 | getline(buff); | 2865 | getline(buff); |
2866 | } | 2866 | } |
2867 | while (locate() >= target && delta < 4096); | 2867 | while (locate() >= target && delta < 4096); |
2868 | } | 2868 | } |
2869 | else | 2869 | else |
2870 | { | 2870 | { |
2871 | jumpto(0); | 2871 | jumpto(0); |
2872 | loc = locate(); | 2872 | loc = locate(); |
2873 | getline(buff); | 2873 | getline(buff); |
2874 | } | 2874 | } |
2875 | cbptr = 0; | 2875 | cbptr = 0; |
2876 | while (locate() < target) | 2876 | while (locate() < target) |
2877 | { | 2877 | { |
2878 | loc = locate(); | 2878 | loc = locate(); |
2879 | getline(buff); | 2879 | getline(buff); |
2880 | } | 2880 | } |
2881 | for (int i = numlines; i > 0; i--) | 2881 | for (int i = numlines; i > 0; i--) |
2882 | { | 2882 | { |
2883 | textarray[i] = textarray[i-1]; | 2883 | textarray[i] = textarray[i-1]; |
2884 | locnarray[i] = locnarray[i-1]; | 2884 | locnarray[i] = locnarray[i-1]; |
2885 | } | 2885 | } |
2886 | textarray[0] = buff; | 2886 | textarray[0] = buff; |
2887 | locnarray[0] = loc; | 2887 | locnarray[0] = loc; |
2888 | int start = numlines; | 2888 | int start = numlines; |
2889 | int ypos = m_topmargin; | 2889 | int ypos = m_topmargin; |
2890 | #ifdef _WINDOWS | 2890 | #ifdef _WINDOWS |
2891 | for (i = 0; i <= numlines; i++) | 2891 | for (i = 0; i <= numlines; i++) |
2892 | #else | 2892 | #else |
2893 | for (int i = 0; i <= numlines; i++) | 2893 | for (int i = 0; i <= numlines; i++) |
2894 | #endif | 2894 | #endif |
2895 | { | 2895 | { |
2896 | ypos += textarray[i]->lineSpacing(); | 2896 | ypos += textarray[i]->lineSpacing(); |
2897 | if (ypos > ((m_rotated) ? width() : height())) | 2897 | if (ypos > ((m_rotated) ? width() : height())) |
2898 | { | 2898 | { |
2899 | start = i; | 2899 | start = i; |
2900 | ypos -= textarray[i]->lineSpacing(); | 2900 | ypos -= textarray[i]->lineSpacing(); |
2901 | break; | 2901 | break; |
2902 | } | 2902 | } |
2903 | } | 2903 | } |
2904 | jumpto(locnarray[start]); | 2904 | jumpto(locnarray[start]); |
2905 | fillbuffer(start, ypos); | 2905 | fillbuffer(start, ypos); |
2906 | repaint(); | 2906 | repaint(); |
2907 | */ | 2907 | */ |
2908 | } | 2908 | } |
2909 | 2909 | ||
2910 | bool QTReader::empty() | 2910 | bool QTReader::empty() |
2911 | { | 2911 | { |
2912 | return buffdoc.empty(); | 2912 | return buffdoc.empty(); |
2913 | } | 2913 | } |
2914 | 2914 | ||
2915 | MarkupType QTReader::PreferredMarkup() | 2915 | MarkupType QTReader::PreferredMarkup() |
2916 | { | 2916 | { |
2917 | MarkupType m = buffdoc.PreferredMarkup(); | 2917 | MarkupType m = buffdoc.PreferredMarkup(); |
2918 | if (m == cTEXT) | 2918 | if (m == cTEXT) |
2919 | { | 2919 | { |
2920 | int ext = m_lastfile.findRev('.'); | 2920 | int ext = m_lastfile.findRev('.'); |
2921 | if (ext >= 0) | 2921 | if (ext >= 0) |
2922 | { | 2922 | { |
2923 | QString ft = m_lastfile.right(m_lastfile.length()-ext-1).upper(); | 2923 | QString ft = m_lastfile.right(m_lastfile.length()-ext-1).upper(); |
2924 | if (ft.left(3) == "HTM") | 2924 | if (ft.left(3) == "HTM") |
2925 | { | 2925 | { |
2926 | m = cHTML; | 2926 | m = cHTML; |
2927 | } | 2927 | } |
2928 | } | 2928 | } |
2929 | } | 2929 | } |
2930 | return m; | 2930 | return m; |
2931 | } | 2931 | } |
2932 | 2932 | ||
2933 | void QTReader::resizeEvent( QResizeEvent * p ) | 2933 | void QTReader::resizeEvent( QResizeEvent * p ) |
2934 | { | 2934 | { |
2935 | qDebug("Resizing"); | 2935 | qDebug("Resizing"); |
2936 | m_outofdate = true; | 2936 | m_outofdate = true; |
2937 | if (dbuff != NULL) | 2937 | if (dbuff != NULL) |
2938 | { | 2938 | { |
2939 | if (m_rotated) | 2939 | if (m_rotated) |
2940 | { | 2940 | { |
2941 | dbuff->resize(p->size().height(),p->size().width()); | 2941 | dbuff->resize(p->size().height(),p->size().width()); |
2942 | } | 2942 | } |
2943 | else | 2943 | else |
2944 | { | 2944 | { |
2945 | dbuff->resize(p->size()); | 2945 | dbuff->resize(p->size()); |
2946 | } | 2946 | } |
2947 | } | 2947 | } |
2948 | m_bgIsScaled = false; | 2948 | m_bgIsScaled = false; |
2949 | if (m_bgtype == bgStretched) | 2949 | if (m_bgtype == bgStretched) |
2950 | { | 2950 | { |
2951 | emit RefreshBitmap(); | 2951 | emit RefreshBitmap(); |
2952 | } | 2952 | } |
2953 | 2953 | ||
2954 | { | 2954 | { |
2955 | int h, w; | 2955 | int h, w; |
2956 | if (m_rotated) | 2956 | if (m_rotated) |
2957 | { | 2957 | { |
2958 | h = p->size().width(); | 2958 | h = p->size().width(); |
2959 | w = p->size().height(); | 2959 | w = p->size().height(); |
2960 | } | 2960 | } |
2961 | else | 2961 | else |
2962 | { | 2962 | { |
2963 | w = p->size().width(); | 2963 | w = p->size().width(); |
2964 | h = p->size().height(); | 2964 | h = p->size().height(); |
2965 | } | 2965 | } |
2966 | m_topmargin = (h*m_abstopmargin+500)/1000; | 2966 | m_topmargin = (h*m_abstopmargin+500)/1000; |
2967 | m_bottommargin = (h*m_absbottommargin+500)/1000; | 2967 | m_bottommargin = (h*m_absbottommargin+500)/1000; |
2968 | m_left_border = (w*m_absleft_border+500)/1000; | 2968 | m_left_border = (w*m_absleft_border+500)/1000; |
2969 | m_right_border = (w*m_absright_border+500)/1000; | 2969 | m_right_border = (w*m_absright_border+500)/1000; |
2970 | } | 2970 | } |
2971 | if (dbuff != NULL && buffdoc.empty()) | 2971 | if (dbuff != NULL && buffdoc.empty()) |
2972 | { | 2972 | { |
2973 | dbp->begin(dbuff); | 2973 | dbp->begin(dbuff); |
2974 | drawBackground(dbp); | 2974 | drawBackground(dbp); |
2975 | dbp->end(); | 2975 | dbp->end(); |
2976 | } | 2976 | } |
2977 | } | 2977 | } |
2978 | 2978 | ||
2979 | void QTReader::setrotated(bool sfs) | 2979 | void QTReader::setrotated(bool sfs) |
2980 | { | 2980 | { |
2981 | qDebug("Rotating"); | 2981 | qDebug("Rotating"); |
2982 | m_rotated = sfs; | 2982 | m_rotated = sfs; |
2983 | setDoubleBuffer(m_doubleBuffered); | 2983 | setDoubleBuffer(m_doubleBuffered); |
2984 | m_bgIsScaled = false; | 2984 | m_bgIsScaled = false; |
2985 | m_outofdate = true; | 2985 | m_outofdate = true; |
2986 | /* | 2986 | /* |
2987 | int h, w; | 2987 | int h, w; |
2988 | if (m_rotated) | 2988 | if (m_rotated) |
2989 | { | 2989 | { |
2990 | h = width(); | 2990 | h = width(); |
2991 | w = height(); | 2991 | w = height(); |
2992 | } | 2992 | } |
2993 | else | 2993 | else |
2994 | { | 2994 | { |
2995 | w = width(); | 2995 | w = width(); |
2996 | h = height(); | 2996 | h = height(); |
2997 | } | 2997 | } |
2998 | m_topmargin = (h*m_abstopmargin+500)/1000; | 2998 | m_topmargin = (h*m_abstopmargin+500)/1000; |
2999 | m_bottommargin = (h*m_absbottommargin+500)/1000; | 2999 | m_bottommargin = (h*m_absbottommargin+500)/1000; |
3000 | m_left_border = (w*m_absleft_border+500)/1000; | 3000 | m_left_border = (w*m_absleft_border+500)/1000; |
3001 | m_right_border = (w*m_absright_border+500)/1000; | 3001 | m_right_border = (w*m_absright_border+500)/1000; |
3002 | 3002 | ||
3003 | qDebug("Top margin:%u", m_topmargin ); | 3003 | qDebug("Top margin:%u", m_topmargin ); |
3004 | qDebug("Bottom margin:%u", m_bottommargin ); | 3004 | qDebug("Bottom margin:%u", m_bottommargin ); |
3005 | qDebug("Left margin:%u", m_left_border ); | 3005 | qDebug("Left margin:%u", m_left_border ); |
3006 | qDebug("Right margin:%u", m_right_border ); | 3006 | qDebug("Right margin:%u", m_right_border ); |
3007 | */ | 3007 | */ |
3008 | } | 3008 | } |
3009 | 3009 | ||
3010 | void QTReader::drawBackground(QPainter *p) | 3010 | void QTReader::drawBackground(QPainter *p) |
3011 | { | 3011 | { |
3012 | // p->setBackgroundMode(OpaqueMode); | 3012 | // p->setBackgroundMode(OpaqueMode); |
3013 | p->setBackgroundColor(m_bg); | 3013 | p->setBackgroundColor(m_bg); |
3014 | if (dbuff != NULL) | 3014 | if (dbuff != NULL) |
3015 | { | 3015 | { |
3016 | p->eraseRect(dbuff->rect()); | 3016 | p->eraseRect(dbuff->rect()); |
3017 | } | 3017 | } |
3018 | else | 3018 | else |
3019 | { | 3019 | { |
3020 | if (m_rotated) | 3020 | if (m_rotated) |
3021 | { | 3021 | { |
3022 | p->eraseRect(0,0,height(),width()); | 3022 | p->eraseRect(0,0,height(),width()); |
3023 | } | 3023 | } |
3024 | else | 3024 | else |
3025 | { | 3025 | { |
3026 | p->eraseRect(rect()); | 3026 | p->eraseRect(rect()); |
3027 | } | 3027 | } |
3028 | } | 3028 | } |
3029 | if (!m_bgpm.isNull()) | 3029 | if (!m_bgpm.isNull()) |
3030 | { | 3030 | { |
3031 | // p->setBackgroundMode(TransparentMode); | 3031 | // p->setBackgroundMode(TransparentMode); |
3032 | switch (m_bgtype) | 3032 | switch (m_bgtype) |
3033 | { | 3033 | { |
3034 | case bgCentred: | 3034 | case bgCentred: |
3035 | { | 3035 | { |
3036 | if (dbuff == NULL) | 3036 | if (dbuff == NULL) |
3037 | { | 3037 | { |
3038 | p->drawPixmap(width(),height(),m_bgpm); | 3038 | p->drawPixmap(width(),height(),m_bgpm); |
3039 | } | 3039 | } |
3040 | else | 3040 | else |
3041 | { | 3041 | { |
3042 | int w = (dbuff->rect().width()-m_bgpm.width())/2; | 3042 | int w = (dbuff->rect().width()-m_bgpm.width())/2; |
3043 | int h = (dbuff->rect().height()-m_bgpm.height())/2; | 3043 | int h = (dbuff->rect().height()-m_bgpm.height())/2; |
3044 | p->drawPixmap(w,h,m_bgpm); | 3044 | p->drawPixmap(w,h,m_bgpm); |
3045 | } | 3045 | } |
3046 | } | 3046 | } |
3047 | break; | 3047 | break; |
3048 | case bgTiled: | 3048 | case bgTiled: |
3049 | { | 3049 | { |
3050 | if (dbuff == NULL) | 3050 | if (dbuff == NULL) |
3051 | { | 3051 | { |
3052 | p->drawTiledPixmap(0,0,width(),height(),m_bgpm); | 3052 | p->drawTiledPixmap(0,0,width(),height(),m_bgpm); |
3053 | } | 3053 | } |
3054 | else | 3054 | else |
3055 | { | 3055 | { |
3056 | p->drawTiledPixmap(0,0,dbuff->rect().width(),dbuff->rect().height(),m_bgpm); | 3056 | p->drawTiledPixmap(0,0,dbuff->rect().width(),dbuff->rect().height(),m_bgpm); |
3057 | } | 3057 | } |
3058 | } | 3058 | } |
3059 | break; | 3059 | break; |
3060 | case bgStretched: | 3060 | case bgStretched: |
3061 | { | 3061 | { |
3062 | if (!m_bgIsScaled) | 3062 | if (!m_bgIsScaled) |
3063 | { | 3063 | { |
3064 | m_bgIsScaled = true; | 3064 | m_bgIsScaled = true; |
3065 | QImage im = m_bgpm.convertToImage(); | 3065 | QImage im = m_bgpm.convertToImage(); |
3066 | if (dbuff == NULL) | 3066 | if (dbuff == NULL) |
3067 | { | 3067 | { |
3068 | m_bgpm.convertFromImage(im.smoothScale(width(),height())); | 3068 | m_bgpm.convertFromImage(im.smoothScale(width(),height())); |
3069 | } | 3069 | } |
3070 | else | 3070 | else |
3071 | { | 3071 | { |
3072 | m_bgpm.convertFromImage(im.smoothScale(dbuff->rect().width(), dbuff->rect().height())); | 3072 | m_bgpm.convertFromImage(im.smoothScale(dbuff->rect().width(), dbuff->rect().height())); |
3073 | } | 3073 | } |
3074 | } | 3074 | } |
3075 | p->drawPixmap(0,0,m_bgpm); | 3075 | p->drawPixmap(0,0,m_bgpm); |
3076 | } | 3076 | } |
3077 | break; | 3077 | break; |
3078 | default: | 3078 | default: |
3079 | qDebug("Unknown background type"); | 3079 | qDebug("Unknown background type"); |
3080 | } | 3080 | } |
3081 | // p->setBackgroundMode(OpaqueMode); | 3081 | // p->setBackgroundMode(OpaqueMode); |
3082 | } | 3082 | } |
3083 | } | 3083 | } |
3084 | 3084 | ||
3085 | void QTReader::blitRot(int dx, int dy, int sw, int sh, CDrawBuffer* txt) | 3085 | void QTReader::blitRot(int dx, int dy, int sw, int sh, CDrawBuffer* txt) |
3086 | { | 3086 | { |
3087 | if (txt != NULL) | 3087 | if (txt != NULL) |
3088 | { | 3088 | { |
3089 | sh = txt->lineSpacing(); | 3089 | sh = txt->lineSpacing(); |
3090 | } | 3090 | } |
3091 | int sy = width()-dx-sh; | 3091 | int sy = width()-dx-sh; |
3092 | if (m_autoScroll && !(m_scrolltype == 0)) | 3092 | if (m_autoScroll && !(m_scrolltype == 0)) |
3093 | { | 3093 | { |
3094 | sy = (sy+m_totalscroll+1)%width(); | 3094 | sy = (sy+m_totalscroll+1)%width(); |
3095 | } | 3095 | } |
3096 | 3096 | ||
3097 | QPixmap pm(sw, sh); | 3097 | QPixmap pm(sw, sh); |
3098 | 3098 | ||
3099 | QPainter pd(&pm, this); | 3099 | QPainter pd(&pm, this); |
3100 | if (m_bgpm.isNull()) | 3100 | if (m_bgpm.isNull()) |
3101 | { | 3101 | { |
3102 | pd.eraseRect(pm.rect()); | 3102 | pd.eraseRect(pm.rect()); |
3103 | } | 3103 | } |
3104 | else | 3104 | else |
3105 | { | 3105 | { |
3106 | if (sy+pm.height() > dbuff->height()) | 3106 | if (sy+pm.height() > dbuff->height()) |
3107 | { | 3107 | { |
3108 | // pd.eraseRect(pm.rect()); | 3108 | // pd.eraseRect(pm.rect()); |
3109 | int fh = dbuff->height() - sy; | 3109 | int fh = dbuff->height() - sy; |
3110 | if (sy+fh > dbuff->height()) | 3110 | if (sy+fh > dbuff->height()) |
3111 | { | 3111 | { |
3112 | qDebug("Oh no!"); | 3112 | qDebug("Oh no!"); |
3113 | } | 3113 | } |
3114 | 3114 | ||
3115 | if (fh > pm.height()) | 3115 | if (fh > pm.height()) |
3116 | { | 3116 | { |
3117 | qDebug("Oh no! - 2"); | 3117 | qDebug("Oh no! - 2"); |
3118 | } | 3118 | } |
3119 | 3119 | ||
3120 | bitBlt(&pm,0,0,dbuff,dy,sy,pm.width(),fh); | 3120 | bitBlt(&pm,0,0,dbuff,dy,sy,pm.width(),fh); |
3121 | bitBlt(&pm,0,fh,dbuff,dy,0,pm.width(),pm.height()-fh); | 3121 | bitBlt(&pm,0,fh,dbuff,dy,0,pm.width(),pm.height()-fh); |
3122 | } | 3122 | } |
3123 | else | 3123 | else |
3124 | { | 3124 | { |
3125 | bitBlt(&pm,0,0,dbuff,dy,sy,pm.width(),pm.height()); | 3125 | bitBlt(&pm,0,0,dbuff,dy,sy,pm.width(),pm.height()); |
3126 | } | 3126 | } |
3127 | } | 3127 | } |
3128 | if (txt != NULL) | 3128 | if (txt != NULL) |
3129 | { | 3129 | { |
3130 | // txt->render(&pd, txt->lineSpacing() - txt->descent() - txt->lineExtraSpacing(), m_bMonoSpaced, m_charWidth, sw, m_left_border, m_right_border, m_bg); | 3130 | // txt->render(&pd, txt->lineSpacing() - txt->descent() - txt->lineExtraSpacing(), m_bMonoSpaced, m_charWidth, sw, m_left_border, m_right_border, m_bg); |
3131 | txt->render(&pd, txt->lineSpacing() - txt->descent() - txt->lineExtraSpacing(), m_bMonoSpaced, m_charWidth, sw, m_left_border, m_right_border, m_bg, width()-m_topmargin-m_bottommargin); | 3131 | txt->render(&pd, txt->lineSpacing() - txt->descent() - txt->lineExtraSpacing(), m_bMonoSpaced, m_charWidth, sw, m_left_border, m_right_border, m_bg, width()-m_topmargin-m_bottommargin); |
3132 | } | 3132 | } |
3133 | QWMatrix m; | 3133 | QWMatrix m; |
3134 | m.rotate(90); | 3134 | m.rotate(90); |
3135 | QPixmap rp = pm.xForm(m); | 3135 | QPixmap rp = pm.xForm(m); |
3136 | /* | 3136 | /* |
3137 | p.drawPixmap(QPoint(dx, dy), rp); | 3137 | p.drawPixmap(QPoint(dx, dy), rp); |
3138 | */ | 3138 | */ |
3139 | bitBlt(this, dx, dy, &rp, 0, 0, -1, -1, CopyROP); | 3139 | bitBlt(this, dx, dy, &rp, 0, 0, -1, -1, CopyROP); |
3140 | } | 3140 | } |
3141 | 3141 | ||
3142 | QString QTReader::about() | 3142 | QString QTReader::about() |
3143 | { | 3143 | { |
3144 | QString ab = QString("QTReader widget (c) Tim Wentford\n")+buffdoc.about() + "\nMini-scrollbar by Markus Gritsch\nNavigation History fixes by Frantisek Dufka"; | 3144 | QString ab = QString("QTReader widget (c) Tim Wentford\n")+buffdoc.about() + "\nMini-scrollbar by Markus Gritsch\nNavigation History fixes by Frantisek Dufka"; |
3145 | if (m_output != NULL) | 3145 | if (m_output != NULL) |
3146 | { | 3146 | { |
3147 | ab += QString("\n") + m_output->about(); | 3147 | ab += QString("\n") + m_output->about(); |
3148 | } | 3148 | } |
3149 | return ab; | 3149 | return ab; |
3150 | } | 3150 | } |
3151 | 3151 | ||
3152 | void QTReader::getNextLink() | 3152 | void QTReader::getNextLink() |
3153 | { | 3153 | { |
3154 | if (m_scrolldy != 0) | 3154 | if (m_scrolldy != 0) |
3155 | { | 3155 | { |
3156 | setautoscroll(false); | 3156 | setautoscroll(false); |
3157 | ResetScroll(); | 3157 | ResetScroll(); |
3158 | redrawall(); | 3158 | redrawall(); |
3159 | } | 3159 | } |
3160 | bool redraw = false; | 3160 | bool redraw = false; |
3161 | bool found = false; | 3161 | bool found = false; |
3162 | if (m_currentlink >= 0) | 3162 | if (m_currentlink >= 0) |
3163 | { | 3163 | { |
3164 | m_currentlinkoffset = textarray[m_currentlink]->invertLink(m_currentlinkoffset); | 3164 | m_currentlinkoffset = textarray[m_currentlink]->invertLink(m_currentlinkoffset); |
3165 | if ((m_currentlinkstyle = textarray[m_currentlink]->getNextLink(m_currentlinkoffset)) != NULL) | 3165 | if ((m_currentlinkstyle = textarray[m_currentlink]->getNextLink(m_currentlinkoffset)) != NULL) |
3166 | { | 3166 | { |
3167 | qDebug("Found a link at %u", m_currentlinkoffset); | 3167 | qDebug("Found a link at %u", m_currentlinkoffset); |
3168 | int offset = textarray[m_currentlink]->invertLink(m_currentlinkoffset); | 3168 | int offset = textarray[m_currentlink]->invertLink(m_currentlinkoffset); |
3169 | qDebug("Finishes at %u", offset); | 3169 | qDebug("Finishes at %u", offset); |
3170 | found = true; | 3170 | found = true; |
3171 | } | 3171 | } |
3172 | redraw = true; | 3172 | redraw = true; |
3173 | drawSingleLine(m_currentlink); | 3173 | drawSingleLine(m_currentlink); |
3174 | // if (found) return; | 3174 | // if (found) return; |
3175 | } | 3175 | } |
3176 | if (!found) | 3176 | if (!found) |
3177 | { | 3177 | { |
3178 | m_currentlinkoffset = -1; | 3178 | m_currentlinkoffset = -1; |
3179 | for (int i = m_currentlink+1; i < numlines; ++i) | 3179 | for (int i = m_currentlink+1; i < numlines; ++i) |
3180 | { | 3180 | { |
3181 | if ((m_currentlinkstyle = textarray[i]->getNextLink(m_currentlinkoffset)) != NULL) | 3181 | if ((m_currentlinkstyle = textarray[i]->getNextLink(m_currentlinkoffset)) != NULL) |
3182 | { | 3182 | { |
3183 | m_currentlink = i; | 3183 | m_currentlink = i; |
3184 | qDebug("Found a link at %u", m_currentlinkoffset); | 3184 | qDebug("Found a link at %u", m_currentlinkoffset); |
3185 | int offset = textarray[m_currentlink]->invertLink(m_currentlinkoffset); | 3185 | int offset = textarray[m_currentlink]->invertLink(m_currentlinkoffset); |
3186 | qDebug("Finishes at %u", offset); | 3186 | qDebug("Finishes at %u", offset); |
3187 | //drawSingleLine(i); | 3187 | //drawSingleLine(i); |
3188 | redraw = true; | 3188 | redraw = true; |
3189 | found = true; | 3189 | found = true; |
3190 | drawSingleLine(m_currentlink); | 3190 | drawSingleLine(m_currentlink); |
3191 | break; | 3191 | break; |
3192 | } | 3192 | } |
3193 | } | 3193 | } |
3194 | } | 3194 | } |
3195 | if (redraw) | 3195 | if (redraw) |
3196 | { | 3196 | { |
3197 | // redrawall(); | 3197 | // redrawall(); |
3198 | } | 3198 | } |
3199 | if (!found) | 3199 | if (!found) |
3200 | { | 3200 | { |
3201 | m_currentlink = -1; | 3201 | m_currentlink = -1; |
3202 | m_currentlinkstyle = NULL; | 3202 | m_currentlinkstyle = NULL; |
3203 | m_currentlinkoffset = -1; | 3203 | m_currentlinkoffset = -1; |
3204 | dopagedn(); | 3204 | dopagedn(); |
3205 | } | 3205 | } |
3206 | } | 3206 | } |
3207 | 3207 | ||
3208 | void QTReader::emitRedraw() | 3208 | void QTReader::emitRedraw() |
3209 | { | 3209 | { |
3210 | m_currentlinkstyle = NULL; | 3210 | m_currentlinkstyle = NULL; |
3211 | m_currentlink = -1; | 3211 | m_currentlink = -1; |
3212 | m_currentlinkoffset = -1; | 3212 | m_currentlinkoffset = -1; |
3213 | emit OnRedraw(); | 3213 | emit OnRedraw(); |
3214 | }; | 3214 | }; |
3215 | 3215 | ||
3216 | void QTReader::drawSingleLine(int lineno) | 3216 | void QTReader::drawSingleLine(int lineno) |
3217 | { | 3217 | { |
3218 | QPainter p( this ); | 3218 | QPainter p( this ); |
3219 | int ypos = textarray[0]->ascent()+m_topmargin; | 3219 | int ypos = textarray[0]->ascent()+m_topmargin; |
3220 | if (lineno == 0) | 3220 | if (lineno == 0) |
3221 | { | 3221 | { |
3222 | if (m_rotated) | 3222 | if (m_rotated) |
3223 | { | 3223 | { |
3224 | blitRot(width()-(ypos+textarray[lineno]->descent()+textarray[lineno]->lineExtraSpacing()), 0, height(), -1, textarray[lineno]); | 3224 | blitRot(width()-(ypos+textarray[lineno]->descent()+textarray[lineno]->lineExtraSpacing()), 0, height(), -1, textarray[lineno]); |
3225 | } | 3225 | } |
3226 | else | 3226 | else |
3227 | { | 3227 | { |
3228 | if (m_bgpm.isNull()) | 3228 | if (m_bgpm.isNull()) |
3229 | { | 3229 | { |
3230 | p.fillRect(m_left_border,ypos-textarray[lineno]->ascent(),width()-(m_left_border+m_right_border),textarray[lineno]->lineSpacing(),m_bg); | 3230 | p.fillRect(m_left_border,ypos-textarray[lineno]->ascent(),width()-(m_left_border+m_right_border),textarray[lineno]->lineSpacing(),m_bg); |
3231 | } | 3231 | } |
3232 | else | 3232 | else |
3233 | { | 3233 | { |
3234 | bitBlt(this, m_left_border, ypos-textarray[lineno]->ascent(), dbuff, m_left_border, ypos-textarray[lineno]->ascent(), width()-(m_left_border+m_right_border), textarray[lineno]->lineSpacing()); | 3234 | bitBlt(this, m_left_border, ypos-textarray[lineno]->ascent(), dbuff, m_left_border, ypos-textarray[lineno]->ascent(), width()-(m_left_border+m_right_border), textarray[lineno]->lineSpacing()); |
3235 | } | 3235 | } |
3236 | textarray[lineno]->render( &p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); | 3236 | textarray[lineno]->render( &p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); |
3237 | } | 3237 | } |
3238 | } | 3238 | } |
3239 | for (int i = 1; i < numlines; i++) | 3239 | for (int i = 1; i < numlines; i++) |
3240 | { | 3240 | { |
3241 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ | 3241 | ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ |
3242 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; | 3242 | (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; |
3243 | if (i == lineno) | 3243 | if (i == lineno) |
3244 | { | 3244 | { |
3245 | if (m_rotated) | 3245 | if (m_rotated) |
3246 | { | 3246 | { |
3247 | blitRot(width()-(ypos+textarray[i]->descent()+textarray[i]->lineExtraSpacing()), 0, height(), -1, textarray[i]); | 3247 | blitRot(width()-(ypos+textarray[i]->descent()+textarray[i]->lineExtraSpacing()), 0, height(), -1, textarray[i]); |
3248 | } | 3248 | } |
3249 | else | 3249 | else |
3250 | { | 3250 | { |
3251 | if (m_bgpm.isNull()) | 3251 | if (m_bgpm.isNull()) |
3252 | { | 3252 | { |
3253 | p.fillRect(m_left_border,ypos-textarray[lineno]->ascent(),width()-(m_left_border+m_right_border),textarray[lineno]->lineSpacing(),m_bg); | 3253 | p.fillRect(m_left_border,ypos-textarray[lineno]->ascent(),width()-(m_left_border+m_right_border),textarray[lineno]->lineSpacing(),m_bg); |
3254 | } | 3254 | } |
3255 | else | 3255 | else |
3256 | { | 3256 | { |
3257 | bitBlt(this, m_left_border, ypos-textarray[lineno]->ascent(), dbuff, m_left_border, ypos-textarray[lineno]->ascent(), width()-(m_left_border+m_right_border), textarray[lineno]->lineSpacing()); | 3257 | bitBlt(this, m_left_border, ypos-textarray[lineno]->ascent(), dbuff, m_left_border, ypos-textarray[lineno]->ascent(), width()-(m_left_border+m_right_border), textarray[lineno]->lineSpacing()); |
3258 | } | 3258 | } |
3259 | textarray[i]->render( &p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); | 3259 | textarray[i]->render( &p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin); |
3260 | } | 3260 | } |
3261 | } | 3261 | } |
3262 | } | 3262 | } |
3263 | } | 3263 | } |
3264 | 3264 | ||
3265 | 3265 | ||
3266 | void QTReader::gotoLink() | 3266 | void QTReader::gotoLink() |
3267 | { | 3267 | { |
3268 | if (m_currentlinkstyle == NULL) return; | 3268 | if (m_currentlinkstyle == NULL) return; |
3269 | textarray[m_currentlink]->invertLink(m_currentlinkoffset); | 3269 | textarray[m_currentlink]->invertLink(m_currentlinkoffset); |
3270 | size_t saveposn = pagelocate(); | 3270 | size_t saveposn = pagelocate(); |
3271 | QString href, nm; | 3271 | QString href, nm; |
3272 | unsigned long tgt = m_currentlinkstyle->getData(); | 3272 | unsigned long tgt = m_currentlinkstyle->getData(); |
3273 | unsigned long tgtoffset = m_currentlinkstyle->getOffset(); | 3273 | unsigned long tgtoffset = m_currentlinkstyle->getOffset(); |
3274 | linkType lt = buffdoc.hyperlink(tgt, tgtoffset, href, nm); | 3274 | linkType lt = buffdoc.hyperlink(tgt, tgtoffset, href, nm); |
3275 | qDebug("URL(1):%s", (const char*)href); | 3275 | qDebug("URL(1):%s", (const char*)href); |
3276 | if ((lt & eFile) != 0) | 3276 | if ((lt & eFile) != 0) |
3277 | { | 3277 | { |
3278 | buffdoc.saveposn(m_lastfile, saveposn); | 3278 | buffdoc.saveposn(m_lastfile, saveposn); |
3279 | #ifdef USEQPE | 3279 | #ifdef USEQPE |
3280 | { | 3280 | { |
3281 | QCopEnvelope e("QPE/System", "busy()"); | 3281 | QCopEnvelope e("QPE/System", "busy()"); |
3282 | } | 3282 | } |
3283 | #endif | 3283 | #endif |
3284 | ResetScroll(); | 3284 | ResetScroll(); |
3285 | if (!href.isEmpty()) | 3285 | if (!href.isEmpty()) |
3286 | { | 3286 | { |
3287 | if (!buffdoc.getFile(href, nm)) | 3287 | if (!buffdoc.getFile(href, nm)) |
3288 | { | 3288 | { |
3289 | emit NewFileRequest(href); | 3289 | emit NewFileRequest(href); |
3290 | } | 3290 | } |
3291 | else | 3291 | else |
3292 | { | 3292 | { |
3293 | ResetScroll(); | 3293 | ResetScroll(); |
3294 | fillbuffer(); | 3294 | fillbuffer(); |
3295 | m_outofdate = true; | 3295 | m_outofdate = true; |
3296 | update(); | 3296 | update(); |
3297 | } | 3297 | } |
3298 | } | 3298 | } |
3299 | if (!nm.isEmpty()) | 3299 | if (!nm.isEmpty()) |
3300 | { | 3300 | { |
3301 | qDebug("QTReader:Finding %s", (const char*)nm); | 3301 | qDebug("QTReader:Finding %s", (const char*)nm); |
3302 | if (buffdoc.findanchor(nm)) | 3302 | if (buffdoc.findanchor(nm)) |
3303 | { | 3303 | { |
3304 | buffdoc.resetPos(); | 3304 | buffdoc.resetPos(); |
3305 | fillbuffer(); | 3305 | fillbuffer(); |
3306 | m_outofdate = true; | 3306 | m_outofdate = true; |
3307 | update(); | 3307 | update(); |
3308 | } | 3308 | } |
3309 | } | 3309 | } |
3310 | //fillbuffer(); | 3310 | //fillbuffer(); |
3311 | //update(); | 3311 | //update(); |
3312 | #ifdef USEQPE | 3312 | #ifdef USEQPE |
3313 | { | 3313 | { |
3314 | QCopEnvelope e("QPE/System", "notBusy()"); | 3314 | QCopEnvelope e("QPE/System", "notBusy()"); |
3315 | } | 3315 | } |
3316 | #endif | 3316 | #endif |
3317 | } | 3317 | } |
3318 | else if ((lt & eLink) != 0) | 3318 | else if ((lt & eLink) != 0) |
3319 | { | 3319 | { |
3320 | buffdoc.saveposn(m_lastfile, saveposn); | 3320 | buffdoc.saveposn(m_lastfile, saveposn); |
3321 | ResetScroll(); | 3321 | ResetScroll(); |
3322 | fillbuffer(); | 3322 | fillbuffer(); |
3323 | m_outofdate = true; | 3323 | m_outofdate = true; |
3324 | update(); | 3324 | update(); |
3325 | } | 3325 | } |
3326 | else | 3326 | else |
3327 | { | 3327 | { |
3328 | if ((lt & ePicture) != 0) | 3328 | if ((lt & ePicture) != 0) |
3329 | { | 3329 | { |
3330 | QImage* pm = buffdoc.getPicture(tgt); | 3330 | QImage* pm = buffdoc.getPicture(tgt); |
3331 | if (pm != NULL) | 3331 | if (pm != NULL) |
3332 | { | 3332 | { |
3333 | emit OnShowPicture(*pm); | 3333 | emit OnShowPicture(*pm); |
3334 | delete pm; | 3334 | delete pm; |
3335 | } | 3335 | } |
3336 | } | 3336 | } |
3337 | else | 3337 | else |
3338 | { | 3338 | { |
3339 | // QString anchortext = textarray[lineno]->getanchortext(startoffset); | 3339 | // QString anchortext = textarray[lineno]->getanchortext(startoffset); |
3340 | if (!href.isEmpty()) | 3340 | if (!href.isEmpty()) |
3341 | { | 3341 | { |
3342 | emit OnURLSelected(href, tgt); | 3342 | emit OnURLSelected(href, tgt); |
3343 | refresh(); | 3343 | refresh(); |
3344 | } | 3344 | } |
3345 | } | 3345 | } |
3346 | } | 3346 | } |
3347 | m_currentlinkstyle = NULL; | 3347 | m_currentlinkstyle = NULL; |
3348 | m_currentlink = -1; | 3348 | m_currentlink = -1; |
3349 | m_currentlinkoffset = -1; | 3349 | m_currentlinkoffset = -1; |
3350 | } | 3350 | } |
3351 | 3351 | ||
3352 | void QTReader::refresh(bool full) | 3352 | void QTReader::refresh(bool full) |
3353 | { | 3353 | { |
3354 | qDebug("Refreshing"); | 3354 | qDebug("Refreshing"); |
3355 | int h, w; | 3355 | int h, w; |
3356 | if (m_rotated) | 3356 | if (m_rotated) |
3357 | { | 3357 | { |
3358 | h = width(); | 3358 | h = width(); |
3359 | w = height(); | 3359 | w = height(); |
3360 | } | 3360 | } |
3361 | else | 3361 | else |
3362 | { | 3362 | { |
3363 | w = width(); | 3363 | w = width(); |
3364 | h = height(); | 3364 | h = height(); |
3365 | } | 3365 | } |
3366 | m_topmargin = (h*m_abstopmargin+500)/1000; | 3366 | m_topmargin = (h*m_abstopmargin+500)/1000; |
3367 | m_bottommargin = (h*m_absbottommargin+500)/1000; | 3367 | m_bottommargin = (h*m_absbottommargin+500)/1000; |
3368 | m_left_border = (w*m_absleft_border+500)/1000; | 3368 | m_left_border = (w*m_absleft_border+500)/1000; |
3369 | m_right_border = (w*m_absright_border+500)/1000; | 3369 | m_right_border = (w*m_absright_border+500)/1000; |
3370 | 3370 | ||
3371 | qDebug("Top margin:%u", m_topmargin ); | 3371 | qDebug("Top margin:%u", m_topmargin ); |
3372 | qDebug("Bottom margin:%u", m_bottommargin ); | 3372 | qDebug("Bottom margin:%u", m_bottommargin ); |
3373 | qDebug("Left margin:%u", m_left_border ); | 3373 | qDebug("Left margin:%u", m_left_border ); |
3374 | qDebug("Right margin:%u", m_right_border ); | 3374 | qDebug("Right margin:%u", m_right_border ); |
3375 | if (full && m_highlightfilter) m_highlightfilter->refresh(pagelocate()); | 3375 | if (full && m_highlightfilter) m_highlightfilter->refresh(pagelocate()); |
3376 | m_outofdate = true; | 3376 | m_outofdate = true; |
3377 | locate(pagelocate()); | 3377 | locate(pagelocate()); |
3378 | } | 3378 | } |
3379 | 3379 | ||
3380 | #include "striphtml.h" | 3380 | #include "striphtml.h" |
3381 | 3381 | ||
3382 | CFilterChain* QTReader::getfilter() | 3382 | CFilterChain* QTReader::getfilter() |
3383 | { | 3383 | { |
3384 | CFilterChain * filt = new CFilterChain(getencoding()); | 3384 | CFilterChain * filt = new CFilterChain(getencoding()); |
3385 | if (bstripcr) filt->addfilter(new stripcr); | 3385 | if (bstripcr) filt->addfilter(new stripcr); |
3386 | 3386 | ||
3387 | if (btextfmt || (bautofmt && (PreferredMarkup() == cTEXT))) filt->addfilter(new textfmt); | 3387 | if (btextfmt || (bautofmt && (PreferredMarkup() == cTEXT))) filt->addfilter(new textfmt); |
3388 | if (bpeanut || (bautofmt && (PreferredMarkup() == cPML))) filt->addfilter(new PeanutFormatter); | 3388 | if (bpeanut || (bautofmt && (PreferredMarkup() == cPML))) filt->addfilter(new PeanutFormatter); |
3389 | // if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile)); | 3389 | // if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile)); |
3390 | 3390 | ||
3391 | #ifdef __STATIC | 3391 | #ifdef __STATIC |
3392 | if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile)); | 3392 | if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile)); |
3393 | if (bautofmt && (PreferredMarkup() == cCHM)) | 3393 | if (bautofmt && (PreferredMarkup() == cCHM)) |
3394 | { | 3394 | { |
3395 | striphtml* f = new striphtml(m_lastfile); | 3395 | striphtml* f = new striphtml(m_lastfile); |
3396 | f->setchm(true); | 3396 | f->setchm(true); |
3397 | filt->addfilter(f); | 3397 | filt->addfilter(f); |
3398 | } | 3398 | } |
3399 | #else | 3399 | #else |
3400 | if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new ExternFilter("HTMLfilter", m_lastfile)); | 3400 | if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new ExternFilter("HTMLfilter", m_lastfile)); |
3401 | if (bautofmt && (PreferredMarkup() == cCHM)) | 3401 | if (bautofmt && (PreferredMarkup() == cCHM)) |
3402 | { | 3402 | { |
3403 | ExternFilter* f = new ExternFilter("HTMLfilter",m_lastfile); | 3403 | ExternFilter* f = new ExternFilter("HTMLfilter",m_lastfile); |
3404 | ((striphtml*)f->filter())->setchm(true); | 3404 | ((striphtml*)f->filter())->setchm(true); |
3405 | filt->addfilter(f); | 3405 | filt->addfilter(f); |
3406 | } | 3406 | } |
3407 | #endif | 3407 | #endif |
3408 | m_highlightfilter = new HighlightFilter(this); | 3408 | m_highlightfilter = new HighlightFilter(this); |
3409 | filt->addfilter(m_highlightfilter); | 3409 | filt->addfilter(m_highlightfilter); |
3410 | 3410 | ||
3411 | if (bdehyphen) filt->addfilter(new dehyphen); | 3411 | if (bdehyphen) filt->addfilter(new dehyphen); |
3412 | if (bunindent) filt->addfilter(new unindent); | 3412 | if (bunindent) filt->addfilter(new unindent); |
3413 | if (brepara) filt->addfilter(new repara(m_reparastring)); | 3413 | if (brepara) filt->addfilter(new repara(m_reparastring)); |
3414 | if (bonespace) filt->addfilter(new OnePara); | 3414 | if (bonespace) filt->addfilter(new OnePara); |
3415 | if (bindenter) filt->addfilter(new indenter(bindenter)); | 3415 | if (bindenter) filt->addfilter(new indenter(bindenter)); |
3416 | if (bdblspce) filt->addfilter(new dblspce); | 3416 | if (bdblspce) filt->addfilter(new dblspce); |
3417 | if (bdepluck) filt->addfilter(new DePluck(pluckernextpart)); | 3417 | if (bdepluck) filt->addfilter(new DePluck(pluckernextpart)); |
3418 | if (bdejpluck) filt->addfilter(new DePluck(jplucknextpart)); | 3418 | if (bdejpluck) filt->addfilter(new DePluck(jplucknextpart)); |
3419 | if (brepalm) filt->addfilter(new repalm); | 3419 | if (brepalm) filt->addfilter(new repalm); |
3420 | if (bunderlineLink) filt->addfilter(new underlineLink); | 3420 | if (bunderlineLink) filt->addfilter(new underlineLink); |
3421 | if (bkern) filt->addfilter(new kern); | 3421 | if (bkern) filt->addfilter(new kern); |
3422 | if (bremap) filt->addfilter(new remap); | 3422 | if (bremap) filt->addfilter(new remap); |
3423 | if (bmakebold) filt->addfilter(new embolden); | 3423 | if (bmakebold) filt->addfilter(new embolden); |
3424 | if (bfulljust) filt->addfilter(new FullJust); | 3424 | if (bfulljust) filt->addfilter(new FullJust); |
3425 | int r,g,b; | 3425 | int r,g,b; |
3426 | m_default_bg.rgb(&r, &g, &b); | 3426 | m_default_bg.rgb(&r, &g, &b); |
3427 | if (r != 255 || g != 255 || b != 255) | 3427 | if (r != 255 || g != 255 || b != 255) |
3428 | filt->addfilter(new setbg(r,g,b)); | 3428 | filt->addfilter(new setbg(r,g,b)); |
3429 | m_default_fg.rgb(&r, &g, &b); | 3429 | m_default_fg.rgb(&r, &g, &b); |
3430 | if (r != 0 || g != 0 || b != 0) | 3430 | if (r != 0 || g != 0 || b != 0) |
3431 | filt->addfilter(new setfg(r,g,b)); | 3431 | filt->addfilter(new setfg(r,g,b)); |
3432 | // if (bNegative) filt->addfilter(new makeNegative); | 3432 | // if (bNegative) filt->addfilter(new makeNegative); |
3433 | if (bInverse) filt->addfilter(new makeInverse); | 3433 | if (bInverse) filt->addfilter(new makeInverse); |
3434 | if (bNoInlineTables) filt->addfilter(new tableLink); | 3434 | if (bNoInlineTables) filt->addfilter(new tableLink); |
3435 | return filt; | 3435 | return filt; |
3436 | } | 3436 | } |
3437 | 3437 | ||
3438 | void QTReader::readAloud() | 3438 | void QTReader::readAloud() |
3439 | { | 3439 | { |
3440 | #ifdef __STATIC | 3440 | #ifdef __STATIC |
3441 | return; | 3441 | return; |
3442 | #else | 3442 | #else |
3443 | CBuffer para; | 3443 | CBuffer para; |
3444 | jumpto(pagelocate()); | 3444 | jumpto(pagelocate()); |
3445 | while (m_autoScroll && (buffdoc.getpara(para) != -1)) | 3445 | while (m_autoScroll && (buffdoc.getpara(para) != -1)) |
3446 | { | 3446 | { |
3447 | if (para.length() > 0) | 3447 | if (para.length() > 0) |
3448 | { | 3448 | { |
3449 | unsigned long lastpos = buffdoc.explocate(); | 3449 | unsigned long lastpos = buffdoc.explocate(); |
3450 | while (lastpos > mylastpos) | 3450 | while (lastpos > mylastpos) |
3451 | { | 3451 | { |
3452 | dopagedn(); | 3452 | dopagedn(); |
3453 | qApp->processEvents(); | 3453 | qApp->processEvents(); |
3454 | } | 3454 | } |
3455 | jumpto(lastpos); | 3455 | jumpto(lastpos); |
3456 | QString txt = toQString(para.data()); | 3456 | QString txt = toQString(para.data()); |
3457 | 3457 | ||
3458 | doOutput(txt); | 3458 | doOutput(txt); |
3459 | } | 3459 | } |
3460 | qApp->processEvents(); | 3460 | qApp->processEvents(); |
3461 | } | 3461 | } |
3462 | #endif | 3462 | #endif |
3463 | } | 3463 | } |
3464 | 3464 | ||
3465 | bool QTReader::doOutput(const QString& wrd) | 3465 | bool QTReader::doOutput(const QString& wrd) |
3466 | { | 3466 | { |
3467 | if (m_output != NULL) | 3467 | if (m_output != NULL) |
3468 | { | 3468 | { |
3469 | m_output->output(wrd); | 3469 | m_output->output(wrd); |
3470 | return true; | 3470 | return true; |
3471 | } | 3471 | } |
3472 | else | 3472 | else |
3473 | { | 3473 | { |
3474 | return false; | 3474 | return false; |
3475 | } | 3475 | } |
3476 | } | 3476 | } |
3477 | 3477 | ||
3478 | bool QTReader::checkoutput() | 3478 | bool QTReader::checkoutput() |
3479 | { | 3479 | { |
3480 | if (m_output == NULL) | 3480 | if (m_output == NULL) |
3481 | { | 3481 | { |
3482 | m_output = new outputcodec(m_outputName); | 3482 | m_output = new outputcodec(m_outputName); |
3483 | if (reinterpret_cast<outputcodec*>(m_output)->getStatus() != 0) | 3483 | if (reinterpret_cast<outputcodec*>(m_output)->getStatus() != 0) |
3484 | { | 3484 | { |
3485 | delete m_output; | 3485 | delete m_output; |
3486 | m_output = NULL; | 3486 | m_output = NULL; |
3487 | QMessageBox::warning(this, PROGNAME, QString("Couldn't find output codec\n")+m_outputName); | 3487 | QMessageBox::warning(this, PROGNAME, QString("Couldn't find output codec\n")+m_outputName); |
3488 | return false; | 3488 | return false; |
3489 | } | 3489 | } |
3490 | } | 3490 | } |
3491 | return true; | 3491 | return true; |
3492 | } | 3492 | } |
diff --git a/noncore/apps/opie-reader/plucker_base.cpp b/noncore/apps/opie-reader/plucker_base.cpp index 849edfc..302ac73 100644 --- a/noncore/apps/opie-reader/plucker_base.cpp +++ b/noncore/apps/opie-reader/plucker_base.cpp | |||
@@ -1,1531 +1,1531 @@ | |||
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | #include <string.h> | 2 | #include <string.h> |
3 | #include <qmessagebox.h> | 3 | #include <qmessagebox.h> |
4 | #include <qpixmap.h> | 4 | #include <qpixmap.h> |
5 | #ifdef USEQPE | 5 | #ifdef USEQPE |
6 | #include <qpe/qcopenvelope_qws.h> | 6 | #include <qpe/qcopenvelope_qws.h> |
7 | #endif /* USEQPE */ | 7 | #endif /* USEQPE */ |
8 | #ifdef LOCALPICTURES | 8 | #ifdef LOCALPICTURES |
9 | #include <qscrollview.h> | 9 | #include <qscrollview.h> |
10 | #endif | 10 | #endif |
11 | #ifdef USEQPE | 11 | #ifdef USEQPE |
12 | #include <qpe/global.h> | 12 | #include <qpe/global.h> |
13 | #endif /* USEQPE */ | 13 | #endif /* USEQPE */ |
14 | #include <qclipboard.h> | 14 | #include <qclipboard.h> |
15 | #ifndef USEQPE | 15 | #ifndef USEQPE |
16 | #include <qapplication.h> | 16 | #include <qapplication.h> |
17 | #else /* USEQPE */ | 17 | #else /* USEQPE */ |
18 | #include <qpe/qpeapplication.h> | 18 | #include <qpe/qpeapplication.h> |
19 | #endif /* USEQPE */ | 19 | #endif /* USEQPE */ |
20 | #include <qimage.h> | 20 | #include <qimage.h> |
21 | 21 | ||
22 | #include "plucker_base.h" | 22 | #include "plucker_base.h" |
23 | #include "Aportis.h" | 23 | #include "Aportis.h" |
24 | #include "hrule.h" | 24 | #include "hrule.h" |
25 | #include "decompress.h" | 25 | #include "decompress.h" |
26 | 26 | ||
27 | const UInt8 CPlucker_base::continuation_bit = 1; | 27 | const UInt8 CPlucker_base::continuation_bit = 1; |
28 | 28 | ||
29 | CPlucker_base::CPlucker_base() : | 29 | CPlucker_base::CPlucker_base() : |
30 | #ifdef LOCALPICTURES | 30 | #ifdef LOCALPICTURES |
31 | m_viewer(NULL), | 31 | m_viewer(NULL), |
32 | m_picture(NULL), | 32 | m_picture(NULL), |
33 | #endif | 33 | #endif |
34 | expandedtextbuffer(NULL), | 34 | expandedtextbuffer(NULL), |
35 | compressedtextbuffer(NULL), | 35 | compressedtextbuffer(NULL), |
36 | bufferrec(-1), | 36 | bufferrec(-1), |
37 | m_offset(0) | 37 | m_offset(0) |
38 | //, urls(NULL) | 38 | //, urls(NULL) |
39 | { /*printf("constructing:%x\n",fin);*/ } | 39 | { /*printf("constructing:%x\n",fin);*/ } |
40 | 40 | ||
41 | 41 | ||
42 | void CPlucker_base::Expand(UInt32 reclen, UInt8 type, UInt8* buffer, UInt32 buffersize) | 42 | void CPlucker_base::Expand(UInt32 reclen, UInt8 type, UInt8* buffer, UInt32 buffersize) |
43 | { | 43 | { |
44 | unsuspend(); | 44 | unsuspend(); |
45 | if ((type%2 == 0) && (type != 14)) | 45 | if ((type%2 == 0) && (type != 14)) |
46 | { | 46 | { |
47 | size_t bytes_read = fread(buffer, reclen, sizeof(char), fin); | 47 | size_t bytes_read = fread(buffer, reclen, sizeof(char), fin); |
48 | buffer[bytes_read] = '\0'; | 48 | buffer[bytes_read] = '\0'; |
49 | } | 49 | } |
50 | else | 50 | else |
51 | { | 51 | { |
52 | UInt8* readbuffer = NULL; | 52 | UInt8* readbuffer = NULL; |
53 | if (reclen > compressedbuffersize) | 53 | if (reclen > compressedbuffersize) |
54 | { | 54 | { |
55 | readbuffer = new UInt8[reclen]; | 55 | readbuffer = new UInt8[reclen]; |
56 | } | 56 | } |
57 | else | 57 | else |
58 | { | 58 | { |
59 | readbuffer = compressedtextbuffer; | 59 | readbuffer = compressedtextbuffer; |
60 | } | 60 | } |
61 | if (readbuffer != NULL) | 61 | if (readbuffer != NULL) |
62 | { | 62 | { |
63 | fread(readbuffer, reclen, sizeof(char), fin); | 63 | fread(readbuffer, reclen, sizeof(char), fin); |
64 | size_t bytes_read = (*m_decompress)(readbuffer, reclen, buffer, buffersize); | 64 | size_t bytes_read = (*m_decompress)(readbuffer, reclen, buffer, buffersize); |
65 | buffer[bytes_read] = '\0'; | 65 | buffer[bytes_read] = '\0'; |
66 | if (reclen > compressedbuffersize) | 66 | if (reclen > compressedbuffersize) |
67 | { | 67 | { |
68 | delete [] readbuffer; | 68 | delete [] readbuffer; |
69 | } | 69 | } |
70 | } | 70 | } |
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | ||
74 | void CPlucker_base::sizes(unsigned long& _file, unsigned long& _text) | 74 | void CPlucker_base::sizes(unsigned long& _file, unsigned long& _text) |
75 | { | 75 | { |
76 | _file = file_length; | 76 | _file = file_length; |
77 | if (textlength == 0) | 77 | if (textlength == 0) |
78 | { | 78 | { |
79 | for (int recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) | 79 | for (int recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) |
80 | { | 80 | { |
81 | gotorecordnumber(recptr); | 81 | gotorecordnumber(recptr); |
82 | UInt16 thishdr_uid, thishdr_nParagraphs; | 82 | UInt16 thishdr_uid, thishdr_nParagraphs; |
83 | UInt32 thishdr_size; | 83 | UInt32 thishdr_size; |
84 | UInt8 thishdr_type, thishdr_reserved; | 84 | UInt8 thishdr_type, thishdr_reserved; |
85 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 85 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
86 | if (thishdr_type < 2) textlength += thishdr_size; | 86 | if (thishdr_type < 2) textlength += thishdr_size; |
87 | } | 87 | } |
88 | } | 88 | } |
89 | _text = textlength; | 89 | _text = textlength; |
90 | //ntohl(hdr0.size); | 90 | //ntohl(hdr0.size); |
91 | } | 91 | } |
92 | 92 | ||
93 | char* CPlucker_base::geturl(UInt16 tgt) | 93 | char* CPlucker_base::geturl(UInt16 tgt) |
94 | { | 94 | { |
95 | char * pRet = NULL; | 95 | char * pRet = NULL; |
96 | gotorecordnumber(0); | 96 | gotorecordnumber(0); |
97 | fread(&hdr0, 1, 6, fin); | 97 | fread(&hdr0, 1, 6, fin); |
98 | unsigned int nrecs = ntohs(hdr0.nRecords); | 98 | unsigned int nrecs = ntohs(hdr0.nRecords); |
99 | //qDebug("Version %u, no. recs %u", ntohs(hdr0.version), nrecs); | 99 | //qDebug("Version %u, no. recs %u", ntohs(hdr0.version), nrecs); |
100 | UInt16 urlid = 0; | 100 | UInt16 urlid = 0; |
101 | bool urlsfound = false; | 101 | bool urlsfound = false; |
102 | char* urls = NULL; | 102 | char* urls = NULL; |
103 | size_t urlsize = 0; | 103 | size_t urlsize = 0; |
104 | for (unsigned int i = 0; i < nrecs; i++) | 104 | for (unsigned int i = 0; i < nrecs; i++) |
105 | { | 105 | { |
106 | UInt16 id, name; | 106 | UInt16 id, name; |
107 | fread(&name, 1, sizeof(name), fin); | 107 | fread(&name, 1, sizeof(name), fin); |
108 | fread(&id, 1, sizeof(id), fin); | 108 | fread(&id, 1, sizeof(id), fin); |
109 | //qDebug("N:%d, I:%d", ntohs(name), ntohs(id)); | 109 | //qDebug("N:%d, I:%d", ntohs(name), ntohs(id)); |
110 | if (ntohs(name) == 2) | 110 | if (ntohs(name) == 2) |
111 | { | 111 | { |
112 | urlsfound = true; | 112 | urlsfound = true; |
113 | urlid = id; | 113 | urlid = id; |
114 | //qDebug("Found url index:%d", ntohs(urlid)); | 114 | //qDebug("Found url index:%d", ntohs(urlid)); |
115 | } | 115 | } |
116 | ////qDebug("%x", id); | 116 | ////qDebug("%x", id); |
117 | } | 117 | } |
118 | if (urlsfound) | 118 | if (urlsfound) |
119 | { | 119 | { |
120 | unsigned short recptr = finduid(ntohs(urlid)); | 120 | unsigned short recptr = finduid(ntohs(urlid)); |
121 | if (recptr != 0) | 121 | if (recptr != 0) |
122 | { | 122 | { |
123 | gotorecordnumber(recptr); | 123 | gotorecordnumber(recptr); |
124 | UInt16 thishdr_uid, thishdr_nParagraphs; | 124 | UInt16 thishdr_uid, thishdr_nParagraphs; |
125 | UInt32 thishdr_size; | 125 | UInt32 thishdr_size; |
126 | UInt8 thishdr_type, thishdr_reserved; | 126 | UInt8 thishdr_type, thishdr_reserved; |
127 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 127 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
128 | UInt16 urlctr = 0; | 128 | UInt16 urlctr = 0; |
129 | while (1) | 129 | while (1) |
130 | { | 130 | { |
131 | UInt16 tctr; | 131 | UInt16 tctr; |
132 | fread(&tctr, 1, sizeof(tctr), fin); | 132 | fread(&tctr, 1, sizeof(tctr), fin); |
133 | fread(&urlid, 1, sizeof(urlid), fin); | 133 | fread(&urlid, 1, sizeof(urlid), fin); |
134 | tctr = ntohs(tctr); | 134 | tctr = ntohs(tctr); |
135 | //qDebug("tgt:%u urlctr:%u tctr:%u", tgt, urlctr, tctr); | 135 | //qDebug("tgt:%u urlctr:%u tctr:%u", tgt, urlctr, tctr); |
136 | if (tctr >= tgt) | 136 | if (tctr >= tgt) |
137 | { | 137 | { |
138 | break; | 138 | break; |
139 | } | 139 | } |
140 | urlctr = tctr; | 140 | urlctr = tctr; |
141 | } | 141 | } |
142 | //qDebug("urls are in %d", ntohs(urlid)); | 142 | //qDebug("urls are in %d", ntohs(urlid)); |
143 | recptr = finduid(ntohs(urlid)); | 143 | recptr = finduid(ntohs(urlid)); |
144 | if (recptr != 0) | 144 | if (recptr != 0) |
145 | { | 145 | { |
146 | UInt32 reclen = recordlength(recptr) - HeaderSize(); | 146 | UInt32 reclen = recordlength(recptr) - HeaderSize(); |
147 | gotorecordnumber(recptr); | 147 | gotorecordnumber(recptr); |
148 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 148 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
149 | //qDebug("Found urls:%x",thishdr_type); | 149 | //qDebug("Found urls:%x",thishdr_type); |
150 | urlsize = thishdr_size; | 150 | urlsize = thishdr_size; |
151 | urls = new char[urlsize]; | 151 | urls = new char[urlsize]; |
152 | Expand(reclen, thishdr_type, (UInt8*)urls, urlsize); | 152 | Expand(reclen, thishdr_type, (UInt8*)urls, urlsize); |
153 | char* ptr = urls; | 153 | char* ptr = urls; |
154 | int rn = urlctr+1; | 154 | int rn = urlctr+1; |
155 | while (ptr - urls < urlsize) | 155 | while (ptr - urls < urlsize) |
156 | { | 156 | { |
157 | if (rn == tgt) | 157 | if (rn == tgt) |
158 | { | 158 | { |
159 | //qDebug("URL:%s", ptr); | 159 | //qDebug("URL:%s", ptr); |
160 | int len = strlen(ptr)+1; | 160 | int len = strlen(ptr)+1; |
161 | pRet = new char[len]; | 161 | pRet = new char[len]; |
162 | memcpy(pRet, ptr, len); | 162 | memcpy(pRet, ptr, len); |
163 | break; | 163 | break; |
164 | } | 164 | } |
165 | ptr += strlen(ptr)+1; | 165 | ptr += strlen(ptr)+1; |
166 | rn++; | 166 | rn++; |
167 | } | 167 | } |
168 | delete [] urls; | 168 | delete [] urls; |
169 | } | 169 | } |
170 | } | 170 | } |
171 | } | 171 | } |
172 | else | 172 | else |
173 | { | 173 | { |
174 | pRet = NULL; | 174 | pRet = NULL; |
175 | } | 175 | } |
176 | return pRet; | 176 | return pRet; |
177 | } | 177 | } |
178 | 178 | ||
179 | CPlucker_base::~CPlucker_base() | 179 | CPlucker_base::~CPlucker_base() |
180 | { | 180 | { |
181 | if (expandedtextbuffer != NULL) delete [] expandedtextbuffer; | 181 | if (expandedtextbuffer != NULL) delete [] expandedtextbuffer; |
182 | if (compressedtextbuffer != NULL) delete [] compressedtextbuffer; | 182 | if (compressedtextbuffer != NULL) delete [] compressedtextbuffer; |
183 | #ifdef LOCALPICTURES | 183 | #ifdef LOCALPICTURES |
184 | if (m_viewer != NULL) delete m_viewer; | 184 | if (m_viewer != NULL) delete m_viewer; |
185 | #endif | 185 | #endif |
186 | } | 186 | } |
187 | 187 | ||
188 | int CPlucker_base::getch() { return getch(false); } | 188 | int CPlucker_base::getch() { return getch(false); } |
189 | 189 | ||
190 | void CPlucker_base::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 190 | void CPlucker_base::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
191 | { | 191 | { |
192 | pos = locate(); | 192 | pos = locate(); |
193 | ch = getch(false); | 193 | ch = getch(false); |
194 | sty = mystyle; | 194 | sty = mystyle; |
195 | } | 195 | } |
196 | 196 | ||
197 | unsigned int CPlucker_base::locate() | 197 | unsigned int CPlucker_base::locate() |
198 | { | 198 | { |
199 | return currentpos; | 199 | return currentpos; |
200 | /* | 200 | /* |
201 | UInt16 thisrec = 1; | 201 | UInt16 thisrec = 1; |
202 | unsigned long locpos = 0; | 202 | unsigned long locpos = 0; |
203 | gotorecordnumber(thisrec); | 203 | gotorecordnumber(thisrec); |
204 | UInt16 thishdr_uid, thishdr_nParagraphs; | 204 | UInt16 thishdr_uid, thishdr_nParagraphs; |
205 | UInt32 thishdr_size; | 205 | UInt32 thishdr_size; |
206 | UInt8 thishdr_type, thishdr_reserved; | 206 | UInt8 thishdr_type, thishdr_reserved; |
207 | while (thisrec < bufferrec) | 207 | while (thisrec < bufferrec) |
208 | { | 208 | { |
209 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 209 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
210 | if (thishdr_type < 2) locpos += thishdr_size; | 210 | if (thishdr_type < 2) locpos += thishdr_size; |
211 | thisrec++; | 211 | thisrec++; |
212 | gotorecordnumber(thisrec); | 212 | gotorecordnumber(thisrec); |
213 | } | 213 | } |
214 | return locpos+bufferpos; | 214 | return locpos+bufferpos; |
215 | */ | 215 | */ |
216 | } | 216 | } |
217 | 217 | ||
218 | void CPlucker_base::locate(unsigned int n) | 218 | void CPlucker_base::locate(unsigned int n) |
219 | { | 219 | { |
220 | 220 | ||
221 | // clock_t start = clock(); | 221 | // clock_t start = clock(); |
222 | if (n >= currentpos-bufferpos && n < currentpos - bufferpos + buffercontent) | 222 | if (n >= currentpos-bufferpos && n < currentpos - bufferpos + buffercontent) |
223 | { | 223 | { |
224 | currentpos -= bufferpos; | 224 | currentpos -= bufferpos; |
225 | expand(bufferrec); | 225 | expand(bufferrec); |
226 | while (currentpos < n && bufferpos < buffercontent) getch_base(true); | 226 | while (currentpos < n && bufferpos < buffercontent) getch_base(true); |
227 | return; | 227 | return; |
228 | } | 228 | } |
229 | /* | 229 | /* |
230 | 230 | ||
231 | UInt32 textlength = currentpos - bufferpos; | 231 | UInt32 textlength = currentpos - bufferpos; |
232 | UInt16 recptr = bufferrec; | 232 | UInt16 recptr = bufferrec; |
233 | if (n < textlength/2) | 233 | if (n < textlength/2) |
234 | { | 234 | { |
235 | textlength = 0; | 235 | textlength = 0; |
236 | UInt16 thishdr_uid, thishdr_nParagraphs; | 236 | UInt16 thishdr_uid, thishdr_nParagraphs; |
237 | UInt32 thishdr_size = buffercontent; | 237 | UInt32 thishdr_size = buffercontent; |
238 | UInt8 thishdr_type, thishdr_reserved; | 238 | UInt8 thishdr_type, thishdr_reserved; |
239 | for (recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) | 239 | for (recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) |
240 | { | 240 | { |
241 | gotorecordnumber(recptr); | 241 | gotorecordnumber(recptr); |
242 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 242 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
243 | if (thishdr_type < 2) | 243 | if (thishdr_type < 2) |
244 | { | 244 | { |
245 | textlength += thishdr_size; | 245 | textlength += thishdr_size; |
246 | if (textlength > n) | 246 | if (textlength > n) |
247 | { | 247 | { |
248 | textlength -= thishdr_size; | 248 | textlength -= thishdr_size; |
249 | break; | 249 | break; |
250 | } | 250 | } |
251 | } | 251 | } |
252 | } | 252 | } |
253 | } | 253 | } |
254 | else if (n < textlength) | 254 | else if (n < textlength) |
255 | { | 255 | { |
256 | UInt16 thishdr_uid, thishdr_nParagraphs; | 256 | UInt16 thishdr_uid, thishdr_nParagraphs; |
257 | UInt32 thishdr_size; | 257 | UInt32 thishdr_size; |
258 | UInt8 thishdr_type, thishdr_reserved; | 258 | UInt8 thishdr_type, thishdr_reserved; |
259 | while (n < textlength && recptr > 1) | 259 | while (n < textlength && recptr > 1) |
260 | { | 260 | { |
261 | recptr--; | 261 | recptr--; |
262 | gotorecordnumber(recptr); | 262 | gotorecordnumber(recptr); |
263 | //qDebug("recptr:%u", recptr); | 263 | //qDebug("recptr:%u", recptr); |
264 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 264 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
265 | if (thishdr_type < 2) | 265 | if (thishdr_type < 2) |
266 | { | 266 | { |
267 | textlength -= thishdr_size; | 267 | textlength -= thishdr_size; |
268 | } | 268 | } |
269 | } | 269 | } |
270 | } | 270 | } |
271 | else | 271 | else |
272 | { | 272 | { |
273 | UInt16 thishdr_uid, thishdr_nParagraphs; | 273 | UInt16 thishdr_uid, thishdr_nParagraphs; |
274 | UInt32 thishdr_size = buffercontent; | 274 | UInt32 thishdr_size = buffercontent; |
275 | UInt8 thishdr_type, thishdr_reserved; | 275 | UInt8 thishdr_type, thishdr_reserved; |
276 | while (n > textlength + thishdr_size && recptr < ntohs(head.recordList.numRecords)-1) | 276 | while (n > textlength + thishdr_size && recptr < ntohs(head.recordList.numRecords)-1) |
277 | { | 277 | { |
278 | textlength += thishdr_size; | 278 | textlength += thishdr_size; |
279 | recptr++; | 279 | recptr++; |
280 | gotorecordnumber(recptr); | 280 | gotorecordnumber(recptr); |
281 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 281 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
282 | if (!(thishdr_type < 2)) | 282 | if (!(thishdr_type < 2)) |
283 | { | 283 | { |
284 | thishdr_size = 0; | 284 | thishdr_size = 0; |
285 | } | 285 | } |
286 | } | 286 | } |
287 | } | 287 | } |
288 | 288 | ||
289 | */ | 289 | */ |
290 | UInt16 thisrec = 0; | 290 | UInt16 thisrec = 0; |
291 | unsigned long locpos = 0; | 291 | unsigned long locpos = 0; |
292 | unsigned long bs = 0; | 292 | unsigned long bs = 0; |
293 | unsigned int np1 = n+1; | 293 | unsigned int np1 = n+1; |
294 | UInt16 thishdr_uid, thishdr_nParagraphs; | 294 | UInt16 thishdr_uid, thishdr_nParagraphs; |
295 | UInt32 thishdr_size; | 295 | UInt32 thishdr_size; |
296 | UInt8 thishdr_type, thishdr_reserved; | 296 | UInt8 thishdr_type, thishdr_reserved; |
297 | do | 297 | do |
298 | { | 298 | { |
299 | thisrec++; | 299 | thisrec++; |
300 | locpos += bs; | 300 | locpos += bs; |
301 | gotorecordnumber(thisrec); | 301 | gotorecordnumber(thisrec); |
302 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 302 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
303 | if (thishdr_type < 2) | 303 | if (thishdr_type < 2) |
304 | { | 304 | { |
305 | bs = thishdr_size; | 305 | bs = thishdr_size; |
306 | } | 306 | } |
307 | else | 307 | else |
308 | { | 308 | { |
309 | bs = 0; | 309 | bs = 0; |
310 | } | 310 | } |
311 | } while (locpos + bs < np1); | 311 | } while (locpos + bs < np1); |
312 | 312 | ||
313 | // qDebug("Time(2): %u", clock()-start); | 313 | // qDebug("Time(2): %u", clock()-start); |
314 | /* | 314 | /* |
315 | if (recptr != thisrec) | 315 | if (recptr != thisrec) |
316 | { | 316 | { |
317 | qDebug("Disaster:recptr:%u thisrec:%u", recptr, thisrec); | 317 | qDebug("Disaster:recptr:%u thisrec:%u", recptr, thisrec); |
318 | UInt16 thishdr_uid, thishdr_nParagraphs; | 318 | UInt16 thishdr_uid, thishdr_nParagraphs; |
319 | UInt32 thishdr_size = buffercontent; | 319 | UInt32 thishdr_size = buffercontent; |
320 | UInt8 thishdr_type, thishdr_reserved; | 320 | UInt8 thishdr_type, thishdr_reserved; |
321 | for (recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) | 321 | for (recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) |
322 | { | 322 | { |
323 | gotorecordnumber(recptr); | 323 | gotorecordnumber(recptr); |
324 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 324 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
325 | // qDebug("UID:%u Paras:%u Size:%u Type:%u Reserved:%u", thishdr_uid, thishdr_nParagraphs, thishdr_size, (unsigned int)thishdr_type, (unsigned int)thishdr_reserved); | 325 | // qDebug("UID:%u Paras:%u Size:%u Type:%u Reserved:%u", thishdr_uid, thishdr_nParagraphs, thishdr_size, (unsigned int)thishdr_type, (unsigned int)thishdr_reserved); |
326 | } | 326 | } |
327 | //QApplication::exit ( 100 ); | 327 | //QApplication::exit ( 100 ); |
328 | } | 328 | } |
329 | */ | 329 | */ |
330 | currentpos = locpos; | 330 | currentpos = locpos; |
331 | expand(thisrec); | 331 | expand(thisrec); |
332 | while (currentpos < n && bufferpos < buffercontent) getch_base(true); | 332 | while (currentpos < n && bufferpos < buffercontent) getch_base(true); |
333 | 333 | ||
334 | /* // This is faster but the alignment attribute doesn't get set 8^( | 334 | /* // This is faster but the alignment attribute doesn't get set 8^( |
335 | bufferpos = n-locpos; | 335 | bufferpos = n-locpos; |
336 | currentpos = n; | 336 | currentpos = n; |
337 | while (bufferpos >= m_nextPara && m_nextPara >= 0) | 337 | while (bufferpos >= m_nextPara && m_nextPara >= 0) |
338 | { | 338 | { |
339 | UInt16 attr = m_ParaAttrs[m_nextParaIndex]; | 339 | UInt16 attr = m_ParaAttrs[m_nextParaIndex]; |
340 | m_nextParaIndex++; | 340 | m_nextParaIndex++; |
341 | if (m_nextParaIndex == m_nParas) | 341 | if (m_nextParaIndex == m_nParas) |
342 | { | 342 | { |
343 | m_nextPara = -1; | 343 | m_nextPara = -1; |
344 | } | 344 | } |
345 | else | 345 | else |
346 | { | 346 | { |
347 | m_nextPara += m_ParaOffsets[m_nextParaIndex]; | 347 | m_nextPara += m_ParaOffsets[m_nextParaIndex]; |
348 | } | 348 | } |
349 | } | 349 | } |
350 | */ | 350 | */ |
351 | } | 351 | } |
352 | 352 | ||
353 | bool CPlucker_base::expand(int thisrec) | 353 | bool CPlucker_base::expand(int thisrec) |
354 | { | 354 | { |
355 | mystyle.unset(); | 355 | mystyle.unset(); |
356 | if (bufferrec != thisrec) | 356 | if (bufferrec != thisrec) |
357 | { | 357 | { |
358 | size_t reclen = recordlength(thisrec); | 358 | size_t reclen = recordlength(thisrec); |
359 | gotorecordnumber(thisrec); | 359 | gotorecordnumber(thisrec); |
360 | UInt16 thishdr_uid, thishdr_nParagraphs; | 360 | UInt16 thishdr_uid, thishdr_nParagraphs; |
361 | UInt32 thishdr_size; | 361 | UInt32 thishdr_size; |
362 | UInt8 thishdr_type, thishdr_reserved; | 362 | UInt8 thishdr_type, thishdr_reserved; |
363 | while (1) | 363 | while (1) |
364 | { | 364 | { |
365 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 365 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
366 | //qDebug("This (%d) type is %d, uid is %u", thisrec, thishdr_type, thishdr_uid); | 366 | //qDebug("This (%d) type is %d, uid is %u", thisrec, thishdr_type, thishdr_uid); |
367 | if (thishdr_type < 2) break; | 367 | if (thishdr_type < 2) break; |
368 | //qDebug("Skipping paragraph of type %d", thishdr_type); | 368 | //qDebug("Skipping paragraph of type %d", thishdr_type); |
369 | if (++thisrec >= ntohs(head.recordList.numRecords) - 1) return false; | 369 | if (++thisrec >= ntohs(head.recordList.numRecords) - 1) return false; |
370 | reclen = recordlength(thisrec); | 370 | reclen = recordlength(thisrec); |
371 | gotorecordnumber(thisrec); | 371 | gotorecordnumber(thisrec); |
372 | } | 372 | } |
373 | m_nParas = thishdr_nParagraphs; | 373 | m_nParas = thishdr_nParagraphs; |
374 | m_bufferisreserved = (thishdr_reserved != 0); | 374 | m_bufferisreserved = (thishdr_reserved != 0); |
375 | //qDebug("It has %u paragraphs and is %u bytes", thishdr_nParagraphs, thishdr_size); | 375 | //qDebug("It has %u paragraphs and is %u bytes", thishdr_nParagraphs, thishdr_size); |
376 | uid = thishdr_uid; | 376 | uid = thishdr_uid; |
377 | // gotorecordnumber(thisrec); | 377 | // gotorecordnumber(thisrec); |
378 | // fread(expandedtextbuffer,1,10,fin); | 378 | // fread(expandedtextbuffer,1,10,fin); |
379 | for (int i = 0; i < m_nParas; i++) | 379 | for (int i = 0; i < m_nParas; i++) |
380 | { | 380 | { |
381 | UInt16 ubytes, attrs; | 381 | UInt16 ubytes, attrs; |
382 | fread(&ubytes, 1, sizeof(ubytes), fin); | 382 | fread(&ubytes, 1, sizeof(ubytes), fin); |
383 | fread(&attrs, 1, sizeof(attrs), fin); | 383 | fread(&attrs, 1, sizeof(attrs), fin); |
384 | m_ParaOffsets[i] = ntohs(ubytes); | 384 | m_ParaOffsets[i] = ntohs(ubytes); |
385 | m_ParaAttrs[i] = ntohs(attrs); | 385 | m_ParaAttrs[i] = ntohs(attrs); |
386 | ////qDebug("Bytes %u, Attr %x", ntohs(ubytes), ntohs(attrs)); | 386 | ////qDebug("Bytes %u, Attr %x", ntohs(ubytes), ntohs(attrs)); |
387 | } | 387 | } |
388 | 388 | ||
389 | reclen -= HeaderSize()+4*m_nParas; | 389 | reclen -= HeaderSize()+4*m_nParas; |
390 | 390 | ||
391 | buffercontent = thishdr_size; | 391 | buffercontent = thishdr_size; |
392 | 392 | ||
393 | if (thishdr_size > buffersize) | 393 | if (thishdr_size > buffersize) |
394 | { | 394 | { |
395 | delete [] expandedtextbuffer; | 395 | delete [] expandedtextbuffer; |
396 | buffersize = thishdr_size; | 396 | buffersize = thishdr_size; |
397 | expandedtextbuffer = new UInt8[buffersize]; | 397 | expandedtextbuffer = new UInt8[buffersize]; |
398 | } | 398 | } |
399 | Expand(reclen, thishdr_type, expandedtextbuffer, buffercontent); | 399 | Expand(reclen, thishdr_type, expandedtextbuffer, buffercontent); |
400 | bufferrec = thisrec; | 400 | bufferrec = thisrec; |
401 | } | 401 | } |
402 | 402 | ||
403 | 403 | ||
404 | if (m_nParas > 0) | 404 | if (m_nParas > 0) |
405 | { | 405 | { |
406 | m_nextPara = m_ParaOffsets[0]; | 406 | m_nextPara = m_ParaOffsets[0]; |
407 | //qDebug("First offset = %u", m_nextPara); | 407 | //qDebug("First offset = %u", m_nextPara); |
408 | m_nextParaIndex = 0; | 408 | m_nextParaIndex = 0; |
409 | } | 409 | } |
410 | else | 410 | else |
411 | { | 411 | { |
412 | m_nextPara = -1; | 412 | m_nextPara = -1; |
413 | } | 413 | } |
414 | bufferpos = 0; | 414 | bufferpos = 0; |
415 | //qDebug("BC:%u, HS:%u", buffercontent, thishdr_size); | 415 | //qDebug("BC:%u, HS:%u", buffercontent, thishdr_size); |
416 | return true; | 416 | return true; |
417 | } | 417 | } |
418 | /* | 418 | /* |
419 | void CPlucker_base::UnZip(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize) | 419 | void CPlucker_base::UnZip(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize) |
420 | { | 420 | { |
421 | z_stream zstream; | 421 | z_stream zstream; |
422 | memset(&zstream,sizeof(zstream),0); | 422 | memset(&zstream,sizeof(zstream),0); |
423 | zstream.next_in = compressedbuffer; | 423 | zstream.next_in = compressedbuffer; |
424 | zstream.next_out = tgtbuffer; | 424 | zstream.next_out = tgtbuffer; |
425 | zstream.avail_out = bsize; | 425 | zstream.avail_out = bsize; |
426 | zstream.avail_in = reclen; | 426 | zstream.avail_in = reclen; |
427 | 427 | ||
428 | int keylen = 0; | 428 | int keylen = 0; |
429 | 429 | ||
430 | zstream.zalloc = Z_NULL; | 430 | zstream.zalloc = Z_NULL; |
431 | zstream.zfree = Z_NULL; | 431 | zstream.zfree = Z_NULL; |
432 | zstream.opaque = Z_NULL; | 432 | zstream.opaque = Z_NULL; |
433 | 433 | ||
434 | // printf("Initialising\n"); | 434 | // printf("Initialising\n"); |
435 | 435 | ||
436 | inflateInit(&zstream); | 436 | inflateInit(&zstream); |
437 | int err = 0; | 437 | int err = 0; |
438 | do { | 438 | do { |
439 | if ( zstream.avail_in == 0 && 0 < keylen ) { | 439 | if ( zstream.avail_in == 0 && 0 < keylen ) { |
440 | zstream.next_in = compressedbuffer + keylen; | 440 | zstream.next_in = compressedbuffer + keylen; |
441 | zstream.avail_in = reclen - keylen; | 441 | zstream.avail_in = reclen - keylen; |
442 | keylen = 0; | 442 | keylen = 0; |
443 | } | 443 | } |
444 | zstream.next_out = tgtbuffer; | 444 | zstream.next_out = tgtbuffer; |
445 | zstream.avail_out = bsize; | 445 | zstream.avail_out = bsize; |
446 | 446 | ||
447 | err = inflate( &zstream, Z_SYNC_FLUSH ); | 447 | err = inflate( &zstream, Z_SYNC_FLUSH ); |
448 | 448 | ||
449 | ////qDebug("err:%d - %u", err, zstream.avail_in); | 449 | ////qDebug("err:%d - %u", err, zstream.avail_in); |
450 | 450 | ||
451 | } while ( err == Z_OK ); | 451 | } while ( err == Z_OK ); |
452 | 452 | ||
453 | inflateEnd(&zstream); | 453 | inflateEnd(&zstream); |
454 | } | 454 | } |
455 | */ | 455 | */ |
456 | size_t CPlucker_base::UnDoc(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize) | 456 | size_t CPlucker_base::UnDoc(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize) |
457 | { | 457 | { |
458 | // UInt16 headerSize; | 458 | // UInt16 headerSize; |
459 | UInt16 docSize; | 459 | UInt16 docSize; |
460 | UInt16 i; | 460 | UInt16 i; |
461 | UInt16 j; | 461 | UInt16 j; |
462 | UInt16 k; | 462 | UInt16 k; |
463 | 463 | ||
464 | UInt8 *inBuf = compressedbuffer; | 464 | UInt8 *inBuf = compressedbuffer; |
465 | UInt8 *outBuf = tgtbuffer; | 465 | UInt8 *outBuf = tgtbuffer; |
466 | 466 | ||
467 | // headerSize = sizeof( Header ) + record->paragraphs * sizeof( Paragraph ); | 467 | // headerSize = sizeof( Header ) + record->paragraphs * sizeof( Paragraph ); |
468 | docSize = reclen; | 468 | docSize = reclen; |
469 | 469 | ||
470 | j = 0; | 470 | j = 0; |
471 | k = 0; | 471 | k = 0; |
472 | while ( j < docSize ) { | 472 | while ( j < docSize ) { |
473 | i = 0; | 473 | i = 0; |
474 | while ( i < bsize && j < docSize ) { | 474 | while ( i < bsize && j < docSize ) { |
475 | UInt16 c; | 475 | UInt16 c; |
476 | 476 | ||
477 | c = (UInt16) inBuf[ j++ ]; | 477 | c = (UInt16) inBuf[ j++ ]; |
478 | if ( 0 < c && c < 9 ) { | 478 | if ( 0 < c && c < 9 ) { |
479 | while ( 0 < c-- ) | 479 | while ( 0 < c-- ) |
480 | outBuf[ i++ ] = inBuf[ j++ ]; | 480 | outBuf[ i++ ] = inBuf[ j++ ]; |
481 | } | 481 | } |
482 | else if ( c < 0x80 ) | 482 | else if ( c < 0x80 ) |
483 | outBuf[ i++ ] = c; | 483 | outBuf[ i++ ] = c; |
484 | else if ( 0xc0 <= c ) { | 484 | else if ( 0xc0 <= c ) { |
485 | outBuf[ i++ ] = ' '; | 485 | outBuf[ i++ ] = ' '; |
486 | outBuf[ i++ ] = c ^ 0x80; | 486 | outBuf[ i++ ] = c ^ 0x80; |
487 | } | 487 | } |
488 | else { | 488 | else { |
489 | Int16 m; | 489 | Int16 m; |
490 | Int16 n; | 490 | Int16 n; |
491 | 491 | ||
492 | c <<= 8; | 492 | c <<= 8; |
493 | c += inBuf[ j++ ]; | 493 | c += inBuf[ j++ ]; |
494 | 494 | ||
495 | m = ( c & 0x3fff ) >> COUNT_BITS; | 495 | m = ( c & 0x3fff ) >> COUNT_BITS; |
496 | n = c & ( ( 1 << COUNT_BITS ) - 1 ); | 496 | n = c & ( ( 1 << COUNT_BITS ) - 1 ); |
497 | n += 2; | 497 | n += 2; |
498 | 498 | ||
499 | do { | 499 | do { |
500 | outBuf[ i ] = outBuf[ i - m ]; | 500 | outBuf[ i ] = outBuf[ i - m ]; |
501 | i++; | 501 | i++; |
502 | } while ( 0 < n-- ); | 502 | } while ( 0 < n-- ); |
503 | } | 503 | } |
504 | } | 504 | } |
505 | k += bsize; | 505 | k += bsize; |
506 | } | 506 | } |
507 | return i; | 507 | return i; |
508 | } | 508 | } |
509 | 509 | ||
510 | void CPlucker_base::home() | 510 | void CPlucker_base::home() |
511 | { | 511 | { |
512 | currentpos = 0; | 512 | currentpos = 0; |
513 | expand(1); | 513 | expand(1); |
514 | } | 514 | } |
515 | 515 | ||
516 | CList<Bkmk>* CPlucker_base::getbkmklist() | 516 | CList<Bkmk>* CPlucker_base::getbkmklist() |
517 | { | 517 | { |
518 | /* | 518 | /* |
519 | UInt16 thishdr_uid, thishdr_nParagraphs; | 519 | UInt16 thishdr_uid, thishdr_nParagraphs; |
520 | UInt32 thishdr_size; | 520 | UInt32 thishdr_size; |
521 | UInt8 thishdr_type, thishdr_reserved; | 521 | UInt8 thishdr_type, thishdr_reserved; |
522 | 522 | ||
523 | for (int i = 1; i < ntohs(head.recordList.numRecords); i++) | 523 | for (int i = 1; i < ntohs(head.recordList.numRecords); i++) |
524 | { | 524 | { |
525 | gotorecordnumber(i); | 525 | gotorecordnumber(i); |
526 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 526 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
527 | if (thishdr_type == 8) | 527 | if (thishdr_type == 8) |
528 | { | 528 | { |
529 | UInt16 n; | 529 | UInt16 n; |
530 | fread(&n, 1, sizeof(n), fin); | 530 | fread(&n, 1, sizeof(n), fin); |
531 | n = ntohs(n); | 531 | n = ntohs(n); |
532 | //qDebug("Found %u bookmarks", n); | 532 | //qDebug("Found %u bookmarks", n); |
533 | } | 533 | } |
534 | //qDebug("Found:%d, %u", i , thishdr_type); | 534 | //qDebug("Found:%d, %u", i , thishdr_type); |
535 | } | 535 | } |
536 | */ | 536 | */ |
537 | return NULL; | 537 | return NULL; |
538 | } | 538 | } |
539 | 539 | ||
540 | #include <qnamespace.h> | 540 | #include <qnamespace.h> |
541 | 541 | ||
542 | QImage* CPlucker_base::expandimg(UInt16 tgt, bool border) | 542 | QImage* CPlucker_base::expandimg(UInt16 tgt, bool border) |
543 | { | 543 | { |
544 | QImage* qimage = getimg(tgt); | 544 | QImage* qimage = getimg(tgt); |
545 | QImage* ret; | 545 | QImage* ret; |
546 | if (qimage == NULL) return NULL; | 546 | if (qimage == NULL) return NULL; |
547 | if (border) | 547 | if (border) |
548 | { | 548 | { |
549 | QPixmap* image = new QPixmap(0,0); | 549 | QPixmap* image = new QPixmap(0,0); |
550 | image->convertFromImage(*qimage); | 550 | image->convertFromImage(*qimage); |
551 | delete qimage; | 551 | delete qimage; |
552 | QPixmap* pret = new QPixmap(image->width()+4, image->height()+4); | 552 | QPixmap* pret = new QPixmap(image->width()+4, image->height()+4); |
553 | pret->fill(Qt::red); | 553 | pret->fill(Qt::red); |
554 | bitBlt(pret, 2, 2, image, 0, 0, -1, -1);//, Qt::RasterOp::CopyROP); | 554 | bitBlt(pret, 2, 2, image, 0, 0, -1, -1);//, Qt::RasterOp::CopyROP); |
555 | delete image; | 555 | delete image; |
556 | ret = new QImage(pret->convertToImage()); | 556 | ret = new QImage(pret->convertToImage()); |
557 | } | 557 | } |
558 | else | 558 | else |
559 | { | 559 | { |
560 | ret = qimage; | 560 | ret = qimage; |
561 | } | 561 | } |
562 | return ret; | 562 | return ret; |
563 | } | 563 | } |
564 | 564 | ||
565 | #ifdef _BUFFERPICS | 565 | #ifdef _BUFFERPICS |
566 | #include <qmap.h> | 566 | #include <qmap.h> |
567 | #endif | 567 | #endif |
568 | 568 | ||
569 | QImage* CPlucker_base::getPicture(unsigned long tgt) | 569 | QImage* CPlucker_base::getPicture(unsigned long tgt) |
570 | { | 570 | { |
571 | #ifdef _BUFFERPICS | 571 | #ifdef _BUFFERPICS |
572 | static QMap<unsigned long, QPixmap> pix; | 572 | static QMap<unsigned long, QPixmap> pix; |
573 | QMap<unsigned long, QPixmap>::Iterator t = pix.find(tgt); | 573 | QMap<unsigned long, QPixmap>::Iterator t = pix.find(tgt); |
574 | if (t == pix.end()) | 574 | if (t == pix.end()) |
575 | { | 575 | { |
576 | pix[tgt] = *expandimg(tgt); | 576 | pix[tgt] = *expandimg(tgt); |
577 | return &pix[tgt]; | 577 | return &pix[tgt]; |
578 | } | 578 | } |
579 | else | 579 | else |
580 | return &(t.data()); | 580 | return &(t.data()); |
581 | #else | 581 | #else |
582 | return expandimg(tgt >> 16); | 582 | return expandimg(tgt >> 16); |
583 | #endif | 583 | #endif |
584 | } | 584 | } |
585 | 585 | ||
586 | #ifdef LOCALPICTURES | 586 | #ifdef LOCALPICTURES |
587 | #include <unistd.h> | 587 | #include <unistd.h> |
588 | #include <qpe/global.h> | 588 | #include <qpe/global.h> |
589 | void CPlucker_base::showimg(UInt16 tgt) | 589 | void CPlucker_base::showimg(UInt16 tgt) |
590 | { | 590 | { |
591 | //qDebug("Crassssssh!"); | 591 | //qDebug("Crassssssh!"); |
592 | QPixmap* qimage = expandimg(tgt); | 592 | QPixmap* qimage = expandimg(tgt); |
593 | m_picture->setFixedSize(qimage->size()); | 593 | m_picture->setFixedSize(qimage->size()); |
594 | m_picture->setBackgroundPixmap(*qimage); | 594 | m_picture->setBackgroundPixmap(*qimage); |
595 | delete qimage; | 595 | delete qimage; |
596 | m_viewer->show(); | 596 | m_viewer->show(); |
597 | 597 | ||
598 | /* | 598 | /* |
599 | char tmp[] = "uqtreader.XXXXXX"; | 599 | char tmp[] = "uqtreader.XXXXXX"; |
600 | QImage* qimage = getimg(tgt); | 600 | QImage* qimage = getimg(tgt); |
601 | QPixmap* image = new QPixmap(0,0); | 601 | QPixmap* image = new QPixmap(0,0); |
602 | // //qDebug("New image"); | 602 | // //qDebug("New image"); |
603 | image->convertFromImage(*qimage); | 603 | image->convertFromImage(*qimage); |
604 | delete qimage; | 604 | delete qimage; |
605 | char tmpfile[sizeof(tmp)+1]; | 605 | char tmpfile[sizeof(tmp)+1]; |
606 | strcpy(tmpfile,tmp); | 606 | strcpy(tmpfile,tmp); |
607 | int f = mkstemp(tmpfile); | 607 | int f = mkstemp(tmpfile); |
608 | close(f); | 608 | close(f); |
609 | //qDebug("TMPFILE:%s", tmpfile); | 609 | //qDebug("TMPFILE:%s", tmpfile); |
610 | if (image->save(tmpfile,"PNG")) | 610 | if (image->save(tmpfile,"PNG")) |
611 | { | 611 | { |
612 | QCopEnvelope e("QPE/Application/showimg", "setDocument(QString)"); | 612 | QCopEnvelope e("QPE/Application/showimg", "setDocument(QString)"); |
613 | e << QString(tmpfile); | 613 | e << QString(tmpfile); |
614 | } | 614 | } |
615 | Global::statusMessage("Opening image"); | 615 | Global::statusMessage("Opening image"); |
616 | sleep(5); | 616 | sleep(5); |
617 | delete image; | 617 | delete image; |
618 | unlink(tmpfile); | 618 | unlink(tmpfile); |
619 | */ | 619 | */ |
620 | } | 620 | } |
621 | 621 | ||
622 | #endif | 622 | #endif |
623 | 623 | ||
624 | unsigned short CPlucker_base::finduid(unsigned short urlid) | 624 | unsigned short CPlucker_base::finduid(unsigned short urlid) |
625 | { | 625 | { |
626 | // //qDebug("Finding %u", urlid); | 626 | // //qDebug("Finding %u", urlid); |
627 | unsigned short jmin = 1, jmax = ntohs(head.recordList.numRecords); | 627 | unsigned short jmin = 1, jmax = ntohs(head.recordList.numRecords); |
628 | unsigned short jmid = (jmin+jmax) >> 1; | 628 | unsigned short jmid = (jmin+jmax) >> 1; |
629 | while (jmax - jmin > 1) | 629 | while (jmax - jmin > 1) |
630 | { | 630 | { |
631 | gotorecordnumber(jmid); | 631 | gotorecordnumber(jmid); |
632 | UInt16 thishdr_uid, thishdr_nParagraphs; | 632 | UInt16 thishdr_uid, thishdr_nParagraphs; |
633 | UInt32 thishdr_size; | 633 | UInt32 thishdr_size; |
634 | UInt8 thishdr_type, thishdr_reserved; | 634 | UInt8 thishdr_type, thishdr_reserved; |
635 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 635 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
636 | unsigned short luid = thishdr_uid; | 636 | unsigned short luid = thishdr_uid; |
637 | ////qDebug("%u %u %u : %u", jmin, jmid, jmax, urlid); | 637 | ////qDebug("%u %u %u : %u", jmin, jmid, jmax, urlid); |
638 | if (luid == urlid) | 638 | if (luid == urlid) |
639 | { | 639 | { |
640 | return jmid; | 640 | return jmid; |
641 | } | 641 | } |
642 | if (luid < urlid) | 642 | if (luid < urlid) |
643 | { | 643 | { |
644 | jmin = jmid; | 644 | jmin = jmid; |
645 | } | 645 | } |
646 | else | 646 | else |
647 | { | 647 | { |
648 | jmax = jmid; | 648 | jmax = jmid; |
649 | } | 649 | } |
650 | jmid = (jmin+jmax) >> 1; | 650 | jmid = (jmin+jmax) >> 1; |
651 | } | 651 | } |
652 | gotorecordnumber(jmin); | 652 | gotorecordnumber(jmin); |
653 | UInt16 thishdr_uid, thishdr_nParagraphs; | 653 | UInt16 thishdr_uid, thishdr_nParagraphs; |
654 | UInt32 thishdr_size; | 654 | UInt32 thishdr_size; |
655 | UInt8 thishdr_type, thishdr_reserved; | 655 | UInt8 thishdr_type, thishdr_reserved; |
656 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 656 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
657 | unsigned short luid = thishdr_uid; | 657 | unsigned short luid = thishdr_uid; |
658 | //qDebug("jmin at end:%u,%u", jmin, luid); | 658 | //qDebug("jmin at end:%u,%u", jmin, luid); |
659 | if (luid == urlid) | 659 | if (luid == urlid) |
660 | { | 660 | { |
661 | return jmin; | 661 | return jmin; |
662 | } | 662 | } |
663 | gotorecordnumber(jmax); | 663 | gotorecordnumber(jmax); |
664 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 664 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
665 | luid = thishdr_uid; | 665 | luid = thishdr_uid; |
666 | //qDebug("jmax at end:%u,%u", jmax, luid); | 666 | //qDebug("jmax at end:%u,%u", jmax, luid); |
667 | if (luid == urlid) | 667 | if (luid == urlid) |
668 | { | 668 | { |
669 | return jmax; | 669 | return jmax; |
670 | } | 670 | } |
671 | //qDebug("Couldn't find %u", urlid); | 671 | //qDebug("Couldn't find %u", urlid); |
672 | return 0; // Not found! | 672 | return 0; // Not found! |
673 | } | 673 | } |
674 | 674 | ||
675 | #include <qnamespace.h> | 675 | #include <qnamespace.h> |
676 | 676 | ||
677 | void CPlucker_base::setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) | 677 | void CPlucker_base::setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) |
678 | { | 678 | { |
679 | unsigned short sz = 0; | 679 | unsigned short sz = 0; |
680 | for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) | 680 | for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) |
681 | { | 681 | { |
682 | sz++; | 682 | sz++; |
683 | } | 683 | } |
684 | size_t newlen = srclen+sizeof(sz)+sz*sizeof(unsigned long); | 684 | size_t newlen = srclen+sizeof(sz)+sz*sizeof(unsigned long); |
685 | unsigned char* newdata = new unsigned char[newlen]; | 685 | unsigned char* newdata = new unsigned char[newlen]; |
686 | unsigned char* pdata = newdata; | 686 | unsigned char* pdata = newdata; |
687 | memcpy(newdata, src, srclen); | 687 | memcpy(newdata, src, srclen); |
688 | newdata += srclen; | 688 | newdata += srclen; |
689 | memcpy(newdata, &sz, sizeof(sz)); | 689 | memcpy(newdata, &sz, sizeof(sz)); |
690 | newdata += sizeof(sz); | 690 | newdata += sizeof(sz); |
691 | #ifdef _WINDOWS | 691 | #ifdef _WINDOWS |
692 | for (it = visited.begin(); it != visited.end(); it++) | 692 | for (it = visited.begin(); it != visited.end(); it++) |
693 | #else | 693 | #else |
694 | for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) | 694 | for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) |
695 | #endif | 695 | #endif |
696 | { | 696 | { |
697 | unsigned long t = *it; | 697 | unsigned long t = *it; |
698 | //qDebug("[%u]", t); | 698 | //qDebug("[%u]", t); |
699 | memcpy(newdata, &t, sizeof(t)); | 699 | memcpy(newdata, &t, sizeof(t)); |
700 | newdata += sizeof(t); | 700 | newdata += sizeof(t); |
701 | } | 701 | } |
702 | m_nav.setSaveData(data, len, pdata, newlen); | 702 | m_nav.setSaveData(data, len, pdata, newlen); |
703 | delete [] pdata; | 703 | delete [] pdata; |
704 | } | 704 | } |
705 | 705 | ||
706 | void CPlucker_base::putSaveData(unsigned char*& src, unsigned short& srclen) | 706 | void CPlucker_base::putSaveData(unsigned char*& src, unsigned short& srclen) |
707 | { | 707 | { |
708 | unsigned short sz; | 708 | unsigned short sz = 0; |
709 | if (srclen >= sizeof(sz)) | 709 | if (srclen >= sizeof(sz)) |
710 | { | 710 | { |
711 | memcpy(&sz, src, sizeof(sz)); | 711 | memcpy(&sz, src, sizeof(sz)); |
712 | src += sizeof(sz); | 712 | src += sizeof(sz); |
713 | srclen -= sizeof(sz); | 713 | srclen -= sizeof(sz); |
714 | } | 714 | } |
715 | for (int i = 0; i < sz; i++) | 715 | for (int i = 0; i < sz; i++) |
716 | { | 716 | { |
717 | unsigned long t; | 717 | unsigned long t; |
718 | if (srclen >= sizeof(t)) | 718 | if (srclen >= sizeof(t)) |
719 | { | 719 | { |
720 | memcpy(&t, src, sizeof(t)); | 720 | memcpy(&t, src, sizeof(t)); |
721 | // qDebug("[%u]", t); | 721 | // qDebug("[%u]", t); |
722 | visited.push_front(t); | 722 | visited.push_front(t); |
723 | src += sizeof(t); | 723 | src += sizeof(t); |
724 | srclen -= sizeof(t); | 724 | srclen -= sizeof(t); |
725 | } | 725 | } |
726 | else | 726 | else |
727 | { | 727 | { |
728 | QMessageBox::warning(NULL, PROGNAME, "File data mismatch\nMight fix itself"); | 728 | QMessageBox::warning(NULL, PROGNAME, "File data mismatch\nMight fix itself"); |
729 | break; | 729 | break; |
730 | } | 730 | } |
731 | } | 731 | } |
732 | m_nav.putSaveData(src, srclen); | 732 | m_nav.putSaveData(src, srclen); |
733 | } | 733 | } |
734 | 734 | ||
735 | int CPlucker_base::OpenFile(const char *src) | 735 | int CPlucker_base::OpenFile(const char *src) |
736 | { | 736 | { |
737 | qDebug("plucker openfile:%s", src); | 737 | qDebug("plucker openfile:%s", src); |
738 | m_lastBreak = 0; | 738 | m_lastBreak = 0; |
739 | if (!Cpdb::openpdbfile(src)) | 739 | if (!Cpdb::openpdbfile(src)) |
740 | { | 740 | { |
741 | return -1; | 741 | return -1; |
742 | } | 742 | } |
743 | 743 | ||
744 | if (!CorrectDecoder()) return -1; | 744 | if (!CorrectDecoder()) return -1; |
745 | 745 | ||
746 | gotorecordnumber(0); | 746 | gotorecordnumber(0); |
747 | fread(&hdr0, 1, 6, fin); | 747 | fread(&hdr0, 1, 6, fin); |
748 | qDebug("Compression type:%u", ntohs(hdr0.version)); | 748 | qDebug("Compression type:%u", ntohs(hdr0.version)); |
749 | 749 | ||
750 | 750 | ||
751 | switch (ntohs(hdr0.version)) | 751 | switch (ntohs(hdr0.version)) |
752 | { | 752 | { |
753 | case 2: | 753 | case 2: |
754 | m_decompress = UnZip; | 754 | m_decompress = UnZip; |
755 | break; | 755 | break; |
756 | case 1: | 756 | case 1: |
757 | m_decompress = UnDoc; | 757 | m_decompress = UnDoc; |
758 | break; | 758 | break; |
759 | #ifdef USENEF | 759 | #ifdef USENEF |
760 | case 3: | 760 | case 3: |
761 | m_decompress = getdecompressor("PluckerDecompress3"); | 761 | m_decompress = getdecompressor("PluckerDecompress3"); |
762 | break; | 762 | break; |
763 | case 4: | 763 | case 4: |
764 | m_decompress = getdecompressor("PluckerDecompress4"); | 764 | m_decompress = getdecompressor("PluckerDecompress4"); |
765 | break; | 765 | break; |
766 | #endif | 766 | #endif |
767 | default: | 767 | default: |
768 | m_decompress = NULL; | 768 | m_decompress = NULL; |
769 | } | 769 | } |
770 | if (m_decompress == NULL) return -1; | 770 | if (m_decompress == NULL) return -1; |
771 | 771 | ||
772 | setbuffersize(); | 772 | setbuffersize(); |
773 | compressedtextbuffer = new UInt8[compressedbuffersize]; | 773 | compressedtextbuffer = new UInt8[compressedbuffersize]; |
774 | expandedtextbuffer = new UInt8[buffersize]; | 774 | expandedtextbuffer = new UInt8[buffersize]; |
775 | 775 | ||
776 | unsigned int nrecs = ntohs(hdr0.nRecords); | 776 | unsigned int nrecs = ntohs(hdr0.nRecords); |
777 | qDebug("Version %u, no. reserved recs %u", ntohs(hdr0.version), nrecs); | 777 | qDebug("Version %u, no. reserved recs %u", ntohs(hdr0.version), nrecs); |
778 | textlength = ntohl(head.sortInfoID); | 778 | textlength = ntohl(head.sortInfoID); |
779 | qDebug("Textlength at startup:%u", textlength); | 779 | qDebug("Textlength at startup:%u", textlength); |
780 | UInt16 homerecid = 1; | 780 | UInt16 homerecid = 1; |
781 | for (unsigned int i = 0; i < nrecs; i++) | 781 | for (unsigned int i = 0; i < nrecs; i++) |
782 | { | 782 | { |
783 | UInt16 id, name; | 783 | UInt16 id, name; |
784 | fread(&name, 1, sizeof(name), fin); | 784 | fread(&name, 1, sizeof(name), fin); |
785 | fread(&id, 1, sizeof(id), fin); | 785 | fread(&id, 1, sizeof(id), fin); |
786 | //qDebug("N:%d, I:%d", ntohs(name), ntohs(id)); | 786 | //qDebug("N:%d, I:%d", ntohs(name), ntohs(id)); |
787 | if (ntohs(name) == 0) homerecid = ntohs(id); | 787 | if (ntohs(name) == 0) homerecid = ntohs(id); |
788 | } | 788 | } |
789 | 789 | ||
790 | textlength = 0; | 790 | textlength = 0; |
791 | for (int recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) | 791 | for (int recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) |
792 | { | 792 | { |
793 | gotorecordnumber(recptr); | 793 | gotorecordnumber(recptr); |
794 | UInt16 thishdr_uid, thishdr_nParagraphs; | 794 | UInt16 thishdr_uid, thishdr_nParagraphs; |
795 | UInt32 thishdr_size; | 795 | UInt32 thishdr_size; |
796 | UInt8 thishdr_type, thishdr_reserved; | 796 | UInt8 thishdr_type, thishdr_reserved; |
797 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 797 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
798 | if (thishdr_uid == homerecid) | 798 | if (thishdr_uid == homerecid) |
799 | { | 799 | { |
800 | m_homepos = textlength; | 800 | m_homepos = textlength; |
801 | break; | 801 | break; |
802 | } | 802 | } |
803 | if (thishdr_type < 2) textlength += thishdr_size; | 803 | if (thishdr_type < 2) textlength += thishdr_size; |
804 | } | 804 | } |
805 | qDebug("Found home"); | 805 | qDebug("Found home"); |
806 | textlength = 0; | 806 | textlength = 0; |
807 | home(); | 807 | home(); |
808 | qDebug("Gone home"); | 808 | qDebug("Gone home"); |
809 | #ifdef LOCALPICTURES | 809 | #ifdef LOCALPICTURES |
810 | if (m_viewer == NULL) | 810 | if (m_viewer == NULL) |
811 | { | 811 | { |
812 | m_viewer = new QScrollView(NULL); | 812 | m_viewer = new QScrollView(NULL); |
813 | m_picture = new QWidget(m_viewer->viewport()); | 813 | m_picture = new QWidget(m_viewer->viewport()); |
814 | m_viewer->addChild(m_picture); | 814 | m_viewer->addChild(m_picture); |
815 | } | 815 | } |
816 | #endif | 816 | #endif |
817 | return 0; | 817 | return 0; |
818 | 818 | ||
819 | } | 819 | } |
820 | 820 | ||
821 | QImage* CPlucker_base::getimg(UInt16 tgt) | 821 | QImage* CPlucker_base::getimg(UInt16 tgt) |
822 | { | 822 | { |
823 | size_t reclen; | 823 | size_t reclen; |
824 | UInt16 thisrec = finduid(tgt); | 824 | UInt16 thisrec = finduid(tgt); |
825 | qDebug("getimg:Found %u from uid:%u", thisrec, tgt); | 825 | qDebug("getimg:Found %u from uid:%u", thisrec, tgt); |
826 | reclen = recordlength(thisrec); | 826 | reclen = recordlength(thisrec); |
827 | gotorecordnumber(thisrec); | 827 | gotorecordnumber(thisrec); |
828 | UInt16 thishdr_uid, thishdr_nParagraphs; | 828 | UInt16 thishdr_uid, thishdr_nParagraphs; |
829 | UInt32 thishdr_size; | 829 | UInt32 thishdr_size; |
830 | UInt8 thishdr_type, thishdr_reserved; | 830 | UInt8 thishdr_type, thishdr_reserved; |
831 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 831 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
832 | if (thishdr_type == 15) | 832 | if (thishdr_type == 15) |
833 | { | 833 | { |
834 | char *buffer = new char[thishdr_size]; | 834 | char *buffer = new char[thishdr_size]; |
835 | fread(buffer, thishdr_size, sizeof(char), fin); | 835 | fread(buffer, thishdr_size, sizeof(char), fin); |
836 | unsigned short tmp; | 836 | unsigned short tmp; |
837 | memcpy(&tmp, buffer, sizeof(tmp)); | 837 | memcpy(&tmp, buffer, sizeof(tmp)); |
838 | unsigned short cols = ntohs(tmp); | 838 | unsigned short cols = ntohs(tmp); |
839 | memcpy(&tmp, buffer+sizeof(tmp), sizeof(tmp)); | 839 | memcpy(&tmp, buffer+sizeof(tmp), sizeof(tmp)); |
840 | unsigned short rows = ntohs(tmp); | 840 | unsigned short rows = ntohs(tmp); |
841 | qDebug("Found a picture of type:%u [%u,%u]", thishdr_type, rows, cols); | 841 | qDebug("Found a picture of type:%u [%u,%u]", thishdr_type, rows, cols); |
842 | QImage*** images; | 842 | QImage*** images; |
843 | images = new QImage**[rows]; | 843 | images = new QImage**[rows]; |
844 | #ifdef _WINDOWS | 844 | #ifdef _WINDOWS |
845 | int i; | 845 | int i; |
846 | for (i = 0; i < rows; i++) | 846 | for (i = 0; i < rows; i++) |
847 | #else | 847 | #else |
848 | for (int i = 0; i < rows; i++) | 848 | for (int i = 0; i < rows; i++) |
849 | #endif | 849 | #endif |
850 | { | 850 | { |
851 | images[i] = new QImage*[cols]; | 851 | images[i] = new QImage*[cols]; |
852 | } | 852 | } |
853 | int height = 0; | 853 | int height = 0; |
854 | int width = 0; | 854 | int width = 0; |
855 | #ifdef _WINDOWS | 855 | #ifdef _WINDOWS |
856 | for (i = 0; i < rows; i++) | 856 | for (i = 0; i < rows; i++) |
857 | #else | 857 | #else |
858 | for (int i = 0; i < rows; i++) | 858 | for (int i = 0; i < rows; i++) |
859 | #endif | 859 | #endif |
860 | { | 860 | { |
861 | width = 0; | 861 | width = 0; |
862 | for (int j = 0; j < cols; j++) | 862 | for (int j = 0; j < cols; j++) |
863 | { | 863 | { |
864 | memcpy(&tmp, buffer+(i*cols+j+2)*sizeof(tmp), sizeof(tmp)); | 864 | memcpy(&tmp, buffer+(i*cols+j+2)*sizeof(tmp), sizeof(tmp)); |
865 | unsigned short uid = ntohs(tmp); | 865 | unsigned short uid = ntohs(tmp); |
866 | images[i][j] = getimg(uid); | 866 | images[i][j] = getimg(uid); |
867 | width += images[i][j]->width(); | 867 | width += images[i][j]->width(); |
868 | } | 868 | } |
869 | height += images[i][0]->height(); | 869 | height += images[i][0]->height(); |
870 | } | 870 | } |
871 | delete [] buffer; | 871 | delete [] buffer; |
872 | QPixmap pm(width, height); | 872 | QPixmap pm(width, height); |
873 | int hoffset = 0; | 873 | int hoffset = 0; |
874 | #ifdef _WINDOWS | 874 | #ifdef _WINDOWS |
875 | for (i = 0; i < rows; i++) | 875 | for (i = 0; i < rows; i++) |
876 | #else | 876 | #else |
877 | for (int i = 0; i < rows; i++) | 877 | for (int i = 0; i < rows; i++) |
878 | #endif | 878 | #endif |
879 | { | 879 | { |
880 | int woffset = 0; | 880 | int woffset = 0; |
881 | int delht = images[i][0]->height(); | 881 | int delht = images[i][0]->height(); |
882 | for (int j = 0; j < cols; j++) | 882 | for (int j = 0; j < cols; j++) |
883 | { | 883 | { |
884 | QPixmap pm2; | 884 | QPixmap pm2; |
885 | pm2.convertFromImage(*(images[i][j])); | 885 | pm2.convertFromImage(*(images[i][j])); |
886 | delete images[i][j]; | 886 | delete images[i][j]; |
887 | bitBlt(&pm, woffset, hoffset, &pm2, 0, 0, pm2.width(), pm2.height()); | 887 | bitBlt(&pm, woffset, hoffset, &pm2, 0, 0, pm2.width(), pm2.height()); |
888 | woffset += pm2.width(); | 888 | woffset += pm2.width(); |
889 | } | 889 | } |
890 | hoffset += delht; | 890 | hoffset += delht; |
891 | } | 891 | } |
892 | #ifdef _WINDOWS | 892 | #ifdef _WINDOWS |
893 | for (i = 0; i < rows; i++) | 893 | for (i = 0; i < rows; i++) |
894 | #else | 894 | #else |
895 | for (int i = 0; i < rows; i++) | 895 | for (int i = 0; i < rows; i++) |
896 | #endif | 896 | #endif |
897 | { | 897 | { |
898 | delete [] images[i]; | 898 | delete [] images[i]; |
899 | } | 899 | } |
900 | delete [] images; | 900 | delete [] images; |
901 | return new QImage(pm.convertToImage()); | 901 | return new QImage(pm.convertToImage()); |
902 | } | 902 | } |
903 | else | 903 | else |
904 | { | 904 | { |
905 | qDebug("Found a picture of type:%u", thishdr_type); | 905 | qDebug("Found a picture of type:%u", thishdr_type); |
906 | reclen -= HeaderSize(); | 906 | reclen -= HeaderSize(); |
907 | 907 | ||
908 | UInt32 imgsize = thishdr_size; | 908 | UInt32 imgsize = thishdr_size; |
909 | UInt8* imgbuffer = new UInt8[imgsize]; | 909 | UInt8* imgbuffer = new UInt8[imgsize]; |
910 | 910 | ||
911 | Expand(reclen, thishdr_type, imgbuffer, imgsize); | 911 | Expand(reclen, thishdr_type, imgbuffer, imgsize); |
912 | 912 | ||
913 | return imagefromdata(imgbuffer, imgsize); | 913 | return imagefromdata(imgbuffer, imgsize); |
914 | } | 914 | } |
915 | } | 915 | } |
916 | 916 | ||
917 | linkType CPlucker_base::hyperlink(unsigned int n, unsigned int offset, QString& wrd, QString&) | 917 | linkType CPlucker_base::hyperlink(unsigned int n, unsigned int offset, QString& wrd, QString&) |
918 | { | 918 | { |
919 | visited.push_front(n); | 919 | visited.push_front(n); |
920 | UInt16 tuid = (n >> 16); | 920 | UInt16 tuid = (n >> 16); |
921 | n &= 0xffff; | 921 | n &= 0xffff; |
922 | char *turl = geturl(tuid); | 922 | char *turl = geturl(tuid); |
923 | if (turl != NULL) | 923 | if (turl != NULL) |
924 | { | 924 | { |
925 | qDebug("URL in PB:%s", turl); | 925 | qDebug("URL in PB:%s", turl); |
926 | wrd = turl; | 926 | wrd = turl; |
927 | delete [] turl; | 927 | delete [] turl; |
928 | } | 928 | } |
929 | else | 929 | else |
930 | { | 930 | { |
931 | wrd.truncate(0); | 931 | wrd.truncate(0); |
932 | } | 932 | } |
933 | qDebug("Hyper: UID:%u, Para:%u, Offset:%u", tuid, n, offset); | 933 | qDebug("Hyper: UID:%u, Para:%u, Offset:%u", tuid, n, offset); |
934 | UInt16 thisrec = 1; | 934 | UInt16 thisrec = 1; |
935 | currentpos = 0; | 935 | currentpos = 0; |
936 | gotorecordnumber(thisrec); | 936 | gotorecordnumber(thisrec); |
937 | UInt16 thishdr_uid, thishdr_nParagraphs; | 937 | UInt16 thishdr_uid, thishdr_nParagraphs; |
938 | UInt32 thishdr_size; | 938 | UInt32 thishdr_size; |
939 | UInt8 thishdr_type, thishdr_reserved; | 939 | UInt8 thishdr_type, thishdr_reserved; |
940 | while (1) | 940 | while (1) |
941 | { | 941 | { |
942 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 942 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
943 | if (tuid == thishdr_uid) break; | 943 | if (tuid == thishdr_uid) break; |
944 | if (thishdr_type < 2) currentpos += thishdr_size; | 944 | if (thishdr_type < 2) currentpos += thishdr_size; |
945 | ////qDebug("hyper-cp:%u", currentpos); | 945 | ////qDebug("hyper-cp:%u", currentpos); |
946 | thisrec++; | 946 | thisrec++; |
947 | if (thisrec >= ntohs(head.recordList.numRecords)) | 947 | if (thisrec >= ntohs(head.recordList.numRecords)) |
948 | { | 948 | { |
949 | if (wrd.isEmpty()) | 949 | if (wrd.isEmpty()) |
950 | { | 950 | { |
951 | QMessageBox::information(NULL, | 951 | QMessageBox::information(NULL, |
952 | QString(PROGNAME), | 952 | QString(PROGNAME), |
953 | QString("Couldn't find link") | 953 | QString("Couldn't find link") |
954 | ); | 954 | ); |
955 | } | 955 | } |
956 | else | 956 | else |
957 | { | 957 | { |
958 | #ifdef USEQPE | 958 | #ifdef USEQPE |
959 | if (wrd.length() > 10) | 959 | if (wrd.length() > 10) |
960 | { | 960 | { |
961 | Global::statusMessage(wrd.left(8) + ".."); | 961 | Global::statusMessage(wrd.left(8) + ".."); |
962 | } | 962 | } |
963 | else | 963 | else |
964 | { | 964 | { |
965 | Global::statusMessage(wrd); | 965 | Global::statusMessage(wrd); |
966 | } | 966 | } |
967 | #else | 967 | #else |
968 | #endif /* USEQPE */ | 968 | #endif /* USEQPE */ |
969 | //qDebug("Link:%s", (const char*)wrd); | 969 | //qDebug("Link:%s", (const char*)wrd); |
970 | // setlink(fn, wrd); | 970 | // setlink(fn, wrd); |
971 | } | 971 | } |
972 | return eNone; | 972 | return eNone; |
973 | } | 973 | } |
974 | gotorecordnumber(thisrec); | 974 | gotorecordnumber(thisrec); |
975 | } | 975 | } |
976 | if (thishdr_type > 1) | 976 | if (thishdr_type > 1) |
977 | { | 977 | { |
978 | if (thishdr_type == 4) | 978 | if (thishdr_type == 4) |
979 | { | 979 | { |
980 | QMessageBox::information(NULL, | 980 | QMessageBox::information(NULL, |
981 | QString(PROGNAME), | 981 | QString(PROGNAME), |
982 | QString("Mailto links\nnot yet supported (2)")); | 982 | QString("Mailto links\nnot yet supported (2)")); |
983 | } | 983 | } |
984 | else | 984 | else |
985 | { | 985 | { |
986 | if (thishdr_type > 3 && thishdr_type != 15) | 986 | if (thishdr_type > 3 && thishdr_type != 15) |
987 | { | 987 | { |
988 | QMessageBox::information(NULL, | 988 | QMessageBox::information(NULL, |
989 | QString(PROGNAME), | 989 | QString(PROGNAME), |
990 | QString("External links\nnot yet supported (2)") | 990 | QString("External links\nnot yet supported (2)") |
991 | ); | 991 | ); |
992 | return eNone; | 992 | return eNone; |
993 | } | 993 | } |
994 | else | 994 | else |
995 | { | 995 | { |
996 | #ifdef LOCALPICTURES | 996 | #ifdef LOCALPICTURES |
997 | showimg(tuid); | 997 | showimg(tuid); |
998 | #else | 998 | #else |
999 | return ePicture; | 999 | return ePicture; |
1000 | #endif | 1000 | #endif |
1001 | } | 1001 | } |
1002 | } | 1002 | } |
1003 | return eNone; | 1003 | return eNone; |
1004 | } | 1004 | } |
1005 | /* | 1005 | /* |
1006 | if (thishdr_type == 2 || thishdr_type == 3) | 1006 | if (thishdr_type == 2 || thishdr_type == 3) |
1007 | { | 1007 | { |
1008 | expandimg(thisrec); | 1008 | expandimg(thisrec); |
1009 | 1009 | ||
1010 | } | 1010 | } |
1011 | */ | 1011 | */ |
1012 | else | 1012 | else |
1013 | { | 1013 | { |
1014 | expand(thisrec); | 1014 | expand(thisrec); |
1015 | unsigned int paraoffset = offset; | 1015 | unsigned int paraoffset = offset; |
1016 | // unsigned int noff = 0; | 1016 | // unsigned int noff = 0; |
1017 | if (n != 0) | 1017 | if (n != 0) |
1018 | { | 1018 | { |
1019 | if (n >= m_nParas) | 1019 | if (n >= m_nParas) |
1020 | { | 1020 | { |
1021 | QMessageBox::information(NULL, | 1021 | QMessageBox::information(NULL, |
1022 | QString(PROGNAME), | 1022 | QString(PROGNAME), |
1023 | QString("Error in link\nPara # too big") | 1023 | QString("Error in link\nPara # too big") |
1024 | ); | 1024 | ); |
1025 | return eNone; | 1025 | return eNone; |
1026 | } | 1026 | } |
1027 | unsigned int noff = 0; | 1027 | unsigned int noff = 0; |
1028 | for (unsigned int i = 0; i < n; i++) noff += m_ParaOffsets[i]; | 1028 | for (unsigned int i = 0; i < n; i++) noff += m_ParaOffsets[i]; |
1029 | 1029 | ||
1030 | paraoffset += noff; | 1030 | paraoffset += noff; |
1031 | } | 1031 | } |
1032 | if (paraoffset > thishdr_size) | 1032 | if (paraoffset > thishdr_size) |
1033 | { | 1033 | { |
1034 | QMessageBox::information(NULL, | 1034 | QMessageBox::information(NULL, |
1035 | QString(PROGNAME), | 1035 | QString(PROGNAME), |
1036 | QString("Error in link\nOffset too big") | 1036 | QString("Error in link\nOffset too big") |
1037 | ); | 1037 | ); |
1038 | return eNone; | 1038 | return eNone; |
1039 | } | 1039 | } |
1040 | while (bufferpos < paraoffset && bufferpos < buffercontent) getch_base(true); | 1040 | while (bufferpos < paraoffset && bufferpos < buffercontent) getch_base(true); |
1041 | //qDebug("Hyper:<%u,%u,%u>", paraoffset, bufferpos, currentpos); | 1041 | //qDebug("Hyper:<%u,%u,%u>", paraoffset, bufferpos, currentpos); |
1042 | /* // This is faster but the alignment doesn't get set | 1042 | /* // This is faster but the alignment doesn't get set |
1043 | mystyle.unset(); | 1043 | mystyle.unset(); |
1044 | bufferpos = n; | 1044 | bufferpos = n; |
1045 | currentpos += n; | 1045 | currentpos += n; |
1046 | while (bufferpos >= m_nextPara && m_nextPara >= 0) | 1046 | while (bufferpos >= m_nextPara && m_nextPara >= 0) |
1047 | { | 1047 | { |
1048 | UInt16 attr = m_ParaAttrs[m_nextParaIndex]; | 1048 | UInt16 attr = m_ParaAttrs[m_nextParaIndex]; |
1049 | m_nextParaIndex++; | 1049 | m_nextParaIndex++; |
1050 | if (m_nextParaIndex == m_nParas) | 1050 | if (m_nextParaIndex == m_nParas) |
1051 | { | 1051 | { |
1052 | m_nextPara = -1; | 1052 | m_nextPara = -1; |
1053 | } | 1053 | } |
1054 | else | 1054 | else |
1055 | { | 1055 | { |
1056 | m_nextPara += m_ParaOffsets[m_nextParaIndex]; | 1056 | m_nextPara += m_ParaOffsets[m_nextParaIndex]; |
1057 | } | 1057 | } |
1058 | } | 1058 | } |
1059 | */ | 1059 | */ |
1060 | } | 1060 | } |
1061 | return eLink; | 1061 | return eLink; |
1062 | } | 1062 | } |
1063 | QString CPlucker_base::getTableAsHtml(unsigned long tgt) | 1063 | QString CPlucker_base::getTableAsHtml(unsigned long tgt) |
1064 | { | 1064 | { |
1065 | qDebug("CPlucker_base::getTableAsHtml:%u", tgt); | 1065 | qDebug("CPlucker_base::getTableAsHtml:%u", tgt); |
1066 | size_t reclen; | 1066 | size_t reclen; |
1067 | UInt16 thisrec = finduid(tgt); | 1067 | UInt16 thisrec = finduid(tgt); |
1068 | qDebug("getimg:Found %u from uid:%u", thisrec, tgt); | 1068 | qDebug("getimg:Found %u from uid:%u", thisrec, tgt); |
1069 | reclen = recordlength(thisrec); | 1069 | reclen = recordlength(thisrec); |
1070 | gotorecordnumber(thisrec); | 1070 | gotorecordnumber(thisrec); |
1071 | UInt16 thishdr_uid, thishdr_nParagraphs; | 1071 | UInt16 thishdr_uid, thishdr_nParagraphs; |
1072 | UInt32 thishdr_size; | 1072 | UInt32 thishdr_size; |
1073 | UInt8 thishdr_type, thishdr_reserved; | 1073 | UInt8 thishdr_type, thishdr_reserved; |
1074 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); | 1074 | GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved); |
1075 | qDebug("Found a table of type:%u", thishdr_type); | 1075 | qDebug("Found a table of type:%u", thishdr_type); |
1076 | reclen -= HeaderSize(); | 1076 | reclen -= HeaderSize(); |
1077 | UInt32 imgsize = thishdr_size; | 1077 | UInt32 imgsize = thishdr_size; |
1078 | UInt8* imgbuffer = new UInt8[imgsize]; | 1078 | UInt8* imgbuffer = new UInt8[imgsize]; |
1079 | Expand(reclen, thishdr_type, imgbuffer, imgsize); | 1079 | Expand(reclen, thishdr_type, imgbuffer, imgsize); |
1080 | 1080 | ||
1081 | QString ret; | 1081 | QString ret; |
1082 | 1082 | ||
1083 | UInt16 size, columns, rows; | 1083 | UInt16 size, columns, rows; |
1084 | UInt8 depth, border; | 1084 | UInt8 depth, border; |
1085 | UInt32 borderColour, linkColour; | 1085 | UInt32 borderColour, linkColour; |
1086 | UInt8* dp(imgbuffer); | 1086 | UInt8* dp(imgbuffer); |
1087 | 1087 | ||
1088 | memcpy(&size, dp, sizeof(size)); | 1088 | memcpy(&size, dp, sizeof(size)); |
1089 | size = ntohs(size); | 1089 | size = ntohs(size); |
1090 | dp += sizeof(size); | 1090 | dp += sizeof(size); |
1091 | memcpy(&columns, dp, sizeof(columns)); | 1091 | memcpy(&columns, dp, sizeof(columns)); |
1092 | columns = ntohs(columns); | 1092 | columns = ntohs(columns); |
1093 | dp += sizeof(columns); | 1093 | dp += sizeof(columns); |
1094 | memcpy(&rows, dp, sizeof(rows)); | 1094 | memcpy(&rows, dp, sizeof(rows)); |
1095 | rows = ntohs(rows); | 1095 | rows = ntohs(rows); |
1096 | dp += sizeof(rows); | 1096 | dp += sizeof(rows); |
1097 | qDebug("Rows:%u Cols:%u", rows, columns); | 1097 | qDebug("Rows:%u Cols:%u", rows, columns); |
1098 | 1098 | ||
1099 | memcpy(&depth, dp, sizeof(depth)); | 1099 | memcpy(&depth, dp, sizeof(depth)); |
1100 | dp += sizeof(depth); | 1100 | dp += sizeof(depth); |
1101 | memcpy(&border, dp, sizeof(border)); | 1101 | memcpy(&border, dp, sizeof(border)); |
1102 | dp += sizeof(border); | 1102 | dp += sizeof(border); |
1103 | 1103 | ||
1104 | qDebug("Depth:%u, Border:%u", depth, border); | 1104 | qDebug("Depth:%u, Border:%u", depth, border); |
1105 | 1105 | ||
1106 | memcpy(&borderColour, dp, sizeof(borderColour)); | 1106 | memcpy(&borderColour, dp, sizeof(borderColour)); |
1107 | dp += sizeof(borderColour); | 1107 | dp += sizeof(borderColour); |
1108 | memcpy(&linkColour, dp, sizeof(linkColour)); | 1108 | memcpy(&linkColour, dp, sizeof(linkColour)); |
1109 | dp += sizeof(linkColour); | 1109 | dp += sizeof(linkColour); |
1110 | 1110 | ||
1111 | qDebug("Colours: border:%x, link:%x", borderColour, linkColour); | 1111 | qDebug("Colours: border:%x, link:%x", borderColour, linkColour); |
1112 | 1112 | ||
1113 | if (border) | 1113 | if (border) |
1114 | { | 1114 | { |
1115 | ret = "<table border>"; | 1115 | ret = "<table border>"; |
1116 | } | 1116 | } |
1117 | else | 1117 | else |
1118 | { | 1118 | { |
1119 | ret = "<table>"; | 1119 | ret = "<table>"; |
1120 | } | 1120 | } |
1121 | bool firstrow = true; | 1121 | bool firstrow = true; |
1122 | bool firstcol = true; | 1122 | bool firstcol = true; |
1123 | while (dp < imgbuffer+imgsize) | 1123 | while (dp < imgbuffer+imgsize) |
1124 | { | 1124 | { |
1125 | UInt8 ch = *dp++; | 1125 | UInt8 ch = *dp++; |
1126 | if (ch == 0x00) | 1126 | if (ch == 0x00) |
1127 | { | 1127 | { |
1128 | ch = *dp++; | 1128 | ch = *dp++; |
1129 | if (ch == 0x90) | 1129 | if (ch == 0x90) |
1130 | { | 1130 | { |
1131 | if (firstrow) | 1131 | if (firstrow) |
1132 | { | 1132 | { |
1133 | ret += "<tr>"; | 1133 | ret += "<tr>"; |
1134 | firstrow = false; | 1134 | firstrow = false; |
1135 | firstcol = true; | 1135 | firstcol = true; |
1136 | } | 1136 | } |
1137 | else | 1137 | else |
1138 | { | 1138 | { |
1139 | ret += "</tr><tr>"; | 1139 | ret += "</tr><tr>"; |
1140 | } | 1140 | } |
1141 | } | 1141 | } |
1142 | else if (ch == 0x97) | 1142 | else if (ch == 0x97) |
1143 | { | 1143 | { |
1144 | if (firstcol) | 1144 | if (firstcol) |
1145 | { | 1145 | { |
1146 | ret += "<td"; | 1146 | ret += "<td"; |
1147 | firstcol = false; | 1147 | firstcol = false; |
1148 | } | 1148 | } |
1149 | else | 1149 | else |
1150 | { | 1150 | { |
1151 | ret += "</td><td"; | 1151 | ret += "</td><td"; |
1152 | } | 1152 | } |
1153 | UInt8 align; | 1153 | UInt8 align; |
1154 | UInt16 imgid; | 1154 | UInt16 imgid; |
1155 | UInt8 cols, rows; | 1155 | UInt8 cols, rows; |
1156 | UInt16 len; | 1156 | UInt16 len; |
1157 | memcpy(&align, dp, sizeof(align)); | 1157 | memcpy(&align, dp, sizeof(align)); |
1158 | dp += sizeof(align); | 1158 | dp += sizeof(align); |
1159 | memcpy(&imgid, dp, sizeof(imgid)); | 1159 | memcpy(&imgid, dp, sizeof(imgid)); |
1160 | dp += sizeof(imgid); | 1160 | dp += sizeof(imgid); |
1161 | imgid = ntohs(imgid); | 1161 | imgid = ntohs(imgid); |
1162 | memcpy(&cols, dp, sizeof(cols)); | 1162 | memcpy(&cols, dp, sizeof(cols)); |
1163 | dp += sizeof(cols); | 1163 | dp += sizeof(cols); |
1164 | memcpy(&rows, dp, sizeof(rows)); | 1164 | memcpy(&rows, dp, sizeof(rows)); |
1165 | dp += sizeof(rows); | 1165 | dp += sizeof(rows); |
1166 | memcpy(&len, dp, sizeof(len)); | 1166 | memcpy(&len, dp, sizeof(len)); |
1167 | dp += sizeof(len); | 1167 | dp += sizeof(len); |
1168 | len = ntohs(len); | 1168 | len = ntohs(len); |
1169 | switch (align) | 1169 | switch (align) |
1170 | { | 1170 | { |
1171 | case 1: | 1171 | case 1: |
1172 | ret += " align=right"; | 1172 | ret += " align=right"; |
1173 | break; | 1173 | break; |
1174 | case 2: | 1174 | case 2: |
1175 | ret += " align=center"; | 1175 | ret += " align=center"; |
1176 | break; | 1176 | break; |
1177 | case 3: | 1177 | case 3: |
1178 | ret += " align=justify"; | 1178 | ret += " align=justify"; |
1179 | break; | 1179 | break; |
1180 | case 0: | 1180 | case 0: |
1181 | break; | 1181 | break; |
1182 | default: | 1182 | default: |
1183 | qDebug("Unknown table cell alignment:%u", align); | 1183 | qDebug("Unknown table cell alignment:%u", align); |
1184 | } | 1184 | } |
1185 | if (cols != 1) | 1185 | if (cols != 1) |
1186 | { | 1186 | { |
1187 | QString num; | 1187 | QString num; |
1188 | num.setNum(cols); | 1188 | num.setNum(cols); |
1189 | ret += " colspan="; | 1189 | ret += " colspan="; |
1190 | ret += num; | 1190 | ret += num; |
1191 | } | 1191 | } |
1192 | if (rows != 1) | 1192 | if (rows != 1) |
1193 | { | 1193 | { |
1194 | QString num; | 1194 | QString num; |
1195 | num.setNum(rows); | 1195 | num.setNum(rows); |
1196 | ret += " rowspan="; | 1196 | ret += " rowspan="; |
1197 | ret += num; | 1197 | ret += num; |
1198 | } | 1198 | } |
1199 | ret += ">"; | 1199 | ret += ">"; |
1200 | } | 1200 | } |
1201 | else | 1201 | else |
1202 | { | 1202 | { |
1203 | dp += (ch & 7); | 1203 | dp += (ch & 7); |
1204 | } | 1204 | } |
1205 | } | 1205 | } |
1206 | else | 1206 | else |
1207 | { | 1207 | { |
1208 | ret += QChar(ch); | 1208 | ret += QChar(ch); |
1209 | } | 1209 | } |
1210 | } | 1210 | } |
1211 | 1211 | ||
1212 | ret += "</td></tr></table>"; | 1212 | ret += "</td></tr></table>"; |
1213 | delete [] imgbuffer; | 1213 | delete [] imgbuffer; |
1214 | return ret; | 1214 | return ret; |
1215 | } | 1215 | } |
1216 | 1216 | ||
1217 | tchar CPlucker_base::getch_base(bool fast) | 1217 | tchar CPlucker_base::getch_base(bool fast) |
1218 | { | 1218 | { |
1219 | mystyle.setTable(0xffffffff); | 1219 | mystyle.setTable(0xffffffff); |
1220 | int ch = bgetch(); | 1220 | int ch = bgetch(); |
1221 | while (ch == 0) | 1221 | while (ch == 0) |
1222 | { | 1222 | { |
1223 | ch = bgetch(); | 1223 | ch = bgetch(); |
1224 | ////qDebug("Function:%x", ch); | 1224 | ////qDebug("Function:%x", ch); |
1225 | switch (ch) | 1225 | switch (ch) |
1226 | { | 1226 | { |
1227 | case 0x38: | 1227 | case 0x38: |
1228 | // //qDebug("Break:%u", locate()); | 1228 | // //qDebug("Break:%u", locate()); |
1229 | if (m_lastBreak == locate()) | 1229 | if (m_lastBreak == locate()) |
1230 | { | 1230 | { |
1231 | ch = bgetch(); | 1231 | ch = bgetch(); |
1232 | } | 1232 | } |
1233 | else | 1233 | else |
1234 | { | 1234 | { |
1235 | ch = 10; | 1235 | ch = 10; |
1236 | } | 1236 | } |
1237 | m_lastBreak = locate(); | 1237 | m_lastBreak = locate(); |
1238 | break; | 1238 | break; |
1239 | case 0x0a: | 1239 | case 0x0a: |
1240 | case 0x0c: | 1240 | case 0x0c: |
1241 | { | 1241 | { |
1242 | unsigned long ln = 0; | 1242 | unsigned long ln = 0; |
1243 | int skip = ch & 7; | 1243 | int skip = ch & 7; |
1244 | for (int i = 0; i < 2; i++) | 1244 | for (int i = 0; i < 2; i++) |
1245 | { | 1245 | { |
1246 | int ch = bgetch(); | 1246 | int ch = bgetch(); |
1247 | ln = (ln << 8) + ch; | 1247 | ln = (ln << 8) + ch; |
1248 | // //qDebug("ch:%d, ln:%u", ch, ln); | 1248 | // //qDebug("ch:%d, ln:%u", ch, ln); |
1249 | } | 1249 | } |
1250 | if (skip == 2) | 1250 | if (skip == 2) |
1251 | { | 1251 | { |
1252 | ln <<= 16; | 1252 | ln <<= 16; |
1253 | } | 1253 | } |
1254 | else | 1254 | else |
1255 | { | 1255 | { |
1256 | for (int i = 0; i < 2; i++) | 1256 | for (int i = 0; i < 2; i++) |
1257 | { | 1257 | { |
1258 | int ch = bgetch(); | 1258 | int ch = bgetch(); |
1259 | ln = (ln << 8) + ch; | 1259 | ln = (ln << 8) + ch; |
1260 | // //qDebug("ch:%d, ln:%u", ch, ln); | 1260 | // //qDebug("ch:%d, ln:%u", ch, ln); |
1261 | } | 1261 | } |
1262 | } | 1262 | } |
1263 | // //qDebug("ln:%u", ln); | 1263 | // //qDebug("ln:%u", ln); |
1264 | mystyle.setLink(true); | 1264 | mystyle.setLink(true); |
1265 | mystyle.setData(ln); | 1265 | mystyle.setData(ln); |
1266 | // mystyle.setColour(255, 0, 0); | 1266 | // mystyle.setColour(255, 0, 0); |
1267 | bool hasseen = false; | 1267 | bool hasseen = false; |
1268 | for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) | 1268 | for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) |
1269 | { | 1269 | { |
1270 | if (*it == ln) | 1270 | if (*it == ln) |
1271 | { | 1271 | { |
1272 | hasseen = true; | 1272 | hasseen = true; |
1273 | break; | 1273 | break; |
1274 | } | 1274 | } |
1275 | } | 1275 | } |
1276 | if (hasseen) | 1276 | if (hasseen) |
1277 | { | 1277 | { |
1278 | mystyle.setStrikethru(); | 1278 | mystyle.setStrikethru(); |
1279 | } | 1279 | } |
1280 | mystyle.setOffset(m_offset); | 1280 | mystyle.setOffset(m_offset); |
1281 | m_offset = 0; | 1281 | m_offset = 0; |
1282 | ch = bgetch(); | 1282 | ch = bgetch(); |
1283 | } | 1283 | } |
1284 | break; | 1284 | break; |
1285 | case 0x08: | 1285 | case 0x08: |
1286 | ch = bgetch(); | 1286 | ch = bgetch(); |
1287 | // mystyle.setColour(0, 0, 0); | 1287 | // mystyle.setColour(0, 0, 0); |
1288 | mystyle.unsetUnderline(); | 1288 | mystyle.unsetUnderline(); |
1289 | mystyle.unsetStrikethru(); | 1289 | mystyle.unsetStrikethru(); |
1290 | mystyle.setLink(false); | 1290 | mystyle.setLink(false); |
1291 | mystyle.setData(0); | 1291 | mystyle.setData(0); |
1292 | break; | 1292 | break; |
1293 | case 0x40: | 1293 | case 0x40: |
1294 | mystyle.setItalic(); | 1294 | mystyle.setItalic(); |
1295 | ch = bgetch(); | 1295 | ch = bgetch(); |
1296 | break; | 1296 | break; |
1297 | case 0x48: | 1297 | case 0x48: |
1298 | mystyle.unsetItalic(); | 1298 | mystyle.unsetItalic(); |
1299 | ch = bgetch(); | 1299 | ch = bgetch(); |
1300 | break; | 1300 | break; |
1301 | case 0x11: | 1301 | case 0x11: |
1302 | { | 1302 | { |
1303 | ch = bgetch(); | 1303 | ch = bgetch(); |
1304 | // //qDebug("Font:%d",ch); | 1304 | // //qDebug("Font:%d",ch); |
1305 | mystyle.setVOffset(0); | 1305 | mystyle.setVOffset(0); |
1306 | mystyle.unsetMono(); | 1306 | mystyle.unsetMono(); |
1307 | mystyle.unsetBold(); | 1307 | mystyle.unsetBold(); |
1308 | switch (ch) | 1308 | switch (ch) |
1309 | { | 1309 | { |
1310 | case 0: | 1310 | case 0: |
1311 | mystyle.setFontSize(0); | 1311 | mystyle.setFontSize(0); |
1312 | break; | 1312 | break; |
1313 | case 1: | 1313 | case 1: |
1314 | mystyle.setFontSize(3); | 1314 | mystyle.setFontSize(3); |
1315 | mystyle.setBold(); | 1315 | mystyle.setBold(); |
1316 | break; | 1316 | break; |
1317 | case 2: | 1317 | case 2: |
1318 | mystyle.setFontSize(2); | 1318 | mystyle.setFontSize(2); |
1319 | mystyle.setBold(); | 1319 | mystyle.setBold(); |
1320 | break; | 1320 | break; |
1321 | case 3: | 1321 | case 3: |
1322 | mystyle.setFontSize(1); | 1322 | mystyle.setFontSize(1); |
1323 | mystyle.setBold(); | 1323 | mystyle.setBold(); |
1324 | break; | 1324 | break; |
1325 | case 4: | 1325 | case 4: |
1326 | mystyle.setFontSize(0); | 1326 | mystyle.setFontSize(0); |
1327 | mystyle.setBold(); | 1327 | mystyle.setBold(); |
1328 | break; | 1328 | break; |
1329 | case 5: | 1329 | case 5: |
1330 | mystyle.setFontSize(0); | 1330 | mystyle.setFontSize(0); |
1331 | mystyle.setBold(); | 1331 | mystyle.setBold(); |
1332 | break; | 1332 | break; |
1333 | case 6: | 1333 | case 6: |
1334 | mystyle.setFontSize(0); | 1334 | mystyle.setFontSize(0); |
1335 | mystyle.setBold(); | 1335 | mystyle.setBold(); |
1336 | break; | 1336 | break; |
1337 | case 7: | 1337 | case 7: |
1338 | mystyle.setFontSize(0); | 1338 | mystyle.setFontSize(0); |
1339 | mystyle.setBold(); | 1339 | mystyle.setBold(); |
1340 | break; | 1340 | break; |
1341 | case 8: // should be fixed width | 1341 | case 8: // should be fixed width |
1342 | //qDebug("Trying fixed width"); | 1342 | //qDebug("Trying fixed width"); |
1343 | mystyle.setFontSize(0); | 1343 | mystyle.setFontSize(0); |
1344 | mystyle.setMono(); | 1344 | mystyle.setMono(); |
1345 | break; | 1345 | break; |
1346 | case 9: | 1346 | case 9: |
1347 | // mystyle.setFontSize(mystyle.getFontSize()); | 1347 | // mystyle.setFontSize(mystyle.getFontSize()); |
1348 | mystyle.setFontSize(-1); | 1348 | mystyle.setFontSize(-1); |
1349 | break; | 1349 | break; |
1350 | case 10: | 1350 | case 10: |
1351 | mystyle.setFontSize(-2); | 1351 | mystyle.setFontSize(-2); |
1352 | mystyle.setVOffset(1); | 1352 | mystyle.setVOffset(1); |
1353 | break; | 1353 | break; |
1354 | case 11: | 1354 | case 11: |
1355 | mystyle.setFontSize(-2); | 1355 | mystyle.setFontSize(-2); |
1356 | mystyle.setVOffset(-1); | 1356 | mystyle.setVOffset(-1); |
1357 | break; | 1357 | break; |
1358 | default: | 1358 | default: |
1359 | qDebug("Unrecognised font"); | 1359 | qDebug("Unrecognised font"); |
1360 | break; | 1360 | break; |
1361 | } | 1361 | } |
1362 | ch = bgetch(); | 1362 | ch = bgetch(); |
1363 | } | 1363 | } |
1364 | break; | 1364 | break; |
1365 | case 0x29: | 1365 | case 0x29: |
1366 | ch = bgetch(); | 1366 | ch = bgetch(); |
1367 | switch (ch) | 1367 | switch (ch) |
1368 | { | 1368 | { |
1369 | case 0: | 1369 | case 0: |
1370 | mystyle.setLeftJustify(); | 1370 | mystyle.setLeftJustify(); |
1371 | // //qDebug("left"); | 1371 | // //qDebug("left"); |
1372 | break; | 1372 | break; |
1373 | case 1: | 1373 | case 1: |
1374 | mystyle.setRightJustify(); | 1374 | mystyle.setRightJustify(); |
1375 | // //qDebug("right"); | 1375 | // //qDebug("right"); |
1376 | break; | 1376 | break; |
1377 | case 2: | 1377 | case 2: |
1378 | mystyle.setCentreJustify(); | 1378 | mystyle.setCentreJustify(); |
1379 | // //qDebug("centre"); | 1379 | // //qDebug("centre"); |
1380 | break; | 1380 | break; |
1381 | case 3: | 1381 | case 3: |
1382 | mystyle.setFullJustify(); | 1382 | mystyle.setFullJustify(); |
1383 | // //qDebug("full"); | 1383 | // //qDebug("full"); |
1384 | break; | 1384 | break; |
1385 | 1385 | ||
1386 | } | 1386 | } |
1387 | ch = bgetch(); | 1387 | ch = bgetch(); |
1388 | break; | 1388 | break; |
1389 | case 0x53: | 1389 | case 0x53: |
1390 | { | 1390 | { |
1391 | int r = bgetch(); | 1391 | int r = bgetch(); |
1392 | int g = bgetch(); | 1392 | int g = bgetch(); |
1393 | int b = bgetch(); | 1393 | int b = bgetch(); |
1394 | mystyle.setColour(r,g,b); | 1394 | mystyle.setColour(r,g,b); |
1395 | ch = bgetch(); | 1395 | ch = bgetch(); |
1396 | } | 1396 | } |
1397 | break; | 1397 | break; |
1398 | case 0x1a: | 1398 | case 0x1a: |
1399 | case 0x5c: | 1399 | case 0x5c: |
1400 | { | 1400 | { |
1401 | bool hasalternate = (ch == 0x5c); | 1401 | bool hasalternate = (ch == 0x5c); |
1402 | UInt16 ir = bgetch(); | 1402 | UInt16 ir = bgetch(); |
1403 | ir = (ir << 8) + bgetch(); | 1403 | ir = (ir << 8) + bgetch(); |
1404 | if (hasalternate) | 1404 | if (hasalternate) |
1405 | { | 1405 | { |
1406 | //qDebug("Alternate image:%x", ir); | 1406 | //qDebug("Alternate image:%x", ir); |
1407 | UInt16 ir2 = bgetch(); | 1407 | UInt16 ir2 = bgetch(); |
1408 | ir2 = (ir2 << 8) + bgetch(); | 1408 | ir2 = (ir2 << 8) + bgetch(); |
1409 | if (!fast) mystyle.setPicture(true, expandimg(ir2, true), true, ir << 16); | 1409 | if (!fast) mystyle.setPicture(true, expandimg(ir2, true), true, ir << 16); |
1410 | #ifdef LOCALPICTURES | 1410 | #ifdef LOCALPICTURES |
1411 | UInt32 ln = ir; | 1411 | UInt32 ln = ir; |
1412 | ln <<= 16; | 1412 | ln <<= 16; |
1413 | mystyle.setLink(true); | 1413 | mystyle.setLink(true); |
1414 | mystyle.setData(ln); | 1414 | mystyle.setData(ln); |
1415 | #endif | 1415 | #endif |
1416 | } | 1416 | } |
1417 | else | 1417 | else |
1418 | { | 1418 | { |
1419 | if (!fast) mystyle.setPicture(true, expandimg(ir)); | 1419 | if (!fast) mystyle.setPicture(true, expandimg(ir)); |
1420 | } | 1420 | } |
1421 | // if (mystyle.getLink()) qDebug("Picture link!"); | 1421 | // if (mystyle.getLink()) qDebug("Picture link!"); |
1422 | ch = '#'; | 1422 | ch = '#'; |
1423 | } | 1423 | } |
1424 | // ch = bgetch(); | 1424 | // ch = bgetch(); |
1425 | break; | 1425 | break; |
1426 | case 0x33: | 1426 | case 0x33: |
1427 | { | 1427 | { |
1428 | UInt8 h = bgetch(); | 1428 | UInt8 h = bgetch(); |
1429 | UInt8 wc = bgetch(); | 1429 | UInt8 wc = bgetch(); |
1430 | UInt8 pc = bgetch(); | 1430 | UInt8 pc = bgetch(); |
1431 | UInt16 w = wc; | 1431 | UInt16 w = wc; |
1432 | // //qDebug("h,w,pc [%u, %u, %u]", h, w, pc); | 1432 | // //qDebug("h,w,pc [%u, %u, %u]", h, w, pc); |
1433 | if (w == 0) | 1433 | if (w == 0) |
1434 | { | 1434 | { |
1435 | w = (m_scrWidth*(unsigned long)pc)/100; | 1435 | w = (m_scrWidth*(unsigned long)pc)/100; |
1436 | } | 1436 | } |
1437 | if (w == 0) w = m_scrWidth; | 1437 | if (w == 0) w = m_scrWidth; |
1438 | mystyle.setPicture(false, hRule(w,h,mystyle.Red(),mystyle.Green(),mystyle.Blue())); | 1438 | mystyle.setPicture(false, hRule(w,h,mystyle.Red(),mystyle.Green(),mystyle.Blue())); |
1439 | // if (mystyle.getLink()) //qDebug("hRule link!"); | 1439 | // if (mystyle.getLink()) //qDebug("hRule link!"); |
1440 | ch = '#'; | 1440 | ch = '#'; |
1441 | } | 1441 | } |
1442 | break; | 1442 | break; |
1443 | case 0x60: | 1443 | case 0x60: |
1444 | mystyle.setUnderline(); | 1444 | mystyle.setUnderline(); |
1445 | ch = bgetch(); | 1445 | ch = bgetch(); |
1446 | break; | 1446 | break; |
1447 | case 0x68: | 1447 | case 0x68: |
1448 | mystyle.unsetUnderline(); | 1448 | mystyle.unsetUnderline(); |
1449 | ch = bgetch(); | 1449 | ch = bgetch(); |
1450 | break; | 1450 | break; |
1451 | case 0x22: | 1451 | case 0x22: |
1452 | ch = bgetch(); | 1452 | ch = bgetch(); |
1453 | mystyle.setLeftMargin(ch); | 1453 | mystyle.setLeftMargin(ch); |
1454 | // //qDebug("Left margin:%d", ch); | 1454 | // //qDebug("Left margin:%d", ch); |
1455 | ch = bgetch(); | 1455 | ch = bgetch(); |
1456 | mystyle.setRightMargin(ch); | 1456 | mystyle.setRightMargin(ch); |
1457 | // //qDebug("Right margin:%d", ch); | 1457 | // //qDebug("Right margin:%d", ch); |
1458 | ch = bgetch(); | 1458 | ch = bgetch(); |
1459 | break; | 1459 | break; |
1460 | case 0x70: | 1460 | case 0x70: |
1461 | mystyle.setStrikethru(); | 1461 | mystyle.setStrikethru(); |
1462 | ch = bgetch(); | 1462 | ch = bgetch(); |
1463 | break; | 1463 | break; |
1464 | case 0x78: | 1464 | case 0x78: |
1465 | mystyle.unsetStrikethru(); | 1465 | mystyle.unsetStrikethru(); |
1466 | ch = bgetch(); | 1466 | ch = bgetch(); |
1467 | break; | 1467 | break; |
1468 | case 0x83: | 1468 | case 0x83: |
1469 | { | 1469 | { |
1470 | int tlen = bgetch(); | 1470 | int tlen = bgetch(); |
1471 | ch = bgetch(); | 1471 | ch = bgetch(); |
1472 | ch <<= 8; | 1472 | ch <<= 8; |
1473 | ch |= (tchar)bgetch(); | 1473 | ch |= (tchar)bgetch(); |
1474 | for (int i = 0; i < tlen; i++) bgetch(); | 1474 | for (int i = 0; i < tlen; i++) bgetch(); |
1475 | //qDebug("Function 83"); | 1475 | //qDebug("Function 83"); |
1476 | } | 1476 | } |
1477 | break; | 1477 | break; |
1478 | case 0x9a: | 1478 | case 0x9a: |
1479 | { | 1479 | { |
1480 | m_offset = 255*bgetch(); | 1480 | m_offset = 255*bgetch(); |
1481 | m_offset += bgetch(); | 1481 | m_offset += bgetch(); |
1482 | qDebug("Found offset:%u", m_offset); | 1482 | qDebug("Found offset:%u", m_offset); |
1483 | ch = bgetch(); | 1483 | ch = bgetch(); |
1484 | } | 1484 | } |
1485 | break; | 1485 | break; |
1486 | case 0x92: | 1486 | case 0x92: |
1487 | { | 1487 | { |
1488 | ch = bgetch(); | 1488 | ch = bgetch(); |
1489 | ch <<= 8; | 1489 | ch <<= 8; |
1490 | ch |= (tchar)bgetch(); | 1490 | ch |= (tchar)bgetch(); |
1491 | mystyle.setTable(ch); | 1491 | mystyle.setTable(ch); |
1492 | ch = 0x16e5; | 1492 | ch = 0x16e5; |
1493 | } | 1493 | } |
1494 | break; | 1494 | break; |
1495 | case 0x85: | 1495 | case 0x85: |
1496 | default: | 1496 | default: |
1497 | qDebug("Function:%x NOT IMPLEMENTED", ch); | 1497 | qDebug("Function:%x NOT IMPLEMENTED", ch); |
1498 | { | 1498 | { |
1499 | int skip = ch & 7; | 1499 | int skip = ch & 7; |
1500 | for (int i = 0; i < skip; i++) | 1500 | for (int i = 0; i < skip; i++) |
1501 | { | 1501 | { |
1502 | ch = bgetch(); | 1502 | ch = bgetch(); |
1503 | //qDebug("Arg %d, %d", i, ch); | 1503 | //qDebug("Arg %d, %d", i, ch); |
1504 | } | 1504 | } |
1505 | ch = bgetch(); | 1505 | ch = bgetch(); |
1506 | } | 1506 | } |
1507 | } | 1507 | } |
1508 | } | 1508 | } |
1509 | 1509 | ||
1510 | if (m_lastIsBreak && !mystyle.isMono()) | 1510 | if (m_lastIsBreak && !mystyle.isMono()) |
1511 | { | 1511 | { |
1512 | while (ch == ' ') | 1512 | while (ch == ' ') |
1513 | { | 1513 | { |
1514 | ch = getch(false); | 1514 | ch = getch(false); |
1515 | } | 1515 | } |
1516 | } | 1516 | } |
1517 | 1517 | ||
1518 | m_lastIsBreak = (ch == 10); | 1518 | m_lastIsBreak = (ch == 10); |
1519 | 1519 | ||
1520 | return (ch == EOF) ? UEOF : ch; | 1520 | return (ch == EOF) ? UEOF : ch; |
1521 | } | 1521 | } |
1522 | 1522 | ||
1523 | QString CPlucker_base::about() | 1523 | QString CPlucker_base::about() |
1524 | { | 1524 | { |
1525 | QString abt = "Plucker base codec (c) Tim Wentford"; | 1525 | QString abt = "Plucker base codec (c) Tim Wentford"; |
1526 | if (m_decompress != UnDoc && m_decompress != UnZip) | 1526 | if (m_decompress != UnDoc && m_decompress != UnZip) |
1527 | { | 1527 | { |
1528 | abt += "\nSpecial decompression (c) Tim Wentford (ppmd by Dmitry Shkarin"; | 1528 | abt += "\nSpecial decompression (c) Tim Wentford (ppmd by Dmitry Shkarin"; |
1529 | } | 1529 | } |
1530 | return abt; | 1530 | return abt; |
1531 | } | 1531 | } |
diff --git a/noncore/apps/opie-reader/striphtml.cpp b/noncore/apps/opie-reader/striphtml.cpp index c434dbb..a2ad56b 100644 --- a/noncore/apps/opie-reader/striphtml.cpp +++ b/noncore/apps/opie-reader/striphtml.cpp | |||
@@ -1,1414 +1,1414 @@ | |||
1 | #include <qmap.h> | 1 | #include <qmap.h> |
2 | #include <qfileinfo.h> | 2 | #include <qfileinfo.h> |
3 | #include <qtextstream.h> | 3 | #include <qtextstream.h> |
4 | #include <qdir.h> | 4 | #include <qdir.h> |
5 | #ifdef USEQPE | 5 | #ifdef USEQPE |
6 | #include <qpe/global.h> | 6 | #include <qpe/global.h> |
7 | #endif | 7 | #endif |
8 | #include "CDrawBuffer.h" | 8 | #include "CDrawBuffer.h" |
9 | #include "striphtml.h" | 9 | #include "striphtml.h" |
10 | #include "hrule.h" | 10 | #include "hrule.h" |
11 | 11 | ||
12 | #include <qregexp.h> | 12 | #include <qregexp.h> |
13 | #include <qimage.h> | 13 | #include <qimage.h> |
14 | #include <qpixmap.h> | 14 | #include <qpixmap.h> |
15 | //#include <qprogressdialog.h> | 15 | //#include <qprogressdialog.h> |
16 | //#include <qapplication.h> | 16 | //#include <qapplication.h> |
17 | 17 | ||
18 | static unsigned char h2i(unsigned char c) | 18 | static unsigned char h2i(unsigned char c) |
19 | { | 19 | { |
20 | unsigned char ret = 0; | 20 | unsigned char ret = 0; |
21 | if ('0' <= c && c <= '9') | 21 | if ('0' <= c && c <= '9') |
22 | { | 22 | { |
23 | ret = c - '0'; | 23 | ret = c - '0'; |
24 | } | 24 | } |
25 | else if ('a' <= c && c <= 'f') | 25 | else if ('a' <= c && c <= 'f') |
26 | { | 26 | { |
27 | ret = c - 'a' + 10; | 27 | ret = c - 'a' + 10; |
28 | } | 28 | } |
29 | return ret; | 29 | return ret; |
30 | } | 30 | } |
31 | 31 | ||
32 | static void parse_color(const QString& attr, unsigned char& r, unsigned char& g, unsigned char& b) | 32 | static void parse_color(const QString& attr, unsigned char& r, unsigned char& g, unsigned char& b) |
33 | { | 33 | { |
34 | r = g = b = 0; | 34 | r = g = b = 0; |
35 | if (attr.length() >= 7 && attr[0] == '#') | 35 | if (attr.length() >= 7 && attr[0] == '#') |
36 | { | 36 | { |
37 | r = h2i(attr[1].unicode()); | 37 | r = h2i(attr[1].unicode()); |
38 | r = 16*r + h2i(attr[2].unicode()); | 38 | r = 16*r + h2i(attr[2].unicode()); |
39 | g = h2i(attr[3].unicode()); | 39 | g = h2i(attr[3].unicode()); |
40 | g = 16*g + h2i(attr[4].unicode()); | 40 | g = 16*g + h2i(attr[4].unicode()); |
41 | b = h2i(attr[5].unicode()); | 41 | b = h2i(attr[5].unicode()); |
42 | b = 16*b + h2i(attr[6].unicode()); | 42 | b = 16*b + h2i(attr[6].unicode()); |
43 | } | 43 | } |
44 | else if (attr == "red") | 44 | else if (attr == "red") |
45 | { | 45 | { |
46 | r = 255; | 46 | r = 255; |
47 | } | 47 | } |
48 | else if (attr == "green") | 48 | else if (attr == "green") |
49 | { | 49 | { |
50 | g = 255; | 50 | g = 255; |
51 | } | 51 | } |
52 | else if (attr == "blue") | 52 | else if (attr == "blue") |
53 | { | 53 | { |
54 | b = 255; | 54 | b = 255; |
55 | } | 55 | } |
56 | else if (attr == "white") | 56 | else if (attr == "white") |
57 | { | 57 | { |
58 | r = g = b = 255; | 58 | r = g = b = 255; |
59 | } | 59 | } |
60 | else if (attr == "black") | 60 | else if (attr == "black") |
61 | { | 61 | { |
62 | r = g = b = 0; | 62 | r = g = b = 0; |
63 | } | 63 | } |
64 | else | 64 | else |
65 | { | 65 | { |
66 | qDebug("Don't understand colour \"%s\"", (const char*)attr); | 66 | qDebug("Don't understand colour \"%s\"", (const char*)attr); |
67 | } | 67 | } |
68 | } | 68 | } |
69 | 69 | ||
70 | CNavigation_base<htmlmark> striphtml::m_nav; | 70 | CNavigation_base<htmlmark> striphtml::m_nav; |
71 | 71 | ||
72 | void striphtml::skipblock(const QString& _ent) | 72 | void striphtml::skipblock(const QString& _ent) |
73 | { | 73 | { |
74 | tchar ch = '>'; | 74 | tchar ch = '>'; |
75 | CStyle dummy; | 75 | CStyle dummy; |
76 | QString ent; | 76 | QString ent; |
77 | unsigned long pos; | 77 | unsigned long pos; |
78 | do | 78 | do |
79 | { | 79 | { |
80 | while (ch != '<' && ch != UEOF) | 80 | while (ch != '<' && ch != UEOF) |
81 | { | 81 | { |
82 | mygetch(ch, dummy, pos); | 82 | mygetch(ch, dummy, pos); |
83 | } | 83 | } |
84 | 84 | ||
85 | ch = skip_ws(); | 85 | ch = skip_ws(); |
86 | 86 | ||
87 | ent = getname(ch, " >").lower(); | 87 | ent = getname(ch, " >").lower(); |
88 | qDebug("Skipblock:%s", (const char*)ent); | 88 | qDebug("Skipblock:%s", (const char*)ent); |
89 | } while (ent != _ent && ch != UEOF); | 89 | } while (ent != _ent && ch != UEOF); |
90 | } | 90 | } |
91 | 91 | ||
92 | void striphtml::reset() | 92 | void striphtml::reset() |
93 | { | 93 | { |
94 | m_inblock = false; | 94 | m_inblock = false; |
95 | text_q = ""; | 95 | text_q = ""; |
96 | q = ""; | 96 | q = ""; |
97 | tablenesteddepth = 0; | 97 | tablenesteddepth = 0; |
98 | forcecentre = false; | 98 | forcecentre = false; |
99 | ignorespace = false; | 99 | ignorespace = false; |
100 | indent = 0; | 100 | indent = 0; |
101 | while (!stylestack.isEmpty()) stylestack.pop(); | 101 | while (!stylestack.isEmpty()) stylestack.pop(); |
102 | currentstyle.unset(); | 102 | currentstyle.unset(); |
103 | } | 103 | } |
104 | 104 | ||
105 | void striphtml::locate(unsigned int n) | 105 | void striphtml::locate(unsigned int n) |
106 | { | 106 | { |
107 | qDebug("striphtml:locating:%u", n); | 107 | qDebug("striphtml:locating:%u", n); |
108 | reset(); | 108 | reset(); |
109 | parent->locate(n); | 109 | parent->locate(n); |
110 | } | 110 | } |
111 | 111 | ||
112 | int striphtml::getpara(CBuffer& buff, unsigned long& startpos) | 112 | int striphtml::getpara(CBuffer& buff, unsigned long& startpos) |
113 | { | 113 | { |
114 | tchar ch; | 114 | tchar ch; |
115 | CStyle sty; | 115 | CStyle sty; |
116 | unsigned long pos; | 116 | unsigned long pos; |
117 | int i = 0; | 117 | int i = 0; |
118 | parent->getch(ch, sty, startpos); | 118 | parent->getch(ch, sty, startpos); |
119 | pos = startpos; | 119 | pos = startpos; |
120 | while (1) | 120 | while (1) |
121 | { | 121 | { |
122 | if (ch == 10 && !isPre) | 122 | if (ch == 10 && !isPre) |
123 | { | 123 | { |
124 | ch = ' '; | 124 | ch = ' '; |
125 | } | 125 | } |
126 | if (ch == UEOF) | 126 | if (ch == UEOF) |
127 | { | 127 | { |
128 | // qDebug("EOF:%d:%u", i, pos); | 128 | // qDebug("EOF:%d:%u", i, pos); |
129 | buff[i] = 0; | 129 | buff[i] = 0; |
130 | if (i == 0) | 130 | if (i == 0) |
131 | { | 131 | { |
132 | i = -1; | 132 | i = -1; |
133 | } | 133 | } |
134 | return i; | 134 | return i; |
135 | } | 135 | } |
136 | else if (ch == '<') | 136 | else if (ch == '<') |
137 | { | 137 | { |
138 | tchar ch2 = skip_ws(); | 138 | tchar ch2 = skip_ws(); |
139 | QString ent = getname(ch2, " >"); | 139 | QString ent = getname(ch2, " >"); |
140 | ent = ent.lower(); | 140 | ent = ent.lower(); |
141 | // qDebug("ent:%s", (const char*)ent); | 141 | // qDebug("ent:%s", (const char*)ent); |
142 | if (ent == "a") | 142 | if (ent == "a") |
143 | { | 143 | { |
144 | buff[i++] = '<'; | 144 | buff[i++] = '<'; |
145 | buff[i++] = 'a'; | 145 | buff[i++] = 'a'; |
146 | buff[i++] = ch2; | 146 | buff[i++] = ch2; |
147 | // buff[i] = 0; qDebug("ANCHOR:%s", (const char*)toQString(buff.data())); | 147 | // buff[i] = 0; qDebug("ANCHOR:%s", (const char*)toQString(buff.data())); |
148 | } | 148 | } |
149 | else if (ent == "/a") | 149 | else if (ent == "/a") |
150 | { | 150 | { |
151 | buff[i++] = '<'; | 151 | buff[i++] = '<'; |
152 | buff[i++] = '/'; | 152 | buff[i++] = '/'; |
153 | buff[i++] = 'a'; | 153 | buff[i++] = 'a'; |
154 | buff[i++] = ch2; | 154 | buff[i++] = ch2; |
155 | // buff[i] = 0; qDebug("/ANCHOR:%s", (const char*)toQString(buff.data())); | 155 | // buff[i] = 0; qDebug("/ANCHOR:%s", (const char*)toQString(buff.data())); |
156 | } | 156 | } |
157 | else if (ent == "div") | 157 | else if (ent == "div") |
158 | { | 158 | { |
159 | // buff[i] = 0; qDebug("DIV:%s", (const char*)toQString(buff.data())); | 159 | // buff[i] = 0; qDebug("DIV:%s", (const char*)toQString(buff.data())); |
160 | if (i == 0) | 160 | if (i == 0) |
161 | { | 161 | { |
162 | buff[i++] = '<'; | 162 | buff[i++] = '<'; |
163 | buff[i++] = 'd'; | 163 | buff[i++] = 'd'; |
164 | buff[i++] = 'i'; | 164 | buff[i++] = 'i'; |
165 | buff[i++] = 'v'; | 165 | buff[i++] = 'v'; |
166 | buff[i++] = ' '; | 166 | buff[i++] = ' '; |
167 | buff[i++] = ch2; | 167 | buff[i++] = ch2; |
168 | while (ch2 != '>' && ch2 != UEOF && i < 2048) | 168 | while (ch2 != '>' && ch2 != UEOF && i < 2048) |
169 | { | 169 | { |
170 | parent->getch(ch2, sty, pos); | 170 | parent->getch(ch2, sty, pos); |
171 | buff[i++] = ch2; | 171 | buff[i++] = ch2; |
172 | } | 172 | } |
173 | } | 173 | } |
174 | else | 174 | else |
175 | { | 175 | { |
176 | locate(pos); | 176 | locate(pos); |
177 | } | 177 | } |
178 | buff[i++] = 0; | 178 | buff[i++] = 0; |
179 | // qDebug("DIV:%s", (const char*)toQString(buff.data())); | 179 | // qDebug("DIV:%s", (const char*)toQString(buff.data())); |
180 | return i; | 180 | return i; |
181 | } | 181 | } |
182 | else if (ent == "p" || (ent[0] == 'h' && ent.length() == 2 && QString("123456789").find(ent[1]) != -1)) | 182 | else if (ent == "p" || (ent[0] == 'h' && ent.length() == 2 && QString("123456789").find(ent[1]) != -1)) |
183 | { | 183 | { |
184 | buff[i++] = 0; | 184 | buff[i++] = 0; |
185 | while (ch2 != '>' && ch2 != UEOF) | 185 | while (ch2 != '>' && ch2 != UEOF) |
186 | { | 186 | { |
187 | parent->getch(ch2, sty, pos); | 187 | parent->getch(ch2, sty, pos); |
188 | } | 188 | } |
189 | return i; | 189 | return i; |
190 | } | 190 | } |
191 | else | 191 | else |
192 | { | 192 | { |
193 | while (ch2 != '>' && ch2 != UEOF) | 193 | while (ch2 != '>' && ch2 != UEOF) |
194 | { | 194 | { |
195 | parent->getch(ch2, sty, pos); | 195 | parent->getch(ch2, sty, pos); |
196 | } | 196 | } |
197 | } | 197 | } |
198 | } | 198 | } |
199 | else | 199 | else |
200 | { | 200 | { |
201 | buff[i++] = ch; | 201 | buff[i++] = ch; |
202 | } | 202 | } |
203 | parent->getch(ch, sty, pos); | 203 | parent->getch(ch, sty, pos); |
204 | } | 204 | } |
205 | } | 205 | } |
206 | 206 | ||
207 | QString striphtml::dehtml(const QString& _info) | 207 | QString striphtml::dehtml(const QString& _info) |
208 | { | 208 | { |
209 | QString info; | 209 | QString info; |
210 | for (int i = 0; i < _info.length(); i++) | 210 | for (int i = 0; i < _info.length(); i++) |
211 | { | 211 | { |
212 | tchar ch = _info[i]; | 212 | tchar ch = _info[i]; |
213 | if (ch == '%') | 213 | if (ch == '%') |
214 | { | 214 | { |
215 | ch = 0; | 215 | ch = 0; |
216 | for (int j = 0; j < 2; j++) | 216 | for (int j = 0; j < 2; j++) |
217 | { | 217 | { |
218 | ch <<= 4; | 218 | ch <<= 4; |
219 | tchar ch1 = _info[++i]; | 219 | tchar ch1 = _info[++i]; |
220 | if ('0' <= ch1 && ch1 <= '9') | 220 | if ('0' <= ch1 && ch1 <= '9') |
221 | { | 221 | { |
222 | ch += ch1 - '0'; | 222 | ch += ch1 - '0'; |
223 | } | 223 | } |
224 | else if ('a' <= ch1 && ch1 <= 'f') | 224 | else if ('a' <= ch1 && ch1 <= 'f') |
225 | { | 225 | { |
226 | ch += ch1 - 'a' + 10; | 226 | ch += ch1 - 'a' + 10; |
227 | } | 227 | } |
228 | else if ('A' <= ch1 && ch1 <= 'F') | 228 | else if ('A' <= ch1 && ch1 <= 'F') |
229 | { | 229 | { |
230 | ch += ch1 - 'A' + 10; | 230 | ch += ch1 - 'A' + 10; |
231 | } | 231 | } |
232 | } | 232 | } |
233 | } | 233 | } |
234 | info += ch; | 234 | info += ch; |
235 | } | 235 | } |
236 | return info; | 236 | return info; |
237 | } | 237 | } |
238 | 238 | ||
239 | bool striphtml::findanchor(const QString& _info) | 239 | bool striphtml::findanchor(const QString& _info) |
240 | { | 240 | { |
241 | // QProgressDialog dlg("Finding link...", QString::null, 0, NULL, "progress", true); | 241 | // QProgressDialog dlg("Finding link...", QString::null, 0, NULL, "progress", true); |
242 | // QProgressBar dlg(0); | 242 | // QProgressBar dlg(0); |
243 | if (parent->findanchor(_info)) | 243 | if (parent->findanchor(_info)) |
244 | { | 244 | { |
245 | reset(); | 245 | reset(); |
246 | return true; | 246 | return true; |
247 | } | 247 | } |
248 | qDebug("Using html find"); | 248 | qDebug("Using html find"); |
249 | parent->locate(parent->startSection()); | 249 | parent->locate(parent->startSection()); |
250 | #if defined(USEQPE) || defined(_WINDOWS) | 250 | #if defined(USEQPE) || defined(_WINDOWS) |
251 | QString info; | 251 | QString info; |
252 | for (int i = 0; i < _info.length(); i++) | 252 | for (int i = 0; i < _info.length(); i++) |
253 | { | 253 | { |
254 | tchar ch = _info[i]; | 254 | tchar ch = _info[i]; |
255 | if (QString(".^$[]*+?").find(ch) != -1) | 255 | if (QString(".^$[]*+?").find(ch) != -1) |
256 | { | 256 | { |
257 | info += '\\'; | 257 | info += '\\'; |
258 | } | 258 | } |
259 | info += ch; | 259 | info += ch; |
260 | } | 260 | } |
261 | #else | 261 | #else |
262 | QString info = QRegExp::escape(_info); | 262 | QString info = QRegExp::escape(_info); |
263 | #endif | 263 | #endif |
264 | qDebug("Adjusted searchstring:%s", (const char*)info); | 264 | qDebug("Adjusted searchstring:%s", (const char*)info); |
265 | QString sname("<[Aa][^>]*[ \t]+[Nn][Aa][Mm][Ee][ \t]*=[ \t]*\"?"); | 265 | QString sname("<[Aa][^>]*[ \t]+[Nn][Aa][Mm][Ee][ \t]*=[ \t]*\"?"); |
266 | sname += info + "\"?[ \t>]"; | 266 | sname += info + "\"?[ \t>]"; |
267 | QString sid("<[A-Za-z][^>]*[ \t]+[Ii][Dd][ \t]*=[ \t]*\"?"); | 267 | QString sid("<[A-Za-z][^>]*[ \t]+[Ii][Dd][ \t]*=[ \t]*\"?"); |
268 | sid += info+"\"?[ \t>]"; | 268 | sid += info+"\"?[ \t>]"; |
269 | #ifdef USEQPE | 269 | #ifdef USEQPE |
270 | QRegExp name(sname); | 270 | QRegExp name(sname); |
271 | QRegExp id(sid); | 271 | QRegExp id(sid); |
272 | #else | 272 | #else |
273 | QRegExp name(sname+"|"+sid); | 273 | QRegExp name(sname+"|"+sid); |
274 | #endif | 274 | #endif |
275 | bool ret = true; | 275 | bool ret = true; |
276 | locate(0); | 276 | locate(0); |
277 | unsigned long pos = 0; | 277 | unsigned long pos = 0; |
278 | unsigned long startpos = 0; | 278 | unsigned long startpos = 0; |
279 | int offset; | 279 | int offset; |
280 | CBuffer test; | 280 | CBuffer test; |
281 | qDebug("striphtml::findanchor"); | 281 | qDebug("striphtml::findanchor"); |
282 | // dlg.show(); | 282 | // dlg.show(); |
283 | if (getpara(test, pos) >= 0) | 283 | if (getpara(test, pos) >= 0) |
284 | { | 284 | { |
285 | while (1) | 285 | while (1) |
286 | { | 286 | { |
287 | // qApp->processEvents(); | 287 | // qApp->processEvents(); |
288 | if ((offset = name.match(toQString(test.data()))) != -1) break; | 288 | if ((offset = name.match(toQString(test.data()))) != -1) break; |
289 | #ifdef USEQPE | 289 | #ifdef USEQPE |
290 | if ((offset = id.match(toQString(test.data()))) != -1) break; | 290 | if ((offset = id.match(toQString(test.data()))) != -1) break; |
291 | #endif | 291 | #endif |
292 | if (getpara(test, pos) < 0) | 292 | if (getpara(test, pos) < 0) |
293 | { | 293 | { |
294 | locate(startpos); | 294 | locate(startpos); |
295 | qDebug("Not found"); | 295 | qDebug("Not found"); |
296 | return false; | 296 | return false; |
297 | } | 297 | } |
298 | } | 298 | } |
299 | locate(pos); | 299 | locate(pos); |
300 | qDebug("Found"); | 300 | qDebug("Found"); |
301 | ret = true; | 301 | ret = true; |
302 | } | 302 | } |
303 | else | 303 | else |
304 | { | 304 | { |
305 | locate(startpos); | 305 | locate(startpos); |
306 | qDebug("Not found"); | 306 | qDebug("Not found"); |
307 | ret = false; | 307 | ret = false; |
308 | } | 308 | } |
309 | return ret; | 309 | return ret; |
310 | } | 310 | } |
311 | 311 | ||
312 | striphtml::striphtml(const QString& _s) : entmap(NULL), isPre(false), currentid(0), lastch(0), currentfile(_s), indent(0), forcecentre(false), m_inblock(false), m_bchm(false), ignorespace(false), tablenesteddepth(0) | 312 | striphtml::striphtml(const QString& _s) : entmap(NULL), isPre(false), currentid(0), lastch(0), currentfile(_s), indent(0), forcecentre(false), m_inblock(false), m_bchm(false), ignorespace(false), tablenesteddepth(0) |
313 | { | 313 | { |
314 | href2filepos = new QMap<QString, unsigned long>; | 314 | href2filepos = new QMap<QString, unsigned long>; |
315 | id2href = new QMap<unsigned long, QString>; | 315 | id2href = new QMap<unsigned long, QString>; |
316 | } | 316 | } |
317 | 317 | ||
318 | striphtml::~striphtml() | 318 | striphtml::~striphtml() |
319 | { | 319 | { |
320 | if (entmap != NULL) delete entmap; | 320 | if (entmap != NULL) delete entmap; |
321 | delete href2filepos; | 321 | delete href2filepos; |
322 | delete id2href; | 322 | delete id2href; |
323 | } | 323 | } |
324 | 324 | ||
325 | void striphtml::initentmap() | 325 | void striphtml::initentmap() |
326 | { | 326 | { |
327 | entmap = new QMap<QString, tchar>; | 327 | entmap = new QMap<QString, tchar>; |
328 | #ifdef USEQPE | 328 | #ifdef USEQPE |
329 | #ifdef OPIE | 329 | #ifdef OPIE |
330 | QString fname(getenv("OPIEDIR")); | 330 | QString fname(getenv("OPIEDIR")); |
331 | #else | 331 | #else |
332 | QString fname(getenv("QTDIR")); | 332 | QString fname(getenv("QTDIR")); |
333 | #endif | 333 | #endif |
334 | fname += "/plugins/reader/data"; | 334 | fname += "/plugins/reader/data"; |
335 | #else | 335 | #else |
336 | QString fname(getenv("READERDIR")); | 336 | QString fname(getenv("READERDIR")); |
337 | fname += "/data"; | 337 | fname += "/data"; |
338 | #endif | 338 | #endif |
339 | QFileInfo fi; | 339 | QFileInfo fi; |
340 | fi.setFile(fname, "HTMLentities"); | 340 | fi.setFile(fname, "HTMLentities"); |
341 | if (fi.exists()) | 341 | if (fi.exists()) |
342 | { | 342 | { |
343 | fname = fi.absFilePath(); | 343 | fname = fi.absFilePath(); |
344 | 344 | ||
345 | QFile fl(fname); | 345 | QFile fl(fname); |
346 | if (fl.open(IO_ReadOnly)) | 346 | if (fl.open(IO_ReadOnly)) |
347 | { | 347 | { |
348 | QTextStream t(&fl); | 348 | QTextStream t(&fl); |
349 | QString key, value; | 349 | QString key, value; |
350 | while (!t.eof()) | 350 | while (!t.eof()) |
351 | { | 351 | { |
352 | QString data = t.readLine(); | 352 | QString data = t.readLine(); |
353 | int colon = data.find(':'); | 353 | int colon = data.find(':'); |
354 | if (colon > 0) | 354 | if (colon > 0) |
355 | { | 355 | { |
356 | QString key = data.left(colon); | 356 | QString key = data.left(colon); |
357 | QString value = data.right(data.length()-colon-1); | 357 | QString value = data.right(data.length()-colon-1); |
358 | bool ok; | 358 | bool ok; |
359 | int ret = value.toInt(&ok); | 359 | int ret = value.toInt(&ok); |
360 | if (ok) | 360 | if (ok) |
361 | { | 361 | { |
362 | (*entmap)[key] = ret; | 362 | (*entmap)[key] = ret; |
363 | } | 363 | } |
364 | } | 364 | } |
365 | } | 365 | } |
366 | fl.close(); | 366 | fl.close(); |
367 | } | 367 | } |
368 | } | 368 | } |
369 | } | 369 | } |
370 | 370 | ||
371 | unsigned short striphtml::skip_ws() | 371 | unsigned short striphtml::skip_ws() |
372 | { | 372 | { |
373 | tchar ch; | 373 | tchar ch; |
374 | CStyle sty; | 374 | CStyle sty; |
375 | unsigned long dummy; | 375 | unsigned long dummy; |
376 | do | 376 | do |
377 | { | 377 | { |
378 | mygetch(ch, sty, dummy); | 378 | mygetch(ch, sty, dummy); |
379 | } | 379 | } |
380 | while (ch < 33 && ch != UEOF); | 380 | while (ch < 33 && ch != UEOF); |
381 | return ch; | 381 | return ch; |
382 | } | 382 | } |
383 | 383 | ||
384 | unsigned short striphtml::skip_ws_end() | 384 | unsigned short striphtml::skip_ws_end() |
385 | { | 385 | { |
386 | unsigned long dummy; | 386 | unsigned long dummy; |
387 | return skip_ws_end(dummy); | 387 | return skip_ws_end(dummy); |
388 | } | 388 | } |
389 | 389 | ||
390 | unsigned short striphtml::skip_ws_end(unsigned long& pos) | 390 | unsigned short striphtml::skip_ws_end(unsigned long& pos) |
391 | { | 391 | { |
392 | tchar ch; | 392 | tchar ch; |
393 | CStyle sty; | 393 | CStyle sty; |
394 | do | 394 | do |
395 | { | 395 | { |
396 | mygetch(ch, sty, pos); | 396 | mygetch(ch, sty, pos); |
397 | } | 397 | } |
398 | while (ch != '>' && ch != UEOF); | 398 | while (ch != '>' && ch != UEOF); |
399 | return ch; | 399 | return ch; |
400 | } | 400 | } |
401 | 401 | ||
402 | QString striphtml::getname(tchar& ch, const QString& nd) | 402 | QString striphtml::getname(tchar& ch, const QString& nd) |
403 | { | 403 | { |
404 | QString nm = ""; | 404 | QString nm = ""; |
405 | // nm += ch; | 405 | // nm += ch; |
406 | CStyle sty; | 406 | CStyle sty; |
407 | unsigned long dummy; | 407 | unsigned long dummy; |
408 | while (1) | 408 | while (1) |
409 | { | 409 | { |
410 | // if ( QChar(ch).isLetterOrNumber() ) | 410 | // if ( QChar(ch).isLetterOrNumber() ) |
411 | if (ch != UEOF && nd.find(ch, 0, false) == -1 && nm.length() < 2048) | 411 | if (ch != UEOF && nd.find(ch, 0, false) == -1 && nm.length() < 2048) |
412 | { | 412 | { |
413 | nm += ch; | 413 | nm += ch; |
414 | } | 414 | } |
415 | else | 415 | else |
416 | { | 416 | { |
417 | break; | 417 | break; |
418 | } | 418 | } |
419 | mygetch(ch, sty, dummy); | 419 | mygetch(ch, sty, dummy); |
420 | } | 420 | } |
421 | return nm; | 421 | return nm; |
422 | } | 422 | } |
423 | 423 | ||
424 | QString striphtml::getattr(tchar& ch) | 424 | QString striphtml::getattr(tchar& ch) |
425 | { | 425 | { |
426 | QString ref; | 426 | QString ref; |
427 | CStyle sty; | 427 | CStyle sty; |
428 | unsigned long pos; | 428 | unsigned long pos; |
429 | if (ch == ' ') ch = skip_ws(); | 429 | if (ch == ' ') ch = skip_ws(); |
430 | if (ch == '=') | 430 | if (ch == '=') |
431 | { | 431 | { |
432 | ch = skip_ws(); | 432 | ch = skip_ws(); |
433 | if (ch == '"') | 433 | if (ch == '"') |
434 | { | 434 | { |
435 | mygetch(ch, sty, pos); | 435 | mygetch(ch, sty, pos); |
436 | ref = getname(ch, "\""); | 436 | ref = getname(ch, "\""); |
437 | ch = skip_ws(); | 437 | ch = skip_ws(); |
438 | } | 438 | } |
439 | else if (ch == '\'') | 439 | else if (ch == '\'') |
440 | { | 440 | { |
441 | mygetch(ch, sty, pos); | 441 | mygetch(ch, sty, pos); |
442 | ref = getname(ch, "\'"); | 442 | ref = getname(ch, "\'"); |
443 | ch = skip_ws(); | 443 | ch = skip_ws(); |
444 | } | 444 | } |
445 | else | 445 | else |
446 | { | 446 | { |
447 | ref = getname(ch, " >"); | 447 | ref = getname(ch, " >"); |
448 | if (ch == ' ') ch = skip_ws(); | 448 | if (ch == ' ') ch = skip_ws(); |
449 | } | 449 | } |
450 | } | 450 | } |
451 | return ref; | 451 | return ref; |
452 | } | 452 | } |
453 | 453 | ||
454 | linkType striphtml::hyperlink(unsigned int n, unsigned int, QString& w, QString& nm) | 454 | linkType striphtml::hyperlink(unsigned int n, unsigned int, QString& w, QString& nm) |
455 | { | 455 | { |
456 | #if defined(USEQPE) || defined(_WINDOWS) | 456 | #if defined(USEQPE) || defined(_WINDOWS) |
457 | QMap<unsigned long, QString>::Iterator hrefit = id2href->find(n); | 457 | QMap<unsigned long, QString>::Iterator hrefit = id2href->find(n); |
458 | #else | 458 | #else |
459 | QMap<unsigned long, QString>::iterator hrefit = id2href->find(n); | 459 | QMap<unsigned long, QString>::iterator hrefit = id2href->find(n); |
460 | #endif | 460 | #endif |
461 | if (hrefit == id2href->end()) | 461 | if (hrefit == id2href->end()) |
462 | { | 462 | { |
463 | return eNone; | 463 | return eNone; |
464 | } | 464 | } |
465 | QString href = *hrefit; | 465 | QString href = *hrefit; |
466 | #if defined(USEQPE) || defined(_WINDOWS) | 466 | #if defined(USEQPE) || defined(_WINDOWS) |
467 | QMap<QString, unsigned long>::Iterator fpit = href2filepos->find(href); | 467 | QMap<QString, unsigned long>::Iterator fpit = href2filepos->find(href); |
468 | #else | 468 | #else |
469 | QMap<QString, unsigned long>::iterator fpit = href2filepos->find(href); | 469 | QMap<QString, unsigned long>::iterator fpit = href2filepos->find(href); |
470 | #endif | 470 | #endif |
471 | if (fpit == href2filepos->end()) | 471 | if (fpit == href2filepos->end()) |
472 | { | 472 | { |
473 | if (href == "history.back()") | 473 | if (href == "history.back()") |
474 | { | 474 | { |
475 | QString fc = currentfile; | 475 | QString fc = currentfile; |
476 | unsigned long loc; | 476 | unsigned long loc = 0; |
477 | htmlmark m(fc, loc); | 477 | htmlmark m(fc, loc); |
478 | linkType ret = (m_nav.back(m)) ? eFile : eNone; | 478 | linkType ret = (m_nav.back(m)) ? eFile : eNone; |
479 | if (fc == m.filename()) | 479 | if (fc == m.filename()) |
480 | { | 480 | { |
481 | if ((ret & eFile) != 0) | 481 | if ((ret & eFile) != 0) |
482 | { | 482 | { |
483 | locate(m.posn()); | 483 | locate(m.posn()); |
484 | return eLink; | 484 | return eLink; |
485 | } | 485 | } |
486 | } | 486 | } |
487 | return eNone; | 487 | return eNone; |
488 | } | 488 | } |
489 | qDebug("Searching for %s", (const char*)href); | 489 | qDebug("Searching for %s", (const char*)href); |
490 | 490 | ||
491 | 491 | ||
492 | QString file, name; | 492 | QString file, name; |
493 | 493 | ||
494 | int colon = href.find('#'); | 494 | int colon = href.find('#'); |
495 | if (colon >= 0) | 495 | if (colon >= 0) |
496 | { | 496 | { |
497 | file = dehtml(href.left(colon)); | 497 | file = dehtml(href.left(colon)); |
498 | name = dehtml(href.right(href.length()-colon-1)); | 498 | name = dehtml(href.right(href.length()-colon-1)); |
499 | } | 499 | } |
500 | else | 500 | else |
501 | { | 501 | { |
502 | file = dehtml(href); | 502 | file = dehtml(href); |
503 | } | 503 | } |
504 | 504 | ||
505 | qDebug("File:%s", (const char*)file); | 505 | qDebug("File:%s", (const char*)file); |
506 | qDebug("Name:%s", (const char*)name); | 506 | qDebug("Name:%s", (const char*)name); |
507 | 507 | ||
508 | 508 | ||
509 | if (file.isEmpty()) | 509 | if (file.isEmpty()) |
510 | { | 510 | { |
511 | if (parent->findanchor(name)) | 511 | if (parent->findanchor(name)) |
512 | { | 512 | { |
513 | reset(); | 513 | reset(); |
514 | return eLink; | 514 | return eLink; |
515 | } | 515 | } |
516 | fpit = href2filepos->find(name); | 516 | fpit = href2filepos->find(name); |
517 | if (fpit != href2filepos->end()) | 517 | if (fpit != href2filepos->end()) |
518 | { | 518 | { |
519 | locate(*fpit); | 519 | locate(*fpit); |
520 | return eLink; | 520 | return eLink; |
521 | } | 521 | } |
522 | else | 522 | else |
523 | { | 523 | { |
524 | // nm = QString("<a[^>]*name[ \t]*=[ \t]*\"") + name + "\""; | 524 | // nm = QString("<a[^>]*name[ \t]*=[ \t]*\"") + name + "\""; |
525 | qDebug("Do a search for:%s", (const char*)name); | 525 | qDebug("Do a search for:%s", (const char*)name); |
526 | findanchor(name); | 526 | findanchor(name); |
527 | return eLink; | 527 | return eLink; |
528 | } | 528 | } |
529 | } | 529 | } |
530 | else | 530 | else |
531 | // if (href.find('#') == -1) | 531 | // if (href.find('#') == -1) |
532 | { | 532 | { |
533 | if (m_bchm) | 533 | if (m_bchm) |
534 | { | 534 | { |
535 | w = file; | 535 | w = file; |
536 | nm = name; | 536 | nm = name; |
537 | return eFile; | 537 | return eFile; |
538 | } | 538 | } |
539 | else | 539 | else |
540 | { | 540 | { |
541 | QFileInfo f(currentfile); | 541 | QFileInfo f(currentfile); |
542 | QFileInfo f1(f.dir(true), file); | 542 | QFileInfo f1(f.dir(true), file); |
543 | if (f1.exists()) | 543 | if (f1.exists()) |
544 | { | 544 | { |
545 | w = f1.absFilePath(); | 545 | w = f1.absFilePath(); |
546 | nm = name; | 546 | nm = name; |
547 | } | 547 | } |
548 | else | 548 | else |
549 | { | 549 | { |
550 | w = file; | 550 | w = file; |
551 | } | 551 | } |
552 | return (f1.exists() ? eFile : eNone); | 552 | return (f1.exists() ? eFile : eNone); |
553 | } | 553 | } |
554 | } | 554 | } |
555 | return eNone; | 555 | return eNone; |
556 | } | 556 | } |
557 | locate(*fpit); | 557 | locate(*fpit); |
558 | // parent->locate((*href2filepos)[(*id2href)[n]]); | 558 | // parent->locate((*href2filepos)[(*id2href)[n]]); |
559 | return eLink; | 559 | return eLink; |
560 | } | 560 | } |
561 | /* | 561 | /* |
562 | unsigned short striphtml::parse_m() | 562 | unsigned short striphtml::parse_m() |
563 | { | 563 | { |
564 | tchar ch; | 564 | tchar ch; |
565 | CStyle sty; | 565 | CStyle sty; |
566 | unsigned long dummy; | 566 | unsigned long dummy; |
567 | mygetch(ch, sty, dummy); | 567 | mygetch(ch, sty, dummy); |
568 | if (ch == 'm' || ch == 'M') | 568 | if (ch == 'm' || ch == 'M') |
569 | { | 569 | { |
570 | ch = skip_ws_end(); | 570 | ch = skip_ws_end(); |
571 | if (ch == '>') | 571 | if (ch == '>') |
572 | { | 572 | { |
573 | return 0; | 573 | return 0; |
574 | } | 574 | } |
575 | } | 575 | } |
576 | return ch; | 576 | return ch; |
577 | } | 577 | } |
578 | */ | 578 | */ |
579 | 579 | ||
580 | void striphtml::mygetch(tchar& ch, CStyle& sty, unsigned long& pos) | 580 | void striphtml::mygetch(tchar& ch, CStyle& sty, unsigned long& pos) |
581 | { | 581 | { |
582 | if (!text_q.isEmpty() && !m_inblock) | 582 | if (!text_q.isEmpty() && !m_inblock) |
583 | { | 583 | { |
584 | ch = text_q[0].unicode(); | 584 | ch = text_q[0].unicode(); |
585 | text_q = text_q.right(text_q.length()-1); | 585 | text_q = text_q.right(text_q.length()-1); |
586 | } | 586 | } |
587 | else | 587 | else |
588 | { | 588 | { |
589 | parent->getch(ch, sty, pos); | 589 | parent->getch(ch, sty, pos); |
590 | if (ch == '<') | 590 | if (ch == '<') |
591 | { | 591 | { |
592 | m_inblock = true; | 592 | m_inblock = true; |
593 | } | 593 | } |
594 | if (ch == '>') | 594 | if (ch == '>') |
595 | { | 595 | { |
596 | m_inblock = false; | 596 | m_inblock = false; |
597 | } | 597 | } |
598 | } | 598 | } |
599 | if (ch == 10 && !isPre) | 599 | if (ch == 10 && !isPre) |
600 | { | 600 | { |
601 | #ifdef REMOVE_LF_BEFORE_ENDTAG | 601 | #ifdef REMOVE_LF_BEFORE_ENDTAG |
602 | parent->getch(ch, sty, pos); | 602 | parent->getch(ch, sty, pos); |
603 | if (ch == '<') | 603 | if (ch == '<') |
604 | { | 604 | { |
605 | parent->getch(ch, sty, pos); | 605 | parent->getch(ch, sty, pos); |
606 | if (ch == '/') | 606 | if (ch == '/') |
607 | { | 607 | { |
608 | ch = '<'; | 608 | ch = '<'; |
609 | text_q += '/'; | 609 | text_q += '/'; |
610 | } | 610 | } |
611 | else | 611 | else |
612 | { | 612 | { |
613 | text_q += '<'; | 613 | text_q += '<'; |
614 | text_q += ch; | 614 | text_q += ch; |
615 | ch = ' '; | 615 | ch = ' '; |
616 | } | 616 | } |
617 | } | 617 | } |
618 | else | 618 | else |
619 | { | 619 | { |
620 | text_q += ch; | 620 | text_q += ch; |
621 | ch = ' '; | 621 | ch = ' '; |
622 | } | 622 | } |
623 | #else | 623 | #else |
624 | ch = ' '; | 624 | ch = ' '; |
625 | #endif | 625 | #endif |
626 | } | 626 | } |
627 | } | 627 | } |
628 | 628 | ||
629 | void striphtml::parse_paragraph(CStyle& currentstyle, tchar& ch, unsigned long pos) | 629 | void striphtml::parse_paragraph(CStyle& currentstyle, tchar& ch, unsigned long pos) |
630 | { | 630 | { |
631 | /* | 631 | /* |
632 | int count = 0; | 632 | int count = 0; |
633 | for (CList<CStyle>::iterator iter = stylestack.begin(); iter != stylestack.end(); ++iter) | 633 | for (CList<CStyle>::iterator iter = stylestack.begin(); iter != stylestack.end(); ++iter) |
634 | { | 634 | { |
635 | count++; | 635 | count++; |
636 | } | 636 | } |
637 | qDebug("Currently have %u styles", count); | 637 | qDebug("Currently have %u styles", count); |
638 | */ | 638 | */ |
639 | if (stylestack.isEmpty()) | 639 | if (stylestack.isEmpty()) |
640 | { | 640 | { |
641 | currentstyle.unset(); | 641 | currentstyle.unset(); |
642 | } | 642 | } |
643 | else | 643 | else |
644 | { | 644 | { |
645 | currentstyle = stylestack.first(); | 645 | currentstyle = stylestack.first(); |
646 | } | 646 | } |
647 | if (forcecentre) | 647 | if (forcecentre) |
648 | { | 648 | { |
649 | currentstyle.setCentreJustify(); | 649 | currentstyle.setCentreJustify(); |
650 | } | 650 | } |
651 | if (ch == ' ') ch = skip_ws(); | 651 | if (ch == ' ') ch = skip_ws(); |
652 | while (ch != '>' && ch != UEOF) | 652 | while (ch != '>' && ch != UEOF) |
653 | { | 653 | { |
654 | QString ent = getname(ch, " =>").lower(); | 654 | QString ent = getname(ch, " =>").lower(); |
655 | QString attr = getattr(ch).lower(); | 655 | QString attr = getattr(ch).lower(); |
656 | //qDebug("(Paragraph)Entity:%s Attr:%s", (const char*)ent, (const char*)attr); | 656 | //qDebug("(Paragraph)Entity:%s Attr:%s", (const char*)ent, (const char*)attr); |
657 | if (ent == "align") | 657 | if (ent == "align") |
658 | { | 658 | { |
659 | if (attr == "center") | 659 | if (attr == "center") |
660 | { | 660 | { |
661 | currentstyle.setCentreJustify(); | 661 | currentstyle.setCentreJustify(); |
662 | } | 662 | } |
663 | if (attr == "right") | 663 | if (attr == "right") |
664 | { | 664 | { |
665 | currentstyle.setRightJustify(); | 665 | currentstyle.setRightJustify(); |
666 | } | 666 | } |
667 | if (attr == "justify") | 667 | if (attr == "justify") |
668 | { | 668 | { |
669 | currentstyle.setFullJustify(); | 669 | currentstyle.setFullJustify(); |
670 | } | 670 | } |
671 | } | 671 | } |
672 | if (ent == "id") | 672 | if (ent == "id") |
673 | { | 673 | { |
674 | (*href2filepos)[attr] = pos; | 674 | (*href2filepos)[attr] = pos; |
675 | } | 675 | } |
676 | if (ent == "bgcolor") | 676 | if (ent == "bgcolor") |
677 | { | 677 | { |
678 | qDebug("Got paper colour:%s", (const char*)attr); | 678 | qDebug("Got paper colour:%s", (const char*)attr); |
679 | unsigned char r,g,b; | 679 | unsigned char r,g,b; |
680 | parse_color(attr, r, g, b); | 680 | parse_color(attr, r, g, b); |
681 | currentstyle.setPaper(r, g, b); | 681 | currentstyle.setPaper(r, g, b); |
682 | } | 682 | } |
683 | if (ent == "color") | 683 | if (ent == "color") |
684 | { | 684 | { |
685 | qDebug("Got foreground colour:%s", (const char*)attr); | 685 | qDebug("Got foreground colour:%s", (const char*)attr); |
686 | unsigned char r,g,b; | 686 | unsigned char r,g,b; |
687 | parse_color(attr, r, g, b); | 687 | parse_color(attr, r, g, b); |
688 | currentstyle.setColour(r, g, b); | 688 | currentstyle.setColour(r, g, b); |
689 | } | 689 | } |
690 | if (ch == ' ') ch = skip_ws(); | 690 | if (ch == ' ') ch = skip_ws(); |
691 | } | 691 | } |
692 | ch = 10; | 692 | ch = 10; |
693 | } | 693 | } |
694 | 694 | ||
695 | void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos) | 695 | void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos) |
696 | { | 696 | { |
697 | currentstyle.clearPicture(); | 697 | currentstyle.clearPicture(); |
698 | if (!q.isEmpty()) | 698 | if (!q.isEmpty()) |
699 | { | 699 | { |
700 | ch = q[0].unicode(); | 700 | ch = q[0].unicode(); |
701 | if (ch == '-') | 701 | if (ch == '-') |
702 | { | 702 | { |
703 | tchar w = q[1].unicode(); | 703 | tchar w = q[1].unicode(); |
704 | tchar h = q[2].unicode(); | 704 | tchar h = q[2].unicode(); |
705 | unsigned char r = q[3].unicode(); | 705 | unsigned char r = q[3].unicode(); |
706 | unsigned char g = q[4].unicode(); | 706 | unsigned char g = q[4].unicode(); |
707 | unsigned char b = q[5].unicode(); | 707 | unsigned char b = q[5].unicode(); |
708 | ch = '#'; | 708 | ch = '#'; |
709 | //qDebug("html:hrule<%u, %u>", w, h); | 709 | //qDebug("html:hrule<%u, %u>", w, h); |
710 | currentstyle.setPicture(false, hRule(w,h,r,g,b)); | 710 | currentstyle.setPicture(false, hRule(w,h,r,g,b)); |
711 | q = q.right(q.length()-6); | 711 | q = q.right(q.length()-6); |
712 | } | 712 | } |
713 | else | 713 | else |
714 | { | 714 | { |
715 | q = q.right(q.length()-1); | 715 | q = q.right(q.length()-1); |
716 | } | 716 | } |
717 | sty = currentstyle; | 717 | sty = currentstyle; |
718 | lastch = ch; | 718 | lastch = ch; |
719 | return; | 719 | return; |
720 | } | 720 | } |
721 | do | 721 | do |
722 | { | 722 | { |
723 | unsigned long npos; | 723 | unsigned long npos; |
724 | CStyle dummy; | 724 | CStyle dummy; |
725 | mygetch(ch, dummy, pos); | 725 | mygetch(ch, dummy, pos); |
726 | while (ch == '<' && ch != UEOF) | 726 | while (ch == '<' && ch != UEOF) |
727 | { | 727 | { |
728 | ch = skip_ws(); | 728 | ch = skip_ws(); |
729 | QString ent = getname(ch, " >").lower(); | 729 | QString ent = getname(ch, " >").lower(); |
730 | 730 | ||
731 | // qDebug("Entity:%s", (const char*)ent); | 731 | // qDebug("Entity:%s", (const char*)ent); |
732 | 732 | ||
733 | if (ent == "a"/* || ent == "reference"*/) | 733 | if (ent == "a"/* || ent == "reference"*/) |
734 | { | 734 | { |
735 | if (ch == ' ') ch = skip_ws(); | 735 | if (ch == ' ') ch = skip_ws(); |
736 | bool fileposfound = false; | 736 | bool fileposfound = false; |
737 | bool ishref = false; | 737 | bool ishref = false; |
738 | unsigned int filepos = 0; | 738 | unsigned int filepos = 0; |
739 | QString ref, name; | 739 | QString ref, name; |
740 | while (ch != '>' && ch != UEOF) | 740 | while (ch != '>' && ch != UEOF) |
741 | { | 741 | { |
742 | QString ent = getname(ch, " =>").lower(); | 742 | QString ent = getname(ch, " =>").lower(); |
743 | QString attr = getattr(ch); | 743 | QString attr = getattr(ch); |
744 | //qDebug("<A>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); | 744 | //qDebug("<A>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); |
745 | if (ent == "name") | 745 | if (ent == "name") |
746 | { | 746 | { |
747 | name = attr; | 747 | name = attr; |
748 | } | 748 | } |
749 | if (ent == "onclick") | 749 | if (ent == "onclick") |
750 | { | 750 | { |
751 | int st = attr.find('\''); | 751 | int st = attr.find('\''); |
752 | int nd = attr.findRev('\''); | 752 | int nd = attr.findRev('\''); |
753 | ref = attr.mid(st+1, nd-st-1); | 753 | ref = attr.mid(st+1, nd-st-1); |
754 | ishref = true; | 754 | ishref = true; |
755 | qDebug("Onclick:%s", (const char*)ref); | 755 | qDebug("Onclick:%s", (const char*)ref); |
756 | } | 756 | } |
757 | if (ent == "href") | 757 | if (ent == "href") |
758 | { | 758 | { |
759 | ishref = true; | 759 | ishref = true; |
760 | ref = attr; | 760 | ref = attr; |
761 | } | 761 | } |
762 | if (ent == "filepos") | 762 | if (ent == "filepos") |
763 | { | 763 | { |
764 | filepos = attr.toUInt(&fileposfound); | 764 | filepos = attr.toUInt(&fileposfound); |
765 | if (ref.isEmpty()) | 765 | if (ref.isEmpty()) |
766 | { | 766 | { |
767 | ishref = true; | 767 | ishref = true; |
768 | ref = attr; | 768 | ref = attr; |
769 | } | 769 | } |
770 | } | 770 | } |
771 | if (ent == "title") | 771 | if (ent == "title") |
772 | { | 772 | { |
773 | text_q = attr + "</a><p>"; | 773 | text_q = attr + "</a><p>"; |
774 | } | 774 | } |
775 | //qDebug("<a %s=%s>", (const char*)ent, (const char*)ref); | 775 | //qDebug("<a %s=%s>", (const char*)ent, (const char*)ref); |
776 | } | 776 | } |
777 | if (ishref) | 777 | if (ishref) |
778 | { | 778 | { |
779 | currentstyle.setColour(0,0,255); | 779 | currentstyle.setColour(0,0,255); |
780 | currentstyle.setLink(true); | 780 | currentstyle.setLink(true); |
781 | currentstyle.setData(currentid); | 781 | currentstyle.setData(currentid); |
782 | if (!text_q.isEmpty()) | 782 | if (!text_q.isEmpty()) |
783 | { | 783 | { |
784 | currentstyle.setBold(); | 784 | currentstyle.setBold(); |
785 | currentstyle.setCentreJustify(); | 785 | currentstyle.setCentreJustify(); |
786 | } | 786 | } |
787 | (*id2href)[currentid] = ref; | 787 | (*id2href)[currentid] = ref; |
788 | currentid++; | 788 | currentid++; |
789 | 789 | ||
790 | 790 | ||
791 | if (fileposfound) | 791 | if (fileposfound) |
792 | { | 792 | { |
793 | (*href2filepos)[ref] = filepos; | 793 | (*href2filepos)[ref] = filepos; |
794 | } | 794 | } |
795 | } | 795 | } |
796 | if (!name.isEmpty()) | 796 | if (!name.isEmpty()) |
797 | { | 797 | { |
798 | (*href2filepos)[name] = pos; | 798 | (*href2filepos)[name] = pos; |
799 | } | 799 | } |
800 | } | 800 | } |
801 | else if (ent == "p") | 801 | else if (ent == "p") |
802 | { | 802 | { |
803 | parse_paragraph(currentstyle, ch, pos); | 803 | parse_paragraph(currentstyle, ch, pos); |
804 | currentstyle.setExtraSpace(3); | 804 | currentstyle.setExtraSpace(3); |
805 | continue; | 805 | continue; |
806 | } | 806 | } |
807 | else if (ent == "div") | 807 | else if (ent == "div") |
808 | { | 808 | { |
809 | parse_paragraph(currentstyle, ch, pos); | 809 | parse_paragraph(currentstyle, ch, pos); |
810 | stylestack.push_front(currentstyle); | 810 | stylestack.push_front(currentstyle); |
811 | currentstyle.setExtraSpace(16); | 811 | currentstyle.setExtraSpace(16); |
812 | //indent = 0; | 812 | //indent = 0; |
813 | continue; | 813 | continue; |
814 | } | 814 | } |
815 | else if (ent == "sup") | 815 | else if (ent == "sup") |
816 | { | 816 | { |
817 | currentstyle.setVOffset(-1); | 817 | currentstyle.setVOffset(-1); |
818 | } | 818 | } |
819 | else if (ent == "sup") | 819 | else if (ent == "sup") |
820 | { | 820 | { |
821 | currentstyle.setVOffset(1); | 821 | currentstyle.setVOffset(1); |
822 | } | 822 | } |
823 | else if (ent == "/sup" || ent == "/sub") | 823 | else if (ent == "/sup" || ent == "/sub") |
824 | { | 824 | { |
825 | currentstyle.setVOffset(0); | 825 | currentstyle.setVOffset(0); |
826 | } | 826 | } |
827 | else if (ent == "span") | 827 | else if (ent == "span") |
828 | { | 828 | { |
829 | if (ch == ' ') ch = skip_ws(); | 829 | if (ch == ' ') ch = skip_ws(); |
830 | while (ch != '>' && ch != UEOF) | 830 | while (ch != '>' && ch != UEOF) |
831 | { | 831 | { |
832 | QString ent = getname(ch, " =>").lower(); | 832 | QString ent = getname(ch, " =>").lower(); |
833 | QString attr = getattr(ch).lower(); | 833 | QString attr = getattr(ch).lower(); |
834 | if (ent == "bgcolor") | 834 | if (ent == "bgcolor") |
835 | { | 835 | { |
836 | qDebug("Got background colour:%s", (const char*)attr); | 836 | qDebug("Got background colour:%s", (const char*)attr); |
837 | unsigned char r,g,b; | 837 | unsigned char r,g,b; |
838 | parse_color(attr, r, g, b); | 838 | parse_color(attr, r, g, b); |
839 | currentstyle.setBackground(r, g, b); | 839 | currentstyle.setBackground(r, g, b); |
840 | } | 840 | } |
841 | if (ent == "color") | 841 | if (ent == "color") |
842 | { | 842 | { |
843 | qDebug("Got foreground colour:%s", (const char*)attr); | 843 | qDebug("Got foreground colour:%s", (const char*)attr); |
844 | unsigned char r,g,b; | 844 | unsigned char r,g,b; |
845 | parse_color(attr, r, g, b); | 845 | parse_color(attr, r, g, b); |
846 | currentstyle.setColour(r, g, b); | 846 | currentstyle.setColour(r, g, b); |
847 | } | 847 | } |
848 | } | 848 | } |
849 | stylestack.push_front(currentstyle); | 849 | stylestack.push_front(currentstyle); |
850 | } | 850 | } |
851 | else if (ent == "/span") | 851 | else if (ent == "/span") |
852 | { | 852 | { |
853 | if (ch != '>') ch = skip_ws_end(); | 853 | if (ch != '>') ch = skip_ws_end(); |
854 | currentstyle.setBackground(255, 255, 255); | 854 | currentstyle.setBackground(255, 255, 255); |
855 | currentstyle.setColour(0, 0, 0); | 855 | currentstyle.setColour(0, 0, 0); |
856 | if (!stylestack.isEmpty()) | 856 | if (!stylestack.isEmpty()) |
857 | { | 857 | { |
858 | stylestack.pop(); | 858 | stylestack.pop(); |
859 | } | 859 | } |
860 | } | 860 | } |
861 | else if (ent == "pre") | 861 | else if (ent == "pre") |
862 | { | 862 | { |
863 | isPre = true; | 863 | isPre = true; |
864 | currentstyle.setNoJustify(); | 864 | currentstyle.setNoJustify(); |
865 | currentstyle.setMono(); | 865 | currentstyle.setMono(); |
866 | } | 866 | } |
867 | else if (ent == "tt") | 867 | else if (ent == "tt") |
868 | { | 868 | { |
869 | currentstyle.setMono(); | 869 | currentstyle.setMono(); |
870 | } | 870 | } |
871 | else if (ent == "b" || ent == "strong") | 871 | else if (ent == "b" || ent == "strong") |
872 | { | 872 | { |
873 | currentstyle.setBold(); | 873 | currentstyle.setBold(); |
874 | } | 874 | } |
875 | else if (ent == "u") | 875 | else if (ent == "u") |
876 | { | 876 | { |
877 | currentstyle.setUnderline(); | 877 | currentstyle.setUnderline(); |
878 | } | 878 | } |
879 | else if (ent == "/u") | 879 | else if (ent == "/u") |
880 | { | 880 | { |
881 | currentstyle.unsetUnderline(); | 881 | currentstyle.unsetUnderline(); |
882 | } | 882 | } |
883 | else if (ent == "blockquote") | 883 | else if (ent == "blockquote") |
884 | { | 884 | { |
885 | if (ch != '>') ch = skip_ws_end(); | 885 | if (ch != '>') ch = skip_ws_end(); |
886 | ch = 10; | 886 | ch = 10; |
887 | currentstyle.setExtraSpace(0); | 887 | currentstyle.setExtraSpace(0); |
888 | currentstyle.setLeftMargin(30); | 888 | currentstyle.setLeftMargin(30); |
889 | currentstyle.setRightMargin(30); | 889 | currentstyle.setRightMargin(30); |
890 | continue; | 890 | continue; |
891 | } | 891 | } |
892 | else if (ent == "br" || ent == "br/") | 892 | else if (ent == "br" || ent == "br/") |
893 | { | 893 | { |
894 | if (ch != '>') ch = skip_ws_end(); | 894 | if (ch != '>') ch = skip_ws_end(); |
895 | ch = 10; | 895 | ch = 10; |
896 | currentstyle.setExtraSpace(0); | 896 | currentstyle.setExtraSpace(0); |
897 | lastch = 0; | 897 | lastch = 0; |
898 | continue; | 898 | continue; |
899 | } | 899 | } |
900 | else if (ent == "mbp:pagebreak") | 900 | else if (ent == "mbp:pagebreak") |
901 | { | 901 | { |
902 | /* | 902 | /* |
903 | if (ch != '>') ch = skip_ws_end(pos); | 903 | if (ch != '>') ch = skip_ws_end(pos); |
904 | q += 10; | 904 | q += 10; |
905 | q += QChar(UEOF); | 905 | q += QChar(UEOF); |
906 | ch = 10; | 906 | ch = 10; |
907 | continue; | 907 | continue; |
908 | */ | 908 | */ |
909 | ch = 6; | 909 | ch = 6; |
910 | // currentstyle.setTop(); | 910 | // currentstyle.setTop(); |
911 | continue; | 911 | continue; |
912 | } | 912 | } |
913 | else if (ent == "center") | 913 | else if (ent == "center") |
914 | { | 914 | { |
915 | //forcecentre = true; | 915 | //forcecentre = true; |
916 | qDebug("setting centre"); | 916 | qDebug("setting centre"); |
917 | currentstyle.setCentreJustify(); | 917 | currentstyle.setCentreJustify(); |
918 | ch = 10; | 918 | ch = 10; |
919 | continue; | 919 | continue; |
920 | } | 920 | } |
921 | else if (ent == "/center") | 921 | else if (ent == "/center") |
922 | { | 922 | { |
923 | qDebug("unsetting centre"); | 923 | qDebug("unsetting centre"); |
924 | forcecentre = false; | 924 | forcecentre = false; |
925 | } | 925 | } |
926 | else if (ent == "li") | 926 | else if (ent == "li") |
927 | { | 927 | { |
928 | if (ch != '>') ch = skip_ws_end(); | 928 | if (ch != '>') ch = skip_ws_end(); |
929 | lastch = 0; | 929 | lastch = 0; |
930 | ch = 10; | 930 | ch = 10; |
931 | if (m_listtype[indent % m_cmaxdepth] == 1) | 931 | if (m_listtype[indent % m_cmaxdepth] == 1) |
932 | { | 932 | { |
933 | q.setNum(m_ctr[indent % m_cmaxdepth]++); | 933 | q.setNum(m_ctr[indent % m_cmaxdepth]++); |
934 | } | 934 | } |
935 | else | 935 | else |
936 | { | 936 | { |
937 | q += QChar(8226); | 937 | q += QChar(8226); |
938 | } | 938 | } |
939 | q += ' '; | 939 | q += ' '; |
940 | currentstyle.setLeftMargin(6*indent); | 940 | currentstyle.setLeftMargin(6*indent); |
941 | qDebug("Setting indent:%d", indent); | 941 | qDebug("Setting indent:%d", indent); |
942 | continue; | 942 | continue; |
943 | } | 943 | } |
944 | else if (ent == "ul") | 944 | else if (ent == "ul") |
945 | { | 945 | { |
946 | indent++; | 946 | indent++; |
947 | m_listtype[indent % m_cmaxdepth] = 0; | 947 | m_listtype[indent % m_cmaxdepth] = 0; |
948 | } | 948 | } |
949 | else if (ent == "/ul") | 949 | else if (ent == "/ul") |
950 | { | 950 | { |
951 | indent--; | 951 | indent--; |
952 | } | 952 | } |
953 | else if (ent == "ol") | 953 | else if (ent == "ol") |
954 | { | 954 | { |
955 | indent++; | 955 | indent++; |
956 | m_listtype[indent % m_cmaxdepth] = 1; | 956 | m_listtype[indent % m_cmaxdepth] = 1; |
957 | m_ctr[indent % m_cmaxdepth] = 1; | 957 | m_ctr[indent % m_cmaxdepth] = 1; |
958 | } | 958 | } |
959 | else if (ent == "/ol") | 959 | else if (ent == "/ol") |
960 | { | 960 | { |
961 | indent--; | 961 | indent--; |
962 | } | 962 | } |
963 | else if (ent == "i") | 963 | else if (ent == "i") |
964 | { | 964 | { |
965 | currentstyle.setItalic(); | 965 | currentstyle.setItalic(); |
966 | } | 966 | } |
967 | else if (ent == "em") | 967 | else if (ent == "em") |
968 | { | 968 | { |
969 | currentstyle.setItalic(); | 969 | currentstyle.setItalic(); |
970 | } | 970 | } |
971 | else if (ent == "small") | 971 | else if (ent == "small") |
972 | { | 972 | { |
973 | currentstyle.setFontSize(-2); | 973 | currentstyle.setFontSize(-2); |
974 | } | 974 | } |
975 | else if (ent == "/small") | 975 | else if (ent == "/small") |
976 | { | 976 | { |
977 | currentstyle.setFontSize(0); | 977 | currentstyle.setFontSize(0); |
978 | } | 978 | } |
979 | else if (ent == "big") | 979 | else if (ent == "big") |
980 | { | 980 | { |
981 | currentstyle.setFontSize(2); | 981 | currentstyle.setFontSize(2); |
982 | } | 982 | } |
983 | else if (ent == "/big") | 983 | else if (ent == "/big") |
984 | { | 984 | { |
985 | currentstyle.setFontSize(0); | 985 | currentstyle.setFontSize(0); |
986 | } | 986 | } |
987 | else if (ent[0] == '/' && ent[1] == 'h' && ent.length() == 3 && QString("123456789").find(ent[2]) != -1) | 987 | else if (ent[0] == '/' && ent[1] == 'h' && ent.length() == 3 && QString("123456789").find(ent[2]) != -1) |
988 | { | 988 | { |
989 | parse_paragraph(currentstyle, ch, pos); | 989 | parse_paragraph(currentstyle, ch, pos); |
990 | currentstyle.setExtraSpace(3); | 990 | currentstyle.setExtraSpace(3); |
991 | continue; | 991 | continue; |
992 | } | 992 | } |
993 | else if (ent[0] == 'h' && ent.length() == 2 && QString("123456789").find(ent[1]) != -1) | 993 | else if (ent[0] == 'h' && ent.length() == 2 && QString("123456789").find(ent[1]) != -1) |
994 | { | 994 | { |
995 | indent = 0; | 995 | indent = 0; |
996 | if (ent[1] == '1') | 996 | if (ent[1] == '1') |
997 | { | 997 | { |
998 | parse_paragraph(currentstyle, ch, pos); | 998 | parse_paragraph(currentstyle, ch, pos); |
999 | currentstyle.setFontSize(3); | 999 | currentstyle.setFontSize(3); |
1000 | currentstyle.setExtraSpace(8); | 1000 | currentstyle.setExtraSpace(8); |
1001 | currentstyle.setBold(); | 1001 | currentstyle.setBold(); |
1002 | // currentstyle.setExtraSpace(10); | 1002 | // currentstyle.setExtraSpace(10); |
1003 | } | 1003 | } |
1004 | else if (ent[1] == '2') | 1004 | else if (ent[1] == '2') |
1005 | { | 1005 | { |
1006 | parse_paragraph(currentstyle, ch, pos); | 1006 | parse_paragraph(currentstyle, ch, pos); |
1007 | currentstyle.setFontSize(2); | 1007 | currentstyle.setFontSize(2); |
1008 | currentstyle.setExtraSpace(6); | 1008 | currentstyle.setExtraSpace(6); |
1009 | currentstyle.setBold(); | 1009 | currentstyle.setBold(); |
1010 | // currentstyle.setExtraSpace(10); | 1010 | // currentstyle.setExtraSpace(10); |
1011 | } | 1011 | } |
1012 | else if (ent[1] == '3') | 1012 | else if (ent[1] == '3') |
1013 | { | 1013 | { |
1014 | parse_paragraph(currentstyle, ch, pos); | 1014 | parse_paragraph(currentstyle, ch, pos); |
1015 | currentstyle.setFontSize(1); | 1015 | currentstyle.setFontSize(1); |
1016 | currentstyle.setExtraSpace(4); | 1016 | currentstyle.setExtraSpace(4); |
1017 | currentstyle.setBold(); | 1017 | currentstyle.setBold(); |
1018 | // currentstyle.setExtraSpace(10); | 1018 | // currentstyle.setExtraSpace(10); |
1019 | } | 1019 | } |
1020 | else | 1020 | else |
1021 | { | 1021 | { |
1022 | parse_paragraph(currentstyle, ch, pos); | 1022 | parse_paragraph(currentstyle, ch, pos); |
1023 | currentstyle.setExtraSpace(4); | 1023 | currentstyle.setExtraSpace(4); |
1024 | currentstyle.setBold(); | 1024 | currentstyle.setBold(); |
1025 | // currentstyle.setExtraSpace(10); | 1025 | // currentstyle.setExtraSpace(10); |
1026 | } | 1026 | } |
1027 | ch = 10; | 1027 | ch = 10; |
1028 | continue; | 1028 | continue; |
1029 | } | 1029 | } |
1030 | 1030 | ||
1031 | 1031 | ||
1032 | else if (ent == "/a") | 1032 | else if (ent == "/a") |
1033 | { | 1033 | { |
1034 | currentstyle.setColour(0,0,0); | 1034 | currentstyle.setColour(0,0,0); |
1035 | currentstyle.setLink(false); | 1035 | currentstyle.setLink(false); |
1036 | } | 1036 | } |
1037 | else if (ent == "/pre") | 1037 | else if (ent == "/pre") |
1038 | { | 1038 | { |
1039 | currentstyle.unsetMono(); | 1039 | currentstyle.unsetMono(); |
1040 | isPre = false; | 1040 | isPre = false; |
1041 | } | 1041 | } |
1042 | else if (ent == "/tt") | 1042 | else if (ent == "/tt") |
1043 | { | 1043 | { |
1044 | currentstyle.unsetMono(); | 1044 | currentstyle.unsetMono(); |
1045 | } | 1045 | } |
1046 | else if (ent == "/b" || ent == "/strong") | 1046 | else if (ent == "/b" || ent == "/strong") |
1047 | { | 1047 | { |
1048 | currentstyle.unsetBold(); | 1048 | currentstyle.unsetBold(); |
1049 | } | 1049 | } |
1050 | else if (ent == "/i") | 1050 | else if (ent == "/i") |
1051 | { | 1051 | { |
1052 | currentstyle.unsetItalic(); | 1052 | currentstyle.unsetItalic(); |
1053 | } | 1053 | } |
1054 | else if (ent == "/em") | 1054 | else if (ent == "/em") |
1055 | { | 1055 | { |
1056 | currentstyle.unsetItalic(); | 1056 | currentstyle.unsetItalic(); |
1057 | } | 1057 | } |
1058 | else if (ent == "/div") | 1058 | else if (ent == "/div") |
1059 | { | 1059 | { |
1060 | currentstyle.unset(); | 1060 | currentstyle.unset(); |
1061 | if (ch != '>') ch = skip_ws_end(); | 1061 | if (ch != '>') ch = skip_ws_end(); |
1062 | ch = 10; | 1062 | ch = 10; |
1063 | if (!stylestack.isEmpty()) | 1063 | if (!stylestack.isEmpty()) |
1064 | { | 1064 | { |
1065 | stylestack.pop(); | 1065 | stylestack.pop(); |
1066 | } | 1066 | } |
1067 | continue; | 1067 | continue; |
1068 | } | 1068 | } |
1069 | else if (ent == "tr") | 1069 | else if (ent == "tr") |
1070 | { | 1070 | { |
1071 | if (ch != '>') ch = skip_ws_end(); | 1071 | if (ch != '>') ch = skip_ws_end(); |
1072 | ch = 10; | 1072 | ch = 10; |
1073 | q += '-'; | 1073 | q += '-'; |
1074 | q += QChar(parent->getwidth()); | 1074 | q += QChar(parent->getwidth()); |
1075 | q += 2; | 1075 | q += 2; |
1076 | q += '\0'; | 1076 | q += '\0'; |
1077 | q += '\0'; | 1077 | q += '\0'; |
1078 | q += '\0'; | 1078 | q += '\0'; |
1079 | continue; | 1079 | continue; |
1080 | } | 1080 | } |
1081 | else if (ent == "td") | 1081 | else if (ent == "td") |
1082 | { | 1082 | { |
1083 | if (ch != '>') ch = skip_ws_end(); | 1083 | if (ch != '>') ch = skip_ws_end(); |
1084 | ignorespace = false; | 1084 | ignorespace = false; |
1085 | } | 1085 | } |
1086 | else if (ent == "/td") | 1086 | else if (ent == "/td") |
1087 | { | 1087 | { |
1088 | ignorespace = true; | 1088 | ignorespace = true; |
1089 | // parse_paragraph(currentstyle, ch, pos); | 1089 | // parse_paragraph(currentstyle, ch, pos); |
1090 | //stylestack.push_front(currentstyle); | 1090 | //stylestack.push_front(currentstyle); |
1091 | if (ch != '>') ch = skip_ws_end(); | 1091 | if (ch != '>') ch = skip_ws_end(); |
1092 | // ch = '|'; | 1092 | // ch = '|'; |
1093 | //continue; | 1093 | //continue; |
1094 | ch = 10; | 1094 | ch = 10; |
1095 | q += '-'; | 1095 | q += '-'; |
1096 | q += QChar(parent->getwidth()); | 1096 | q += QChar(parent->getwidth()); |
1097 | q += 1; | 1097 | q += 1; |
1098 | q += '\0'; | 1098 | q += '\0'; |
1099 | q += '\0'; | 1099 | q += '\0'; |
1100 | q += '\0'; | 1100 | q += '\0'; |
1101 | continue; | 1101 | continue; |
1102 | } | 1102 | } |
1103 | /* | 1103 | /* |
1104 | else if (ent == "/td") | 1104 | else if (ent == "/td") |
1105 | { | 1105 | { |
1106 | currentstyle.unset(); | 1106 | currentstyle.unset(); |
1107 | if (ch != '>') ch = skip_ws_end(); | 1107 | if (ch != '>') ch = skip_ws_end(); |
1108 | if (!stylestack.isEmpty()) | 1108 | if (!stylestack.isEmpty()) |
1109 | { | 1109 | { |
1110 | stylestack.pop(); | 1110 | stylestack.pop(); |
1111 | } | 1111 | } |
1112 | // ch = 10; | 1112 | // ch = 10; |
1113 | continue; | 1113 | continue; |
1114 | } | 1114 | } |
1115 | */ | 1115 | */ |
1116 | else if (ent[0] == '/' && ent.length() == 3 && ent[1] == 'h' && QString("123456789").find(ent[2]) != -1) | 1116 | else if (ent[0] == '/' && ent.length() == 3 && ent[1] == 'h' && QString("123456789").find(ent[2]) != -1) |
1117 | { | 1117 | { |
1118 | currentstyle.unset(); | 1118 | currentstyle.unset(); |
1119 | if (ch != '>') ch = skip_ws_end(); | 1119 | if (ch != '>') ch = skip_ws_end(); |
1120 | //ch = 10; | 1120 | //ch = 10; |
1121 | //continue; | 1121 | //continue; |
1122 | } | 1122 | } |
1123 | else if (ent == "table" || ent == "/table") | 1123 | else if (ent == "table" || ent == "/table") |
1124 | { | 1124 | { |
1125 | currentstyle.unset(); | 1125 | currentstyle.unset(); |
1126 | ignorespace = (ent == "table"); | 1126 | ignorespace = (ent == "table"); |
1127 | if (ent == "table") | 1127 | if (ent == "table") |
1128 | { | 1128 | { |
1129 | if (tablenesteddepth++ == 0) currentstyle.setTable(pos); | 1129 | if (tablenesteddepth++ == 0) currentstyle.setTable(pos); |
1130 | } | 1130 | } |
1131 | else | 1131 | else |
1132 | { | 1132 | { |
1133 | if (--tablenesteddepth <= 0) | 1133 | if (--tablenesteddepth <= 0) |
1134 | { | 1134 | { |
1135 | tablenesteddepth = 0; | 1135 | tablenesteddepth = 0; |
1136 | currentstyle.setTable(0xffffffff); | 1136 | currentstyle.setTable(0xffffffff); |
1137 | } | 1137 | } |
1138 | } | 1138 | } |
1139 | if (ch == ' ') ch = skip_ws(); | 1139 | if (ch == ' ') ch = skip_ws(); |
1140 | while (ch != '>' && ch != UEOF) | 1140 | while (ch != '>' && ch != UEOF) |
1141 | { | 1141 | { |
1142 | QString ent = getname(ch, " =>").lower(); | 1142 | QString ent = getname(ch, " =>").lower(); |
1143 | QString attr = getattr(ch); | 1143 | QString attr = getattr(ch); |
1144 | qDebug("<table>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); | 1144 | qDebug("<table>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); |
1145 | } | 1145 | } |
1146 | if (ch != '>') ch = skip_ws_end(); | 1146 | if (ch != '>') ch = skip_ws_end(); |
1147 | 1147 | ||
1148 | currentstyle.setLeftMargin(6*tablenesteddepth); | 1148 | currentstyle.setLeftMargin(6*tablenesteddepth); |
1149 | 1149 | ||
1150 | 1150 | ||
1151 | lastch = 0; // Anything but 10 | 1151 | lastch = 0; // Anything but 10 |
1152 | ch = 10; | 1152 | ch = 10; |
1153 | q += '-'; | 1153 | q += '-'; |
1154 | q += QChar(parent->getwidth()); | 1154 | q += QChar(parent->getwidth()); |
1155 | q += 3; | 1155 | q += 3; |
1156 | q += '\0'; | 1156 | q += '\0'; |
1157 | q += '\0'; | 1157 | q += '\0'; |
1158 | q += '\0'; | 1158 | q += '\0'; |
1159 | continue; | 1159 | continue; |
1160 | } | 1160 | } |
1161 | else if (ent == "hr") | 1161 | else if (ent == "hr") |
1162 | { | 1162 | { |
1163 | //bool isPageBreak = false; | 1163 | //bool isPageBreak = false; |
1164 | if (ch == ' ') ch = skip_ws(); | 1164 | if (ch == ' ') ch = skip_ws(); |
1165 | unsigned char red = 0, green = 0, blue = 0; | 1165 | unsigned char red = 0, green = 0, blue = 0; |
1166 | while (ch != '>' && ch != UEOF) | 1166 | while (ch != '>' && ch != UEOF) |
1167 | { | 1167 | { |
1168 | QString ent = getname(ch, " =>").lower(); | 1168 | QString ent = getname(ch, " =>").lower(); |
1169 | QString attr = getattr(ch); | 1169 | QString attr = getattr(ch); |
1170 | if (ent == "color") | 1170 | if (ent == "color") |
1171 | { | 1171 | { |
1172 | parse_color(attr, red, green, blue); | 1172 | parse_color(attr, red, green, blue); |
1173 | } | 1173 | } |
1174 | /* | 1174 | /* |
1175 | if (ent == "size") | 1175 | if (ent == "size") |
1176 | { | 1176 | { |
1177 | if (attr == "0") | 1177 | if (attr == "0") |
1178 | { | 1178 | { |
1179 | isPageBreak = true; | 1179 | isPageBreak = true; |
1180 | } | 1180 | } |
1181 | } | 1181 | } |
1182 | */ | 1182 | */ |
1183 | qDebug("<hr>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); | 1183 | qDebug("<hr>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); |
1184 | } | 1184 | } |
1185 | if (ch != '>') ch = skip_ws_end(); | 1185 | if (ch != '>') ch = skip_ws_end(); |
1186 | /* | 1186 | /* |
1187 | if (isPageBreak) | 1187 | if (isPageBreak) |
1188 | { | 1188 | { |
1189 | ch = UEOF; | 1189 | ch = UEOF; |
1190 | } | 1190 | } |
1191 | else | 1191 | else |
1192 | { | 1192 | { |
1193 | */ | 1193 | */ |
1194 | // if (stylestack.isEmpty()) | 1194 | // if (stylestack.isEmpty()) |
1195 | // { | 1195 | // { |
1196 | currentstyle.unset(); | 1196 | currentstyle.unset(); |
1197 | // } | 1197 | // } |
1198 | /* | 1198 | /* |
1199 | else | 1199 | else |
1200 | { | 1200 | { |
1201 | qDebug("Using stack style"); | 1201 | qDebug("Using stack style"); |
1202 | currentstyle = stylestack.first(); | 1202 | currentstyle = stylestack.first(); |
1203 | } | 1203 | } |
1204 | */ | 1204 | */ |
1205 | lastch = 0; //Anything but 10 or ' ' | 1205 | lastch = 0; //Anything but 10 or ' ' |
1206 | ch = 10; | 1206 | ch = 10; |
1207 | q += '-'; | 1207 | q += '-'; |
1208 | q += QChar(parent->getwidth()); | 1208 | q += QChar(parent->getwidth()); |
1209 | q += 3; | 1209 | q += 3; |
1210 | q += red; | 1210 | q += red; |
1211 | q += green; | 1211 | q += green; |
1212 | q += blue; | 1212 | q += blue; |
1213 | 1213 | ||
1214 | continue; | 1214 | continue; |
1215 | } | 1215 | } |
1216 | 1216 | ||
1217 | 1217 | ||
1218 | 1218 | ||
1219 | else if (ent == "img") | 1219 | else if (ent == "img") |
1220 | { | 1220 | { |
1221 | if (ch == ' ') ch = skip_ws(); | 1221 | if (ch == ' ') ch = skip_ws(); |
1222 | while (ch != '>' && ch != UEOF) | 1222 | while (ch != '>' && ch != UEOF) |
1223 | { | 1223 | { |
1224 | QString ent = getname(ch, " =>").lower(); | 1224 | QString ent = getname(ch, " =>").lower(); |
1225 | QString attr = getattr(ch); | 1225 | QString attr = getattr(ch); |
1226 | qDebug("<img>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); | 1226 | qDebug("<img>Entity:%s Attr:%s", (const char*)ent, (const char*)attr); |
1227 | if (ent == "src") | 1227 | if (ent == "src") |
1228 | { | 1228 | { |
1229 | /* | 1229 | /* |
1230 | if (m_bchm) | 1230 | if (m_bchm) |
1231 | { | 1231 | { |
1232 | QImage* img = parent->getPicture(attr); | 1232 | QImage* img = parent->getPicture(attr); |
1233 | if (img != NULL) | 1233 | if (img != NULL) |
1234 | { | 1234 | { |
1235 | currentstyle.setPicture(true, img); | 1235 | currentstyle.setPicture(true, img); |
1236 | } | 1236 | } |
1237 | } | 1237 | } |
1238 | */ | 1238 | */ |
1239 | 1239 | ||
1240 | 1240 | ||
1241 | QImage* img = parent->getPicture(attr); | 1241 | QImage* img = parent->getPicture(attr); |
1242 | if (img != NULL) | 1242 | if (img != NULL) |
1243 | { | 1243 | { |
1244 | currentstyle.setPicture(true, img); | 1244 | currentstyle.setPicture(true, img); |
1245 | } | 1245 | } |
1246 | else | 1246 | else |
1247 | { | 1247 | { |
1248 | QFileInfo f(currentfile); | 1248 | QFileInfo f(currentfile); |
1249 | QFileInfo f1(f.dir(true), attr); | 1249 | QFileInfo f1(f.dir(true), attr); |
1250 | QPixmap pm; | 1250 | QPixmap pm; |
1251 | if (pm.load(f1.absFilePath())) | 1251 | if (pm.load(f1.absFilePath())) |
1252 | { | 1252 | { |
1253 | QImage* img = new QImage(pm.convertToImage()); | 1253 | QImage* img = new QImage(pm.convertToImage()); |
1254 | currentstyle.setPicture(true, img); | 1254 | currentstyle.setPicture(true, img); |
1255 | } | 1255 | } |
1256 | } | 1256 | } |
1257 | } | 1257 | } |
1258 | if (ent == "recindex") | 1258 | if (ent == "recindex") |
1259 | { | 1259 | { |
1260 | bool ok; | 1260 | bool ok; |
1261 | unsigned int picindex = attr.toUInt(&ok); | 1261 | unsigned int picindex = attr.toUInt(&ok); |
1262 | qDebug("Looking for image at %u", picindex); | 1262 | qDebug("Looking for image at %u", picindex); |
1263 | QImage* img = parent->getPicture(picindex); | 1263 | QImage* img = parent->getPicture(picindex); |
1264 | if (img != NULL) | 1264 | if (img != NULL) |
1265 | { | 1265 | { |
1266 | currentstyle.setPicture(true, img); | 1266 | currentstyle.setPicture(true, img); |
1267 | } | 1267 | } |
1268 | else | 1268 | else |
1269 | { | 1269 | { |
1270 | qDebug("No image found"); | 1270 | qDebug("No image found"); |
1271 | } | 1271 | } |
1272 | } | 1272 | } |
1273 | } | 1273 | } |
1274 | if (ch != '>') ch = skip_ws_end(); | 1274 | if (ch != '>') ch = skip_ws_end(); |
1275 | ch = '#'; | 1275 | ch = '#'; |
1276 | break; | 1276 | break; |
1277 | } | 1277 | } |
1278 | else if (ent.left(2) == "dc") | 1278 | else if (ent.left(2) == "dc") |
1279 | { | 1279 | { |
1280 | QString nd("/"); | 1280 | QString nd("/"); |
1281 | skipblock(nd+ent); | 1281 | skipblock(nd+ent); |
1282 | } | 1282 | } |
1283 | else if (ent == "metadata") | 1283 | else if (ent == "metadata") |
1284 | { | 1284 | { |
1285 | // skipblock("/metadata"); | 1285 | // skipblock("/metadata"); |
1286 | } | 1286 | } |
1287 | else if (ent == "title") | 1287 | else if (ent == "title") |
1288 | { | 1288 | { |
1289 | skipblock("/title"); | 1289 | skipblock("/title"); |
1290 | } | 1290 | } |
1291 | else if (ent == "head") | 1291 | else if (ent == "head") |
1292 | { | 1292 | { |
1293 | skipblock("/head"); | 1293 | skipblock("/head"); |
1294 | } | 1294 | } |
1295 | /* | 1295 | /* |
1296 | else if (ent == "metadata") | 1296 | else if (ent == "metadata") |
1297 | { | 1297 | { |
1298 | currentstyle.setFontSize(-2); | 1298 | currentstyle.setFontSize(-2); |
1299 | } | 1299 | } |
1300 | else if (ent == "/metadata") | 1300 | else if (ent == "/metadata") |
1301 | { | 1301 | { |
1302 | currentstyle.unset(); | 1302 | currentstyle.unset(); |
1303 | ch = 10; | 1303 | ch = 10; |
1304 | continue; | 1304 | continue; |
1305 | } | 1305 | } |
1306 | */ | 1306 | */ |
1307 | else | 1307 | else |
1308 | { | 1308 | { |
1309 | if (ent[0] != '/') | 1309 | if (ent[0] != '/') |
1310 | qDebug("Not handling:%s", (const char*)ent); | 1310 | qDebug("Not handling:%s", (const char*)ent); |
1311 | } | 1311 | } |
1312 | 1312 | ||
1313 | if (ch != '>') ch = skip_ws_end(); | 1313 | if (ch != '>') ch = skip_ws_end(); |
1314 | if (ent[0] == '/') | 1314 | if (ent[0] == '/') |
1315 | mygetch(ch, dummy, pos); | 1315 | mygetch(ch, dummy, pos); |
1316 | else | 1316 | else |
1317 | mygetch(ch, dummy, npos); | 1317 | mygetch(ch, dummy, npos); |
1318 | } | 1318 | } |
1319 | if (ch == '&') | 1319 | if (ch == '&') |
1320 | { | 1320 | { |
1321 | mygetch(ch, dummy, npos); | 1321 | mygetch(ch, dummy, npos); |
1322 | if (ch == '#') | 1322 | if (ch == '#') |
1323 | { | 1323 | { |
1324 | int id = 0; | 1324 | int id = 0; |
1325 | mygetch(ch, dummy, npos); | 1325 | mygetch(ch, dummy, npos); |
1326 | while (ch != ';' && ch != UEOF) | 1326 | while (ch != ';' && ch != UEOF) |
1327 | { | 1327 | { |
1328 | id = 10*id+ch-'0'; | 1328 | id = 10*id+ch-'0'; |
1329 | mygetch(ch, dummy, npos); | 1329 | mygetch(ch, dummy, npos); |
1330 | } | 1330 | } |
1331 | ch = id; | 1331 | ch = id; |
1332 | } | 1332 | } |
1333 | else | 1333 | else |
1334 | { | 1334 | { |
1335 | QString en; | 1335 | QString en; |
1336 | en += ch; | 1336 | en += ch; |
1337 | mygetch(ch, dummy, npos); | 1337 | mygetch(ch, dummy, npos); |
1338 | while (ch != ';' && ch != UEOF) | 1338 | while (ch != ';' && ch != UEOF) |
1339 | { | 1339 | { |
1340 | en += ch; | 1340 | en += ch; |
1341 | mygetch(ch, dummy, npos); | 1341 | mygetch(ch, dummy, npos); |
1342 | } | 1342 | } |
1343 | if (entmap == NULL) initentmap(); | 1343 | if (entmap == NULL) initentmap(); |
1344 | #if defined(USEQPE) || defined(_WINDOWS) | 1344 | #if defined(USEQPE) || defined(_WINDOWS) |
1345 | QMap<QString, tchar>::Iterator it = entmap->find(en); | 1345 | QMap<QString, tchar>::Iterator it = entmap->find(en); |
1346 | #else | 1346 | #else |
1347 | QMap<QString, tchar>::iterator it = entmap->find(en); | 1347 | QMap<QString, tchar>::iterator it = entmap->find(en); |
1348 | #endif | 1348 | #endif |
1349 | if (it != entmap->end()) | 1349 | if (it != entmap->end()) |
1350 | { | 1350 | { |
1351 | ch = *it; | 1351 | ch = *it; |
1352 | } | 1352 | } |
1353 | else | 1353 | else |
1354 | { | 1354 | { |
1355 | ch = '.'; | 1355 | ch = '.'; |
1356 | } | 1356 | } |
1357 | } | 1357 | } |
1358 | } | 1358 | } |
1359 | // sty = (dummy == ucFontBase) ? currentstyle : dummy; | 1359 | // sty = (dummy == ucFontBase) ? currentstyle : dummy; |
1360 | if (lastch == 10 && ch == 10 && sty.getExtraSpace() > currentstyle.getExtraSpace()) | 1360 | if (lastch == 10 && ch == 10 && sty.getExtraSpace() > currentstyle.getExtraSpace()) |
1361 | { | 1361 | { |
1362 | currentstyle.setExtraSpace(sty.getExtraSpace()); | 1362 | currentstyle.setExtraSpace(sty.getExtraSpace()); |
1363 | } | 1363 | } |
1364 | sty = currentstyle; | 1364 | sty = currentstyle; |
1365 | } | 1365 | } |
1366 | while (!isPre && (((lastch == ' ' || lastch == 10 || ignorespace) && ch == ' ') || ((ch == 10) && (lastch == 10)))); | 1366 | while (!isPre && (((lastch == ' ' || lastch == 10 || ignorespace) && ch == ' ') || ((ch == 10) && (lastch == 10)))); |
1367 | // lastch = ch; | 1367 | // lastch = ch; |
1368 | lastch = ch; | 1368 | lastch = ch; |
1369 | return; | 1369 | return; |
1370 | } | 1370 | } |
1371 | 1371 | ||
1372 | QString striphtml::getTableAsHtml(unsigned long loc) | 1372 | QString striphtml::getTableAsHtml(unsigned long loc) |
1373 | { | 1373 | { |
1374 | qDebug("striphtml::getTableAsHtml"); | 1374 | qDebug("striphtml::getTableAsHtml"); |
1375 | QString ret; | 1375 | QString ret; |
1376 | tchar ch(0); | 1376 | tchar ch(0); |
1377 | CStyle sty; | 1377 | CStyle sty; |
1378 | unsigned long pos; | 1378 | unsigned long pos; |
1379 | locate(loc); | 1379 | locate(loc); |
1380 | int endpos(0); | 1380 | int endpos(0); |
1381 | QString endmarker("</table>"); | 1381 | QString endmarker("</table>"); |
1382 | QString startmarker("<table"); | 1382 | QString startmarker("<table"); |
1383 | int startpos(0); | 1383 | int startpos(0); |
1384 | int depth(0); | 1384 | int depth(0); |
1385 | while (ch != UEOF) | 1385 | while (ch != UEOF) |
1386 | { | 1386 | { |
1387 | parent->getch(ch, sty, pos); | 1387 | parent->getch(ch, sty, pos); |
1388 | QChar qc(ch); | 1388 | QChar qc(ch); |
1389 | ret += qc; | 1389 | ret += qc; |
1390 | if (qc.lower() == endmarker[endpos]) | 1390 | if (qc.lower() == endmarker[endpos]) |
1391 | { | 1391 | { |
1392 | if ((++endpos >= endmarker.length()) && (--depth <= 0)) break; | 1392 | if ((++endpos >= endmarker.length()) && (--depth <= 0)) break; |
1393 | } | 1393 | } |
1394 | else | 1394 | else |
1395 | { | 1395 | { |
1396 | endpos = 0; | 1396 | endpos = 0; |
1397 | } | 1397 | } |
1398 | if (qc.lower() == startmarker[startpos]) | 1398 | if (qc.lower() == startmarker[startpos]) |
1399 | { | 1399 | { |
1400 | if (++startpos >= startmarker.length()) ++depth; | 1400 | if (++startpos >= startmarker.length()) ++depth; |
1401 | } | 1401 | } |
1402 | else | 1402 | else |
1403 | { | 1403 | { |
1404 | startpos = 0; | 1404 | startpos = 0; |
1405 | } | 1405 | } |
1406 | } | 1406 | } |
1407 | return ret; | 1407 | return ret; |
1408 | } | 1408 | } |
1409 | 1409 | ||
1410 | 1410 | ||
1411 | extern "C" | 1411 | extern "C" |
1412 | { | 1412 | { |
1413 | CFilter* newfilter(const QString& s) { return new striphtml(s); } | 1413 | CFilter* newfilter(const QString& s) { return new striphtml(s); } |
1414 | } | 1414 | } |
diff --git a/noncore/apps/tinykate/libkate/document/katehighlight.cpp b/noncore/apps/tinykate/libkate/document/katehighlight.cpp index 89024f7..ee6030f 100644 --- a/noncore/apps/tinykate/libkate/document/katehighlight.cpp +++ b/noncore/apps/tinykate/libkate/document/katehighlight.cpp | |||
@@ -1,1468 +1,1470 @@ | |||
1 | /* | 1 | /* |
2 | Copyright (C) 1998, 1999 Jochen Wilhelmy | 2 | Copyright (C) 1998, 1999 Jochen Wilhelmy |
3 | digisnap@cs.tu-berlin.de | 3 | digisnap@cs.tu-berlin.de |
4 | (C) 2002, 2001 The Kate Team <kwrite-devel@kde.org> | 4 | (C) 2002, 2001 The Kate Team <kwrite-devel@kde.org> |
5 | (C) 2002 Joseph Wenninger <jowenn@kde.org> | 5 | (C) 2002 Joseph Wenninger <jowenn@kde.org> |
6 | This library is free software; you can redistribute it and/or | 6 | This library is free software; you can redistribute it and/or |
7 | modify it under the terms of the GNU Library General Public | 7 | modify it under the terms of the GNU Library General Public |
8 | License as published by the Free Software Foundation; either | 8 | License as published by the Free Software Foundation; either |
9 | version 2 of the License, or (at your option) any later version. | 9 | version 2 of the License, or (at your option) any later version. |
10 | 10 | ||
11 | This library is distributed in the hope that it will be useful, | 11 | This library is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | Library General Public License for more details. | 14 | Library General Public License for more details. |
15 | 15 | ||
16 | You should have received a copy of the GNU Library General Public License | 16 | You should have received a copy of the GNU Library General Public License |
17 | along with this library; see the file COPYING.LIB. If not, write to | 17 | along with this library; see the file COPYING.LIB. If not, write to |
18 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 18 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
19 | Boston, MA 02111-1307, USA. | 19 | Boston, MA 02111-1307, USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include "katehighlight.h" | 22 | #include "katehighlight.h" |
23 | #include "katetextline.h" | 23 | #include "katetextline.h" |
24 | #include "katedocument.h" | 24 | #include "katedocument.h" |
25 | #include "katesyntaxdocument.h" | 25 | #include "katesyntaxdocument.h" |
26 | 26 | ||
27 | #include "kglobal.h" | 27 | #include "kglobal.h" |
28 | //#include "kinstance.h" | 28 | //#include "kinstance.h" |
29 | //#include "kmimemagic.h" | 29 | //#include "kmimemagic.h" |
30 | #include "klocale.h" | 30 | #include "klocale.h" |
31 | //#include "kregexp.h" | 31 | //#include "kregexp.h" |
32 | #include "kglobalsettings.h" | 32 | #include "kglobalsettings.h" |
33 | #include "kdebug.h" | 33 | #include "kdebug.h" |
34 | #include "kstddirs.h" | 34 | #include "kstddirs.h" |
35 | 35 | ||
36 | /* OPIE */ | 36 | /* OPIE */ |
37 | #include <opie2/odebug.h> | 37 | #include <opie2/odebug.h> |
38 | #include <qpe/config.h> | 38 | #include <qpe/config.h> |
39 | 39 | ||
40 | /* QT */ | 40 | /* QT */ |
41 | #include <qtextstream.h> | 41 | #include <qtextstream.h> |
42 | 42 | ||
43 | /* STD */ | 43 | /* STD */ |
44 | #include <string.h> | 44 | #include <string.h> |
45 | 45 | ||
46 | 46 | ||
47 | HlManager *HlManager::s_pSelf = 0; | 47 | HlManager *HlManager::s_pSelf = 0; |
48 | 48 | ||
49 | enum Item_styles { dsNormal,dsKeyword,dsDataType,dsDecVal,dsBaseN,dsFloat,dsChar,dsString,dsComment,dsOthers}; | 49 | enum Item_styles { dsNormal,dsKeyword,dsDataType,dsDecVal,dsBaseN,dsFloat,dsChar,dsString,dsComment,dsOthers}; |
50 | 50 | ||
51 | static bool trueBool = true; | 51 | static bool trueBool = true; |
52 | static QString stdDeliminator = QString ("!%&()*+,-./:;<=>?[]^{|}~ \t\\"); | 52 | static QString stdDeliminator = QString ("!%&()*+,-./:;<=>?[]^{|}~ \t\\"); |
53 | 53 | ||
54 | int getDefStyleNum(QString name) | 54 | int getDefStyleNum(QString name) |
55 | { | 55 | { |
56 | if (name=="dsNormal") return dsNormal; | 56 | if (name=="dsNormal") return dsNormal; |
57 | if (name=="dsKeyword") return dsKeyword; | 57 | if (name=="dsKeyword") return dsKeyword; |
58 | if (name=="dsDataType") return dsDataType; | 58 | if (name=="dsDataType") return dsDataType; |
59 | if (name=="dsDecVal") return dsDecVal; | 59 | if (name=="dsDecVal") return dsDecVal; |
60 | if (name=="dsBaseN") return dsBaseN; | 60 | if (name=="dsBaseN") return dsBaseN; |
61 | if (name=="dsFloat") return dsFloat; | 61 | if (name=="dsFloat") return dsFloat; |
62 | if (name=="dsChar") return dsChar; | 62 | if (name=="dsChar") return dsChar; |
63 | if (name=="dsString") return dsString; | 63 | if (name=="dsString") return dsString; |
64 | if (name=="dsComment") return dsComment; | 64 | if (name=="dsComment") return dsComment; |
65 | if (name=="dsOthers") return dsOthers; | 65 | if (name=="dsOthers") return dsOthers; |
66 | 66 | ||
67 | return dsNormal; | 67 | return dsNormal; |
68 | } | 68 | } |
69 | 69 | ||
70 | bool ustrchr(const QChar *s, uint len, QChar c) | 70 | bool ustrchr(const QChar *s, uint len, QChar c) |
71 | { | 71 | { |
72 | for (int z=0; z < len; z++) | 72 | for (int z=0; z < len; z++) |
73 | { | 73 | { |
74 | if (*s == c) return true; | 74 | if (*s == c) return true; |
75 | s++; | 75 | s++; |
76 | } | 76 | } |
77 | 77 | ||
78 | return false; | 78 | return false; |
79 | } | 79 | } |
80 | 80 | ||
81 | HlItem::HlItem(int attribute, int context) | 81 | HlItem::HlItem(int attribute, int context) |
82 | : attr(attribute), ctx(context) {subItems=0; | 82 | : attr(attribute), ctx(context) {subItems=0; |
83 | } | 83 | } |
84 | 84 | ||
85 | HlItem::~HlItem() | 85 | HlItem::~HlItem() |
86 | { | 86 | { |
87 | //kdDebug(13010)<<"In hlItem::~HlItem()"<<endl; | 87 | //kdDebug(13010)<<"In hlItem::~HlItem()"<<endl; |
88 | if (subItems!=0) {subItems->setAutoDelete(true); subItems->clear(); delete subItems;} | 88 | if (subItems!=0) {subItems->setAutoDelete(true); subItems->clear(); delete subItems;} |
89 | } | 89 | } |
90 | 90 | ||
91 | bool HlItem::startEnable(QChar c) | 91 | bool HlItem::startEnable(QChar c) |
92 | { | 92 | { |
93 | return true; | 93 | return true; |
94 | } | 94 | } |
95 | 95 | ||
96 | HlCharDetect::HlCharDetect(int attribute, int context, QChar c) | 96 | HlCharDetect::HlCharDetect(int attribute, int context, QChar c) |
97 | : HlItem(attribute,context), sChar(c) { | 97 | : HlItem(attribute,context), sChar(c) { |
98 | } | 98 | } |
99 | 99 | ||
100 | const QChar *HlCharDetect::checkHgl(const QChar *str, int len, bool) { | 100 | const QChar *HlCharDetect::checkHgl(const QChar *str, int len, bool) { |
101 | if (*str == sChar) return str + 1; | 101 | if (*str == sChar) return str + 1; |
102 | return 0L; | 102 | return 0L; |
103 | } | 103 | } |
104 | 104 | ||
105 | Hl2CharDetect::Hl2CharDetect(int attribute, int context, QChar ch1, QChar ch2) | 105 | Hl2CharDetect::Hl2CharDetect(int attribute, int context, QChar ch1, QChar ch2) |
106 | : HlItem(attribute,context) { | 106 | : HlItem(attribute,context) { |
107 | sChar1 = ch1; | 107 | sChar1 = ch1; |
108 | sChar2 = ch2; | 108 | sChar2 = ch2; |
109 | } | 109 | } |
110 | 110 | ||
111 | const QChar *Hl2CharDetect::checkHgl(const QChar *str, int len, bool) { | 111 | const QChar *Hl2CharDetect::checkHgl(const QChar *str, int len, bool) { |
112 | if (str[0] == sChar1 && str[1] == sChar2) return str + 2; | 112 | if (str[0] == sChar1 && str[1] == sChar2) return str + 2; |
113 | return 0L; | 113 | return 0L; |
114 | } | 114 | } |
115 | 115 | ||
116 | HlStringDetect::HlStringDetect(int attribute, int context, const QString &s, bool inSensitive) | 116 | HlStringDetect::HlStringDetect(int attribute, int context, const QString &s, bool inSensitive) |
117 | : HlItem(attribute, context), str(inSensitive ? s.upper():s), _inSensitive(inSensitive) { | 117 | : HlItem(attribute, context), str(inSensitive ? s.upper():s), _inSensitive(inSensitive) { |
118 | } | 118 | } |
119 | 119 | ||
120 | HlStringDetect::~HlStringDetect() { | 120 | HlStringDetect::~HlStringDetect() { |
121 | } | 121 | } |
122 | 122 | ||
123 | const QChar *HlStringDetect::checkHgl(const QChar *s, int len, bool) { | 123 | const QChar *HlStringDetect::checkHgl(const QChar *s, int len, bool) { |
124 | if (!_inSensitive) {if (memcmp(s, str.unicode(), str.length()*sizeof(QChar)) == 0) return s + str.length();} | 124 | if (!_inSensitive) {if (memcmp(s, str.unicode(), str.length()*sizeof(QChar)) == 0) return s + str.length();} |
125 | else | 125 | else |
126 | { | 126 | { |
127 | QString tmp=QString(s,str.length()).upper(); | 127 | QString tmp=QString(s,str.length()).upper(); |
128 | if (tmp==str) return s+str.length(); | 128 | if (tmp==str) return s+str.length(); |
129 | } | 129 | } |
130 | return 0L; | 130 | return 0L; |
131 | } | 131 | } |
132 | 132 | ||
133 | 133 | ||
134 | HlRangeDetect::HlRangeDetect(int attribute, int context, QChar ch1, QChar ch2) | 134 | HlRangeDetect::HlRangeDetect(int attribute, int context, QChar ch1, QChar ch2) |
135 | : HlItem(attribute,context) { | 135 | : HlItem(attribute,context) { |
136 | sChar1 = ch1; | 136 | sChar1 = ch1; |
137 | sChar2 = ch2; | 137 | sChar2 = ch2; |
138 | } | 138 | } |
139 | 139 | ||
140 | const QChar *HlRangeDetect::checkHgl(const QChar *s, int len, bool) { | 140 | const QChar *HlRangeDetect::checkHgl(const QChar *s, int len, bool) { |
141 | if (*s == sChar1) | 141 | if (*s == sChar1) |
142 | { | 142 | { |
143 | do | 143 | do |
144 | { | 144 | { |
145 | s++; | 145 | s++; |
146 | len--; | 146 | len--; |
147 | if (len == 0) return 0L; | 147 | if (len == 0) return 0L; |
148 | } | 148 | } |
149 | while (*s != sChar2); | 149 | while (*s != sChar2); |
150 | 150 | ||
151 | return s + 1; | 151 | return s + 1; |
152 | } | 152 | } |
153 | return 0L; | 153 | return 0L; |
154 | } | 154 | } |
155 | 155 | ||
156 | HlKeyword::HlKeyword (int attribute, int context,bool casesensitive, const QChar *deliminator, uint deliLen) | 156 | HlKeyword::HlKeyword (int attribute, int context,bool casesensitive, const QChar *deliminator, uint deliLen) |
157 | : HlItem(attribute,context), dict (113, casesensitive) | 157 | : HlItem(attribute,context), dict (113, casesensitive) |
158 | { | 158 | { |
159 | deliminatorChars = deliminator; | 159 | deliminatorChars = deliminator; |
160 | deliminatorLen = deliLen; | 160 | deliminatorLen = deliLen; |
161 | _caseSensitive=casesensitive; | 161 | _caseSensitive=casesensitive; |
162 | } | 162 | } |
163 | 163 | ||
164 | HlKeyword::~HlKeyword() { | 164 | HlKeyword::~HlKeyword() { |
165 | } | 165 | } |
166 | 166 | ||
167 | bool HlKeyword::startEnable(QChar c) | 167 | bool HlKeyword::startEnable(QChar c) |
168 | { | 168 | { |
169 | return ustrchr(deliminatorChars, deliminatorLen, c); | 169 | return ustrchr(deliminatorChars, deliminatorLen, c); |
170 | } | 170 | } |
171 | 171 | ||
172 | // If we use a dictionary for lookup we don't really need | 172 | // If we use a dictionary for lookup we don't really need |
173 | // an item as such we are using the key to lookup | 173 | // an item as such we are using the key to lookup |
174 | void HlKeyword::addWord(const QString &word) | 174 | void HlKeyword::addWord(const QString &word) |
175 | { | 175 | { |
176 | words.append(word); | 176 | words.append(word); |
177 | dict.insert(word,&trueBool); | 177 | dict.insert(word,&trueBool); |
178 | } | 178 | } |
179 | 179 | ||
180 | void HlKeyword::addList(const QStringList& list) | 180 | void HlKeyword::addList(const QStringList& list) |
181 | { | 181 | { |
182 | 182 | ||
183 | words+=list; | 183 | words+=list; |
184 | for(uint i=0;i<list.count();i++) dict.insert(list[i], &trueBool); | 184 | for(uint i=0;i<list.count();i++) dict.insert(list[i], &trueBool); |
185 | } | 185 | } |
186 | 186 | ||
187 | const QChar *HlKeyword::checkHgl(const QChar *s, int len, bool b) | 187 | const QChar *HlKeyword::checkHgl(const QChar *s, int len, bool b) |
188 | { | 188 | { |
189 | if (len == 0) return 0L; | 189 | if (len == 0) return 0L; |
190 | 190 | ||
191 | const QChar *s2 = s; | 191 | const QChar *s2 = s; |
192 | 192 | ||
193 | while ( (len > 0) && (!ustrchr(deliminatorChars, deliminatorLen, *s2)) ) | 193 | while ( (len > 0) && (!ustrchr(deliminatorChars, deliminatorLen, *s2)) ) |
194 | { | 194 | { |
195 | s2++; | 195 | s2++; |
196 | len--; | 196 | len--; |
197 | } | 197 | } |
198 | 198 | ||
199 | if (s2 == s) return 0L; | 199 | if (s2 == s) return 0L; |
200 | 200 | ||
201 | QString lookup = QString(s,s2-s); | 201 | QString lookup = QString(s,s2-s); |
202 | 202 | ||
203 | if ( dict.find(lookup) ) return s2; | 203 | if ( dict.find(lookup) ) return s2; |
204 | return 0L; | 204 | return 0L; |
205 | } | 205 | } |
206 | 206 | ||
207 | HlInt::HlInt(int attribute, int context) | 207 | HlInt::HlInt(int attribute, int context) |
208 | : HlItem(attribute,context) { | 208 | : HlItem(attribute,context) { |
209 | } | 209 | } |
210 | 210 | ||
211 | const QChar *HlInt::checkHgl(const QChar *str, int len, bool) { | 211 | const QChar *HlInt::checkHgl(const QChar *str, int len, bool) { |
212 | const QChar *s,*s1; | 212 | const QChar *s,*s1; |
213 | 213 | ||
214 | s = str; | 214 | s = str; |
215 | while (s->isDigit()) s++; | 215 | while (s->isDigit()) s++; |
216 | if (s > str) | 216 | if (s > str) |
217 | { | 217 | { |
218 | if (subItems) | 218 | if (subItems) |
219 | { | 219 | { |
220 | for (HlItem *it=subItems->first();it;it=subItems->next()) | 220 | for (HlItem *it=subItems->first();it;it=subItems->next()) |
221 | { | 221 | { |
222 | s1=it->checkHgl(s, len, false); | 222 | s1=it->checkHgl(s, len, false); |
223 | if (s1) return s1; | 223 | if (s1) return s1; |
224 | } | 224 | } |
225 | } | 225 | } |
226 | return s; | 226 | return s; |
227 | } | 227 | } |
228 | return 0L; | 228 | return 0L; |
229 | } | 229 | } |
230 | 230 | ||
231 | HlFloat::HlFloat(int attribute, int context) | 231 | HlFloat::HlFloat(int attribute, int context) |
232 | : HlItem(attribute,context) { | 232 | : HlItem(attribute,context) { |
233 | } | 233 | } |
234 | 234 | ||
235 | const QChar *HlFloat::checkHgl(const QChar *s, int len, bool) { | 235 | const QChar *HlFloat::checkHgl(const QChar *s, int len, bool) { |
236 | bool b, p; | 236 | bool b, p; |
237 | const QChar *s1; | 237 | const QChar *s1; |
238 | 238 | ||
239 | b = false; | 239 | b = false; |
240 | while (s->isDigit()){ | 240 | while (s->isDigit()){ |
241 | s++; | 241 | s++; |
242 | b = true; | 242 | b = true; |
243 | } | 243 | } |
244 | if (p = (*s == '.')) { | 244 | if (p = (*s == '.')) { |
245 | s++; | 245 | s++; |
246 | while (s->isDigit()) { | 246 | while (s->isDigit()) { |
247 | s++; | 247 | s++; |
248 | b = true; | 248 | b = true; |
249 | } | 249 | } |
250 | } | 250 | } |
251 | if (!b) return 0L; | 251 | if (!b) return 0L; |
252 | if ((*s&0xdf) == 'E') s++; | 252 | if ((*s&0xdf) == 'E') s++; |
253 | else | 253 | else |
254 | if (!p) return 0L; | 254 | if (!p) return 0L; |
255 | else | 255 | else |
256 | { | 256 | { |
257 | if (subItems) | 257 | if (subItems) |
258 | { | 258 | { |
259 | for (HlItem *it=subItems->first();it;it=subItems->next()) | 259 | for (HlItem *it=subItems->first();it;it=subItems->next()) |
260 | { | 260 | { |
261 | s1=it->checkHgl(s, len, false); | 261 | s1=it->checkHgl(s, len, false); |
262 | if (s1) return s1; | 262 | if (s1) return s1; |
263 | } | 263 | } |
264 | } | 264 | } |
265 | return s; | 265 | return s; |
266 | } | 266 | } |
267 | if ((*s == '-')||(*s =='+')) s++; | 267 | if ((*s == '-')||(*s =='+')) s++; |
268 | b = false; | 268 | b = false; |
269 | while (s->isDigit()) { | 269 | while (s->isDigit()) { |
270 | s++; | 270 | s++; |
271 | b = true; | 271 | b = true; |
272 | } | 272 | } |
273 | if (b) | 273 | if (b) |
274 | { | 274 | { |
275 | if (subItems) | 275 | if (subItems) |
276 | { | 276 | { |
277 | for (HlItem *it=subItems->first();it;it=subItems->next()) | 277 | for (HlItem *it=subItems->first();it;it=subItems->next()) |
278 | { | 278 | { |
279 | s1=it->checkHgl(s, len, false); | 279 | s1=it->checkHgl(s, len, false); |
280 | if (s1) return s1; | 280 | if (s1) return s1; |
281 | } | 281 | } |
282 | } | 282 | } |
283 | return s; | 283 | return s; |
284 | } | 284 | } |
285 | else return 0L; | 285 | else return 0L; |
286 | } | 286 | } |
287 | 287 | ||
288 | 288 | ||
289 | HlCInt::HlCInt(int attribute, int context) | 289 | HlCInt::HlCInt(int attribute, int context) |
290 | : HlInt(attribute,context) { | 290 | : HlInt(attribute,context) { |
291 | } | 291 | } |
292 | 292 | ||
293 | const QChar *HlCInt::checkHgl(const QChar *s, int len, bool lineStart) { | 293 | const QChar *HlCInt::checkHgl(const QChar *s, int len, bool lineStart) { |
294 | 294 | ||
295 | // if (*s == '0') s++; else s = HlInt::checkHgl(s); | 295 | // if (*s == '0') s++; else s = HlInt::checkHgl(s); |
296 | s = HlInt::checkHgl(s, len, lineStart); | 296 | s = HlInt::checkHgl(s, len, lineStart); |
297 | if (s != 0L) { | 297 | if (s != 0L) { |
298 | int l = 0; | 298 | int l = 0; |
299 | int u = 0; | 299 | int u = 0; |
300 | const QChar *str; | 300 | const QChar *str; |
301 | 301 | ||
302 | do { | 302 | do { |
303 | str = s; | 303 | str = s; |
304 | if ((*s&0xdf) == 'L' ) { | 304 | if ((*s&0xdf) == 'L' ) { |
305 | l++; | 305 | l++; |
306 | if (l > 2) return 0L; | 306 | if (l > 2) return 0L; |
307 | s++; | 307 | s++; |
308 | } | 308 | } |
309 | if ((*s&0xdf) == 'U' ){ | 309 | if ((*s&0xdf) == 'U' ){ |
310 | u++; | 310 | u++; |
311 | if (u > 1) return 0L; | 311 | if (u > 1) return 0L; |
312 | s++; | 312 | s++; |
313 | } | 313 | } |
314 | } while (s != str); | 314 | } while (s != str); |
315 | } | 315 | } |
316 | return s; | 316 | return s; |
317 | } | 317 | } |
318 | 318 | ||
319 | HlCOct::HlCOct(int attribute, int context) | 319 | HlCOct::HlCOct(int attribute, int context) |
320 | : HlItem(attribute,context) { | 320 | : HlItem(attribute,context) { |
321 | } | 321 | } |
322 | 322 | ||
323 | const QChar *HlCOct::checkHgl(const QChar *str, int len, bool) { | 323 | const QChar *HlCOct::checkHgl(const QChar *str, int len, bool) { |
324 | const QChar *s; | 324 | const QChar *s; |
325 | 325 | ||
326 | if (*str == '0') { | 326 | if (*str == '0') { |
327 | str++; | 327 | str++; |
328 | s = str; | 328 | s = str; |
329 | while (*s >= '0' && *s <= '7') s++; | 329 | while (*s >= '0' && *s <= '7') s++; |
330 | if (s > str) { | 330 | if (s > str) { |
331 | if ((*s&0xdf) == 'L' || (*s&0xdf) == 'U' ) s++; | 331 | if ((*s&0xdf) == 'L' || (*s&0xdf) == 'U' ) s++; |
332 | return s; | 332 | return s; |
333 | } | 333 | } |
334 | } | 334 | } |
335 | return 0L; | 335 | return 0L; |
336 | } | 336 | } |
337 | 337 | ||
338 | HlCHex::HlCHex(int attribute, int context) | 338 | HlCHex::HlCHex(int attribute, int context) |
339 | : HlItem(attribute,context) { | 339 | : HlItem(attribute,context) { |
340 | } | 340 | } |
341 | 341 | ||
342 | const QChar *HlCHex::checkHgl(const QChar *str, int len, bool) { | 342 | const QChar *HlCHex::checkHgl(const QChar *str, int len, bool) { |
343 | const QChar *s=str; | 343 | const QChar *s=str; |
344 | #if 0 | 344 | #if 0 |
345 | int i; | 345 | int i; |
346 | for (i=0;(*s)!='\0';s++,i++); | 346 | for (i=0;(*s)!='\0';s++,i++); |
347 | QString line(str,i); | 347 | QString line(str,i); |
348 | QRegExp3 rx("0[xX][a-fA-F\\d]+[UuLl]?"); // this matches but is also matching parenthesis | 348 | QRegExp3 rx("0[xX][a-fA-F\\d]+[UuLl]?"); // this matches but is also matching parenthesis |
349 | int pos=rx.search(line,0); | 349 | int pos=rx.search(line,0); |
350 | if(pos > -1) return str+rx.matchedLength(); | 350 | if(pos > -1) return str+rx.matchedLength(); |
351 | else | 351 | else |
352 | return 0L; | 352 | return 0L; |
353 | 353 | ||
354 | #else | 354 | #else |
355 | if (str[0] == '0' && ((str[1]&0xdf) == 'X' )) { | 355 | if (str[0] == '0' && ((str[1]&0xdf) == 'X' )) { |
356 | str += 2; | 356 | str += 2; |
357 | s = str; | 357 | s = str; |
358 | while (s->isDigit() || ((*s&0xdf) >= 'A' && (*s&0xdf) <= 'F') /*|| (*s >= 'a' && *s <= 'f')*/) s++; | 358 | while (s->isDigit() || ((*s&0xdf) >= 'A' && (*s&0xdf) <= 'F') /*|| (*s >= 'a' && *s <= 'f')*/) s++; |
359 | if (s > str) { | 359 | if (s > str) { |
360 | if ((*s&0xdf) == 'L' || (*s&0xdf) == 'U' ) s++; | 360 | if ((*s&0xdf) == 'L' || (*s&0xdf) == 'U' ) s++; |
361 | return s; | 361 | return s; |
362 | } | 362 | } |
363 | } | 363 | } |
364 | return 0L; | 364 | return 0L; |
365 | #endif | 365 | #endif |
366 | } | 366 | } |
367 | 367 | ||
368 | HlCFloat::HlCFloat(int attribute, int context) | 368 | HlCFloat::HlCFloat(int attribute, int context) |
369 | : HlFloat(attribute,context) { | 369 | : HlFloat(attribute,context) { |
370 | } | 370 | } |
371 | 371 | ||
372 | const QChar *HlCFloat::checkHgl(const QChar *s, int len, bool lineStart) { | 372 | const QChar *HlCFloat::checkHgl(const QChar *s, int len, bool lineStart) { |
373 | 373 | ||
374 | s = HlFloat::checkHgl(s, len, lineStart); | 374 | s = HlFloat::checkHgl(s, len, lineStart); |
375 | if (s && ((*s&0xdf) == 'F' )) s++; | 375 | if (s && ((*s&0xdf) == 'F' )) s++; |
376 | return s; | 376 | return s; |
377 | } | 377 | } |
378 | 378 | ||
379 | HlAnyChar::HlAnyChar(int attribute, int context, const QChar* charList, uint len) | 379 | HlAnyChar::HlAnyChar(int attribute, int context, const QChar* charList, uint len) |
380 | : HlItem(attribute, context) { | 380 | : HlItem(attribute, context) { |
381 | _charList=charList; | 381 | _charList=charList; |
382 | _charListLen=len; | 382 | _charListLen=len; |
383 | } | 383 | } |
384 | 384 | ||
385 | const QChar *HlAnyChar::checkHgl(const QChar *s, int len, bool) | 385 | const QChar *HlAnyChar::checkHgl(const QChar *s, int len, bool) |
386 | { | 386 | { |
387 | if (ustrchr(_charList, _charListLen, *s)) return s +1; | 387 | if (ustrchr(_charList, _charListLen, *s)) return s +1; |
388 | return 0L; | 388 | return 0L; |
389 | } | 389 | } |
390 | 390 | ||
391 | HlRegExpr::HlRegExpr(int attribute, int context,QString regexp) | 391 | HlRegExpr::HlRegExpr(int attribute, int context,QString regexp) |
392 | : HlItem(attribute, context), Expr(0) { | 392 | : HlItem(attribute, context), Expr(0) { |
393 | 393 | ||
394 | handlesLinestart=regexp.startsWith("^"); | 394 | handlesLinestart=regexp.startsWith("^"); |
395 | if(!handlesLinestart) regexp.prepend("^"); | 395 | if(!handlesLinestart) regexp.prepend("^"); |
396 | Expr=new QRegExp3(regexp); | 396 | Expr=new QRegExp3(regexp); |
397 | } | 397 | } |
398 | 398 | ||
399 | HlRegExpr::~HlRegExpr() | 399 | HlRegExpr::~HlRegExpr() |
400 | { | 400 | { |
401 | delete Expr; | 401 | delete Expr; |
402 | } | 402 | } |
403 | 403 | ||
404 | const QChar *HlRegExpr::checkHgl(const QChar *s, int len, bool lineStart) | 404 | const QChar *HlRegExpr::checkHgl(const QChar *s, int len, bool lineStart) |
405 | { | 405 | { |
406 | if ((!lineStart) && handlesLinestart) return 0; | 406 | if ((!lineStart) && handlesLinestart) return 0; |
407 | 407 | ||
408 | QString line(s,len); | 408 | QString line(s,len); |
409 | int pos = Expr->search( line, 0 ); | 409 | int pos = Expr->search( line, 0 ); |
410 | if (pos==-1) return 0L; | 410 | if (pos==-1) return 0L; |
411 | else | 411 | else |
412 | return (s+Expr->matchedLength()); | 412 | return (s+Expr->matchedLength()); |
413 | }; | 413 | }; |
414 | 414 | ||
415 | 415 | ||
416 | HlLineContinue::HlLineContinue(int attribute, int context) | 416 | HlLineContinue::HlLineContinue(int attribute, int context) |
417 | : HlItem(attribute,context) { | 417 | : HlItem(attribute,context) { |
418 | } | 418 | } |
419 | 419 | ||
420 | const QChar *HlLineContinue::checkHgl(const QChar *s, int len, bool) { | 420 | const QChar *HlLineContinue::checkHgl(const QChar *s, int len, bool) { |
421 | 421 | ||
422 | if ((s[0].latin1() == '\\') && (len == 1)) | 422 | if ((s[0].latin1() == '\\') && (len == 1)) |
423 | { | 423 | { |
424 | return s + 1; | 424 | return s + 1; |
425 | } | 425 | } |
426 | return 0L; | 426 | return 0L; |
427 | } | 427 | } |
428 | 428 | ||
429 | 429 | ||
430 | HlCStringChar::HlCStringChar(int attribute, int context) | 430 | HlCStringChar::HlCStringChar(int attribute, int context) |
431 | : HlItem(attribute,context) { | 431 | : HlItem(attribute,context) { |
432 | } | 432 | } |
433 | 433 | ||
434 | //checks for hex and oct (for example \x1b or \033) | 434 | //checks for hex and oct (for example \x1b or \033) |
435 | const QChar *checkCharHexOct(const QChar *str) { | 435 | const QChar *checkCharHexOct(const QChar *str) { |
436 | const QChar *s; | 436 | const QChar *s; |
437 | s=str; | 437 | s=str; |
438 | int n; | 438 | int n; |
439 | if (*s == 'x') { | 439 | if (*s == 'x') { |
440 | n = 0; | 440 | n = 0; |
441 | do { | 441 | do { |
442 | s++; | 442 | s++; |
443 | n *= 16; | 443 | n *= 16; |
444 | if (s->isDigit()) n += *s - '0'; | 444 | if (s->isDigit()) n += *s - '0'; |
445 | else if ((*s&0xdf) >= 'A' && (*s&0xdf) <= 'F') n += (*s&0xdf) - 'A' + 10; | 445 | else if ((*s&0xdf) >= 'A' && (*s&0xdf) <= 'F') n += (*s&0xdf) - 'A' + 10; |
446 | // else if (*s >= 'a' && *s <= 'f') n += *s - 'a' + 10; | 446 | // else if (*s >= 'a' && *s <= 'f') n += *s - 'a' + 10; |
447 | else break; | 447 | else break; |
448 | if (n >= 256) return 0L; | 448 | if (n >= 256) return 0L; |
449 | } while (true); | 449 | } while (true); |
450 | if (s - str == 1) return 0L; | 450 | if (s - str == 1) return 0L; |
451 | } else { | 451 | } else { |
452 | if (!(*s >= '0' && *s <= '7')) return 0L; | 452 | if (!(*s >= '0' && *s <= '7')) return 0L; |
453 | n = *s - '0'; | 453 | n = *s - '0'; |
454 | do { | 454 | do { |
455 | s++; | 455 | s++; |
456 | n *= 8; | 456 | n *= 8; |
457 | if (*s >= '0' && *s <= '7') n += *s - '0'; else break; | 457 | if (*s >= '0' && *s <= '7') n += *s - '0'; else break; |
458 | if (n >= 256) return s; | 458 | if (n >= 256) return s; |
459 | } while (s - str < 3); | 459 | } while (s - str < 3); |
460 | } | 460 | } |
461 | return s; | 461 | return s; |
462 | } | 462 | } |
463 | // checks for C escaped chars \n and escaped hex/octal chars | 463 | // checks for C escaped chars \n and escaped hex/octal chars |
464 | const QChar *checkEscapedChar(const QChar *s, int len) { | 464 | const QChar *checkEscapedChar(const QChar *s, int len) { |
465 | int i; | 465 | int i; |
466 | if (s[0] == '\\' && (len > 1) ) { | 466 | if (s[0] == '\\' && (len > 1) ) { |
467 | s++; | 467 | s++; |
468 | switch(*s){ | 468 | switch(*s){ |
469 | case 'a': // checks for control chars | 469 | case 'a': // checks for control chars |
470 | case 'b': // we want to fall through | 470 | case 'b': // we want to fall through |
471 | case 'e': | 471 | case 'e': |
472 | case 'f': | 472 | case 'f': |
473 | 473 | ||
474 | case 'n': | 474 | case 'n': |
475 | case 'r': | 475 | case 'r': |
476 | case 't': | 476 | case 't': |
477 | case 'v': | 477 | case 'v': |
478 | case '\'': | 478 | case '\'': |
479 | case '\"': | 479 | case '\"': |
480 | case '?' : // added ? ANSI C classifies this as an escaped char | 480 | case '?' : // added ? ANSI C classifies this as an escaped char |
481 | case '\\': s++; | 481 | case '\\': s++; |
482 | break; | 482 | break; |
483 | case 'x': // if it's like \xff | 483 | case 'x': // if it's like \xff |
484 | s++; // eat the x | 484 | s++; // eat the x |
485 | // these for loops can probably be | 485 | // these for loops can probably be |
486 | // replaced with something else but | 486 | // replaced with something else but |
487 | // for right now they work | 487 | // for right now they work |
488 | // check for hexdigits | 488 | // check for hexdigits |
489 | for(i=0;i<2 &&(*s >= '0' && *s <= '9' || (*s&0xdf) >= 'A' && (*s&0xdf) <= 'F');i++,s++); | 489 | for(i=0;i<2 &&(*s >= '0' && *s <= '9' || (*s&0xdf) >= 'A' && (*s&0xdf) <= 'F');i++,s++); |
490 | if(i==0) return 0L; // takes care of case '\x' | 490 | if(i==0) return 0L; // takes care of case '\x' |
491 | break; | 491 | break; |
492 | 492 | ||
493 | case '0': case '1': case '2': case '3' : | 493 | case '0': case '1': case '2': case '3' : |
494 | case '4': case '5': case '6': case '7' : | 494 | case '4': case '5': case '6': case '7' : |
495 | for(i=0;i < 3 &&(*s >='0'&& *s<='7');i++,s++); | 495 | for(i=0;i < 3 &&(*s >='0'&& *s<='7');i++,s++); |
496 | break; | 496 | break; |
497 | default: return 0L; | 497 | default: return 0L; |
498 | } | 498 | } |
499 | return s; | 499 | return s; |
500 | } | 500 | } |
501 | return 0L; | 501 | return 0L; |
502 | } | 502 | } |
503 | 503 | ||
504 | const QChar *HlCStringChar::checkHgl(const QChar *str, int len, bool) { | 504 | const QChar *HlCStringChar::checkHgl(const QChar *str, int len, bool) { |
505 | return checkEscapedChar(str, len); | 505 | return checkEscapedChar(str, len); |
506 | } | 506 | } |
507 | 507 | ||
508 | 508 | ||
509 | HlCChar::HlCChar(int attribute, int context) | 509 | HlCChar::HlCChar(int attribute, int context) |
510 | : HlItem(attribute,context) { | 510 | : HlItem(attribute,context) { |
511 | } | 511 | } |
512 | 512 | ||
513 | const QChar *HlCChar::checkHgl(const QChar *str, int len, bool) { | 513 | const QChar *HlCChar::checkHgl(const QChar *str, int len, bool) { |
514 | const QChar *s; | 514 | const QChar *s; |
515 | 515 | ||
516 | if ((len > 1) && (str[0] == '\'') && (str[1] != '\'')) | 516 | if ((len > 1) && (str[0] == '\'') && (str[1] != '\'')) |
517 | { | 517 | { |
518 | s = checkEscapedChar(&str[1], len); //try to match escaped char | 518 | s = checkEscapedChar(&str[1], len); //try to match escaped char |
519 | if (!s) s = &str[2]; //match single non-escaped char | 519 | if (!s) s = &str[2]; //match single non-escaped char |
520 | if (*s == '\'') return s + 1; | 520 | if (*s == '\'') return s + 1; |
521 | } | 521 | } |
522 | return 0L; | 522 | return 0L; |
523 | } | 523 | } |
524 | 524 | ||
525 | 525 | ||
526 | //-------- | 526 | //-------- |
527 | ItemStyle::ItemStyle() : selCol(Qt::white), bold(false), italic(false) { | 527 | ItemStyle::ItemStyle() : selCol(Qt::white), bold(false), italic(false) { |
528 | } | 528 | } |
529 | 529 | ||
530 | ItemStyle::ItemStyle(const QColor &col, const QColor &selCol, | 530 | ItemStyle::ItemStyle(const QColor &col, const QColor &selCol, |
531 | bool bold, bool italic) | 531 | bool bold, bool italic) |
532 | : col(col), selCol(selCol), bold(bold), italic(italic) { | 532 | : col(col), selCol(selCol), bold(bold), italic(italic) { |
533 | } | 533 | } |
534 | 534 | ||
535 | ItemData::ItemData(const QString name, int defStyleNum) | 535 | ItemData::ItemData(const QString name, int defStyleNum) |
536 | : name(name), defStyleNum(defStyleNum), defStyle(true) { | 536 | : name(name), defStyleNum(defStyleNum), defStyle(true) { |
537 | } | 537 | } |
538 | 538 | ||
539 | ItemData::ItemData(const QString name, int defStyleNum, | 539 | ItemData::ItemData(const QString name, int defStyleNum, |
540 | const QColor &col, const QColor &selCol, bool bold, bool italic) | 540 | const QColor &col, const QColor &selCol, bool bold, bool italic) |
541 | : ItemStyle(col,selCol,bold,italic), name(name), defStyleNum(defStyleNum), | 541 | : ItemStyle(col,selCol,bold,italic), name(name), defStyleNum(defStyleNum), |
542 | defStyle(false) { | 542 | defStyle(false) { |
543 | } | 543 | } |
544 | 544 | ||
545 | HlData::HlData(const QString &wildcards, const QString &mimetypes, const QString &identifier) | 545 | HlData::HlData(const QString &wildcards, const QString &mimetypes, const QString &identifier) |
546 | : wildcards(wildcards), mimetypes(mimetypes), identifier(identifier) { | 546 | : wildcards(wildcards), mimetypes(mimetypes), identifier(identifier) { |
547 | 547 | ||
548 | //JW itemDataList.setAutoDelete(true); | 548 | //JW itemDataList.setAutoDelete(true); |
549 | } | 549 | } |
550 | 550 | ||
551 | HlContext::HlContext(int attribute, int lineEndContext, int _lineBeginContext) | 551 | HlContext::HlContext(int attribute, int lineEndContext, int _lineBeginContext) |
552 | : attr(attribute), ctx(lineEndContext),lineBeginContext(_lineBeginContext) { | 552 | : attr(attribute), ctx(lineEndContext),lineBeginContext(_lineBeginContext) { |
553 | items.setAutoDelete(true); | 553 | items.setAutoDelete(true); |
554 | } | 554 | } |
555 | 555 | ||
556 | Hl2CharDetect::Hl2CharDetect(int attribute, int context, const QChar *s) | 556 | Hl2CharDetect::Hl2CharDetect(int attribute, int context, const QChar *s) |
557 | : HlItem(attribute,context) { | 557 | : HlItem(attribute,context) { |
558 | sChar1 = s[0]; | 558 | sChar1 = s[0]; |
559 | sChar2 = s[1]; | 559 | sChar2 = s[1]; |
560 | } | 560 | } |
561 | 561 | ||
562 | Highlight::Highlight(syntaxModeListItem *def) : refCount(0) | 562 | Highlight::Highlight(syntaxModeListItem *def) : refCount(0) |
563 | { | 563 | { |
564 | noHl = false; | 564 | noHl = false; |
565 | 565 | ||
566 | if (def == 0) | 566 | if (def == 0) |
567 | { | 567 | { |
568 | noHl = true; | 568 | noHl = true; |
569 | iName = I18N_NOOP("Normal"); | 569 | iName = I18N_NOOP("Normal"); |
570 | iSection = ""; | 570 | iSection = ""; |
571 | } | 571 | } |
572 | else | 572 | else |
573 | { | 573 | { |
574 | iName = def->name; | 574 | iName = def->name; |
575 | iSection = def->section; | 575 | iSection = def->section; |
576 | iWildcards = def->extension; | 576 | iWildcards = def->extension; |
577 | iMimetypes = def->mimetype; | 577 | iMimetypes = def->mimetype; |
578 | identifier = def->identifier; | 578 | identifier = def->identifier; |
579 | } | 579 | } |
580 | deliminator = stdDeliminator; | 580 | deliminator = stdDeliminator; |
581 | deliminatorChars = deliminator.unicode(); | 581 | deliminatorChars = deliminator.unicode(); |
582 | deliminatorLen = deliminator.length(); | 582 | deliminatorLen = deliminator.length(); |
583 | } | 583 | } |
584 | 584 | ||
585 | Highlight::~Highlight() | 585 | Highlight::~Highlight() |
586 | { | 586 | { |
587 | } | 587 | } |
588 | 588 | ||
589 | int Highlight::doHighlight(int ctxNum, TextLine *textLine) | 589 | int Highlight::doHighlight(int ctxNum, TextLine *textLine) |
590 | { | 590 | { |
591 | if (noHl) | 591 | if (noHl) |
592 | { | 592 | { |
593 | textLine->setAttribs(0,0,textLine->length()); | 593 | textLine->setAttribs(0,0,textLine->length()); |
594 | textLine->setAttr(0); | 594 | textLine->setAttr(0); |
595 | return 0; | 595 | return 0; |
596 | } | 596 | } |
597 | 597 | ||
598 | HlContext *context; | 598 | HlContext *context; |
599 | const QChar *s2; | 599 | const QChar *s2; |
600 | HlItem *item; | 600 | HlItem *item; |
601 | 601 | ||
602 | context = contextList[ctxNum]; | 602 | context = contextList[ctxNum]; |
603 | if (context->lineBeginContext!=-1) | 603 | if (context->lineBeginContext!=-1) |
604 | { | 604 | { |
605 | ctxNum=context->lineBeginContext; | 605 | ctxNum=context->lineBeginContext; |
606 | context=contextList[ctxNum]; | 606 | context=contextList[ctxNum]; |
607 | } | 607 | } |
608 | 608 | ||
609 | QChar lastChar = ' '; | 609 | QChar lastChar = ' '; |
610 | 610 | ||
611 | // first char | 611 | // first char |
612 | const QChar *str = textLine->getText(); | 612 | const QChar *str = textLine->getText(); |
613 | 613 | ||
614 | // non space char - index of that char | 614 | // non space char - index of that char |
615 | const QChar *s1 = textLine->firstNonSpace(); | 615 | const QChar *s1 = textLine->firstNonSpace(); |
616 | uint z = textLine->firstChar(); | 616 | uint z = textLine->firstChar(); |
617 | 617 | ||
618 | // length of textline | 618 | // length of textline |
619 | uint len = textLine->length(); | 619 | uint len = textLine->length(); |
620 | 620 | ||
621 | bool found = false; | 621 | bool found = false; |
622 | while (z < len) | 622 | while (z < len) |
623 | { | 623 | { |
624 | found = false; | 624 | found = false; |
625 | 625 | ||
626 | for (item = context->items.first(); item != 0L; item = context->items.next()) | 626 | for (item = context->items.first(); item != 0L; item = context->items.next()) |
627 | { | 627 | { |
628 | if (item->startEnable(lastChar)) | 628 | if (item->startEnable(lastChar)) |
629 | { | 629 | { |
630 | s2 = item->checkHgl(s1, len-z, z==0); | 630 | s2 = item->checkHgl(s1, len-z, z==0); |
631 | if (s2 > s1) | 631 | if (s2 > s1) |
632 | { | 632 | { |
633 | odebug << "An item has been detected" << oendl; | 633 | odebug << "An item has been detected" << oendl; |
634 | textLine->setAttribs(item->attr,s1 - str,s2 - str); | 634 | textLine->setAttribs(item->attr,s1 - str,s2 - str); |
635 | ctxNum = item->ctx; | 635 | ctxNum = item->ctx; |
636 | context = contextList[ctxNum]; | 636 | context = contextList[ctxNum]; |
637 | z = z + s2 - s1 - 1; | 637 | z = z + s2 - s1 - 1; |
638 | s1 = s2 - 1; | 638 | s1 = s2 - 1; |
639 | found = true; | 639 | found = true; |
640 | break; | 640 | break; |
641 | } | 641 | } |
642 | } | 642 | } |
643 | } | 643 | } |
644 | 644 | ||
645 | // nothing found: set attribute of one char | 645 | // nothing found: set attribute of one char |
646 | if (!found) | 646 | if (!found) |
647 | textLine->setAttribs(context->attr,s1 - str,s1 - str + 1); | 647 | textLine->setAttribs(context->attr,s1 - str,s1 - str + 1); |
648 | 648 | ||
649 | lastChar = *s1; | 649 | lastChar = *s1; |
650 | s1++; | 650 | s1++; |
651 | z++; | 651 | z++; |
652 | } | 652 | } |
653 | 653 | ||
654 | //set "end of line"-properties | 654 | //set "end of line"-properties |
655 | textLine->setAttr(context->attr); | 655 | textLine->setAttr(context->attr); |
656 | 656 | ||
657 | //return new context | 657 | //return new context |
658 | return context->ctx; | 658 | return context->ctx; |
659 | } | 659 | } |
660 | 660 | ||
661 | KateConfig *Highlight::getKateConfig() { | 661 | KateConfig *Highlight::getKateConfig() { |
662 | KateConfig *config; | 662 | KateConfig *config; |
663 | config=KGlobal::config(); | 663 | config=KGlobal::config(); |
664 | config->setGroup(iName + QString(" Highlight")); | 664 | config->setGroup(iName + QString(" Highlight")); |
665 | return config; | 665 | return config; |
666 | } | 666 | } |
667 | 667 | ||
668 | QString Highlight::getWildcards() { | 668 | QString Highlight::getWildcards() { |
669 | KateConfig *config; | 669 | KateConfig *config; |
670 | 670 | ||
671 | config = getKateConfig(); | 671 | config = getKateConfig(); |
672 | 672 | ||
673 | //if wildcards not yet in config, then use iWildCards as default | 673 | //if wildcards not yet in config, then use iWildCards as default |
674 | return config->readEntry("Wildcards", iWildcards); | 674 | return config->readEntry("Wildcards", iWildcards); |
675 | } | 675 | } |
676 | 676 | ||
677 | 677 | ||
678 | QString Highlight::getMimetypes() { | 678 | QString Highlight::getMimetypes() { |
679 | KateConfig *config; | 679 | KateConfig *config; |
680 | 680 | ||
681 | config = getKateConfig(); | 681 | config = getKateConfig(); |
682 | 682 | ||
683 | return config->readEntry("Mimetypes", iMimetypes); | 683 | return config->readEntry("Mimetypes", iMimetypes); |
684 | } | 684 | } |
685 | 685 | ||
686 | 686 | ||
687 | HlData *Highlight::getData() { | 687 | HlData *Highlight::getData() { |
688 | KateConfig *config; | 688 | KateConfig *config; |
689 | HlData *hlData; | 689 | HlData *hlData; |
690 | 690 | ||
691 | config = getKateConfig(); | 691 | config = getKateConfig(); |
692 | 692 | ||
693 | // iWildcards = config->readEntry("Wildcards"); | 693 | // iWildcards = config->readEntry("Wildcards"); |
694 | // iMimetypes = config->readEntry("Mimetypes"); | 694 | // iMimetypes = config->readEntry("Mimetypes"); |
695 | // hlData = new HlData(iWildcards,iMimetypes); | 695 | // hlData = new HlData(iWildcards,iMimetypes); |
696 | hlData = new HlData( | 696 | hlData = new HlData( |
697 | config->readEntry("Wildcards", iWildcards), | 697 | config->readEntry("Wildcards", iWildcards), |
698 | config->readEntry("Mimetypes", iMimetypes), | 698 | config->readEntry("Mimetypes", iMimetypes), |
699 | config->readEntry("Identifier", identifier)); | 699 | config->readEntry("Identifier", identifier)); |
700 | getItemDataList(hlData->itemDataList, config); | 700 | getItemDataList(hlData->itemDataList, config); |
701 | return hlData; | 701 | return hlData; |
702 | } | 702 | } |
703 | 703 | ||
704 | void Highlight::setData(HlData *hlData) { | 704 | void Highlight::setData(HlData *hlData) { |
705 | KateConfig *config; | 705 | KateConfig *config; |
706 | 706 | ||
707 | config = getKateConfig(); | 707 | config = getKateConfig(); |
708 | 708 | ||
709 | // iWildcards = hlData->wildcards; | 709 | // iWildcards = hlData->wildcards; |
710 | // iMimetypes = hlData->mimetypes; | 710 | // iMimetypes = hlData->mimetypes; |
711 | 711 | ||
712 | config->writeEntry("Wildcards",hlData->wildcards); | 712 | config->writeEntry("Wildcards",hlData->wildcards); |
713 | config->writeEntry("Mimetypes",hlData->mimetypes); | 713 | config->writeEntry("Mimetypes",hlData->mimetypes); |
714 | 714 | ||
715 | setItemDataList(hlData->itemDataList,config); | 715 | setItemDataList(hlData->itemDataList,config); |
716 | } | 716 | } |
717 | 717 | ||
718 | void Highlight::getItemDataList(ItemDataList &list) { | 718 | void Highlight::getItemDataList(ItemDataList &list) { |
719 | KateConfig *config; | 719 | KateConfig *config; |
720 | 720 | ||
721 | config = getKateConfig(); | 721 | config = getKateConfig(); |
722 | getItemDataList(list, config); | 722 | getItemDataList(list, config); |
723 | } | 723 | } |
724 | 724 | ||
725 | void Highlight::getItemDataList(ItemDataList &list, KateConfig *config) { | 725 | void Highlight::getItemDataList(ItemDataList &list, KateConfig *config) { |
726 | ItemData *p; | 726 | ItemData *p; |
727 | QString s; | 727 | QString s; |
728 | QRgb col, selCol; | 728 | QRgb col, selCol; |
729 | 729 | ||
730 | list.clear(); | 730 | list.clear(); |
731 | //JW list.setAutoDelete(true); | 731 | //JW list.setAutoDelete(true); |
732 | createItemData(list); | 732 | createItemData(list); |
733 | 733 | ||
734 | for (p = list.first(); p != 0L; p = list.next()) { | 734 | for (p = list.first(); p != 0L; p = list.next()) { |
735 | s = config->readEntry(p->name); | 735 | s = config->readEntry(p->name); |
736 | if (!s.isEmpty()) { | 736 | if (!s.isEmpty()) { |
737 | sscanf(s.latin1(),"%d,%X,%X,%d,%d", &p->defStyle,&col,&selCol,&p->bold,&p->italic); | 737 | sscanf(s.latin1(),"%d,%X,%X,%d,%d", &p->defStyle,&col,&selCol,&p->bold,&p->italic); |
738 | p->col.setRgb(col); | 738 | p->col.setRgb(col); |
739 | p->selCol.setRgb(selCol); | 739 | p->selCol.setRgb(selCol); |
740 | } | 740 | } |
741 | } | 741 | } |
742 | } | 742 | } |
743 | 743 | ||
744 | /******************************************************************************************* | 744 | /******************************************************************************************* |
745 | Highlight - setItemDataList | 745 | Highlight - setItemDataList |
746 | saves the ItemData / attribute / style definitions to the apps configfile. | 746 | saves the ItemData / attribute / style definitions to the apps configfile. |
747 | Especially needed for user overridden values. | 747 | Especially needed for user overridden values. |
748 | 748 | ||
749 | * input: ItemDataList &list :reference to the list, whose | 749 | * input: ItemDataList &list :reference to the list, whose |
750 | * items should be saved | 750 | * items should be saved |
751 | * KateConfig *config :Pointer KDE configuration | 751 | * KateConfig *config :Pointer KDE configuration |
752 | * class, which should be used | 752 | * class, which should be used |
753 | * as storage | 753 | * as storage |
754 | ************* | 754 | ************* |
755 | * output: none | 755 | * output: none |
756 | ************* | 756 | ************* |
757 | * return value: none | 757 | * return value: none |
758 | *******************************************************************************************/ | 758 | *******************************************************************************************/ |
759 | 759 | ||
760 | void Highlight::setItemDataList(ItemDataList &list, KateConfig *config) { | 760 | void Highlight::setItemDataList(ItemDataList &list, KateConfig *config) { |
761 | ItemData *p; | 761 | ItemData *p; |
762 | QString s; | 762 | QString s; |
763 | 763 | ||
764 | for (p = list.first(); p != 0L; p = list.next()) { | 764 | for (p = list.first(); p != 0L; p = list.next()) { |
765 | s.sprintf("%d,%X,%X,%d,%d", | 765 | s.sprintf("%d,%X,%X,%d,%d", |
766 | p->defStyle,p->col.rgb(),p->selCol.rgb(),p->bold,p->italic); | 766 | p->defStyle,p->col.rgb(),p->selCol.rgb(),p->bold,p->italic); |
767 | config->writeEntry(p->name,s); | 767 | config->writeEntry(p->name,s); |
768 | } | 768 | } |
769 | } | 769 | } |
770 | 770 | ||
771 | 771 | ||
772 | /******************************************************************************************* | 772 | /******************************************************************************************* |
773 | Highlight - use | 773 | Highlight - use |
774 | Increase the usage count and trigger initialization if needed | 774 | Increase the usage count and trigger initialization if needed |
775 | 775 | ||
776 | * input: none | 776 | * input: none |
777 | ************* | 777 | ************* |
778 | * output: none | 778 | * output: none |
779 | ************* | 779 | ************* |
780 | * return value: none | 780 | * return value: none |
781 | *******************************************************************************************/ | 781 | *******************************************************************************************/ |
782 | 782 | ||
783 | void Highlight::use() | 783 | void Highlight::use() |
784 | { | 784 | { |
785 | if (refCount == 0) init(); | 785 | if (refCount == 0) init(); |
786 | refCount++; | 786 | refCount++; |
787 | } | 787 | } |
788 | 788 | ||
789 | 789 | ||
790 | /******************************************************************************************* | 790 | /******************************************************************************************* |
791 | Highlight - release | 791 | Highlight - release |
792 | Decrease the usage count and trigger a cleanup if needed | 792 | Decrease the usage count and trigger a cleanup if needed |
793 | 793 | ||
794 | * input: none | 794 | * input: none |
795 | ************* | 795 | ************* |
796 | * output: none | 796 | * output: none |
797 | ************* | 797 | ************* |
798 | * return value: none | 798 | * return value: none |
799 | *******************************************************************************************/ | 799 | *******************************************************************************************/ |
800 | 800 | ||
801 | void Highlight::release() | 801 | void Highlight::release() |
802 | { | 802 | { |
803 | refCount--; | 803 | refCount--; |
804 | if (refCount == 0) done(); | 804 | if (refCount == 0) done(); |
805 | } | 805 | } |
806 | 806 | ||
807 | /******************************************************************************************* | 807 | /******************************************************************************************* |
808 | Highlight - init | 808 | Highlight - init |
809 | If it's the first time a particular highlighting is used create the needed contextlist | 809 | If it's the first time a particular highlighting is used create the needed contextlist |
810 | 810 | ||
811 | * input: none | 811 | * input: none |
812 | ************* | 812 | ************* |
813 | * output: none | 813 | * output: none |
814 | ************* | 814 | ************* |
815 | * return value: none | 815 | * return value: none |
816 | *******************************************************************************************/ | 816 | *******************************************************************************************/ |
817 | 817 | ||
818 | void Highlight::init() | 818 | void Highlight::init() |
819 | { | 819 | { |
820 | if (noHl) | 820 | if (noHl) |
821 | return; | 821 | return; |
822 | 822 | ||
823 | for (int z = 0; z < nContexts; z++) contextList[z] = 0L; | 823 | for (int z = 0; z < nContexts; z++) contextList[z] = 0L; |
824 | makeContextList(); | 824 | makeContextList(); |
825 | } | 825 | } |
826 | 826 | ||
827 | 827 | ||
828 | /******************************************************************************************* | 828 | /******************************************************************************************* |
829 | Highlight - done | 829 | Highlight - done |
830 | If the there is no document using the highlighting style free the complete context | 830 | If the there is no document using the highlighting style free the complete context |
831 | structure. | 831 | structure. |
832 | 832 | ||
833 | * input: none | 833 | * input: none |
834 | ************* | 834 | ************* |
835 | * output: none | 835 | * output: none |
836 | ************* | 836 | ************* |
837 | * return value: none | 837 | * return value: none |
838 | *******************************************************************************************/ | 838 | *******************************************************************************************/ |
839 | 839 | ||
840 | void Highlight::done() | 840 | void Highlight::done() |
841 | { | 841 | { |
842 | if (noHl) | 842 | if (noHl) |
843 | return; | 843 | return; |
844 | 844 | ||
845 | for (int z = 0; z < nContexts; z++) delete contextList[z]; | 845 | for (int z = 0; z < nContexts; z++) delete contextList[z]; |
846 | } | 846 | } |
847 | 847 | ||
848 | 848 | ||
849 | /******************************************************************************************* | 849 | /******************************************************************************************* |
850 | Highlight - createItemData | 850 | Highlight - createItemData |
851 | This function reads the itemData entries from the config file, which specifies the | 851 | This function reads the itemData entries from the config file, which specifies the |
852 | default attribute styles for matched items/contexts. | 852 | default attribute styles for matched items/contexts. |
853 | 853 | ||
854 | * input: none | 854 | * input: none |
855 | ************* | 855 | ************* |
856 | * output: ItemDataList &list :A reference to the internal | 856 | * output: ItemDataList &list :A reference to the internal |
857 | list containing the parsed | 857 | list containing the parsed |
858 | default config | 858 | default config |
859 | ************* | 859 | ************* |
860 | * return value: none | 860 | * return value: none |
861 | *******************************************************************************************/ | 861 | *******************************************************************************************/ |
862 | 862 | ||
863 | void Highlight::createItemData(ItemDataList &list) | 863 | void Highlight::createItemData(ItemDataList &list) |
864 | { | 864 | { |
865 | odebug << "Highlight::createItemData" << oendl; | 865 | odebug << "Highlight::createItemData" << oendl; |
866 | 866 | ||
867 | // If no highlighting is selected we need only one default. | 867 | // If no highlighting is selected we need only one default. |
868 | if (noHl) | 868 | if (noHl) |
869 | { | 869 | { |
870 | list.append(new ItemData(I18N_NOOP("Normal Text"), dsNormal)); | 870 | list.append(new ItemData(I18N_NOOP("Normal Text"), dsNormal)); |
871 | return; | 871 | return; |
872 | } | 872 | } |
873 | 873 | ||
874 | QString color; | 874 | QString color; |
875 | QString selColor; | 875 | QString selColor; |
876 | QString bold; | 876 | QString bold; |
877 | QString italic; | 877 | QString italic; |
878 | 878 | ||
879 | // If the internal list isn't already available read the config file | 879 | // If the internal list isn't already available read the config file |
880 | if (internalIDList.count()==0) | 880 | if (internalIDList.count()==0) |
881 | { | 881 | { |
882 | //if all references to the list are destried the contents will also be deleted | 882 | //if all references to the list are destried the contents will also be deleted |
883 | internalIDList.setAutoDelete(true); | 883 | internalIDList.setAutoDelete(true); |
884 | syntaxContextData *data; | 884 | syntaxContextData *data; |
885 | 885 | ||
886 | odebug << "Trying to read itemData section" << oendl; | 886 | odebug << "Trying to read itemData section" << oendl; |
887 | 887 | ||
888 | //Tell the syntax document class which file we want to parse and which data group | 888 | //Tell the syntax document class which file we want to parse and which data group |
889 | HlManager::self()->syntax->setIdentifier(identifier); | 889 | HlManager::self()->syntax->setIdentifier(identifier); |
890 | data=HlManager::self()->syntax->getGroupInfo("highlighting","itemData"); | 890 | data=HlManager::self()->syntax->getGroupInfo("highlighting","itemData"); |
891 | //begin with the real parsing | 891 | //begin with the real parsing |
892 | while (HlManager::self()->syntax->nextGroup(data)) | 892 | while (HlManager::self()->syntax->nextGroup(data)) |
893 | { | 893 | { |
894 | odebug << "Setting up one itemData element" << oendl; | 894 | odebug << "Setting up one itemData element" << oendl; |
895 | // read all attributes | 895 | // read all attributes |
896 | color=HlManager::self()->syntax->groupData(data,QString("color")); | 896 | color=HlManager::self()->syntax->groupData(data,QString("color")); |
897 | selColor=HlManager::self()->syntax->groupData(data,QString("selColor")); | 897 | selColor=HlManager::self()->syntax->groupData(data,QString("selColor")); |
898 | bold=HlManager::self()->syntax->groupData(data,QString("bold")); | 898 | bold=HlManager::self()->syntax->groupData(data,QString("bold")); |
899 | italic=HlManager::self()->syntax->groupData(data,QString("italic")); | 899 | italic=HlManager::self()->syntax->groupData(data,QString("italic")); |
900 | //check if the user overrides something | 900 | //check if the user overrides something |
901 | if ( (!color.isEmpty()) && (!selColor.isEmpty()) && (!bold.isEmpty()) && (!italic.isEmpty())) | 901 | if ( (!color.isEmpty()) && (!selColor.isEmpty()) && (!bold.isEmpty()) && (!italic.isEmpty())) |
902 | { | 902 | { |
903 | //create a user defined style | 903 | //create a user defined style |
904 | internalIDList.append(new ItemData( | 904 | internalIDList.append(new ItemData( |
905 | HlManager::self()->syntax->groupData(data,QString("name")).simplifyWhiteSpace(), | 905 | HlManager::self()->syntax->groupData(data,QString("name")).simplifyWhiteSpace(), |
906 | getDefStyleNum(HlManager::self()->syntax->groupData(data,QString("defStyleNum"))), | 906 | getDefStyleNum(HlManager::self()->syntax->groupData(data,QString("defStyleNum"))), |
907 | QColor(color),QColor(selColor),(bold=="true") || (bold=="1"), (italic=="true") || (italic=="1") | 907 | QColor(color),QColor(selColor),(bold=="true") || (bold=="1"), (italic=="true") || (italic=="1") |
908 | )); | 908 | )); |
909 | } | 909 | } |
910 | else | 910 | else |
911 | { | 911 | { |
912 | //assign a default style | 912 | //assign a default style |
913 | internalIDList.append(new ItemData( | 913 | internalIDList.append(new ItemData( |
914 | HlManager::self()->syntax->groupData(data,QString("name")).simplifyWhiteSpace(), | 914 | HlManager::self()->syntax->groupData(data,QString("name")).simplifyWhiteSpace(), |
915 | getDefStyleNum(HlManager::self()->syntax->groupData(data,QString("defStyleNum"))))); | 915 | getDefStyleNum(HlManager::self()->syntax->groupData(data,QString("defStyleNum"))))); |
916 | 916 | ||
917 | } | 917 | } |
918 | } | 918 | } |
919 | //clean up | 919 | //clean up |
920 | if (data) HlManager::self()->syntax->freeGroupInfo(data); | 920 | if (data) HlManager::self()->syntax->freeGroupInfo(data); |
921 | } | 921 | } |
922 | 922 | ||
923 | //set the ouput reference | 923 | //set the ouput reference |
924 | list=internalIDList; | 924 | list=internalIDList; |
925 | } | 925 | } |
926 | 926 | ||
927 | 927 | ||
928 | /******************************************************************************************* | 928 | /******************************************************************************************* |
929 | Highlight - lookupAttrName | 929 | Highlight - lookupAttrName |
930 | This function is a helper for makeContextList and createHlItem. It looks the given | 930 | This function is a helper for makeContextList and createHlItem. It looks the given |
931 | attribute name in the itemData list up and returns it's index | 931 | attribute name in the itemData list up and returns it's index |
932 | 932 | ||
933 | * input: QString &name :the attribute name to lookup | 933 | * input: QString &name :the attribute name to lookup |
934 | * ItemDataList &iDl :the list containing all | 934 | * ItemDataList &iDl :the list containing all |
935 | * available attributes | 935 | * available attributes |
936 | ************* | 936 | ************* |
937 | * output: none | 937 | * output: none |
938 | ************* | 938 | ************* |
939 | * return value: int :The index of the attribute | 939 | * return value: int :The index of the attribute |
940 | * or 0 | 940 | * or 0 |
941 | *******************************************************************************************/ | 941 | *******************************************************************************************/ |
942 | 942 | ||
943 | int Highlight::lookupAttrName(const QString& name, ItemDataList &iDl) | 943 | int Highlight::lookupAttrName(const QString& name, ItemDataList &iDl) |
944 | { | 944 | { |
945 | for (int i=0;i<iDl.count();i++) | 945 | for (int i=0;i<iDl.count();i++) |
946 | { | 946 | { |
947 | if (iDl.at(i)->name==name) return i; | 947 | if (iDl.at(i)->name==name) return i; |
948 | } | 948 | } |
949 | kdDebug(13010)<<"Couldn't resolve itemDataName"<<endl; | 949 | kdDebug(13010)<<"Couldn't resolve itemDataName"<<endl; |
950 | return 0; | 950 | return 0; |
951 | } | 951 | } |
952 | 952 | ||
953 | 953 | ||
954 | /******************************************************************************************* | 954 | /******************************************************************************************* |
955 | Highlight - createHlItem | 955 | Highlight - createHlItem |
956 | This function is a helper for makeContextList. It parses the xml file for | 956 | This function is a helper for makeContextList. It parses the xml file for |
957 | information, how single or multi line comments are marked | 957 | information, how single or multi line comments are marked |
958 | 958 | ||
959 | * input: syntaxContextData *data : Data about the item read from | 959 | * input: syntaxContextData *data : Data about the item read from |
960 | * the xml file | 960 | * the xml file |
961 | * ItemDataList &iDl : List of all available itemData | 961 | * ItemDataList &iDl : List of all available itemData |
962 | * entries. Needed for attribute | 962 | * entries. Needed for attribute |
963 | * name->index translation | 963 | * name->index translation |
964 | ************* | 964 | ************* |
965 | * output: none | 965 | * output: none |
966 | ************* | 966 | ************* |
967 | * return value: HlItem * : Pointer to the newly created item | 967 | * return value: HlItem * : Pointer to the newly created item |
968 | * object | 968 | * object |
969 | *******************************************************************************************/ | 969 | *******************************************************************************************/ |
970 | 970 | ||
971 | HlItem *Highlight::createHlItem(syntaxContextData *data, ItemDataList &iDl) | 971 | HlItem *Highlight::createHlItem(syntaxContextData *data, ItemDataList &iDl) |
972 | { | 972 | { |
973 | // No highlighting -> exit | 973 | // No highlighting -> exit |
974 | if (noHl) | 974 | if (noHl) |
975 | return 0; | 975 | return 0; |
976 | 976 | ||
977 | // get the (tagname) itemd type | 977 | // get the (tagname) itemd type |
978 | QString dataname=HlManager::self()->syntax->groupItemData(data,QString("")); | 978 | QString dataname=HlManager::self()->syntax->groupItemData(data,QString("")); |
979 | 979 | ||
980 | // BEGIN - Translation of the attribute parameter | 980 | // BEGIN - Translation of the attribute parameter |
981 | QString tmpAttr=HlManager::self()->syntax->groupItemData(data,QString("attribute")).simplifyWhiteSpace(); | 981 | QString tmpAttr=HlManager::self()->syntax->groupItemData(data,QString("attribute")).simplifyWhiteSpace(); |
982 | int attr; | 982 | int attr; |
983 | if (QString("%1").arg(tmpAttr.toInt())==tmpAttr) | 983 | if (QString("%1").arg(tmpAttr.toInt())==tmpAttr) |
984 | attr=tmpAttr.toInt(); | 984 | attr=tmpAttr.toInt(); |
985 | else | 985 | else |
986 | attr=lookupAttrName(tmpAttr,iDl); | 986 | attr=lookupAttrName(tmpAttr,iDl); |
987 | // END - Translation of the attribute parameter | 987 | // END - Translation of the attribute parameter |
988 | 988 | ||
989 | // Info about context switch | 989 | // Info about context switch |
990 | int context=((HlManager::self()->syntax->groupItemData(data,QString("context"))).toInt()); | 990 | int context=((HlManager::self()->syntax->groupItemData(data,QString("context"))).toInt()); |
991 | 991 | ||
992 | // Get the char parameter (eg DetectChar) | 992 | // Get the char parameter (eg DetectChar) |
993 | char chr; | 993 | char chr; |
994 | if (! HlManager::self()->syntax->groupItemData(data,QString("char")).isEmpty()) | 994 | if (! HlManager::self()->syntax->groupItemData(data,QString("char")).isEmpty()) |
995 | chr= (HlManager::self()->syntax->groupItemData(data,QString("char")).latin1())[0]; | 995 | chr= (HlManager::self()->syntax->groupItemData(data,QString("char")).latin1())[0]; |
996 | else | 996 | else |
997 | chr=0; | 997 | chr=0; |
998 | 998 | ||
999 | // Get the String parameter (eg. StringDetect) | 999 | // Get the String parameter (eg. StringDetect) |
1000 | QString stringdata=HlManager::self()->syntax->groupItemData(data,QString("String")); | 1000 | QString stringdata=HlManager::self()->syntax->groupItemData(data,QString("String")); |
1001 | 1001 | ||
1002 | // Get a second char parameter (char1) (eg Detect2Chars) | 1002 | // Get a second char parameter (char1) (eg Detect2Chars) |
1003 | char chr1; | 1003 | char chr1; |
1004 | if (! HlManager::self()->syntax->groupItemData(data,QString("char1")).isEmpty()) | 1004 | if (! HlManager::self()->syntax->groupItemData(data,QString("char1")).isEmpty()) |
1005 | chr1= (HlManager::self()->syntax->groupItemData(data,QString("char1")).latin1())[0]; | 1005 | chr1= (HlManager::self()->syntax->groupItemData(data,QString("char1")).latin1())[0]; |
1006 | else | 1006 | else |
1007 | chr1=0; | 1007 | chr1=0; |
1008 | 1008 | ||
1009 | // Will be removed eventuall. Atm used for StringDetect | 1009 | // Will be removed eventuall. Atm used for StringDetect |
1010 | bool insensitive=(HlManager::self()->syntax->groupItemData(data,QString("insensitive"))==QString("TRUE")); | 1010 | bool insensitive=(HlManager::self()->syntax->groupItemData(data,QString("insensitive"))==QString("TRUE")); |
1011 | 1011 | ||
1012 | 1012 | ||
1013 | //Create the item corresponding to it's type and set it's parameters | 1013 | //Create the item corresponding to it's type and set it's parameters |
1014 | if (dataname=="keyword") | 1014 | if (dataname=="keyword") |
1015 | { | 1015 | { |
1016 | HlKeyword *keyword=new HlKeyword(attr,context,casesensitive, | 1016 | HlKeyword *keyword=new HlKeyword(attr,context,casesensitive, |
1017 | deliminatorChars, deliminatorLen); | 1017 | deliminatorChars, deliminatorLen); |
1018 | 1018 | ||
1019 | //Get the entries for the keyword lookup list | 1019 | //Get the entries for the keyword lookup list |
1020 | keyword->addList(HlManager::self()->syntax->finddata("highlighting",stringdata)); | 1020 | keyword->addList(HlManager::self()->syntax->finddata("highlighting",stringdata)); |
1021 | return keyword; | 1021 | return keyword; |
1022 | } else | 1022 | } else |
1023 | if (dataname=="Float") return (new HlFloat(attr,context)); else | 1023 | if (dataname=="Float") return (new HlFloat(attr,context)); else |
1024 | if (dataname=="Int") return(new HlInt(attr,context)); else | 1024 | if (dataname=="Int") return(new HlInt(attr,context)); else |
1025 | if (dataname=="DetectChar") return(new HlCharDetect(attr,context,chr)); else | 1025 | if (dataname=="DetectChar") return(new HlCharDetect(attr,context,chr)); else |
1026 | if (dataname=="Detect2Chars") return(new Hl2CharDetect(attr,context,chr,chr1)); else | 1026 | if (dataname=="Detect2Chars") return(new Hl2CharDetect(attr,context,chr,chr1)); else |
1027 | if (dataname=="RangeDetect") return(new HlRangeDetect(attr,context, chr, chr1)); else | 1027 | if (dataname=="RangeDetect") return(new HlRangeDetect(attr,context, chr, chr1)); else |
1028 | if (dataname=="LineContinue") return(new HlLineContinue(attr,context)); else | 1028 | if (dataname=="LineContinue") return(new HlLineContinue(attr,context)); else |
1029 | if (dataname=="StringDetect") return(new HlStringDetect(attr,context,stringdata,insensitive)); else | 1029 | if (dataname=="StringDetect") return(new HlStringDetect(attr,context,stringdata,insensitive)); else |
1030 | if (dataname=="AnyChar") return(new HlAnyChar(attr,context,stringdata.unicode(), stringdata.length())); else | 1030 | if (dataname=="AnyChar") return(new HlAnyChar(attr,context,stringdata.unicode(), stringdata.length())); else |
1031 | if (dataname=="RegExpr") return(new HlRegExpr(attr,context,stringdata)); else | 1031 | if (dataname=="RegExpr") return(new HlRegExpr(attr,context,stringdata)); else |
1032 | if(dataname=="HlCChar") return ( new HlCChar(attr,context));else | 1032 | if(dataname=="HlCChar") return ( new HlCChar(attr,context));else |
1033 | if(dataname=="HlCHex") return (new HlCHex(attr,context));else | 1033 | if(dataname=="HlCHex") return (new HlCHex(attr,context));else |
1034 | if(dataname=="HlCOct") return (new HlCOct(attr,context)); else | 1034 | if(dataname=="HlCOct") return (new HlCOct(attr,context)); else |
1035 | if(dataname=="HlCStringChar") return (new HlCStringChar(attr,context)); else | 1035 | if(dataname=="HlCStringChar") return (new HlCStringChar(attr,context)); else |
1036 | 1036 | ||
1037 | { | 1037 | { |
1038 | // oops, unknown type. Perhaps a spelling error in the xml file | 1038 | // oops, unknown type. Perhaps a spelling error in the xml file |
1039 | return 0; | 1039 | return 0; |
1040 | } | 1040 | } |
1041 | 1041 | ||
1042 | 1042 | ||
1043 | } | 1043 | } |
1044 | 1044 | ||
1045 | 1045 | ||
1046 | /******************************************************************************************* | 1046 | /******************************************************************************************* |
1047 | Highlight - isInWord | 1047 | Highlight - isInWord |
1048 | 1048 | ||
1049 | * input: Qchar c Character to investigate | 1049 | * input: Qchar c Character to investigate |
1050 | ************* | 1050 | ************* |
1051 | * output: none | 1051 | * output: none |
1052 | ************* | 1052 | ************* |
1053 | * return value: returns true, if c is no deliminator | 1053 | * return value: returns true, if c is no deliminator |
1054 | *******************************************************************************************/ | 1054 | *******************************************************************************************/ |
1055 | 1055 | ||
1056 | bool Highlight::isInWord(QChar c) | 1056 | bool Highlight::isInWord(QChar c) |
1057 | { | 1057 | { |
1058 | return !ustrchr(deliminatorChars, deliminatorLen, c); | 1058 | return !ustrchr(deliminatorChars, deliminatorLen, c); |
1059 | } | 1059 | } |
1060 | 1060 | ||
1061 | 1061 | ||
1062 | 1062 | ||
1063 | /******************************************************************************************* | 1063 | /******************************************************************************************* |
1064 | Highlight - readCommentConfig | 1064 | Highlight - readCommentConfig |
1065 | This function is a helper for makeContextList. It parses the xml file for | 1065 | This function is a helper for makeContextList. It parses the xml file for |
1066 | information, how single or multi line comments are marked | 1066 | information, how single or multi line comments are marked |
1067 | 1067 | ||
1068 | * input: none | 1068 | * input: none |
1069 | ************* | 1069 | ************* |
1070 | * output: none | 1070 | * output: none |
1071 | ************* | 1071 | ************* |
1072 | * return value: none | 1072 | * return value: none |
1073 | *******************************************************************************************/ | 1073 | *******************************************************************************************/ |
1074 | 1074 | ||
1075 | void Highlight::readCommentConfig() | 1075 | void Highlight::readCommentConfig() |
1076 | { | 1076 | { |
1077 | 1077 | ||
1078 | cslStart = ""; | 1078 | cslStart = ""; |
1079 | HlManager::self()->syntax->setIdentifier(identifier); | 1079 | HlManager::self()->syntax->setIdentifier(identifier); |
1080 | 1080 | ||
1081 | syntaxContextData *data=HlManager::self()->syntax->getGroupInfo("general","comment"); | 1081 | syntaxContextData *data=HlManager::self()->syntax->getGroupInfo("general","comment"); |
1082 | if (data) | 1082 | if (data) |
1083 | { | 1083 | { |
1084 | // kdDebug(13010)<<"COMMENT DATA FOUND"<<endl; | 1084 | // kdDebug(13010)<<"COMMENT DATA FOUND"<<endl; |
1085 | while (HlManager::self()->syntax->nextGroup(data)) | 1085 | while (HlManager::self()->syntax->nextGroup(data)) |
1086 | { | 1086 | { |
1087 | 1087 | ||
1088 | if (HlManager::self()->syntax->groupData(data,"name")=="singleLine") | 1088 | if (HlManager::self()->syntax->groupData(data,"name")=="singleLine") |
1089 | cslStart=HlManager::self()->syntax->groupData(data,"start"); | 1089 | cslStart=HlManager::self()->syntax->groupData(data,"start"); |
1090 | if (HlManager::self()->syntax->groupData(data,"name")=="multiLine") | 1090 | if (HlManager::self()->syntax->groupData(data,"name")=="multiLine") |
1091 | { | 1091 | { |
1092 | cmlStart=HlManager::self()->syntax->groupData(data,"start"); | 1092 | cmlStart=HlManager::self()->syntax->groupData(data,"start"); |
1093 | cmlEnd=HlManager::self()->syntax->groupData(data,"end"); | 1093 | cmlEnd=HlManager::self()->syntax->groupData(data,"end"); |
1094 | } | 1094 | } |
1095 | } | 1095 | } |
1096 | HlManager::self()->syntax->freeGroupInfo(data); | 1096 | HlManager::self()->syntax->freeGroupInfo(data); |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | } | 1099 | } |
1100 | 1100 | ||
1101 | /******************************************************************************************* | 1101 | /******************************************************************************************* |
1102 | Highlight - readGlobalKeyWordConfig | 1102 | Highlight - readGlobalKeyWordConfig |
1103 | This function is a helper for makeContextList. It parses the xml file for | 1103 | This function is a helper for makeContextList. It parses the xml file for |
1104 | information, if keywords should be treated case(in)sensitive and creates the keyword | 1104 | information, if keywords should be treated case(in)sensitive and creates the keyword |
1105 | delimiter list. Which is the default list, without any given weak deliminiators | 1105 | delimiter list. Which is the default list, without any given weak deliminiators |
1106 | 1106 | ||
1107 | * input: none | 1107 | * input: none |
1108 | ************* | 1108 | ************* |
1109 | * output: none | 1109 | * output: none |
1110 | ************* | 1110 | ************* |
1111 | * return value: none | 1111 | * return value: none |
1112 | *******************************************************************************************/ | 1112 | *******************************************************************************************/ |
1113 | 1113 | ||
1114 | 1114 | ||
1115 | void Highlight::readGlobalKeywordConfig() | 1115 | void Highlight::readGlobalKeywordConfig() |
1116 | { | 1116 | { |
1117 | // Tell the syntax document class which file we want to parse | 1117 | // Tell the syntax document class which file we want to parse |
1118 | HlManager::self()->syntax->setIdentifier(identifier); | 1118 | HlManager::self()->syntax->setIdentifier(identifier); |
1119 | 1119 | ||
1120 | // Get the keywords config entry | 1120 | // Get the keywords config entry |
1121 | syntaxContextData * data=HlManager::self()->syntax->getConfig("general","keywords"); | 1121 | syntaxContextData * data=HlManager::self()->syntax->getConfig("general","keywords"); |
1122 | if (data) | 1122 | if (data) |
1123 | { | 1123 | { |
1124 | kdDebug(13010)<<"Found global keyword config"<<endl; | 1124 | kdDebug(13010)<<"Found global keyword config"<<endl; |
1125 | 1125 | ||
1126 | if (HlManager::self()->syntax->groupItemData(data,QString("casesensitive"))!="0") | 1126 | if (HlManager::self()->syntax->groupItemData(data,QString("casesensitive"))!="0") |
1127 | casesensitive=true; else {casesensitive=false; kdDebug(13010)<<"Turning on case insensitiveness"<<endl;} | 1127 | casesensitive=true; else {casesensitive=false; kdDebug(13010)<<"Turning on case insensitiveness"<<endl;} |
1128 | //get the weak deliminators | 1128 | //get the weak deliminators |
1129 | weakDeliminator=(!HlManager::self()->syntax->groupItemData(data,QString("weakDeliminator"))); | 1129 | weakDeliminator=(!HlManager::self()->syntax->groupItemData(data,QString("weakDeliminator"))); |
1130 | 1130 | ||
1131 | // remove any weakDelimitars (if any) from the default list and store this list. | 1131 | // remove any weakDelimitars (if any) from the default list and store this list. |
1132 | int f; | 1132 | int f; |
1133 | for (int s=0; s < weakDeliminator.length(); s++) | 1133 | for (int s=0; s < weakDeliminator.length(); s++) |
1134 | { | 1134 | { |
1135 | f = 0; | 1135 | f = 0; |
1136 | f = deliminator.find (weakDeliminator[s]); | 1136 | f = deliminator.find (weakDeliminator[s]); |
1137 | 1137 | ||
1138 | if (f > -1) | 1138 | if (f > -1) |
1139 | deliminator.remove (f, 1); | 1139 | deliminator.remove (f, 1); |
1140 | } | 1140 | } |
1141 | 1141 | ||
1142 | deliminatorChars = deliminator.unicode(); | 1142 | deliminatorChars = deliminator.unicode(); |
1143 | deliminatorLen = deliminator.length(); | 1143 | deliminatorLen = deliminator.length(); |
1144 | 1144 | ||
1145 | HlManager::self()->syntax->freeGroupInfo(data); | 1145 | HlManager::self()->syntax->freeGroupInfo(data); |
1146 | } | 1146 | } |
1147 | else | 1147 | else |
1148 | { | 1148 | { |
1149 | //Default values | 1149 | //Default values |
1150 | casesensitive=true; | 1150 | casesensitive=true; |
1151 | weakDeliminator=QString(""); | 1151 | weakDeliminator=QString(""); |
1152 | } | 1152 | } |
1153 | 1153 | ||
1154 | } | 1154 | } |
1155 | 1155 | ||
1156 | /******************************************************************************************* | 1156 | /******************************************************************************************* |
1157 | Highlight - makeContextList | 1157 | Highlight - makeContextList |
1158 | That's the most important initialization function for each highlighting. It's called | 1158 | That's the most important initialization function for each highlighting. It's called |
1159 | each time a document gets a highlighting style assigned. parses the xml file and | 1159 | each time a document gets a highlighting style assigned. parses the xml file and |
1160 | creates a corresponding internal structure | 1160 | creates a corresponding internal structure |
1161 | 1161 | ||
1162 | * input: none | 1162 | * input: none |
1163 | ************* | 1163 | ************* |
1164 | * output: none | 1164 | * output: none |
1165 | ************* | 1165 | ************* |
1166 | * return value: none | 1166 | * return value: none |
1167 | *******************************************************************************************/ | 1167 | *******************************************************************************************/ |
1168 | 1168 | ||
1169 | 1169 | ||
1170 | void Highlight::makeContextList() | 1170 | void Highlight::makeContextList() |
1171 | { | 1171 | { |
1172 | if (noHl) | 1172 | if (noHl) |
1173 | return; | 1173 | return; |
1174 | 1174 | ||
1175 | HlKeyword *keyword=0, *dataType=0; | 1175 | HlKeyword *keyword=0, *dataType=0; |
1176 | syntaxContextData *data, *datasub; | 1176 | syntaxContextData *data, *datasub; |
1177 | HlItem *c; | 1177 | HlItem *c; |
1178 | 1178 | ||
1179 | readCommentConfig(); | 1179 | readCommentConfig(); |
1180 | readGlobalKeywordConfig(); | 1180 | readGlobalKeywordConfig(); |
1181 | 1181 | ||
1182 | // Let the syntax document class know, which file we'd like to parse | 1182 | // Let the syntax document class know, which file we'd like to parse |
1183 | HlManager::self()->syntax->setIdentifier(identifier); | 1183 | HlManager::self()->syntax->setIdentifier(identifier); |
1184 | 1184 | ||
1185 | // This list is needed for the translation of the attribute parameter, if the itemData name is given instead of the index | 1185 | // This list is needed for the translation of the attribute parameter, if the itemData name is given instead of the index |
1186 | ItemDataList iDl; | 1186 | ItemDataList iDl; |
1187 | createItemData(iDl); | 1187 | createItemData(iDl); |
1188 | 1188 | ||
1189 | //start the real work | 1189 | //start the real work |
1190 | data=HlManager::self()->syntax->getGroupInfo("highlighting","context"); | 1190 | data=HlManager::self()->syntax->getGroupInfo("highlighting","context"); |
1191 | int i=0; | 1191 | int i=0; |
1192 | if (data) | 1192 | if (data) |
1193 | { | 1193 | { |
1194 | while (HlManager::self()->syntax->nextGroup(data)) | 1194 | while (HlManager::self()->syntax->nextGroup(data)) |
1195 | { | 1195 | { |
1196 | 1196 | ||
1197 | // BEGIN - Translation of the attribute parameter | 1197 | // BEGIN - Translation of the attribute parameter |
1198 | QString tmpAttr=HlManager::self()->syntax->groupData(data,QString("attribute")).simplifyWhiteSpace(); | 1198 | QString tmpAttr=HlManager::self()->syntax->groupData(data,QString("attribute")).simplifyWhiteSpace(); |
1199 | int attr; | 1199 | int attr; |
1200 | if (QString("%1").arg(tmpAttr.toInt())==tmpAttr) | 1200 | if (QString("%1").arg(tmpAttr.toInt())==tmpAttr) |
1201 | attr=tmpAttr.toInt(); | 1201 | attr=tmpAttr.toInt(); |
1202 | else | 1202 | else |
1203 | attr=lookupAttrName(tmpAttr,iDl); | 1203 | attr=lookupAttrName(tmpAttr,iDl); |
1204 | // END - Translation of the attribute parameter | 1204 | // END - Translation of the attribute parameter |
1205 | 1205 | ||
1206 | contextList[i]=new HlContext( | 1206 | contextList[i]=new HlContext( |
1207 | attr, | 1207 | attr, |
1208 | (HlManager::self()->syntax->groupData(data,QString("lineEndContext"))).toInt(), | 1208 | (HlManager::self()->syntax->groupData(data,QString("lineEndContext"))).toInt(), |
1209 | (HlManager::self()->syntax->groupData(data,QString("lineBeginContext"))).isEmpty()?-1: | 1209 | (HlManager::self()->syntax->groupData(data,QString("lineBeginContext"))).isEmpty()?-1: |
1210 | (HlManager::self()->syntax->groupData(data,QString("lineBeginContext"))).toInt()); | 1210 | (HlManager::self()->syntax->groupData(data,QString("lineBeginContext"))).toInt()); |
1211 | 1211 | ||
1212 | 1212 | ||
1213 | //Let's create all items for the context | 1213 | //Let's create all items for the context |
1214 | while (HlManager::self()->syntax->nextItem(data)) | 1214 | while (HlManager::self()->syntax->nextItem(data)) |
1215 | { | 1215 | { |
1216 | // kdDebug(13010)<< "In make Contextlist: Item:"<<endl; | 1216 | // kdDebug(13010)<< "In make Contextlist: Item:"<<endl; |
1217 | c=createHlItem(data,iDl); | 1217 | c=createHlItem(data,iDl); |
1218 | if (c) | 1218 | if (c) |
1219 | { | 1219 | { |
1220 | contextList[i]->items.append(c); | 1220 | contextList[i]->items.append(c); |
1221 | 1221 | ||
1222 | // Not supported completely atm and only one level. Subitems.(all have to be matched to at once) | 1222 | // Not supported completely atm and only one level. Subitems.(all have to be matched to at once) |
1223 | datasub=HlManager::self()->syntax->getSubItems(data); | 1223 | datasub=HlManager::self()->syntax->getSubItems(data); |
1224 | bool tmpbool; | 1224 | bool tmpbool; |
1225 | if (tmpbool=HlManager::self()->syntax->nextItem(datasub)) | 1225 | if (tmpbool=HlManager::self()->syntax->nextItem(datasub)) |
1226 | { | 1226 | { |
1227 | c->subItems=new QList<HlItem>; | 1227 | c->subItems=new QList<HlItem>; |
1228 | for (;tmpbool;tmpbool=HlManager::self()->syntax->nextItem(datasub)) | 1228 | for (;tmpbool;tmpbool=HlManager::self()->syntax->nextItem(datasub)) |
1229 | c->subItems->append(createHlItem(datasub,iDl)); | 1229 | c->subItems->append(createHlItem(datasub,iDl)); |
1230 | } | 1230 | } |
1231 | HlManager::self()->syntax->freeGroupInfo(datasub); | 1231 | HlManager::self()->syntax->freeGroupInfo(datasub); |
1232 | // end of sublevel | 1232 | // end of sublevel |
1233 | } | 1233 | } |
1234 | // kdDebug(13010)<<"Last line in loop"<<endl; | 1234 | // kdDebug(13010)<<"Last line in loop"<<endl; |
1235 | } | 1235 | } |
1236 | i++; | 1236 | i++; |
1237 | } | 1237 | } |
1238 | } | 1238 | } |
1239 | 1239 | ||
1240 | HlManager::self()->syntax->freeGroupInfo(data); | 1240 | HlManager::self()->syntax->freeGroupInfo(data); |
1241 | 1241 | ||
1242 | 1242 | ||
1243 | } | 1243 | } |
1244 | 1244 | ||
1245 | HlManager::HlManager() : QObject(0L) | 1245 | HlManager::HlManager() : QObject(0L) |
1246 | { | 1246 | { |
1247 | syntax = new SyntaxDocument(); | 1247 | syntax = new SyntaxDocument(); |
1248 | SyntaxModeList modeList = syntax->modeList(); | 1248 | SyntaxModeList modeList = syntax->modeList(); |
1249 | 1249 | ||
1250 | hlList.setAutoDelete(true); | 1250 | hlList.setAutoDelete(true); |
1251 | hlList.append(new Highlight(0)); | 1251 | hlList.append(new Highlight(0)); |
1252 | 1252 | ||
1253 | uint i=0; | 1253 | uint i=0; |
1254 | while (i < modeList.count()) | 1254 | while (i < modeList.count()) |
1255 | { | 1255 | { |
1256 | hlList.append(new Highlight(modeList.at(i))); | 1256 | hlList.append(new Highlight(modeList.at(i))); |
1257 | i++; | 1257 | i++; |
1258 | } | 1258 | } |
1259 | } | 1259 | } |
1260 | 1260 | ||
1261 | HlManager::~HlManager() { | 1261 | HlManager::~HlManager() { |
1262 | if(syntax) delete syntax; | 1262 | if(syntax) delete syntax; |
1263 | } | 1263 | } |
1264 | 1264 | ||
1265 | HlManager *HlManager::self() | 1265 | HlManager *HlManager::self() |
1266 | { | 1266 | { |
1267 | if ( !s_pSelf ) | 1267 | if ( !s_pSelf ) |
1268 | s_pSelf = new HlManager; | 1268 | s_pSelf = new HlManager; |
1269 | return s_pSelf; | 1269 | return s_pSelf; |
1270 | } | 1270 | } |
1271 | 1271 | ||
1272 | Highlight *HlManager::getHl(int n) { | 1272 | Highlight *HlManager::getHl(int n) { |
1273 | if (n < 0 || n >= (int) hlList.count()) n = 0; | 1273 | if (n < 0 || n >= (int) hlList.count()) n = 0; |
1274 | return hlList.at(n); | 1274 | return hlList.at(n); |
1275 | } | 1275 | } |
1276 | 1276 | ||
1277 | int HlManager::defaultHl() { | 1277 | int HlManager::defaultHl() { |
1278 | KateConfig *config; | 1278 | KateConfig *config; |
1279 | config = KGlobal::config(); | 1279 | config = KGlobal::config(); |
1280 | config->setGroup("General Options"); | 1280 | config->setGroup("General Options"); |
1281 | 1281 | ||
1282 | #warning fixme return nameFind(config->readEntry("Highlight")); | 1282 | #warning fixme return nameFind(config->readEntry("Highlight")); |
1283 | 1283 | ||
1284 | } | 1284 | } |
1285 | 1285 | ||
1286 | 1286 | ||
1287 | int HlManager::nameFind(const QString &name) { | 1287 | int HlManager::nameFind(const QString &name) { |
1288 | int z; | 1288 | int z; |
1289 | 1289 | ||
1290 | for (z = hlList.count() - 1; z > 0; z--) { | 1290 | for (z = hlList.count() - 1; z > 0; z--) { |
1291 | if (hlList.at(z)->iName == name) break; | 1291 | if (hlList.at(z)->iName == name) break; |
1292 | } | 1292 | } |
1293 | return z; | 1293 | return z; |
1294 | } | 1294 | } |
1295 | 1295 | ||
1296 | int HlManager::wildcardFind(const QString &fileName) { | 1296 | int HlManager::wildcardFind(const QString &fileName) { |
1297 | Highlight *highlight; | 1297 | Highlight *highlight; |
1298 | int p1, p2; | 1298 | int p1, p2; |
1299 | QString w; | 1299 | QString w; |
1300 | for (highlight = hlList.first(); highlight != 0L; highlight = hlList.next()) { | 1300 | for (highlight = hlList.first(); highlight != 0L; highlight = hlList.next()) { |
1301 | p1 = 0; | 1301 | p1 = 0; |
1302 | w = highlight->getWildcards(); | 1302 | w = highlight->getWildcards(); |
1303 | while (p1 < (int) w.length()) { | 1303 | while (p1 < (int) w.length()) { |
1304 | p2 = w.find(';',p1); | 1304 | p2 = w.find(';',p1); |
1305 | if (p2 == -1) p2 = w.length(); | 1305 | if (p2 == -1) p2 = w.length(); |
1306 | if (p1 < p2) { | 1306 | if (p1 < p2) { |
1307 | QRegExp regExp(w.mid(p1,p2 - p1),true,true); | 1307 | QRegExp regExp(w.mid(p1,p2 - p1),true,true); |
1308 | if (regExp.match(fileName) == 0) return hlList.at(); | 1308 | if (regExp.match(fileName) == 0) return hlList.at(); |
1309 | } | 1309 | } |
1310 | p1 = p2 + 1; | 1310 | p1 = p2 + 1; |
1311 | } | 1311 | } |
1312 | } | 1312 | } |
1313 | return -1; | 1313 | return -1; |
1314 | } | 1314 | } |
1315 | 1315 | ||
1316 | 1316 | ||
1317 | int HlManager::makeAttribs(Highlight *highlight, Attribute *a, int maxAttribs) { | 1317 | int HlManager::makeAttribs(Highlight *highlight, Attribute *a, int maxAttribs) { |
1318 | ItemStyleList defaultStyleList; | 1318 | ItemStyleList defaultStyleList; |
1319 | ItemStyle *defaultStyle; | 1319 | ItemStyle *defaultStyle = 0; |
1320 | ItemDataList itemDataList; | 1320 | ItemDataList itemDataList; |
1321 | ItemData *itemData; | 1321 | ItemData *itemData; |
1322 | int nAttribs, z; | 1322 | int nAttribs, z; |
1323 | 1323 | ||
1324 | odebug << "HlManager::makeAttribs" << oendl; | 1324 | odebug << "HlManager::makeAttribs" << oendl; |
1325 | 1325 | ||
1326 | defaultStyleList.setAutoDelete(true); | 1326 | defaultStyleList.setAutoDelete(true); |
1327 | getDefaults(defaultStyleList); | 1327 | getDefaults(defaultStyleList); |
1328 | 1328 | ||
1329 | // itemDataList.setAutoDelete(true); | 1329 | // itemDataList.setAutoDelete(true); |
1330 | highlight->getItemDataList(itemDataList); | 1330 | highlight->getItemDataList(itemDataList); |
1331 | nAttribs = itemDataList.count(); | 1331 | nAttribs = itemDataList.count(); |
1332 | for (z = 0; z < nAttribs; z++) { | 1332 | for (z = 0; z < nAttribs; z++) { |
1333 | odebug << "HlManager::makeAttribs: createing one attribute definition" << oendl; | 1333 | odebug << "HlManager::makeAttribs: creating an attribute definition" << oendl; |
1334 | itemData = itemDataList.at(z); | 1334 | itemData = itemDataList.at(z); |
1335 | if (itemData->defStyle) { | 1335 | if (itemData->defStyle) { |
1336 | // default style | 1336 | // default style |
1337 | defaultStyle = defaultStyleList.at(itemData->defStyleNum); | 1337 | defaultStyle = defaultStyleList.at(itemData->defStyleNum); |
1338 | a[z].col = defaultStyle->col; | 1338 | a[z].col = defaultStyle->col; |
1339 | a[z].selCol = defaultStyle->selCol; | 1339 | a[z].selCol = defaultStyle->selCol; |
1340 | a[z].bold = defaultStyle->bold; | 1340 | a[z].bold = defaultStyle->bold; |
1341 | a[z].italic = defaultStyle->italic; | 1341 | a[z].italic = defaultStyle->italic; |
1342 | } else { | 1342 | } else { |
1343 | // custom style | 1343 | // custom style |
1344 | a[z].col = itemData->col; | 1344 | a[z].col = itemData->col; |
1345 | a[z].selCol = itemData->selCol; | 1345 | a[z].selCol = itemData->selCol; |
1346 | a[z].bold = itemData->bold; | 1346 | a[z].bold = itemData->bold; |
1347 | a[z].italic = itemData->italic; | 1347 | a[z].italic = itemData->italic; |
1348 | } | 1348 | } |
1349 | } | 1349 | } |
1350 | 1350 | ||
1351 | for (; z < maxAttribs; z++) { | 1351 | for (; z < maxAttribs; z++) { |
1352 | a[z].col = black; | 1352 | a[z].col = black; |
1353 | a[z].selCol = black; | 1353 | a[z].selCol = black; |
1354 | a[z].bold = defaultStyle->bold; | 1354 | if (defaultStyle) { |
1355 | a[z].italic = defaultStyle->italic; | 1355 | a[z].bold = defaultStyle->bold; |
1356 | a[z].italic = defaultStyle->italic; | ||
1357 | } | ||
1356 | } | 1358 | } |
1357 | return nAttribs; | 1359 | return nAttribs; |
1358 | } | 1360 | } |
1359 | 1361 | ||
1360 | int HlManager::defaultStyles() { | 1362 | int HlManager::defaultStyles() { |
1361 | return 10; | 1363 | return 10; |
1362 | } | 1364 | } |
1363 | 1365 | ||
1364 | QString HlManager::defaultStyleName(int n) | 1366 | QString HlManager::defaultStyleName(int n) |
1365 | { | 1367 | { |
1366 | static QStringList names; | 1368 | static QStringList names; |
1367 | 1369 | ||
1368 | if (names.isEmpty()) | 1370 | if (names.isEmpty()) |
1369 | { | 1371 | { |
1370 | names << i18n("Normal"); | 1372 | names << i18n("Normal"); |
1371 | names << i18n("Keyword"); | 1373 | names << i18n("Keyword"); |
1372 | names << i18n("Data Type"); | 1374 | names << i18n("Data Type"); |
1373 | names << i18n("Decimal/Value"); | 1375 | names << i18n("Decimal/Value"); |
1374 | names << i18n("Base-N Integer"); | 1376 | names << i18n("Base-N Integer"); |
1375 | names << i18n("Floating Point"); | 1377 | names << i18n("Floating Point"); |
1376 | names << i18n("Character"); | 1378 | names << i18n("Character"); |
1377 | names << i18n("String"); | 1379 | names << i18n("String"); |
1378 | names << i18n("Comment"); | 1380 | names << i18n("Comment"); |
1379 | names << i18n("Others"); | 1381 | names << i18n("Others"); |
1380 | } | 1382 | } |
1381 | 1383 | ||
1382 | return names[n]; | 1384 | return names[n]; |
1383 | } | 1385 | } |
1384 | 1386 | ||
1385 | void HlManager::getDefaults(ItemStyleList &list) { | 1387 | void HlManager::getDefaults(ItemStyleList &list) { |
1386 | KateConfig *config; | 1388 | KateConfig *config; |
1387 | int z; | 1389 | int z; |
1388 | ItemStyle *i; | 1390 | ItemStyle *i; |
1389 | QString s; | 1391 | QString s; |
1390 | QRgb col, selCol; | 1392 | QRgb col, selCol; |
1391 | 1393 | ||
1392 | list.setAutoDelete(true); | 1394 | list.setAutoDelete(true); |
1393 | //ItemStyle(color, selected color, bold, italic) | 1395 | //ItemStyle(color, selected color, bold, italic) |
1394 | list.append(new ItemStyle(black,white,false,false)); //normal | 1396 | list.append(new ItemStyle(black,white,false,false)); //normal |
1395 | list.append(new ItemStyle(black,white,true,false)); //keyword | 1397 | list.append(new ItemStyle(black,white,true,false)); //keyword |
1396 | list.append(new ItemStyle(darkRed,white,false,false)); //datatype | 1398 | list.append(new ItemStyle(darkRed,white,false,false)); //datatype |
1397 | list.append(new ItemStyle(blue,cyan,false,false)); //decimal/value | 1399 | list.append(new ItemStyle(blue,cyan,false,false)); //decimal/value |
1398 | list.append(new ItemStyle(darkCyan,cyan,false,false)); //base n | 1400 | list.append(new ItemStyle(darkCyan,cyan,false,false)); //base n |
1399 | list.append(new ItemStyle(darkMagenta,cyan,false,false));//float | 1401 | list.append(new ItemStyle(darkMagenta,cyan,false,false));//float |
1400 | list.append(new ItemStyle(magenta,magenta,false,false)); //char | 1402 | list.append(new ItemStyle(magenta,magenta,false,false)); //char |
1401 | list.append(new ItemStyle(red,red,false,false)); //string | 1403 | list.append(new ItemStyle(red,red,false,false)); //string |
1402 | list.append(new ItemStyle(darkGray,gray,false,true)); //comment | 1404 | list.append(new ItemStyle(darkGray,gray,false,true)); //comment |
1403 | list.append(new ItemStyle(darkGreen,green,false,false)); //others | 1405 | list.append(new ItemStyle(darkGreen,green,false,false)); //others |
1404 | 1406 | ||
1405 | #warning fixme | 1407 | #warning fixme |
1406 | /* | 1408 | /* |
1407 | config = KateFactory::instance()->config(); | 1409 | config = KateFactory::instance()->config(); |
1408 | config->setGroup("Default Item Styles"); | 1410 | config->setGroup("Default Item Styles"); |
1409 | for (z = 0; z < defaultStyles(); z++) { | 1411 | for (z = 0; z < defaultStyles(); z++) { |
1410 | i = list.at(z); | 1412 | i = list.at(z); |
1411 | s = config->readEntry(defaultStyleName(z)); | 1413 | s = config->readEntry(defaultStyleName(z)); |
1412 | if (!s.isEmpty()) { | 1414 | if (!s.isEmpty()) { |
1413 | sscanf(s.latin1(),"%X,%X,%d,%d",&col,&selCol,&i->bold,&i->italic); | 1415 | sscanf(s.latin1(),"%X,%X,%d,%d",&col,&selCol,&i->bold,&i->italic); |
1414 | i->col.setRgb(col); | 1416 | i->col.setRgb(col); |
1415 | i->selCol.setRgb(selCol); | 1417 | i->selCol.setRgb(selCol); |
1416 | } | 1418 | } |
1417 | } | 1419 | } |
1418 | */ | 1420 | */ |
1419 | } | 1421 | } |
1420 | 1422 | ||
1421 | void HlManager::setDefaults(ItemStyleList &list) { | 1423 | void HlManager::setDefaults(ItemStyleList &list) { |
1422 | KateConfig *config; | 1424 | KateConfig *config; |
1423 | int z; | 1425 | int z; |
1424 | ItemStyle *i; | 1426 | ItemStyle *i; |
1425 | char s[64]; | 1427 | char s[64]; |
1426 | #warning fixme | 1428 | #warning fixme |
1427 | /* | 1429 | /* |
1428 | config = KateFactory::instance()->config(); | 1430 | config = KateFactory::instance()->config(); |
1429 | config->setGroup("Default Item Styles"); | 1431 | config->setGroup("Default Item Styles"); |
1430 | for (z = 0; z < defaultStyles(); z++) { | 1432 | for (z = 0; z < defaultStyles(); z++) { |
1431 | i = list.at(z); | 1433 | i = list.at(z); |
1432 | sprintf(s,"%X,%X,%d,%d",i->col.rgb(),i->selCol.rgb(),i->bold, i->italic); | 1434 | sprintf(s,"%X,%X,%d,%d",i->col.rgb(),i->selCol.rgb(),i->bold, i->italic); |
1433 | config->writeEntry(defaultStyleName(z),s); | 1435 | config->writeEntry(defaultStyleName(z),s); |
1434 | } | 1436 | } |
1435 | */ | 1437 | */ |
1436 | emit changed(); | 1438 | emit changed(); |
1437 | } | 1439 | } |
1438 | 1440 | ||
1439 | 1441 | ||
1440 | int HlManager::highlights() { | 1442 | int HlManager::highlights() { |
1441 | return (int) hlList.count(); | 1443 | return (int) hlList.count(); |
1442 | } | 1444 | } |
1443 | 1445 | ||
1444 | QString HlManager::hlName(int n) { | 1446 | QString HlManager::hlName(int n) { |
1445 | return hlList.at(n)->iName; | 1447 | return hlList.at(n)->iName; |
1446 | } | 1448 | } |
1447 | 1449 | ||
1448 | QString HlManager::hlSection(int n) { | 1450 | QString HlManager::hlSection(int n) { |
1449 | return hlList.at(n)->iSection; | 1451 | return hlList.at(n)->iSection; |
1450 | } | 1452 | } |
1451 | 1453 | ||
1452 | void HlManager::getHlDataList(HlDataList &list) { | 1454 | void HlManager::getHlDataList(HlDataList &list) { |
1453 | int z; | 1455 | int z; |
1454 | 1456 | ||
1455 | for (z = 0; z < (int) hlList.count(); z++) { | 1457 | for (z = 0; z < (int) hlList.count(); z++) { |
1456 | list.append(hlList.at(z)->getData()); | 1458 | list.append(hlList.at(z)->getData()); |
1457 | } | 1459 | } |
1458 | } | 1460 | } |
1459 | 1461 | ||
1460 | void HlManager::setHlDataList(HlDataList &list) { | 1462 | void HlManager::setHlDataList(HlDataList &list) { |
1461 | int z; | 1463 | int z; |
1462 | 1464 | ||
1463 | for (z = 0; z < (int) hlList.count(); z++) { | 1465 | for (z = 0; z < (int) hlList.count(); z++) { |
1464 | hlList.at(z)->setData(list.at(z)); | 1466 | hlList.at(z)->setData(list.at(z)); |
1465 | } | 1467 | } |
1466 | //notify documents about changes in highlight configuration | 1468 | //notify documents about changes in highlight configuration |
1467 | emit changed(); | 1469 | emit changed(); |
1468 | } | 1470 | } |
diff --git a/noncore/net/ftplib/ftplib.c b/noncore/net/ftplib/ftplib.c index addf9d2..ce4c05f 100644 --- a/noncore/net/ftplib/ftplib.c +++ b/noncore/net/ftplib/ftplib.c | |||
@@ -1,1354 +1,1354 @@ | |||
1 | /***************************************************************************/ | 1 | /***************************************************************************/ |
2 | /* ftplib.c - callable ftp access routines */ | 2 | /* ftplib.c - callable ftp access routines */ |
3 | /* Copyright (C) 1996-2000 Thomas Pfau, pfau@cnj.digex.net */ | 3 | /* Copyright (C) 1996-2000 Thomas Pfau, pfau@cnj.digex.net */ |
4 | /* 73 Catherine Street, South Bound Brook, NJ, 08880 */ | 4 | /* 73 Catherine Street, South Bound Brook, NJ, 08880 */ |
5 | /* */ | 5 | /* */ |
6 | /* This library is free software; you can redistribute it and/or */ | 6 | /* This library is free software; you can redistribute it and/or */ |
7 | /* modify it under the terms of the GNU Library General Public */ | 7 | /* modify it under the terms of the GNU Library General Public */ |
8 | /* License as published by the Free Software Foundation; either */ | 8 | /* License as published by the Free Software Foundation; either */ |
9 | /* version 2 of the License, or (at your option) any later version. */ | 9 | /* version 2 of the License, or (at your option) any later version. */ |
10 | /* */ | 10 | /* */ |
11 | /* This library is distributed in the hope that it will be useful, */ | 11 | /* This library is distributed in the hope that it will be useful, */ |
12 | /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ | 12 | /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ |
13 | /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ | 13 | /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ |
14 | /* Library General Public License for more details. */ | 14 | /* Library General Public License for more details. */ |
15 | /* */ | 15 | /* */ |
16 | /* You should have received a copy of the GNU Library General Public */ | 16 | /* You should have received a copy of the GNU Library General Public */ |
17 | /* License along with this progam; if not, write to the */ | 17 | /* License along with this progam; if not, write to the */ |
18 | /* Free Software Foundation, Inc., 59 Temple Place - Suite 330, */ | 18 | /* Free Software Foundation, Inc., 59 Temple Place - Suite 330, */ |
19 | /* Boston, MA 02111-1307, USA. */ | 19 | /* Boston, MA 02111-1307, USA. */ |
20 | /* */ | 20 | /* */ |
21 | /***************************************************************************/ | 21 | /***************************************************************************/ |
22 | // changes made by Lorn Potter <llornkcor@handhelds.org> | 22 | // changes made by Lorn Potter <llornkcor@handhelds.org> |
23 | // | 23 | // |
24 | #if defined(__unix__) || defined(__VMS) | 24 | #if defined(__unix__) || defined(__VMS) |
25 | #include <unistd.h> | 25 | #include <unistd.h> |
26 | #endif | 26 | #endif |
27 | #if defined(_WIN32) | 27 | #if defined(_WIN32) |
28 | #include <windows.h> | 28 | #include <windows.h> |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | #include <stdio.h> | 31 | #include <stdio.h> |
32 | #include <stdlib.h> | 32 | #include <stdlib.h> |
33 | #include <string.h> | 33 | #include <string.h> |
34 | #include <errno.h> | 34 | #include <errno.h> |
35 | #include <ctype.h> | 35 | #include <ctype.h> |
36 | 36 | ||
37 | #if defined(__unix__) | 37 | #if defined(__unix__) |
38 | 38 | ||
39 | #include <sys/types.h> | 39 | #include <sys/types.h> |
40 | #include <unistd.h> | 40 | #include <unistd.h> |
41 | #include <fcntl.h> | 41 | #include <fcntl.h> |
42 | #include <sys/time.h> | 42 | #include <sys/time.h> |
43 | #include <sys/types.h> | 43 | #include <sys/types.h> |
44 | #include <sys/socket.h> | 44 | #include <sys/socket.h> |
45 | #include <netinet/in.h> | 45 | #include <netinet/in.h> |
46 | #include <netdb.h> | 46 | #include <netdb.h> |
47 | #include <arpa/inet.h> | 47 | #include <arpa/inet.h> |
48 | 48 | ||
49 | #elif defined(VMS) | 49 | #elif defined(VMS) |
50 | 50 | ||
51 | #include <types.h> | 51 | #include <types.h> |
52 | #include <socket.h> | 52 | #include <socket.h> |
53 | #include <in.h> | 53 | #include <in.h> |
54 | #include <netdb.h> | 54 | #include <netdb.h> |
55 | #include <inet.h> | 55 | #include <inet.h> |
56 | 56 | ||
57 | #elif defined(_WIN32) | 57 | #elif defined(_WIN32) |
58 | 58 | ||
59 | #include <winsock.h> | 59 | #include <winsock.h> |
60 | 60 | ||
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | #define BUILDING_LIBRARY | 63 | #define BUILDING_LIBRARY |
64 | #include "ftplib.h" | 64 | #include "ftplib.h" |
65 | 65 | ||
66 | #if defined(_WIN32) | 66 | #if defined(_WIN32) |
67 | #define SETSOCKOPT_OPTVAL_TYPE (const char *) | 67 | #define SETSOCKOPT_OPTVAL_TYPE (const char *) |
68 | #else | 68 | #else |
69 | #define SETSOCKOPT_OPTVAL_TYPE (void *) | 69 | #define SETSOCKOPT_OPTVAL_TYPE (void *) |
70 | #endif | 70 | #endif |
71 | 71 | ||
72 | #define FTPLIB_BUFSIZ 8192 | 72 | #define FTPLIB_BUFSIZ 8192 |
73 | #define ACCEPT_TIMEOUT 10 | 73 | #define ACCEPT_TIMEOUT 10 |
74 | 74 | ||
75 | #define FTPLIB_CONTROL 0 | 75 | #define FTPLIB_CONTROL 0 |
76 | #define FTPLIB_READ 1 | 76 | #define FTPLIB_READ 1 |
77 | #define FTPLIB_WRITE 2 | 77 | #define FTPLIB_WRITE 2 |
78 | 78 | ||
79 | #if !defined FTPLIB_DEFMODE | 79 | #if !defined FTPLIB_DEFMODE |
80 | #define FTPLIB_DEFMODE FTPLIB_PASSIVE | 80 | #define FTPLIB_DEFMODE FTPLIB_PASSIVE |
81 | #endif | 81 | #endif |
82 | 82 | ||
83 | struct NetBuf { | 83 | struct NetBuf { |
84 | char *cput,*cget; | 84 | char *cput,*cget; |
85 | int handle; | 85 | int handle; |
86 | int cavail,cleft; | 86 | int cavail,cleft; |
87 | char *buf; | 87 | char *buf; |
88 | int dir; | 88 | int dir; |
89 | netbuf *ctrl; | 89 | netbuf *ctrl; |
90 | netbuf *data; | 90 | netbuf *data; |
91 | int cmode; | 91 | int cmode; |
92 | struct timeval idletime; | 92 | struct timeval idletime; |
93 | FtpCallback idlecb; | 93 | FtpCallback idlecb; |
94 | void *idlearg; | 94 | void *idlearg; |
95 | int xfered; | 95 | int xfered; |
96 | int cbbytes; | 96 | int cbbytes; |
97 | int xfered1; | 97 | int xfered1; |
98 | char response[256]; | 98 | char response[256]; |
99 | }; | 99 | }; |
100 | 100 | ||
101 | static char *version = | 101 | static char *version = |
102 | "ftplib Release 3.1-1 9/16/00, copyright 1996-2000 Thomas Pfau"; | 102 | "ftplib Release 3.1-1 9/16/00, copyright 1996-2000 Thomas Pfau"; |
103 | 103 | ||
104 | GLOBALDEF int ftplib_debug = 0; | 104 | GLOBALDEF int ftplib_debug = 0; |
105 | 105 | ||
106 | #if defined(__unix__) || defined(VMS) | 106 | #if defined(__unix__) || defined(VMS) |
107 | #define net_read read | 107 | #define net_read read |
108 | #define net_write write | 108 | #define net_write write |
109 | #define net_close close | 109 | #define net_close close |
110 | #elif defined(_WIN32) | 110 | #elif defined(_WIN32) |
111 | #define net_read(x,y,z) recv(x,y,z,0) | 111 | #define net_read(x,y,z) recv(x,y,z,0) |
112 | #define net_write(x,y,z) send(x,y,z,0) | 112 | #define net_write(x,y,z) send(x,y,z,0) |
113 | #define net_close closesocket | 113 | #define net_close closesocket |
114 | #endif | 114 | #endif |
115 | 115 | ||
116 | #if defined(NEED_MEMCCPY) | 116 | #if defined(NEED_MEMCCPY) |
117 | /* | 117 | /* |
118 | * VAX C does not supply a memccpy routine so I provide my own | 118 | * VAX C does not supply a memccpy routine so I provide my own |
119 | */ | 119 | */ |
120 | void *memccpy(void *dest, const void *src, int c, size_t n) | 120 | void *memccpy(void *dest, const void *src, int c, size_t n) |
121 | { | 121 | { |
122 | int i=0; | 122 | int i=0; |
123 | const unsigned char *ip=src; | 123 | const unsigned char *ip=src; |
124 | unsigned char *op=dest; | 124 | unsigned char *op=dest; |
125 | 125 | ||
126 | while (i < n) | 126 | while (i < n) |
127 | { | 127 | { |
128 | if ((*op++ = *ip++) == c) | 128 | if ((*op++ = *ip++) == c) |
129 | break; | 129 | break; |
130 | i++; | 130 | i++; |
131 | } | 131 | } |
132 | if (i == n) | 132 | if (i == n) |
133 | return NULL; | 133 | return NULL; |
134 | return op; | 134 | return op; |
135 | } | 135 | } |
136 | #endif | 136 | #endif |
137 | #if defined(NEED_STRDUP) | 137 | #if defined(NEED_STRDUP) |
138 | /* | 138 | /* |
139 | * strdup - return a malloc'ed copy of a string | 139 | * strdup - return a malloc'ed copy of a string |
140 | */ | 140 | */ |
141 | char *strdup(const char *src) | 141 | char *strdup(const char *src) |
142 | { | 142 | { |
143 | int l = strlen(src) + 1; | 143 | int l = strlen(src) + 1; |
144 | char *dst = malloc(l); | 144 | char *dst = malloc(l); |
145 | if (dst) | 145 | if (dst) |
146 | strcpy(dst,src); | 146 | strcpy(dst,src); |
147 | return dst; | 147 | return dst; |
148 | } | 148 | } |
149 | #endif | 149 | #endif |
150 | 150 | ||
151 | /* | 151 | /* |
152 | * socket_wait - wait for socket to receive or flush data | 152 | * socket_wait - wait for socket to receive or flush data |
153 | * | 153 | * |
154 | * return 1 if no user callback, otherwise, return value returned by | 154 | * return 1 if no user callback, otherwise, return value returned by |
155 | * user callback | 155 | * user callback |
156 | */ | 156 | */ |
157 | static int socket_wait(netbuf *ctl) | 157 | static int socket_wait(netbuf *ctl) |
158 | { | 158 | { |
159 | fd_set fd,*rfd = NULL,*wfd = NULL; | 159 | fd_set fd,*rfd = NULL,*wfd = NULL; |
160 | struct timeval tv; | 160 | struct timeval tv; |
161 | int rv = 0; | 161 | int rv = 0; |
162 | if ((ctl->dir == FTPLIB_CONTROL) || (ctl->idlecb == NULL)) | 162 | if ((ctl->dir == FTPLIB_CONTROL) || (ctl->idlecb == NULL)) |
163 | return 1; | 163 | return 1; |
164 | if (ctl->dir == FTPLIB_WRITE) | 164 | if (ctl->dir == FTPLIB_WRITE) |
165 | wfd = &fd; | 165 | wfd = &fd; |
166 | else | 166 | else |
167 | rfd = &fd; | 167 | rfd = &fd; |
168 | FD_ZERO(&fd); | 168 | FD_ZERO(&fd); |
169 | do | 169 | do |
170 | { | 170 | { |
171 | FD_SET(ctl->handle,&fd); | 171 | FD_SET(ctl->handle,&fd); |
172 | tv = ctl->idletime; | 172 | tv = ctl->idletime; |
173 | rv = select(ctl->handle+1, rfd, wfd, NULL, &tv); | 173 | rv = select(ctl->handle+1, rfd, wfd, NULL, &tv); |
174 | if (rv == -1) | 174 | if (rv == -1) |
175 | { | 175 | { |
176 | rv = 0; | 176 | rv = 0; |
177 | strncpy(ctl->ctrl->response, strerror(errno), | 177 | strncpy(ctl->ctrl->response, strerror(errno), |
178 | sizeof(ctl->ctrl->response)); | 178 | sizeof(ctl->ctrl->response)); |
179 | break; | 179 | break; |
180 | } | 180 | } |
181 | else if (rv > 0) | 181 | else if (rv > 0) |
182 | { | 182 | { |
183 | rv = 1; | 183 | rv = 1; |
184 | break; | 184 | break; |
185 | } | 185 | } |
186 | } | 186 | } |
187 | while ((rv = ctl->idlecb(ctl, ctl->xfered, ctl->idlearg))); | 187 | while ((rv = ctl->idlecb(ctl, ctl->xfered, ctl->idlearg))); |
188 | return rv; | 188 | return rv; |
189 | } | 189 | } |
190 | 190 | ||
191 | /* | 191 | /* |
192 | * read a line of text | 192 | * read a line of text |
193 | * | 193 | * |
194 | * return -1 on error or bytecount | 194 | * return -1 on error or bytecount |
195 | */ | 195 | */ |
196 | static int readline(char *buf,int max,netbuf *ctl) | 196 | static int readline(char *buf,int max,netbuf *ctl) |
197 | { | 197 | { |
198 | int x,retval = 0; | 198 | int x,retval = 0; |
199 | char *end,*bp=buf; | 199 | char *end,*bp=buf; |
200 | int eof = 0; | 200 | int eof = 0; |
201 | 201 | ||
202 | if ((ctl->dir != FTPLIB_CONTROL) && (ctl->dir != FTPLIB_READ)) | 202 | if ((ctl->dir != FTPLIB_CONTROL) && (ctl->dir != FTPLIB_READ)) |
203 | return -1; | 203 | return -1; |
204 | if (max == 0) | 204 | if (max == 0) |
205 | return 0; | 205 | return 0; |
206 | do | 206 | do |
207 | { | 207 | { |
208 | if (ctl->cavail > 0) | 208 | if (ctl->cavail > 0) |
209 | { | 209 | { |
210 | x = (max >= ctl->cavail) ? ctl->cavail : max-1; | 210 | x = (max >= ctl->cavail) ? ctl->cavail : max-1; |
211 | end = memccpy(bp,ctl->cget,'\n',x); | 211 | end = memccpy(bp,ctl->cget,'\n',x); |
212 | if (end != NULL) | 212 | if (end != NULL) |
213 | x = end - bp; | 213 | x = end - bp; |
214 | retval += x; | 214 | retval += x; |
215 | bp += x; | 215 | bp += x; |
216 | *bp = '\0'; | 216 | *bp = '\0'; |
217 | max -= x; | 217 | max -= x; |
218 | ctl->cget += x; | 218 | ctl->cget += x; |
219 | ctl->cavail -= x; | 219 | ctl->cavail -= x; |
220 | if (end != NULL) | 220 | if (end != NULL) |
221 | { | 221 | { |
222 | bp -= 2; | 222 | bp -= 2; |
223 | if (strcmp(bp,"\r\n") == 0) | 223 | if (strcmp(bp,"\r\n") == 0) |
224 | { | 224 | { |
225 | *bp++ = '\n'; | 225 | *bp++ = '\n'; |
226 | *bp++ = '\0'; | 226 | *bp++ = '\0'; |
227 | --retval; | 227 | --retval; |
228 | } | 228 | } |
229 | break; | 229 | break; |
230 | } | 230 | } |
231 | } | 231 | } |
232 | if (max == 1) | 232 | if (max == 1) |
233 | { | 233 | { |
234 | *buf = '\0'; | 234 | *buf = '\0'; |
235 | break; | 235 | break; |
236 | } | 236 | } |
237 | if (ctl->cput == ctl->cget) | 237 | if (ctl->cput == ctl->cget) |
238 | { | 238 | { |
239 | ctl->cput = ctl->cget = ctl->buf; | 239 | ctl->cput = ctl->cget = ctl->buf; |
240 | ctl->cavail = 0; | 240 | ctl->cavail = 0; |
241 | ctl->cleft = FTPLIB_BUFSIZ; | 241 | ctl->cleft = FTPLIB_BUFSIZ; |
242 | } | 242 | } |
243 | if (eof) | 243 | if (eof) |
244 | { | 244 | { |
245 | if (retval == 0) | 245 | if (retval == 0) |
246 | retval = -1; | 246 | retval = -1; |
247 | break; | 247 | break; |
248 | } | 248 | } |
249 | if (!socket_wait(ctl)) | 249 | if (!socket_wait(ctl)) |
250 | return retval; | 250 | return retval; |
251 | if ((x = net_read(ctl->handle,ctl->cput,ctl->cleft)) == -1) | 251 | if ((x = net_read(ctl->handle,ctl->cput,ctl->cleft)) == -1) |
252 | { | 252 | { |
253 | perror("read"); | 253 | perror("read"); |
254 | retval = -1; | 254 | retval = -1; |
255 | break; | 255 | break; |
256 | } | 256 | } |
257 | if (x == 0) | 257 | if (x == 0) |
258 | eof = 1; | 258 | eof = 1; |
259 | ctl->cleft -= x; | 259 | ctl->cleft -= x; |
260 | ctl->cavail += x; | 260 | ctl->cavail += x; |
261 | ctl->cput += x; | 261 | ctl->cput += x; |
262 | } | 262 | } |
263 | while (1); | 263 | while (1); |
264 | return retval; | 264 | return retval; |
265 | } | 265 | } |
266 | 266 | ||
267 | /* | 267 | /* |
268 | * write lines of text | 268 | * write lines of text |
269 | * | 269 | * |
270 | * return -1 on error or bytecount | 270 | * return -1 on error or bytecount |
271 | */ | 271 | */ |
272 | static int writeline(char *buf, int len, netbuf *nData) | 272 | static int writeline(char *buf, int len, netbuf *nData) |
273 | { | 273 | { |
274 | int x, nb=0, w; | 274 | int x, nb=0, w; |
275 | char *ubp = buf, *nbp; | 275 | char *ubp = buf, *nbp; |
276 | char lc=0; | 276 | char lc=0; |
277 | 277 | ||
278 | if (nData->dir != FTPLIB_WRITE) | 278 | if (nData->dir != FTPLIB_WRITE) |
279 | return -1; | 279 | return -1; |
280 | nbp = nData->buf; | 280 | nbp = nData->buf; |
281 | for (x=0; x < len; x++) | 281 | for (x=0; x < len; x++) |
282 | { | 282 | { |
283 | if ((*ubp == '\n') && (lc != '\r')) | 283 | if ((*ubp == '\n') && (lc != '\r')) |
284 | { | 284 | { |
285 | if (nb == FTPLIB_BUFSIZ) | 285 | if (nb == FTPLIB_BUFSIZ) |
286 | { | 286 | { |
287 | if (!socket_wait(nData)) | 287 | if (!socket_wait(nData)) |
288 | return x; | 288 | return x; |
289 | w = net_write(nData->handle, nbp, FTPLIB_BUFSIZ); | 289 | w = net_write(nData->handle, nbp, FTPLIB_BUFSIZ); |
290 | if (w != FTPLIB_BUFSIZ) | 290 | if (w != FTPLIB_BUFSIZ) |
291 | { | 291 | { |
292 | printf("net_write(1) returned %d, errno = %d\n", w, errno); | 292 | printf("net_write(1) returned %d, errno = %d\n", w, errno); |
293 | return(-1); | 293 | return(-1); |
294 | } | 294 | } |
295 | nb = 0; | 295 | nb = 0; |
296 | } | 296 | } |
297 | nbp[nb++] = '\r'; | 297 | nbp[nb++] = '\r'; |
298 | } | 298 | } |
299 | if (nb == FTPLIB_BUFSIZ) | 299 | if (nb == FTPLIB_BUFSIZ) |
300 | { | 300 | { |
301 | if (!socket_wait(nData)) | 301 | if (!socket_wait(nData)) |
302 | return x; | 302 | return x; |
303 | w = net_write(nData->handle, nbp, FTPLIB_BUFSIZ); | 303 | w = net_write(nData->handle, nbp, FTPLIB_BUFSIZ); |
304 | if (w != FTPLIB_BUFSIZ) | 304 | if (w != FTPLIB_BUFSIZ) |
305 | { | 305 | { |
306 | printf("net_write(2) returned %d, errno = %d\n", w, errno); | 306 | printf("net_write(2) returned %d, errno = %d\n", w, errno); |
307 | return(-1); | 307 | return(-1); |
308 | } | 308 | } |
309 | nb = 0; | 309 | nb = 0; |
310 | } | 310 | } |
311 | nbp[nb++] = lc = *ubp++; | 311 | nbp[nb++] = lc = *ubp++; |
312 | } | 312 | } |
313 | if (nb) | 313 | if (nb) |
314 | { | 314 | { |
315 | if (!socket_wait(nData)) | 315 | if (!socket_wait(nData)) |
316 | return x; | 316 | return x; |
317 | w = net_write(nData->handle, nbp, nb); | 317 | w = net_write(nData->handle, nbp, nb); |
318 | if (w != nb) | 318 | if (w != nb) |
319 | { | 319 | { |
320 | printf("net_write(3) returned %d, errno = %d\n", w, errno); | 320 | printf("net_write(3) returned %d, errno = %d\n", w, errno); |
321 | return(-1); | 321 | return(-1); |
322 | } | 322 | } |
323 | } | 323 | } |
324 | return len; | 324 | return len; |
325 | } | 325 | } |
326 | 326 | ||
327 | /* | 327 | /* |
328 | * read a response from the server | 328 | * read a response from the server |
329 | * | 329 | * |
330 | * return 0 if first char doesn't match | 330 | * return 0 if first char doesn't match |
331 | * return 1 if first char matches | 331 | * return 1 if first char matches |
332 | */ | 332 | */ |
333 | static int readresp(char c, netbuf *nControl) | 333 | static int readresp(char c, netbuf *nControl) |
334 | { | 334 | { |
335 | char match[5]; | 335 | char match[5]; |
336 | if (readline(nControl->response,256,nControl) == -1) | 336 | if (readline(nControl->response,256,nControl) == -1) |
337 | { | 337 | { |
338 | perror("Control socket read failed"); | 338 | perror("Control socket read failed"); |
339 | return 0; | 339 | return 0; |
340 | } | 340 | } |
341 | if (ftplib_debug > 1) | 341 | if (ftplib_debug > 1) |
342 | fprintf(stderr,"%s",nControl->response); | 342 | fprintf(stderr,"%s",nControl->response); |
343 | if (nControl->response[3] == '-') | 343 | if (nControl->response[3] == '-') |
344 | { | 344 | { |
345 | strncpy(match,nControl->response,3); | 345 | strncpy(match,nControl->response,3); |
346 | match[3] = ' '; | 346 | match[3] = ' '; |
347 | match[4] = '\0'; | 347 | match[4] = '\0'; |
348 | do | 348 | do |
349 | { | 349 | { |
350 | if (readline(nControl->response,256,nControl) == -1) | 350 | if (readline(nControl->response,256,nControl) == -1) |
351 | { | 351 | { |
352 | perror("Control socket read failed"); | 352 | perror("Control socket read failed"); |
353 | return 0; | 353 | return 0; |
354 | } | 354 | } |
355 | if (ftplib_debug > 1) | 355 | if (ftplib_debug > 1) |
356 | fprintf(stderr,"%s",nControl->response); | 356 | fprintf(stderr,"%s",nControl->response); |
357 | } | 357 | } |
358 | while (strncmp(nControl->response,match,4)); | 358 | while (strncmp(nControl->response,match,4)); |
359 | } | 359 | } |
360 | if (nControl->response[0] == c) | 360 | if (nControl->response[0] == c) |
361 | return 1; | 361 | return 1; |
362 | return 0; | 362 | return 0; |
363 | } | 363 | } |
364 | 364 | ||
365 | /* | 365 | /* |
366 | * FtpInit for stupid operating systems that require it (Windows NT) | 366 | * FtpInit for stupid operating systems that require it (Windows NT) |
367 | */ | 367 | */ |
368 | GLOBALDEF void FtpInit(void) | 368 | GLOBALDEF void FtpInit(void) |
369 | { | 369 | { |
370 | #if defined(_WIN32) | 370 | #if defined(_WIN32) |
371 | WORD wVersionRequested; | 371 | WORD wVersionRequested; |
372 | WSADATA wsadata; | 372 | WSADATA wsadata; |
373 | int err; | 373 | int err; |
374 | wVersionRequested = MAKEWORD(1,1); | 374 | wVersionRequested = MAKEWORD(1,1); |
375 | if ((err = WSAStartup(wVersionRequested,&wsadata)) != 0) | 375 | if ((err = WSAStartup(wVersionRequested,&wsadata)) != 0) |
376 | fprintf(stderr,"Network failed to start: %d\n",err); | 376 | fprintf(stderr,"Network failed to start: %d\n",err); |
377 | #endif | 377 | #endif |
378 | } | 378 | } |
379 | 379 | ||
380 | /* | 380 | /* |
381 | * FtpLastResponse - return a pointer to the last response received | 381 | * FtpLastResponse - return a pointer to the last response received |
382 | */ | 382 | */ |
383 | GLOBALDEF char *FtpLastResponse(netbuf *nControl) | 383 | GLOBALDEF char *FtpLastResponse(netbuf *nControl) |
384 | { | 384 | { |
385 | if ((nControl) && (nControl->dir == FTPLIB_CONTROL)) | 385 | if ((nControl) && (nControl->dir == FTPLIB_CONTROL)) |
386 | return nControl->response; | 386 | return nControl->response; |
387 | return NULL; | 387 | return NULL; |
388 | } | 388 | } |
389 | 389 | ||
390 | /* | 390 | /* |
391 | * FtpConnect - connect to remote server | 391 | * FtpConnect - connect to remote server |
392 | * | 392 | * |
393 | * return 1 if connected, 0 if not | 393 | * return 1 if connected, 0 if not |
394 | */ | 394 | */ |
395 | GLOBALDEF int FtpConnect(const char *host, netbuf **nControl) | 395 | GLOBALDEF int FtpConnect(const char *host, netbuf **nControl) |
396 | { | 396 | { |
397 | int sControl, stat, flags, oldflags; | 397 | int sControl, stat, flags, oldflags; |
398 | struct sockaddr_in sin; | 398 | struct sockaddr_in sin; |
399 | struct hostent *phe; | 399 | struct hostent *phe; |
400 | struct servent *pse; | 400 | struct servent *pse; |
401 | int on=1; | 401 | int on=1; |
402 | netbuf *ctrl; | 402 | netbuf *ctrl; |
403 | char *lhost; | 403 | char *lhost; |
404 | char *pnum; | 404 | char *pnum; |
405 | struct timeval tv; | 405 | struct timeval tv; |
406 | fd_set wr; | 406 | fd_set wr; |
407 | 407 | ||
408 | memset(&sin,0,sizeof(sin)); | 408 | memset(&sin,0,sizeof(sin)); |
409 | sin.sin_family = AF_INET; | 409 | sin.sin_family = AF_INET; |
410 | lhost = strdup(host); | 410 | lhost = strdup(host); |
411 | pnum = strchr(lhost,':'); | 411 | pnum = strchr(lhost,':'); |
412 | if (pnum == NULL) | 412 | if (pnum == NULL) |
413 | { | 413 | { |
414 | #if defined(VMS) | 414 | #if defined(VMS) |
415 | sin.sin_port = htons(21); | 415 | sin.sin_port = htons(21); |
416 | #else | 416 | #else |
417 | if ((pse = getservbyname("ftp","tcp")) == NULL) | 417 | if ((pse = getservbyname("ftp","tcp")) == NULL) |
418 | { | 418 | { |
419 | perror("getservbyname"); | 419 | perror("getservbyname"); |
420 | return 0; | 420 | return 0; |
421 | } | 421 | } |
422 | sin.sin_port = pse->s_port; | 422 | sin.sin_port = pse->s_port; |
423 | #endif | 423 | #endif |
424 | } | 424 | } |
425 | else | 425 | else |
426 | { | 426 | { |
427 | *pnum++ = '\0'; | 427 | *pnum++ = '\0'; |
428 | if (isdigit(*pnum)) | 428 | if (isdigit(*pnum)) |
429 | sin.sin_port = htons(atoi(pnum)); | 429 | sin.sin_port = htons(atoi(pnum)); |
430 | else | 430 | else |
431 | { | 431 | { |
432 | pse = getservbyname(pnum,"tcp"); | 432 | pse = getservbyname(pnum,"tcp"); |
433 | sin.sin_port = pse->s_port; | 433 | sin.sin_port = pse->s_port; |
434 | } | 434 | } |
435 | } | 435 | } |
436 | if ((sin.sin_addr.s_addr = inet_addr(lhost)) == -1) | 436 | if ((sin.sin_addr.s_addr = inet_addr(lhost)) == -1) |
437 | { | 437 | { |
438 | if ((phe = gethostbyname(lhost)) == NULL) | 438 | if ((phe = gethostbyname(lhost)) == NULL) |
439 | { | 439 | { |
440 | perror("gethostbyname"); | 440 | perror("gethostbyname"); |
441 | return 0; | 441 | return 0; |
442 | } | 442 | } |
443 | 443 | ||
444 | memcpy((char *)&sin.sin_addr, phe->h_addr, phe->h_length); | 444 | memcpy((char *)&sin.sin_addr, phe->h_addr, phe->h_length); |
445 | 445 | ||
446 | } | 446 | } |
447 | free(lhost); | 447 | free(lhost); |
448 | 448 | ||
449 | sControl = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); | 449 | sControl = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); |
450 | if (sControl == -1) | 450 | if (sControl == -1) |
451 | { | 451 | { |
452 | perror("socket"); | 452 | perror("socket"); |
453 | return 0; | 453 | return 0; |
454 | } | 454 | } |
455 | 455 | ||
456 | if ( setsockopt(sControl,SOL_SOCKET,SO_REUSEADDR, | 456 | if ( setsockopt(sControl,SOL_SOCKET,SO_REUSEADDR, |
457 | SETSOCKOPT_OPTVAL_TYPE &on, sizeof(on)) == -1) | 457 | SETSOCKOPT_OPTVAL_TYPE &on, sizeof(on)) == -1) |
458 | { | 458 | { |
459 | perror("setsockopt"); | 459 | perror("setsockopt"); |
460 | net_close(sControl); | 460 | net_close(sControl); |
461 | return 0; | 461 | return 0; |
462 | } | 462 | } |
463 | 463 | ||
464 | //set nonblocking for connection timeout | 464 | //set nonblocking for connection timeout |
465 | flags = fcntl( sControl, F_GETFL,0); | 465 | flags = fcntl( sControl, F_GETFL,0); |
466 | oldflags=flags; | 466 | oldflags=flags; |
467 | fcntl( sControl, F_SETFL, O_NONBLOCK|flags); | 467 | fcntl( sControl, F_SETFL, O_NONBLOCK|flags); |
468 | 468 | ||
469 | stat=connect( sControl, (struct sockaddr *)&sin, sizeof(sin)); | 469 | stat=connect( sControl, (struct sockaddr *)&sin, sizeof(sin)); |
470 | if (stat < 0) | 470 | if (stat < 0) |
471 | { | 471 | { |
472 | if (errno != EWOULDBLOCK && errno != EINPROGRESS) | 472 | if (errno != EWOULDBLOCK && errno != EINPROGRESS) |
473 | { | 473 | { |
474 | perror("connect"); | 474 | perror("connect"); |
475 | net_close(sControl); | 475 | net_close(sControl); |
476 | return 0; | 476 | return 0; |
477 | } | 477 | } |
478 | } | 478 | } |
479 | 479 | ||
480 | FD_ZERO(&wr); | 480 | FD_ZERO(&wr); |
481 | FD_SET( sControl, &wr); | 481 | FD_SET( sControl, &wr); |
482 | 482 | ||
483 | tv.tv_sec = ACCEPT_TIMEOUT; | 483 | tv.tv_sec = ACCEPT_TIMEOUT; |
484 | tv.tv_usec = 0; | 484 | tv.tv_usec = 0; |
485 | 485 | ||
486 | stat = select(sControl+1, 0, &wr, 0, &tv); | 486 | stat = select(sControl+1, 0, &wr, 0, &tv); |
487 | 487 | ||
488 | if (stat < 1) | 488 | if (stat < 1) |
489 | { | 489 | { |
490 | // time out has expired, | 490 | // time out has expired, |
491 | // or an error has ocurred | 491 | // or an error has ocurred |
492 | perror("timeout"); | 492 | perror("timeout"); |
493 | net_close(sControl); | 493 | net_close(sControl); |
494 | return 0; | 494 | return 0; |
495 | } | 495 | } |
496 | 496 | ||
497 | printf("connected\n"); | 497 | printf("connected\n"); |
498 | 498 | ||
499 | //set original flags | 499 | //set original flags |
500 | fcntl( sControl, F_SETFL, oldflags); | 500 | fcntl( sControl, F_SETFL, oldflags); |
501 | 501 | ||
502 | ctrl = calloc(1,sizeof(netbuf)); | 502 | ctrl = calloc(1,sizeof(netbuf)); |
503 | if (ctrl == NULL) | 503 | if (ctrl == NULL) |
504 | { | 504 | { |
505 | perror("calloc"); | 505 | perror("calloc"); |
506 | net_close(sControl); | 506 | net_close(sControl); |
507 | return 0; | 507 | return 0; |
508 | } | 508 | } |
509 | ctrl->buf = malloc(FTPLIB_BUFSIZ); | 509 | ctrl->buf = malloc(FTPLIB_BUFSIZ); |
510 | if (ctrl->buf == NULL) | 510 | if (ctrl->buf == NULL) |
511 | { | 511 | { |
512 | perror("calloc"); | 512 | perror("calloc"); |
513 | net_close(sControl); | 513 | net_close(sControl); |
514 | free(ctrl); | 514 | free(ctrl); |
515 | return 0; | 515 | return 0; |
516 | } | 516 | } |
517 | ctrl->handle = sControl; | 517 | ctrl->handle = sControl; |
518 | ctrl->dir = FTPLIB_CONTROL; | 518 | ctrl->dir = FTPLIB_CONTROL; |
519 | ctrl->ctrl = NULL; | 519 | ctrl->ctrl = NULL; |
520 | ctrl->cmode = FTPLIB_DEFMODE; | 520 | ctrl->cmode = FTPLIB_DEFMODE; |
521 | ctrl->idlecb = NULL; | 521 | ctrl->idlecb = NULL; |
522 | ctrl->idletime.tv_sec = ctrl->idletime.tv_usec = 0; | 522 | ctrl->idletime.tv_sec = ctrl->idletime.tv_usec = 0; |
523 | ctrl->idlearg = NULL; | 523 | ctrl->idlearg = NULL; |
524 | ctrl->xfered = 0; | 524 | ctrl->xfered = 0; |
525 | ctrl->xfered1 = 0; | 525 | ctrl->xfered1 = 0; |
526 | ctrl->cbbytes = 0; | 526 | ctrl->cbbytes = 0; |
527 | if (readresp('2', ctrl) == 0) | 527 | if (readresp('2', ctrl) == 0) |
528 | { | 528 | { |
529 | net_close(sControl); | 529 | net_close(sControl); |
530 | free(ctrl->buf); | 530 | free(ctrl->buf); |
531 | free(ctrl); | 531 | free(ctrl); |
532 | return 0; | 532 | return 0; |
533 | } | 533 | } |
534 | *nControl = ctrl; | 534 | *nControl = ctrl; |
535 | return 1; | 535 | return 1; |
536 | } | 536 | } |
537 | 537 | ||
538 | /* | 538 | /* |
539 | * FtpOptions - change connection options | 539 | * FtpOptions - change connection options |
540 | * | 540 | * |
541 | * returns 1 if successful, 0 on error | 541 | * returns 1 if successful, 0 on error |
542 | */ | 542 | */ |
543 | GLOBALDEF int FtpOptions(int opt, long val, netbuf *nControl) | 543 | GLOBALDEF int FtpOptions(int opt, long val, netbuf *nControl) |
544 | { | 544 | { |
545 | int v,rv=0; | 545 | int v,rv=0; |
546 | switch (opt) | 546 | switch (opt) |
547 | { | 547 | { |
548 | case FTPLIB_CONNMODE: | 548 | case FTPLIB_CONNMODE: |
549 | v = (int) val; | 549 | v = (int) val; |
550 | if ((v == FTPLIB_PASSIVE) || (v == FTPLIB_PORT)) | 550 | if ((v == FTPLIB_PASSIVE) || (v == FTPLIB_PORT)) |
551 | { | 551 | { |
552 | nControl->cmode = v; | 552 | nControl->cmode = v; |
553 | rv = 1; | 553 | rv = 1; |
554 | } | 554 | } |
555 | break; | 555 | break; |
556 | case FTPLIB_CALLBACK: | 556 | case FTPLIB_CALLBACK: |
557 | nControl->idlecb = (FtpCallback) val; | 557 | nControl->idlecb = (FtpCallback) val; |
558 | rv = 1; | 558 | rv = 1; |
559 | break; | 559 | break; |
560 | case FTPLIB_IDLETIME: | 560 | case FTPLIB_IDLETIME: |
561 | v = (int) val; | 561 | v = (int) val; |
562 | rv = 1; | 562 | rv = 1; |
563 | nControl->idletime.tv_sec = v / 1000; | 563 | nControl->idletime.tv_sec = v / 1000; |
564 | nControl->idletime.tv_usec = (v % 1000) * 1000; | 564 | nControl->idletime.tv_usec = (v % 1000) * 1000; |
565 | break; | 565 | break; |
566 | case FTPLIB_CALLBACKARG: | 566 | case FTPLIB_CALLBACKARG: |
567 | rv = 1; | 567 | rv = 1; |
568 | nControl->idlearg = (void *) val; | 568 | nControl->idlearg = (void *) val; |
569 | break; | 569 | break; |
570 | case FTPLIB_CALLBACKBYTES: | 570 | case FTPLIB_CALLBACKBYTES: |
571 | rv = 1; | 571 | rv = 1; |
572 | nControl->cbbytes = (int) val; | 572 | nControl->cbbytes = (int) val; |
573 | break; | 573 | break; |
574 | } | 574 | } |
575 | return rv; | 575 | return rv; |
576 | } | 576 | } |
577 | 577 | ||
578 | /* | 578 | /* |
579 | * FtpSendCmd - send a command and wait for expected response | 579 | * FtpSendCmd - send a command and wait for expected response |
580 | * | 580 | * |
581 | * return 1 if proper response received, 0 otherwise | 581 | * return 1 if proper response received, 0 otherwise |
582 | */ | 582 | */ |
583 | static int FtpSendCmd(const char *cmd, char expresp, netbuf *nControl) | 583 | static int FtpSendCmd(const char *cmd, char expresp, netbuf *nControl) |
584 | { | 584 | { |
585 | char buf[256]; | 585 | char buf[256]; |
586 | if (nControl->dir != FTPLIB_CONTROL) | 586 | if (nControl->dir != FTPLIB_CONTROL) |
587 | return 0; | 587 | return 0; |
588 | if (ftplib_debug > 2) | 588 | if (ftplib_debug > 2) |
589 | fprintf(stderr,"%s\n",cmd); | 589 | fprintf(stderr,"%s\n",cmd); |
590 | if ((strlen(cmd) + 3) > sizeof(buf)) | 590 | if ((strlen(cmd) + 3) > sizeof(buf)) |
591 | return 0; | 591 | return 0; |
592 | sprintf(buf,"%s\r\n",cmd); | 592 | sprintf(buf,"%s\r\n",cmd); |
593 | if (net_write(nControl->handle,buf,strlen(buf)) <= 0) | 593 | if (net_write(nControl->handle,buf,strlen(buf)) <= 0) |
594 | { | 594 | { |
595 | perror("write"); | 595 | perror("write"); |
596 | return 0; | 596 | return 0; |
597 | } | 597 | } |
598 | return readresp(expresp, nControl); | 598 | return readresp(expresp, nControl); |
599 | } | 599 | } |
600 | 600 | ||
601 | /* | 601 | /* |
602 | * FtpLogin - log in to remote server | 602 | * FtpLogin - log in to remote server |
603 | * | 603 | * |
604 | * return 1 if logged in, 0 otherwise | 604 | * return 1 if logged in, 0 otherwise |
605 | */ | 605 | */ |
606 | GLOBALDEF int FtpLogin(const char *user, const char *pass, netbuf *nControl) | 606 | GLOBALDEF int FtpLogin(const char *user, const char *pass, netbuf *nControl) |
607 | { | 607 | { |
608 | char tempbuf[64]; | 608 | char tempbuf[64]; |
609 | 609 | ||
610 | if (((strlen(user) + 7) > sizeof(tempbuf)) || | 610 | if (((strlen(user) + 7) > sizeof(tempbuf)) || |
611 | ((strlen(pass) + 7) > sizeof(tempbuf))) | 611 | ((strlen(pass) + 7) > sizeof(tempbuf))) |
612 | return 0; | 612 | return 0; |
613 | sprintf(tempbuf,"USER %s",user); | 613 | sprintf(tempbuf,"USER %s",user); |
614 | if (!FtpSendCmd(tempbuf,'3',nControl)) | 614 | if (!FtpSendCmd(tempbuf,'3',nControl)) |
615 | { | 615 | { |
616 | if (nControl->response[0] == '2') | 616 | if (nControl->response[0] == '2') |
617 | return 1; | 617 | return 1; |
618 | return 0; | 618 | return 0; |
619 | } | 619 | } |
620 | sprintf(tempbuf,"PASS %s",pass); | 620 | sprintf(tempbuf,"PASS %s",pass); |
621 | return FtpSendCmd(tempbuf,'2',nControl); | 621 | return FtpSendCmd(tempbuf,'2',nControl); |
622 | } | 622 | } |
623 | 623 | ||
624 | /* | 624 | /* |
625 | * FtpOpenPort - set up data connection | 625 | * FtpOpenPort - set up data connection |
626 | * | 626 | * |
627 | * return 1 if successful, 0 otherwise | 627 | * return 1 if successful, 0 otherwise |
628 | */ | 628 | */ |
629 | static int FtpOpenPort(netbuf *nControl, netbuf **nData, int mode, int dir) | 629 | static int FtpOpenPort(netbuf *nControl, netbuf **nData, int mode, int dir) |
630 | { | 630 | { |
631 | int sData; | 631 | int sData; |
632 | union { | 632 | union { |
633 | struct sockaddr sa; | 633 | struct sockaddr sa; |
634 | struct sockaddr_in in; | 634 | struct sockaddr_in in; |
635 | } sin; | 635 | } sin; |
636 | struct linger lng = { 0, 0 }; | 636 | struct linger lng = { 0, 0 }; |
637 | unsigned int l; | 637 | unsigned int l; |
638 | int on=1; | 638 | int on=1; |
639 | netbuf *ctrl; | 639 | netbuf *ctrl; |
640 | char *cp; | 640 | char *cp; |
641 | unsigned int v[6]; | 641 | unsigned int v[6]; |
642 | char buf[256]; | 642 | char buf[256]; |
643 | 643 | ||
644 | if (nControl->dir != FTPLIB_CONTROL) | 644 | if (nControl->dir != FTPLIB_CONTROL) |
645 | return -1; | 645 | return -1; |
646 | if ((dir != FTPLIB_READ) && (dir != FTPLIB_WRITE)) | 646 | if ((dir != FTPLIB_READ) && (dir != FTPLIB_WRITE)) |
647 | { | 647 | { |
648 | sprintf(nControl->response, "Invalid direction %d\n", dir); | 648 | sprintf(nControl->response, "Invalid direction %d\n", dir); |
649 | return -1; | 649 | return -1; |
650 | } | 650 | } |
651 | if ((mode != FTPLIB_ASCII) && (mode != FTPLIB_IMAGE)) | 651 | if ((mode != FTPLIB_ASCII) && (mode != FTPLIB_IMAGE)) |
652 | { | 652 | { |
653 | sprintf(nControl->response, "Invalid mode %c\n", mode); | 653 | sprintf(nControl->response, "Invalid mode %c\n", mode); |
654 | return -1; | 654 | return -1; |
655 | } | 655 | } |
656 | l = sizeof(sin); | 656 | l = sizeof(sin); |
657 | if (nControl->cmode == FTPLIB_PASSIVE) | 657 | if (nControl->cmode == FTPLIB_PASSIVE) |
658 | { | 658 | { |
659 | memset(&sin, 0, l); | 659 | memset(&sin, 0, l); |
660 | sin.in.sin_family = AF_INET; | 660 | sin.in.sin_family = AF_INET; |
661 | if (!FtpSendCmd("PASV",'2',nControl)) | 661 | if (!FtpSendCmd("PASV",'2',nControl)) |
662 | return -1; | 662 | return -1; |
663 | cp = strchr(nControl->response,'('); | 663 | cp = strchr(nControl->response,'('); |
664 | if (cp == NULL) | 664 | if (cp == NULL) |
665 | return -1; | 665 | return -1; |
666 | cp++; | 666 | cp++; |
667 | sscanf(cp,"%u,%u,%u,%u,%u,%u",&v[2],&v[3],&v[4],&v[5],&v[0],&v[1]); | 667 | sscanf(cp,"%u,%u,%u,%u,%u,%u",&v[2],&v[3],&v[4],&v[5],&v[0],&v[1]); |
668 | sin.sa.sa_data[2] = v[2]; | 668 | sin.sa.sa_data[2] = v[2]; |
669 | sin.sa.sa_data[3] = v[3]; | 669 | sin.sa.sa_data[3] = v[3]; |
670 | sin.sa.sa_data[4] = v[4]; | 670 | sin.sa.sa_data[4] = v[4]; |
671 | sin.sa.sa_data[5] = v[5]; | 671 | sin.sa.sa_data[5] = v[5]; |
672 | sin.sa.sa_data[0] = v[0]; | 672 | sin.sa.sa_data[0] = v[0]; |
673 | sin.sa.sa_data[1] = v[1]; | 673 | sin.sa.sa_data[1] = v[1]; |
674 | } | 674 | } |
675 | else | 675 | else |
676 | { | 676 | { |
677 | if (getsockname(nControl->handle, &sin.sa, &l) < 0) | 677 | if (getsockname(nControl->handle, &sin.sa, &l) < 0) |
678 | { | 678 | { |
679 | perror("getsockname"); | 679 | perror("getsockname"); |
680 | return 0; | 680 | return 0; |
681 | } | 681 | } |
682 | } | 682 | } |
683 | sData = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); | 683 | sData = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); |
684 | if (sData == -1) | 684 | if (sData == -1) |
685 | { | 685 | { |
686 | perror("socket"); | 686 | perror("socket"); |
687 | return -1; | 687 | return -1; |
688 | } | 688 | } |
689 | if (setsockopt(sData,SOL_SOCKET,SO_REUSEADDR, | 689 | if (setsockopt(sData,SOL_SOCKET,SO_REUSEADDR, |
690 | SETSOCKOPT_OPTVAL_TYPE &on,sizeof(on)) == -1) | 690 | SETSOCKOPT_OPTVAL_TYPE &on,sizeof(on)) == -1) |
691 | { | 691 | { |
692 | perror("setsockopt"); | 692 | perror("setsockopt"); |
693 | net_close(sData); | 693 | net_close(sData); |
694 | return -1; | 694 | return -1; |
695 | } | 695 | } |
696 | if (setsockopt(sData,SOL_SOCKET,SO_LINGER, | 696 | if (setsockopt(sData,SOL_SOCKET,SO_LINGER, |
697 | SETSOCKOPT_OPTVAL_TYPE &lng,sizeof(lng)) == -1) | 697 | SETSOCKOPT_OPTVAL_TYPE &lng,sizeof(lng)) == -1) |
698 | { | 698 | { |
699 | perror("setsockopt"); | 699 | perror("setsockopt"); |
700 | net_close(sData); | 700 | net_close(sData); |
701 | return -1; | 701 | return -1; |
702 | } | 702 | } |
703 | if (nControl->cmode == FTPLIB_PASSIVE) | 703 | if (nControl->cmode == FTPLIB_PASSIVE) |
704 | { | 704 | { |
705 | if (connect(sData, &sin.sa, sizeof(sin.sa)) == -1) | 705 | if (connect(sData, &sin.sa, sizeof(sin.sa)) == -1) |
706 | { | 706 | { |
707 | perror("connect"); | 707 | perror("connect"); |
708 | net_close(sData); | 708 | net_close(sData); |
709 | return -1; | 709 | return -1; |
710 | } | 710 | } |
711 | } | 711 | } |
712 | else | 712 | else |
713 | { | 713 | { |
714 | sin.in.sin_port = 0; | 714 | sin.in.sin_port = 0; |
715 | if (bind(sData, &sin.sa, sizeof(sin)) == -1) | 715 | if (bind(sData, &sin.sa, sizeof(sin)) == -1) |
716 | { | 716 | { |
717 | perror("bind"); | 717 | perror("bind"); |
718 | net_close(sData); | 718 | net_close(sData); |
719 | return 0; | 719 | return 0; |
720 | } | 720 | } |
721 | if (listen(sData, 1) < 0) | 721 | if (listen(sData, 1) < 0) |
722 | { | 722 | { |
723 | perror("listen"); | 723 | perror("listen"); |
724 | net_close(sData); | 724 | net_close(sData); |
725 | return 0; | 725 | return 0; |
726 | } | 726 | } |
727 | if (getsockname(sData, &sin.sa, &l) < 0) | 727 | if (getsockname(sData, &sin.sa, &l) < 0) |
728 | return 0; | 728 | return 0; |
729 | sprintf(buf, "PORT %d,%d,%d,%d,%d,%d", | 729 | sprintf(buf, "PORT %d,%d,%d,%d,%d,%d", |
730 | (unsigned char) sin.sa.sa_data[2], | 730 | (unsigned char) sin.sa.sa_data[2], |
731 | (unsigned char) sin.sa.sa_data[3], | 731 | (unsigned char) sin.sa.sa_data[3], |
732 | (unsigned char) sin.sa.sa_data[4], | 732 | (unsigned char) sin.sa.sa_data[4], |
733 | (unsigned char) sin.sa.sa_data[5], | 733 | (unsigned char) sin.sa.sa_data[5], |
734 | (unsigned char) sin.sa.sa_data[0], | 734 | (unsigned char) sin.sa.sa_data[0], |
735 | (unsigned char) sin.sa.sa_data[1]); | 735 | (unsigned char) sin.sa.sa_data[1]); |
736 | if (!FtpSendCmd(buf,'2',nControl)) | 736 | if (!FtpSendCmd(buf,'2',nControl)) |
737 | { | 737 | { |
738 | net_close(sData); | 738 | net_close(sData); |
739 | return 0; | 739 | return 0; |
740 | } | 740 | } |
741 | } | 741 | } |
742 | ctrl = calloc(1,sizeof(netbuf)); | 742 | ctrl = calloc(1,sizeof(netbuf)); |
743 | if (ctrl == NULL) | 743 | if (ctrl == NULL) |
744 | { | 744 | { |
745 | perror("calloc"); | 745 | perror("calloc"); |
746 | net_close(sData); | 746 | net_close(sData); |
747 | return -1; | 747 | return -1; |
748 | } | 748 | } |
749 | if ((mode == 'A') && ((ctrl->buf = malloc(FTPLIB_BUFSIZ)) == NULL)) | 749 | if ((mode == 'A') && ((ctrl->buf = malloc(FTPLIB_BUFSIZ)) == NULL)) |
750 | { | 750 | { |
751 | perror("calloc"); | 751 | perror("calloc"); |
752 | net_close(sData); | 752 | net_close(sData); |
753 | free(ctrl); | 753 | free(ctrl); |
754 | return -1; | 754 | return -1; |
755 | } | 755 | } |
756 | ctrl->handle = sData; | 756 | ctrl->handle = sData; |
757 | ctrl->dir = dir; | 757 | ctrl->dir = dir; |
758 | ctrl->idletime = nControl->idletime; | 758 | ctrl->idletime = nControl->idletime; |
759 | ctrl->idlearg = nControl->idlearg; | 759 | ctrl->idlearg = nControl->idlearg; |
760 | ctrl->xfered = 0; | 760 | ctrl->xfered = 0; |
761 | ctrl->xfered1 = 0; | 761 | ctrl->xfered1 = 0; |
762 | ctrl->cbbytes = nControl->cbbytes; | 762 | ctrl->cbbytes = nControl->cbbytes; |
763 | if (ctrl->idletime.tv_sec || ctrl->idletime.tv_usec || ctrl->cbbytes) | 763 | if (ctrl->idletime.tv_sec || ctrl->idletime.tv_usec || ctrl->cbbytes) |
764 | ctrl->idlecb = nControl->idlecb; | 764 | ctrl->idlecb = nControl->idlecb; |
765 | else | 765 | else |
766 | ctrl->idlecb = NULL; | 766 | ctrl->idlecb = NULL; |
767 | *nData = ctrl; | 767 | *nData = ctrl; |
768 | return 1; | 768 | return 1; |
769 | } | 769 | } |
770 | 770 | ||
771 | /* | 771 | /* |
772 | * FtpAcceptConnection - accept connection from server | 772 | * FtpAcceptConnection - accept connection from server |
773 | * | 773 | * |
774 | * return 1 if successful, 0 otherwise | 774 | * return 1 if successful, 0 otherwise |
775 | */ | 775 | */ |
776 | static int FtpAcceptConnection(netbuf *nData, netbuf *nControl) | 776 | static int FtpAcceptConnection(netbuf *nData, netbuf *nControl) |
777 | { | 777 | { |
778 | int sData; | 778 | int sData; |
779 | struct sockaddr addr; | 779 | struct sockaddr addr; |
780 | unsigned int l; | 780 | unsigned int l; |
781 | int i; | 781 | int i; |
782 | struct timeval tv; | 782 | struct timeval tv; |
783 | fd_set mask; | 783 | fd_set mask; |
784 | int rv; | 784 | int rv = 1; |
785 | 785 | ||
786 | FD_ZERO(&mask); | 786 | FD_ZERO(&mask); |
787 | FD_SET(nControl->handle, &mask); | 787 | FD_SET(nControl->handle, &mask); |
788 | FD_SET(nData->handle, &mask); | 788 | FD_SET(nData->handle, &mask); |
789 | tv.tv_usec = 0; | 789 | tv.tv_usec = 0; |
790 | tv.tv_sec = ACCEPT_TIMEOUT; | 790 | tv.tv_sec = ACCEPT_TIMEOUT; |
791 | printf("<<<<<<<<<<<<<<<<%d\n",ACCEPT_TIMEOUT); | 791 | printf("<<<<<<<<<<<<<<<<%d\n",ACCEPT_TIMEOUT); |
792 | i = nControl->handle; | 792 | i = nControl->handle; |
793 | if (i < nData->handle) | 793 | if (i < nData->handle) |
794 | i = nData->handle; | 794 | i = nData->handle; |
795 | i = select(i+1, &mask, NULL, NULL, &tv); | 795 | i = select(i+1, &mask, NULL, NULL, &tv); |
796 | if (i == -1) | 796 | if (i == -1) |
797 | { | 797 | { |
798 | strncpy(nControl->response, strerror(errno), | 798 | strncpy(nControl->response, strerror(errno), |
799 | sizeof(nControl->response)); | 799 | sizeof(nControl->response)); |
800 | net_close(nData->handle); | 800 | net_close(nData->handle); |
801 | nData->handle = 0; | 801 | nData->handle = 0; |
802 | rv = 0; | 802 | rv = 0; |
803 | } | 803 | } |
804 | else if (i == 0) | 804 | else if (i == 0) |
805 | { | 805 | { |
806 | strcpy(nControl->response, "timed out waiting for connection"); | 806 | strcpy(nControl->response, "timed out waiting for connection"); |
807 | net_close(nData->handle); | 807 | net_close(nData->handle); |
808 | nData->handle = 0; | 808 | nData->handle = 0; |
809 | rv = 0; | 809 | rv = 0; |
810 | } | 810 | } |
811 | else | 811 | else |
812 | { | 812 | { |
813 | if (FD_ISSET(nData->handle, &mask)) | 813 | if (FD_ISSET(nData->handle, &mask)) |
814 | { | 814 | { |
815 | l = sizeof(addr); | 815 | l = sizeof(addr); |
816 | sData = accept(nData->handle, &addr, &l); | 816 | sData = accept(nData->handle, &addr, &l); |
817 | i = errno; | 817 | i = errno; |
818 | net_close(nData->handle); | 818 | net_close(nData->handle); |
819 | if (sData > 0) | 819 | if (sData > 0) |
820 | { | 820 | { |
821 | rv = 1; | 821 | rv = 1; |
822 | nData->handle = sData; | 822 | nData->handle = sData; |
823 | } | 823 | } |
824 | else | 824 | else |
825 | { | 825 | { |
826 | strncpy(nControl->response, strerror(i), | 826 | strncpy(nControl->response, strerror(i), |
827 | sizeof(nControl->response)); | 827 | sizeof(nControl->response)); |
828 | nData->handle = 0; | 828 | nData->handle = 0; |
829 | rv = 0; | 829 | rv = 0; |
830 | } | 830 | } |
831 | } | 831 | } |
832 | else if (FD_ISSET(nControl->handle, &mask)) | 832 | else if (FD_ISSET(nControl->handle, &mask)) |
833 | { | 833 | { |
834 | net_close(nData->handle); | 834 | net_close(nData->handle); |
835 | nData->handle = 0; | 835 | nData->handle = 0; |
836 | readresp('2', nControl); | 836 | readresp('2', nControl); |
837 | rv = 0; | 837 | rv = 0; |
838 | } | 838 | } |
839 | } | 839 | } |
840 | return rv; | 840 | return rv; |
841 | } | 841 | } |
842 | 842 | ||
843 | /* | 843 | /* |
844 | * FtpAccess - return a handle for a data stream | 844 | * FtpAccess - return a handle for a data stream |
845 | * | 845 | * |
846 | * return 1 if successful, 0 otherwise | 846 | * return 1 if successful, 0 otherwise |
847 | */ | 847 | */ |
848 | GLOBALDEF int FtpAccess(const char *path, int typ, int mode, netbuf *nControl, | 848 | GLOBALDEF int FtpAccess(const char *path, int typ, int mode, netbuf *nControl, |
849 | netbuf **nData) | 849 | netbuf **nData) |
850 | { | 850 | { |
851 | char buf[256]; | 851 | char buf[256]; |
852 | int dir; | 852 | int dir; |
853 | if ((path == NULL) && | 853 | if ((path == NULL) && |
854 | ((typ == FTPLIB_FILE_WRITE) || (typ == FTPLIB_FILE_READ))) | 854 | ((typ == FTPLIB_FILE_WRITE) || (typ == FTPLIB_FILE_READ))) |
855 | { | 855 | { |
856 | sprintf(nControl->response, | 856 | sprintf(nControl->response, |
857 | "Missing path argument for file transfer\n"); | 857 | "Missing path argument for file transfer\n"); |
858 | return 0; | 858 | return 0; |
859 | } | 859 | } |
860 | sprintf(buf, "TYPE %c", mode); | 860 | sprintf(buf, "TYPE %c", mode); |
861 | if (!FtpSendCmd(buf, '2', nControl)) | 861 | if (!FtpSendCmd(buf, '2', nControl)) |
862 | return 0; | 862 | return 0; |
863 | switch (typ) | 863 | switch (typ) |
864 | { | 864 | { |
865 | case FTPLIB_DIR: | 865 | case FTPLIB_DIR: |
866 | strcpy(buf,"NLST"); | 866 | strcpy(buf,"NLST"); |
867 | dir = FTPLIB_READ; | 867 | dir = FTPLIB_READ; |
868 | break; | 868 | break; |
869 | case FTPLIB_DIR_VERBOSE: | 869 | case FTPLIB_DIR_VERBOSE: |
870 | strcpy(buf,"LIST"); | 870 | strcpy(buf,"LIST"); |
871 | dir = FTPLIB_READ; | 871 | dir = FTPLIB_READ; |
872 | break; | 872 | break; |
873 | case FTPLIB_FILE_READ: | 873 | case FTPLIB_FILE_READ: |
874 | strcpy(buf,"RETR"); | 874 | strcpy(buf,"RETR"); |
875 | dir = FTPLIB_READ; | 875 | dir = FTPLIB_READ; |
876 | break; | 876 | break; |
877 | case FTPLIB_FILE_WRITE: | 877 | case FTPLIB_FILE_WRITE: |
878 | strcpy(buf,"STOR"); | 878 | strcpy(buf,"STOR"); |
879 | dir = FTPLIB_WRITE; | 879 | dir = FTPLIB_WRITE; |
880 | break; | 880 | break; |
881 | default: | 881 | default: |
882 | sprintf(nControl->response, "Invalid open type %d\n", typ); | 882 | sprintf(nControl->response, "Invalid open type %d\n", typ); |
883 | return 0; | 883 | return 0; |
884 | } | 884 | } |
885 | if (path != NULL) | 885 | if (path != NULL) |
886 | { | 886 | { |
887 | int i = strlen(buf); | 887 | int i = strlen(buf); |
888 | buf[i++] = ' '; | 888 | buf[i++] = ' '; |
889 | if ((strlen(path) + i) >= sizeof(buf)) | 889 | if ((strlen(path) + i) >= sizeof(buf)) |
890 | return 0; | 890 | return 0; |
891 | strcpy(&buf[i],path); | 891 | strcpy(&buf[i],path); |
892 | } | 892 | } |
893 | if (FtpOpenPort(nControl, nData, mode, dir) == -1) | 893 | if (FtpOpenPort(nControl, nData, mode, dir) == -1) |
894 | return 0; | 894 | return 0; |
895 | if (!FtpSendCmd(buf, '1', nControl)) | 895 | if (!FtpSendCmd(buf, '1', nControl)) |
896 | { | 896 | { |
897 | FtpClose(*nData); | 897 | FtpClose(*nData); |
898 | *nData = NULL; | 898 | *nData = NULL; |
899 | return 0; | 899 | return 0; |
900 | } | 900 | } |
901 | (*nData)->ctrl = nControl; | 901 | (*nData)->ctrl = nControl; |
902 | nControl->data = *nData; | 902 | nControl->data = *nData; |
903 | if (nControl->cmode == FTPLIB_PORT) | 903 | if (nControl->cmode == FTPLIB_PORT) |
904 | { | 904 | { |
905 | if (!FtpAcceptConnection(*nData,nControl)) | 905 | if (!FtpAcceptConnection(*nData,nControl)) |
906 | { | 906 | { |
907 | FtpClose(*nData); | 907 | FtpClose(*nData); |
908 | *nData = NULL; | 908 | *nData = NULL; |
909 | nControl->data = NULL; | 909 | nControl->data = NULL; |
910 | return 0; | 910 | return 0; |
911 | } | 911 | } |
912 | } | 912 | } |
913 | return 1; | 913 | return 1; |
914 | } | 914 | } |
915 | 915 | ||
916 | /* | 916 | /* |
917 | * FtpRead - read from a data connection | 917 | * FtpRead - read from a data connection |
918 | */ | 918 | */ |
919 | GLOBALDEF int FtpRead(void *buf, int max, netbuf *nData) | 919 | GLOBALDEF int FtpRead(void *buf, int max, netbuf *nData) |
920 | { | 920 | { |
921 | int i; | 921 | int i; |
922 | if (nData->dir != FTPLIB_READ) | 922 | if (nData->dir != FTPLIB_READ) |
923 | return 0; | 923 | return 0; |
924 | if (nData->buf) | 924 | if (nData->buf) |
925 | i = readline(buf, max, nData); | 925 | i = readline(buf, max, nData); |
926 | else | 926 | else |
927 | { | 927 | { |
928 | i = socket_wait(nData); | 928 | i = socket_wait(nData); |
929 | if (i != 1) | 929 | if (i != 1) |
930 | return 0; | 930 | return 0; |
931 | i = net_read(nData->handle, buf, max); | 931 | i = net_read(nData->handle, buf, max); |
932 | } | 932 | } |
933 | if (i == -1) | 933 | if (i == -1) |
934 | return 0; | 934 | return 0; |
935 | nData->xfered += i; | 935 | nData->xfered += i; |
936 | if (nData->idlecb && nData->cbbytes) | 936 | if (nData->idlecb && nData->cbbytes) |
937 | { | 937 | { |
938 | nData->xfered1 += i; | 938 | nData->xfered1 += i; |
939 | if (nData->xfered1 > nData->cbbytes) | 939 | if (nData->xfered1 > nData->cbbytes) |
940 | { | 940 | { |
941 | if (nData->idlecb(nData, nData->xfered, nData->idlearg) == 0) | 941 | if (nData->idlecb(nData, nData->xfered, nData->idlearg) == 0) |
942 | return 0; | 942 | return 0; |
943 | nData->xfered1 = 0; | 943 | nData->xfered1 = 0; |
944 | } | 944 | } |
945 | } | 945 | } |
946 | return i; | 946 | return i; |
947 | } | 947 | } |
948 | 948 | ||
949 | /* | 949 | /* |
950 | * FtpWrite - write to a data connection | 950 | * FtpWrite - write to a data connection |
951 | */ | 951 | */ |
952 | GLOBALDEF int FtpWrite(void *buf, int len, netbuf *nData) | 952 | GLOBALDEF int FtpWrite(void *buf, int len, netbuf *nData) |
953 | { | 953 | { |
954 | int i; | 954 | int i; |
955 | if (nData->dir != FTPLIB_WRITE) | 955 | if (nData->dir != FTPLIB_WRITE) |
956 | return 0; | 956 | return 0; |
957 | if (nData->buf) | 957 | if (nData->buf) |
958 | i = writeline(buf, len, nData); | 958 | i = writeline(buf, len, nData); |
959 | else | 959 | else |
960 | { | 960 | { |
961 | if (socket_wait(nData) < 0) | 961 | if (socket_wait(nData) < 0) |
962 | fprintf(stderr, "FtpWrite: socket_wait failed with %s\n", nData->ctrl->response); | 962 | fprintf(stderr, "FtpWrite: socket_wait failed with %s\n", nData->ctrl->response); |
963 | i = net_write(nData->handle, buf, len); | 963 | i = net_write(nData->handle, buf, len); |
964 | } | 964 | } |
965 | if (i == -1) | 965 | if (i == -1) |
966 | return 0; | 966 | return 0; |
967 | nData->xfered += i; | 967 | nData->xfered += i; |
968 | if (nData->idlecb && nData->cbbytes) | 968 | if (nData->idlecb && nData->cbbytes) |
969 | { | 969 | { |
970 | nData->xfered1 += i; | 970 | nData->xfered1 += i; |
971 | if (nData->xfered1 > nData->cbbytes) | 971 | if (nData->xfered1 > nData->cbbytes) |
972 | { | 972 | { |
973 | nData->idlecb(nData, nData->xfered, nData->idlearg); | 973 | nData->idlecb(nData, nData->xfered, nData->idlearg); |
974 | nData->xfered1 = 0; | 974 | nData->xfered1 = 0; |
975 | } | 975 | } |
976 | } | 976 | } |
977 | return i; | 977 | return i; |
978 | } | 978 | } |
979 | 979 | ||
980 | /* | 980 | /* |
981 | * FtpClose - close a data connection | 981 | * FtpClose - close a data connection |
982 | */ | 982 | */ |
983 | GLOBALDEF int FtpClose(netbuf *nData) | 983 | GLOBALDEF int FtpClose(netbuf *nData) |
984 | { | 984 | { |
985 | netbuf *ctrl; | 985 | netbuf *ctrl; |
986 | switch (nData->dir) | 986 | switch (nData->dir) |
987 | { | 987 | { |
988 | case FTPLIB_WRITE: | 988 | case FTPLIB_WRITE: |
989 | /* potential problem - if buffer flush fails, how to notify user? */ | 989 | /* potential problem - if buffer flush fails, how to notify user? */ |
990 | if (nData->buf != NULL) | 990 | if (nData->buf != NULL) |
991 | writeline(NULL, 0, nData); | 991 | writeline(NULL, 0, nData); |
992 | case FTPLIB_READ: | 992 | case FTPLIB_READ: |
993 | if (nData->buf) | 993 | if (nData->buf) |
994 | free(nData->buf); | 994 | free(nData->buf); |
995 | shutdown(nData->handle,2); | 995 | shutdown(nData->handle,2); |
996 | net_close(nData->handle); | 996 | net_close(nData->handle); |
997 | ctrl = nData->ctrl; | 997 | ctrl = nData->ctrl; |
998 | free(nData); | 998 | free(nData); |
999 | if (ctrl) | 999 | if (ctrl) |
1000 | { | 1000 | { |
1001 | ctrl->data = NULL; | 1001 | ctrl->data = NULL; |
1002 | return(readresp('2', ctrl)); | 1002 | return(readresp('2', ctrl)); |
1003 | } | 1003 | } |
1004 | return 1; | 1004 | return 1; |
1005 | case FTPLIB_CONTROL: | 1005 | case FTPLIB_CONTROL: |
1006 | if (nData->data) | 1006 | if (nData->data) |
1007 | { | 1007 | { |
1008 | nData->ctrl = NULL; | 1008 | nData->ctrl = NULL; |
1009 | FtpClose(nData); | 1009 | FtpClose(nData); |
1010 | } | 1010 | } |
1011 | net_close(nData->handle); | 1011 | net_close(nData->handle); |
1012 | free(nData); | 1012 | free(nData); |
1013 | return 0; | 1013 | return 0; |
1014 | } | 1014 | } |
1015 | return 1; | 1015 | return 1; |
1016 | } | 1016 | } |
1017 | 1017 | ||
1018 | /* | 1018 | /* |
1019 | * FtpSite - send a SITE command | 1019 | * FtpSite - send a SITE command |
1020 | * | 1020 | * |
1021 | * return 1 if command successful, 0 otherwise | 1021 | * return 1 if command successful, 0 otherwise |
1022 | */ | 1022 | */ |
1023 | GLOBALDEF int FtpSite(const char *cmd, netbuf *nControl) | 1023 | GLOBALDEF int FtpSite(const char *cmd, netbuf *nControl) |
1024 | { | 1024 | { |
1025 | char buf[256]; | 1025 | char buf[256]; |
1026 | 1026 | ||
1027 | if ((strlen(cmd) + 7) > sizeof(buf)) | 1027 | if ((strlen(cmd) + 7) > sizeof(buf)) |
1028 | return 0; | 1028 | return 0; |
1029 | sprintf(buf,"SITE %s",cmd); | 1029 | sprintf(buf,"SITE %s",cmd); |
1030 | if (!FtpSendCmd(buf,'2',nControl)) | 1030 | if (!FtpSendCmd(buf,'2',nControl)) |
1031 | return 0; | 1031 | return 0; |
1032 | return 1; | 1032 | return 1; |
1033 | } | 1033 | } |
1034 | 1034 | ||
1035 | /* | 1035 | /* |
1036 | * FtpSysType - send a SYST command | 1036 | * FtpSysType - send a SYST command |
1037 | * | 1037 | * |
1038 | * Fills in the user buffer with the remote system type. If more | 1038 | * Fills in the user buffer with the remote system type. If more |
1039 | * information from the response is required, the user can parse | 1039 | * information from the response is required, the user can parse |
1040 | * it out of the response buffer returned by FtpLastResponse(). | 1040 | * it out of the response buffer returned by FtpLastResponse(). |
1041 | * | 1041 | * |
1042 | * return 1 if command successful, 0 otherwise | 1042 | * return 1 if command successful, 0 otherwise |
1043 | */ | 1043 | */ |
1044 | GLOBALDEF int FtpSysType(char *buf, int max, netbuf *nControl) | 1044 | GLOBALDEF int FtpSysType(char *buf, int max, netbuf *nControl) |
1045 | { | 1045 | { |
1046 | int l = max; | 1046 | int l = max; |
1047 | char *b = buf; | 1047 | char *b = buf; |
1048 | char *s; | 1048 | char *s; |
1049 | if (!FtpSendCmd("SYST",'2',nControl)) | 1049 | if (!FtpSendCmd("SYST",'2',nControl)) |
1050 | return 0; | 1050 | return 0; |
1051 | s = &nControl->response[4]; | 1051 | s = &nControl->response[4]; |
1052 | while ((--l) && (*s != ' ')) | 1052 | while ((--l) && (*s != ' ')) |
1053 | *b++ = *s++; | 1053 | *b++ = *s++; |
1054 | *b++ = '\0'; | 1054 | *b++ = '\0'; |
1055 | return 1; | 1055 | return 1; |
1056 | } | 1056 | } |
1057 | 1057 | ||
1058 | /* | 1058 | /* |
1059 | * FtpMkdir - create a directory at server | 1059 | * FtpMkdir - create a directory at server |
1060 | * | 1060 | * |
1061 | * return 1 if successful, 0 otherwise | 1061 | * return 1 if successful, 0 otherwise |
1062 | */ | 1062 | */ |
1063 | GLOBALDEF int FtpMkdir(const char *path, netbuf *nControl) | 1063 | GLOBALDEF int FtpMkdir(const char *path, netbuf *nControl) |
1064 | { | 1064 | { |
1065 | char buf[256]; | 1065 | char buf[256]; |
1066 | 1066 | ||
1067 | if ((strlen(path) + 6) > sizeof(buf)) | 1067 | if ((strlen(path) + 6) > sizeof(buf)) |
1068 | return 0; | 1068 | return 0; |
1069 | sprintf(buf,"MKD %s",path); | 1069 | sprintf(buf,"MKD %s",path); |
1070 | if (!FtpSendCmd(buf,'2', nControl)) | 1070 | if (!FtpSendCmd(buf,'2', nControl)) |
1071 | return 0; | 1071 | return 0; |
1072 | return 1; | 1072 | return 1; |
1073 | } | 1073 | } |
1074 | 1074 | ||
1075 | /* | 1075 | /* |
1076 | * FtpChdir - change path at remote | 1076 | * FtpChdir - change path at remote |
1077 | * | 1077 | * |
1078 | * return 1 if successful, 0 otherwise | 1078 | * return 1 if successful, 0 otherwise |
1079 | */ | 1079 | */ |
1080 | GLOBALDEF int FtpChdir(const char *path, netbuf *nControl) | 1080 | GLOBALDEF int FtpChdir(const char *path, netbuf *nControl) |
1081 | { | 1081 | { |
1082 | char buf[256]; | 1082 | char buf[256]; |
1083 | 1083 | ||
1084 | if ((strlen(path) + 6) > sizeof(buf)) | 1084 | if ((strlen(path) + 6) > sizeof(buf)) |
1085 | return 0; | 1085 | return 0; |
1086 | sprintf(buf,"CWD %s",path); | 1086 | sprintf(buf,"CWD %s",path); |
1087 | if (!FtpSendCmd(buf,'2',nControl)) | 1087 | if (!FtpSendCmd(buf,'2',nControl)) |
1088 | return 0; | 1088 | return 0; |
1089 | return 1; | 1089 | return 1; |
1090 | } | 1090 | } |
1091 | 1091 | ||
1092 | /* | 1092 | /* |
1093 | * FtpCDUp - move to parent directory at remote | 1093 | * FtpCDUp - move to parent directory at remote |
1094 | * | 1094 | * |
1095 | * return 1 if successful, 0 otherwise | 1095 | * return 1 if successful, 0 otherwise |
1096 | */ | 1096 | */ |
1097 | GLOBALDEF int FtpCDUp(netbuf *nControl) | 1097 | GLOBALDEF int FtpCDUp(netbuf *nControl) |
1098 | { | 1098 | { |
1099 | if (!FtpSendCmd("CDUP",'2',nControl)) | 1099 | if (!FtpSendCmd("CDUP",'2',nControl)) |
1100 | return 0; | 1100 | return 0; |
1101 | return 1; | 1101 | return 1; |
1102 | } | 1102 | } |
1103 | 1103 | ||
1104 | /* | 1104 | /* |
1105 | * FtpRmdir - remove directory at remote | 1105 | * FtpRmdir - remove directory at remote |
1106 | * | 1106 | * |
1107 | * return 1 if successful, 0 otherwise | 1107 | * return 1 if successful, 0 otherwise |
1108 | */ | 1108 | */ |
1109 | GLOBALDEF int FtpRmdir(const char *path, netbuf *nControl) | 1109 | GLOBALDEF int FtpRmdir(const char *path, netbuf *nControl) |
1110 | { | 1110 | { |
1111 | char buf[256]; | 1111 | char buf[256]; |
1112 | 1112 | ||
1113 | if ((strlen(path) + 6) > sizeof(buf)) | 1113 | if ((strlen(path) + 6) > sizeof(buf)) |
1114 | return 0; | 1114 | return 0; |
1115 | sprintf(buf,"RMD %s",path); | 1115 | sprintf(buf,"RMD %s",path); |
1116 | if (!FtpSendCmd(buf,'2',nControl)) | 1116 | if (!FtpSendCmd(buf,'2',nControl)) |
1117 | return 0; | 1117 | return 0; |
1118 | return 1; | 1118 | return 1; |
1119 | } | 1119 | } |
1120 | 1120 | ||
1121 | /* | 1121 | /* |
1122 | * FtpPwd - get working directory at remote | 1122 | * FtpPwd - get working directory at remote |
1123 | * | 1123 | * |
1124 | * return 1 if successful, 0 otherwise | 1124 | * return 1 if successful, 0 otherwise |
1125 | */ | 1125 | */ |
1126 | GLOBALDEF int FtpPwd(char *path, int max, netbuf *nControl) | 1126 | GLOBALDEF int FtpPwd(char *path, int max, netbuf *nControl) |
1127 | { | 1127 | { |
1128 | int l = max; | 1128 | int l = max; |
1129 | char *b = path; | 1129 | char *b = path; |
1130 | char *s; | 1130 | char *s; |
1131 | if (!FtpSendCmd("PWD",'2',nControl)) | 1131 | if (!FtpSendCmd("PWD",'2',nControl)) |
1132 | return 0; | 1132 | return 0; |
1133 | s = strchr(nControl->response, '"'); | 1133 | s = strchr(nControl->response, '"'); |
1134 | if (s == NULL) | 1134 | if (s == NULL) |
1135 | return 0; | 1135 | return 0; |
1136 | s++; | 1136 | s++; |
1137 | while ((--l) && (*s) && (*s != '"')) | 1137 | while ((--l) && (*s) && (*s != '"')) |
1138 | *b++ = *s++; | 1138 | *b++ = *s++; |
1139 | *b++ = '\0'; | 1139 | *b++ = '\0'; |
1140 | return 1; | 1140 | return 1; |
1141 | } | 1141 | } |
1142 | 1142 | ||
1143 | /* | 1143 | /* |
1144 | * FtpXfer - issue a command and transfer data | 1144 | * FtpXfer - issue a command and transfer data |
1145 | * | 1145 | * |
1146 | * return 1 if successful, 0 otherwise | 1146 | * return 1 if successful, 0 otherwise |
1147 | */ | 1147 | */ |
1148 | static int FtpXfer(const char *localfile, const char *path, | 1148 | static int FtpXfer(const char *localfile, const char *path, |
1149 | netbuf *nControl, int typ, int mode) | 1149 | netbuf *nControl, int typ, int mode) |
1150 | { | 1150 | { |
1151 | int l,c; | 1151 | int l,c; |
1152 | char *dbuf; | 1152 | char *dbuf; |
1153 | FILE *local = NULL; | 1153 | FILE *local = NULL; |
1154 | netbuf *nData; | 1154 | netbuf *nData; |
1155 | int rv=1; | 1155 | int rv=1; |
1156 | 1156 | ||
1157 | if (localfile != NULL) | 1157 | if (localfile != NULL) |
1158 | { | 1158 | { |
1159 | char ac[4] = "w"; | 1159 | char ac[4] = "w"; |
1160 | if (typ == FTPLIB_FILE_WRITE) | 1160 | if (typ == FTPLIB_FILE_WRITE) |
1161 | ac[0] = 'r'; | 1161 | ac[0] = 'r'; |
1162 | if (mode == FTPLIB_IMAGE) | 1162 | if (mode == FTPLIB_IMAGE) |
1163 | ac[1] = 'b'; | 1163 | ac[1] = 'b'; |
1164 | local = fopen(localfile, ac); | 1164 | local = fopen(localfile, ac); |
1165 | if (local == NULL) | 1165 | if (local == NULL) |
1166 | { | 1166 | { |
1167 | strncpy(nControl->response, strerror(errno), | 1167 | strncpy(nControl->response, strerror(errno), |
1168 | sizeof(nControl->response)); | 1168 | sizeof(nControl->response)); |
1169 | return 0; | 1169 | return 0; |
1170 | } | 1170 | } |
1171 | } | 1171 | } |
1172 | if (local == NULL) | 1172 | if (local == NULL) |
1173 | local = (typ == FTPLIB_FILE_WRITE) ? stdin : stdout; | 1173 | local = (typ == FTPLIB_FILE_WRITE) ? stdin : stdout; |
1174 | if (!FtpAccess(path, typ, mode, nControl, &nData)) | 1174 | if (!FtpAccess(path, typ, mode, nControl, &nData)) |
1175 | { | 1175 | { |
1176 | if (localfile != NULL) | 1176 | if (localfile != NULL) |
1177 | fclose(local); | 1177 | fclose(local); |
1178 | return 0; | 1178 | return 0; |
1179 | } | 1179 | } |
1180 | dbuf = malloc(FTPLIB_BUFSIZ); | 1180 | dbuf = malloc(FTPLIB_BUFSIZ); |
1181 | if (typ == FTPLIB_FILE_WRITE) | 1181 | if (typ == FTPLIB_FILE_WRITE) |
1182 | { | 1182 | { |
1183 | while ((l = fread(dbuf, 1, FTPLIB_BUFSIZ, local)) > 0) | 1183 | while ((l = fread(dbuf, 1, FTPLIB_BUFSIZ, local)) > 0) |
1184 | if ((c = FtpWrite(dbuf, l, nData)) < l) | 1184 | if ((c = FtpWrite(dbuf, l, nData)) < l) |
1185 | { | 1185 | { |
1186 | printf("short write: passed %d, wrote %d\n", l, c); | 1186 | printf("short write: passed %d, wrote %d\n", l, c); |
1187 | rv = 0; | 1187 | rv = 0; |
1188 | break; | 1188 | break; |
1189 | } | 1189 | } |
1190 | } | 1190 | } |
1191 | else | 1191 | else |
1192 | { | 1192 | { |
1193 | while ((l = FtpRead(dbuf, FTPLIB_BUFSIZ, nData)) > 0) | 1193 | while ((l = FtpRead(dbuf, FTPLIB_BUFSIZ, nData)) > 0) |
1194 | if (fwrite(dbuf, 1, l, local) <= 0) | 1194 | if (fwrite(dbuf, 1, l, local) <= 0) |
1195 | { | 1195 | { |
1196 | perror("localfile write"); | 1196 | perror("localfile write"); |
1197 | rv = 0; | 1197 | rv = 0; |
1198 | break; | 1198 | break; |
1199 | } | 1199 | } |
1200 | } | 1200 | } |
1201 | free(dbuf); | 1201 | free(dbuf); |
1202 | fflush(local); | 1202 | fflush(local); |
1203 | if (localfile != NULL) | 1203 | if (localfile != NULL) |
1204 | fclose(local); | 1204 | fclose(local); |
1205 | FtpClose(nData); | 1205 | FtpClose(nData); |
1206 | return rv; | 1206 | return rv; |
1207 | } | 1207 | } |
1208 | 1208 | ||
1209 | /* | 1209 | /* |
1210 | * FtpNlst - issue an NLST command and write response to output | 1210 | * FtpNlst - issue an NLST command and write response to output |
1211 | * | 1211 | * |
1212 | * return 1 if successful, 0 otherwise | 1212 | * return 1 if successful, 0 otherwise |
1213 | */ | 1213 | */ |
1214 | GLOBALDEF int FtpNlst(const char *outputfile, const char *path, | 1214 | GLOBALDEF int FtpNlst(const char *outputfile, const char *path, |
1215 | netbuf *nControl) | 1215 | netbuf *nControl) |
1216 | { | 1216 | { |
1217 | return FtpXfer(outputfile, path, nControl, FTPLIB_DIR, FTPLIB_ASCII); | 1217 | return FtpXfer(outputfile, path, nControl, FTPLIB_DIR, FTPLIB_ASCII); |
1218 | } | 1218 | } |
1219 | 1219 | ||
1220 | /* | 1220 | /* |
1221 | * FtpDir - issue a LIST command and write response to output | 1221 | * FtpDir - issue a LIST command and write response to output |
1222 | * | 1222 | * |
1223 | * return 1 if successful, 0 otherwise | 1223 | * return 1 if successful, 0 otherwise |
1224 | */ | 1224 | */ |
1225 | GLOBALDEF int FtpDir(const char *outputfile, const char *path, netbuf *nControl) | 1225 | GLOBALDEF int FtpDir(const char *outputfile, const char *path, netbuf *nControl) |
1226 | { | 1226 | { |
1227 | return FtpXfer(outputfile, path, nControl, FTPLIB_DIR_VERBOSE, FTPLIB_ASCII); | 1227 | return FtpXfer(outputfile, path, nControl, FTPLIB_DIR_VERBOSE, FTPLIB_ASCII); |
1228 | } | 1228 | } |
1229 | 1229 | ||
1230 | /* | 1230 | /* |
1231 | * FtpSize - determine the size of a remote file | 1231 | * FtpSize - determine the size of a remote file |
1232 | * | 1232 | * |
1233 | * return 1 if successful, 0 otherwise | 1233 | * return 1 if successful, 0 otherwise |
1234 | */ | 1234 | */ |
1235 | GLOBALDEF int FtpSize(const char *path, int *size, char mode, netbuf *nControl) | 1235 | GLOBALDEF int FtpSize(const char *path, int *size, char mode, netbuf *nControl) |
1236 | { | 1236 | { |
1237 | char cmd[256]; | 1237 | char cmd[256]; |
1238 | int resp,sz,rv=1; | 1238 | int resp,sz,rv=1; |
1239 | 1239 | ||
1240 | if ((strlen(path) + 7) > sizeof(cmd)) | 1240 | if ((strlen(path) + 7) > sizeof(cmd)) |
1241 | return 0; | 1241 | return 0; |
1242 | sprintf(cmd, "TYPE %c", mode); | 1242 | sprintf(cmd, "TYPE %c", mode); |
1243 | if (!FtpSendCmd(cmd, '2', nControl)) | 1243 | if (!FtpSendCmd(cmd, '2', nControl)) |
1244 | return 0; | 1244 | return 0; |
1245 | sprintf(cmd,"SIZE %s",path); | 1245 | sprintf(cmd,"SIZE %s",path); |
1246 | if (!FtpSendCmd(cmd,'2',nControl)) | 1246 | if (!FtpSendCmd(cmd,'2',nControl)) |
1247 | rv = 0; | 1247 | rv = 0; |
1248 | else | 1248 | else |
1249 | { | 1249 | { |
1250 | if (sscanf(nControl->response, "%d %d", &resp, &sz) == 2) | 1250 | if (sscanf(nControl->response, "%d %d", &resp, &sz) == 2) |
1251 | *size = sz; | 1251 | *size = sz; |
1252 | else | 1252 | else |
1253 | rv = 0; | 1253 | rv = 0; |
1254 | } | 1254 | } |
1255 | return rv; | 1255 | return rv; |
1256 | } | 1256 | } |
1257 | 1257 | ||
1258 | /* | 1258 | /* |
1259 | * FtpModDate - determine the modification date of a remote file | 1259 | * FtpModDate - determine the modification date of a remote file |
1260 | * | 1260 | * |
1261 | * return 1 if successful, 0 otherwise | 1261 | * return 1 if successful, 0 otherwise |
1262 | */ | 1262 | */ |
1263 | GLOBALDEF int FtpModDate(const char *path, char *dt, int max, netbuf *nControl) | 1263 | GLOBALDEF int FtpModDate(const char *path, char *dt, int max, netbuf *nControl) |
1264 | { | 1264 | { |
1265 | char buf[256]; | 1265 | char buf[256]; |
1266 | int rv = 1; | 1266 | int rv = 1; |
1267 | 1267 | ||
1268 | if ((strlen(path) + 7) > sizeof(buf)) | 1268 | if ((strlen(path) + 7) > sizeof(buf)) |
1269 | return 0; | 1269 | return 0; |
1270 | sprintf(buf,"MDTM %s",path); | 1270 | sprintf(buf,"MDTM %s",path); |
1271 | if (!FtpSendCmd(buf,'2',nControl)) | 1271 | if (!FtpSendCmd(buf,'2',nControl)) |
1272 | rv = 0; | 1272 | rv = 0; |
1273 | else | 1273 | else |
1274 | strncpy(dt, &nControl->response[4], max); | 1274 | strncpy(dt, &nControl->response[4], max); |
1275 | return rv; | 1275 | return rv; |
1276 | } | 1276 | } |
1277 | 1277 | ||
1278 | /* | 1278 | /* |
1279 | * FtpGet - issue a GET command and write received data to output | 1279 | * FtpGet - issue a GET command and write received data to output |
1280 | * | 1280 | * |
1281 | * return 1 if successful, 0 otherwise | 1281 | * return 1 if successful, 0 otherwise |
1282 | */ | 1282 | */ |
1283 | GLOBALDEF int FtpGet(const char *outputfile, const char *path, | 1283 | GLOBALDEF int FtpGet(const char *outputfile, const char *path, |
1284 | char mode, netbuf *nControl) | 1284 | char mode, netbuf *nControl) |
1285 | { | 1285 | { |
1286 | return FtpXfer(outputfile, path, nControl, FTPLIB_FILE_READ, mode); | 1286 | return FtpXfer(outputfile, path, nControl, FTPLIB_FILE_READ, mode); |
1287 | } | 1287 | } |
1288 | 1288 | ||
1289 | /* | 1289 | /* |
1290 | * FtpPut - issue a PUT command and send data from input | 1290 | * FtpPut - issue a PUT command and send data from input |
1291 | * | 1291 | * |
1292 | * return 1 if successful, 0 otherwise | 1292 | * return 1 if successful, 0 otherwise |
1293 | */ | 1293 | */ |
1294 | GLOBALDEF int FtpPut(const char *inputfile, const char *path, char mode, | 1294 | GLOBALDEF int FtpPut(const char *inputfile, const char *path, char mode, |
1295 | netbuf *nControl) | 1295 | netbuf *nControl) |
1296 | { | 1296 | { |
1297 | return FtpXfer(inputfile, path, nControl, FTPLIB_FILE_WRITE, mode); | 1297 | return FtpXfer(inputfile, path, nControl, FTPLIB_FILE_WRITE, mode); |
1298 | } | 1298 | } |
1299 | 1299 | ||
1300 | /* | 1300 | /* |
1301 | * FtpRename - rename a file at remote | 1301 | * FtpRename - rename a file at remote |
1302 | * | 1302 | * |
1303 | * return 1 if successful, 0 otherwise | 1303 | * return 1 if successful, 0 otherwise |
1304 | */ | 1304 | */ |
1305 | GLOBALDEF int FtpRename(const char *src, const char *dst, netbuf *nControl) | 1305 | GLOBALDEF int FtpRename(const char *src, const char *dst, netbuf *nControl) |
1306 | { | 1306 | { |
1307 | char cmd[256]; | 1307 | char cmd[256]; |
1308 | 1308 | ||
1309 | if (((strlen(src) + 7) > sizeof(cmd)) || | 1309 | if (((strlen(src) + 7) > sizeof(cmd)) || |
1310 | ((strlen(dst) + 7) > sizeof(cmd))) | 1310 | ((strlen(dst) + 7) > sizeof(cmd))) |
1311 | return 0; | 1311 | return 0; |
1312 | sprintf(cmd,"RNFR %s",src); | 1312 | sprintf(cmd,"RNFR %s",src); |
1313 | if (!FtpSendCmd(cmd,'3',nControl)) | 1313 | if (!FtpSendCmd(cmd,'3',nControl)) |
1314 | return 0; | 1314 | return 0; |
1315 | sprintf(cmd,"RNTO %s",dst); | 1315 | sprintf(cmd,"RNTO %s",dst); |
1316 | if (!FtpSendCmd(cmd,'2',nControl)) | 1316 | if (!FtpSendCmd(cmd,'2',nControl)) |
1317 | return 0; | 1317 | return 0; |
1318 | return 1; | 1318 | return 1; |
1319 | } | 1319 | } |
1320 | 1320 | ||
1321 | /* | 1321 | /* |
1322 | * FtpDelete - delete a file at remote | 1322 | * FtpDelete - delete a file at remote |
1323 | * | 1323 | * |
1324 | * return 1 if successful, 0 otherwise | 1324 | * return 1 if successful, 0 otherwise |
1325 | */ | 1325 | */ |
1326 | GLOBALDEF int FtpDelete(const char *fnm, netbuf *nControl) | 1326 | GLOBALDEF int FtpDelete(const char *fnm, netbuf *nControl) |
1327 | { | 1327 | { |
1328 | char cmd[256]; | 1328 | char cmd[256]; |
1329 | 1329 | ||
1330 | if ((strlen(fnm) + 7) > sizeof(cmd)) | 1330 | if ((strlen(fnm) + 7) > sizeof(cmd)) |
1331 | return 0; | 1331 | return 0; |
1332 | sprintf(cmd,"DELE %s",fnm); | 1332 | sprintf(cmd,"DELE %s",fnm); |
1333 | if (!FtpSendCmd(cmd,'2', nControl)) | 1333 | if (!FtpSendCmd(cmd,'2', nControl)) |
1334 | return 0; | 1334 | return 0; |
1335 | return 1; | 1335 | return 1; |
1336 | } | 1336 | } |
1337 | 1337 | ||
1338 | /* | 1338 | /* |
1339 | * FtpQuit - disconnect from remote | 1339 | * FtpQuit - disconnect from remote |
1340 | * | 1340 | * |
1341 | * return 1 if successful, 0 otherwise | 1341 | * return 1 if successful, 0 otherwise |
1342 | */ | 1342 | */ |
1343 | GLOBALDEF void FtpQuit(netbuf *nControl) | 1343 | GLOBALDEF void FtpQuit(netbuf *nControl) |
1344 | { | 1344 | { |
1345 | if (nControl->dir != FTPLIB_CONTROL) | 1345 | if (nControl->dir != FTPLIB_CONTROL) |
1346 | return; | 1346 | return; |
1347 | if (FtpSendCmd("QUIT",'2',nControl) == 1) { | 1347 | if (FtpSendCmd("QUIT",'2',nControl) == 1) { |
1348 | if (ftplib_debug > 2) | 1348 | if (ftplib_debug > 2) |
1349 | fprintf(stderr, "FtpQuit: FtpSendCmd(QUIT) failed\n"); | 1349 | fprintf(stderr, "FtpQuit: FtpSendCmd(QUIT) failed\n"); |
1350 | } | 1350 | } |
1351 | net_close(nControl->handle); | 1351 | net_close(nControl->handle); |
1352 | free(nControl->buf); | 1352 | free(nControl->buf); |
1353 | free(nControl); | 1353 | free(nControl); |
1354 | } | 1354 | } |
diff --git a/noncore/settings/sysinfo/contrib/dhry.c b/noncore/settings/sysinfo/contrib/dhry.c index 07fd1c0..5426157 100644 --- a/noncore/settings/sysinfo/contrib/dhry.c +++ b/noncore/settings/sysinfo/contrib/dhry.c | |||
@@ -1,1010 +1,1010 @@ | |||
1 | /*****************************************************/ | 1 | /*****************************************************/ |
2 | /* Various timer routines. */ | 2 | /* Various timer routines. */ |
3 | /* Al Aburto, aburto@nosc.mil, 18 Feb 1997 */ | 3 | /* Al Aburto, aburto@nosc.mil, 18 Feb 1997 */ |
4 | /* */ | 4 | /* */ |
5 | /* t = dtime() outputs the current time in seconds. */ | 5 | /* t = dtime() outputs the current time in seconds. */ |
6 | /* Use CAUTION as some of these routines will mess */ | 6 | /* Use CAUTION as some of these routines will mess */ |
7 | /* up when timing across the hour mark!!! */ | 7 | /* up when timing across the hour mark!!! */ |
8 | /* */ | 8 | /* */ |
9 | /* For timing I use the 'user' time whenever */ | 9 | /* For timing I use the 'user' time whenever */ |
10 | /* possible. Using 'user+sys' time is a separate */ | 10 | /* possible. Using 'user+sys' time is a separate */ |
11 | /* issue. */ | 11 | /* issue. */ |
12 | /* */ | 12 | /* */ |
13 | /* Example Usage: */ | 13 | /* Example Usage: */ |
14 | /* [timer options added here] */ | 14 | /* [timer options added here] */ |
15 | /* main() */ | 15 | /* main() */ |
16 | /* { */ | 16 | /* { */ |
17 | /* double starttime,benchtime,dtime(); */ | 17 | /* double starttime,benchtime,dtime(); */ |
18 | /* */ | 18 | /* */ |
19 | /* starttime = dtime(); */ | 19 | /* starttime = dtime(); */ |
20 | /* [routine to time] */ | 20 | /* [routine to time] */ |
21 | /* benchtime = dtime() - starttime; */ | 21 | /* benchtime = dtime() - starttime; */ |
22 | /* } */ | 22 | /* } */ |
23 | /* */ | 23 | /* */ |
24 | /* [timer code below added here] */ | 24 | /* [timer code below added here] */ |
25 | /*****************************************************/ | 25 | /*****************************************************/ |
26 | 26 | ||
27 | /***************************************************************/ | 27 | /***************************************************************/ |
28 | /* Timer options. You MUST uncomment one of the options below */ | 28 | /* Timer options. You MUST uncomment one of the options below */ |
29 | /* or compile, for example, with the '-DUNIX' option. */ | 29 | /* or compile, for example, with the '-DUNIX' option. */ |
30 | /***************************************************************/ | 30 | /***************************************************************/ |
31 | /* #define Amiga */ | 31 | /* #define Amiga */ |
32 | /* #define UNIX */ | 32 | /* #define UNIX */ |
33 | /* #define UNIX_Old */ | 33 | /* #define UNIX_Old */ |
34 | /* #define VMS */ | 34 | /* #define VMS */ |
35 | /* #define BORLAND_C */ | 35 | /* #define BORLAND_C */ |
36 | /* #define MSC */ | 36 | /* #define MSC */ |
37 | /* #define MAC */ | 37 | /* #define MAC */ |
38 | /* #define IPSC */ | 38 | /* #define IPSC */ |
39 | /* #define FORTRAN_SEC */ | 39 | /* #define FORTRAN_SEC */ |
40 | /* #define GTODay */ | 40 | /* #define GTODay */ |
41 | /* #define CTimer */ | 41 | /* #define CTimer */ |
42 | /* #define UXPM */ | 42 | /* #define UXPM */ |
43 | /* #define MAC_TMgr */ | 43 | /* #define MAC_TMgr */ |
44 | /* #define PARIX */ | 44 | /* #define PARIX */ |
45 | /* #define POSIX */ | 45 | /* #define POSIX */ |
46 | /* #define WIN32 */ | 46 | /* #define WIN32 */ |
47 | /* #define POSIX1 */ | 47 | /* #define POSIX1 */ |
48 | /***********************/ | 48 | /***********************/ |
49 | 49 | ||
50 | /*********************************/ | 50 | /*********************************/ |
51 | /* Timer code. */ | 51 | /* Timer code. */ |
52 | /*********************************/ | 52 | /*********************************/ |
53 | /*******************/ | 53 | /*******************/ |
54 | /* Amiga dtime() */ | 54 | /* Amiga dtime() */ |
55 | /*******************/ | 55 | /*******************/ |
56 | #ifdef Amiga | 56 | #ifdef Amiga |
57 | #include <ctype.h> | 57 | #include <ctype.h> |
58 | #define HZ 50 | 58 | #define HZ 50 |
59 | 59 | ||
60 | double dtime() | 60 | double dtime() |
61 | { | 61 | { |
62 | double q; | 62 | double q; |
63 | 63 | ||
64 | struct tt | 64 | struct tt |
65 | { | 65 | { |
66 | long days; | 66 | long days; |
67 | long minutes; | 67 | long minutes; |
68 | long ticks; | 68 | long ticks; |
69 | } tt; | 69 | } tt; |
70 | 70 | ||
71 | DateStamp(&tt); | 71 | DateStamp(&tt); |
72 | 72 | ||
73 | q = ((double)(tt.ticks + (tt.minutes * 60L * 50L))) / (double)HZ; | 73 | q = ((double)(tt.ticks + (tt.minutes * 60L * 50L))) / (double)HZ; |
74 | 74 | ||
75 | return q; | 75 | return q; |
76 | } | 76 | } |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | /*****************************************************/ | 79 | /*****************************************************/ |
80 | /* UNIX dtime(). This is the preferred UNIX timer. */ | 80 | /* UNIX dtime(). This is the preferred UNIX timer. */ |
81 | /* Provided by: Markku Kolkka, mk59200@cc.tut.fi */ | 81 | /* Provided by: Markku Kolkka, mk59200@cc.tut.fi */ |
82 | /* HP-UX Addition by: Bo Thide', bt@irfu.se */ | 82 | /* HP-UX Addition by: Bo Thide', bt@irfu.se */ |
83 | /*****************************************************/ | 83 | /*****************************************************/ |
84 | #ifdef UNIX | 84 | #ifdef UNIX |
85 | #include <sys/time.h> | 85 | #include <sys/time.h> |
86 | #include <sys/resource.h> | 86 | #include <sys/resource.h> |
87 | 87 | ||
88 | #ifdef hpux | 88 | #ifdef hpux |
89 | #include <sys/syscall.h> | 89 | #include <sys/syscall.h> |
90 | #define getrusage(a,b) syscall(SYS_getrusage,a,b) | 90 | #define getrusage(a,b) syscall(SYS_getrusage,a,b) |
91 | #endif | 91 | #endif |
92 | 92 | ||
93 | struct rusage rusage; | 93 | struct rusage rusage; |
94 | 94 | ||
95 | double dtime() | 95 | double dtime() |
96 | { | 96 | { |
97 | double q; | 97 | double q; |
98 | 98 | ||
99 | getrusage(RUSAGE_SELF,&rusage); | 99 | getrusage(RUSAGE_SELF,&rusage); |
100 | 100 | ||
101 | q = (double)(rusage.ru_utime.tv_sec); | 101 | q = (double)(rusage.ru_utime.tv_sec); |
102 | q = q + (double)(rusage.ru_utime.tv_usec) * 1.0e-06; | 102 | q = q + (double)(rusage.ru_utime.tv_usec) * 1.0e-06; |
103 | 103 | ||
104 | return q; | 104 | return q; |
105 | } | 105 | } |
106 | #endif | 106 | #endif |
107 | 107 | ||
108 | /***************************************************/ | 108 | /***************************************************/ |
109 | /* UNIX_Old dtime(). This is the old UNIX timer. */ | 109 | /* UNIX_Old dtime(). This is the old UNIX timer. */ |
110 | /* Make sure HZ is properly defined in param.h !! */ | 110 | /* Make sure HZ is properly defined in param.h !! */ |
111 | /***************************************************/ | 111 | /***************************************************/ |
112 | #ifdef UNIX_Old | 112 | #ifdef UNIX_Old |
113 | #include <sys/types.h> | 113 | #include <sys/types.h> |
114 | #include <sys/times.h> | 114 | #include <sys/times.h> |
115 | #include <sys/param.h> | 115 | #include <sys/param.h> |
116 | 116 | ||
117 | #ifndef HZ | 117 | #ifndef HZ |
118 | #define HZ 60 | 118 | #define HZ 60 |
119 | #endif | 119 | #endif |
120 | 120 | ||
121 | struct tms tms; | 121 | struct tms tms; |
122 | 122 | ||
123 | double dtime() | 123 | double dtime() |
124 | { | 124 | { |
125 | double q; | 125 | double q; |
126 | 126 | ||
127 | times(&tms); | 127 | times(&tms); |
128 | 128 | ||
129 | q = (double)(tms.tms_utime) / (double)HZ; | 129 | q = (double)(tms.tms_utime) / (double)HZ; |
130 | 130 | ||
131 | return q; | 131 | return q; |
132 | } | 132 | } |
133 | #endif | 133 | #endif |
134 | 134 | ||
135 | /*********************************************************/ | 135 | /*********************************************************/ |
136 | /* VMS dtime() for VMS systems. */ | 136 | /* VMS dtime() for VMS systems. */ |
137 | /* Provided by: RAMO@uvphys.phys.UVic.CA */ | 137 | /* Provided by: RAMO@uvphys.phys.UVic.CA */ |
138 | /* Some people have run into problems with this timer. */ | 138 | /* Some people have run into problems with this timer. */ |
139 | /*********************************************************/ | 139 | /*********************************************************/ |
140 | #ifdef VMS | 140 | #ifdef VMS |
141 | #include time | 141 | #include time |
142 | 142 | ||
143 | #ifndef HZ | 143 | #ifndef HZ |
144 | #define HZ 100 | 144 | #define HZ 100 |
145 | #endif | 145 | #endif |
146 | 146 | ||
147 | struct tbuffer_t | 147 | struct tbuffer_t |
148 | { | 148 | { |
149 | int proc_user_time; | 149 | int proc_user_time; |
150 | int proc_system_time; | 150 | int proc_system_time; |
151 | int child_user_time; | 151 | int child_user_time; |
152 | int child_system_time; | 152 | int child_system_time; |
153 | }; | 153 | }; |
154 | 154 | ||
155 | struct tbuffer_t tms; | 155 | struct tbuffer_t tms; |
156 | 156 | ||
157 | double dtime() | 157 | double dtime() |
158 | { | 158 | { |
159 | double q; | 159 | double q; |
160 | 160 | ||
161 | times(&tms); | 161 | times(&tms); |
162 | 162 | ||
163 | q = (double)(tms.proc_user_time) / (double)HZ; | 163 | q = (double)(tms.proc_user_time) / (double)HZ; |
164 | 164 | ||
165 | return q; | 165 | return q; |
166 | } | 166 | } |
167 | #endif | 167 | #endif |
168 | 168 | ||
169 | /******************************/ | 169 | /******************************/ |
170 | /* BORLAND C dtime() for DOS */ | 170 | /* BORLAND C dtime() for DOS */ |
171 | /******************************/ | 171 | /******************************/ |
172 | #ifdef BORLAND_C | 172 | #ifdef BORLAND_C |
173 | #include <ctype.h> | 173 | #include <ctype.h> |
174 | #include <dos.h> | 174 | #include <dos.h> |
175 | #include <time.h> | 175 | #include <time.h> |
176 | 176 | ||
177 | #define HZ 100 | 177 | #define HZ 100 |
178 | struct time tnow; | 178 | struct time tnow; |
179 | 179 | ||
180 | double dtime() | 180 | double dtime() |
181 | { | 181 | { |
182 | double q; | 182 | double q; |
183 | 183 | ||
184 | gettime(&tnow); | 184 | gettime(&tnow); |
185 | 185 | ||
186 | q = 60.0 * (double)(tnow.ti_min); | 186 | q = 60.0 * (double)(tnow.ti_min); |
187 | q = q + (double)(tnow.ti_sec); | 187 | q = q + (double)(tnow.ti_sec); |
188 | q = q + (double)(tnow.ti_hund)/(double)HZ; | 188 | q = q + (double)(tnow.ti_hund)/(double)HZ; |
189 | 189 | ||
190 | return q; | 190 | return q; |
191 | } | 191 | } |
192 | #endif | 192 | #endif |
193 | 193 | ||
194 | /**************************************/ | 194 | /**************************************/ |
195 | /* Microsoft C (MSC) dtime() for DOS */ | 195 | /* Microsoft C (MSC) dtime() for DOS */ |
196 | /**************************************/ | 196 | /**************************************/ |
197 | #ifdef MSC | 197 | #ifdef MSC |
198 | #include <time.h> | 198 | #include <time.h> |
199 | #include <ctype.h> | 199 | #include <ctype.h> |
200 | 200 | ||
201 | #define HZ CLOCKS_PER_SEC | 201 | #define HZ CLOCKS_PER_SEC |
202 | clock_t tnow; | 202 | clock_t tnow; |
203 | 203 | ||
204 | double dtime() | 204 | double dtime() |
205 | { | 205 | { |
206 | double q; | 206 | double q; |
207 | 207 | ||
208 | tnow = clock(); | 208 | tnow = clock(); |
209 | 209 | ||
210 | q = (double)tnow / (double)HZ; | 210 | q = (double)tnow / (double)HZ; |
211 | 211 | ||
212 | return q; | 212 | return q; |
213 | } | 213 | } |
214 | #endif | 214 | #endif |
215 | 215 | ||
216 | /*************************************/ | 216 | /*************************************/ |
217 | /* Macintosh (MAC) Think C dtime() */ | 217 | /* Macintosh (MAC) Think C dtime() */ |
218 | /*************************************/ | 218 | /*************************************/ |
219 | #ifdef MAC | 219 | #ifdef MAC |
220 | #include <time.h> | 220 | #include <time.h> |
221 | 221 | ||
222 | #define HZ 60 | 222 | #define HZ 60 |
223 | 223 | ||
224 | double dtime() | 224 | double dtime() |
225 | { | 225 | { |
226 | double q; | 226 | double q; |
227 | 227 | ||
228 | q = (double)clock() / (double)HZ; | 228 | q = (double)clock() / (double)HZ; |
229 | 229 | ||
230 | return q; | 230 | return q; |
231 | } | 231 | } |
232 | #endif | 232 | #endif |
233 | 233 | ||
234 | /************************************************************/ | 234 | /************************************************************/ |
235 | /* iPSC/860 (IPSC) dtime() for i860. */ | 235 | /* iPSC/860 (IPSC) dtime() for i860. */ |
236 | /* Provided by: Dan Yergeau, yergeau@gloworm.Stanford.EDU */ | 236 | /* Provided by: Dan Yergeau, yergeau@gloworm.Stanford.EDU */ |
237 | /************************************************************/ | 237 | /************************************************************/ |
238 | #ifdef IPSC | 238 | #ifdef IPSC |
239 | extern double dclock(); | 239 | extern double dclock(); |
240 | 240 | ||
241 | double dtime() | 241 | double dtime() |
242 | { | 242 | { |
243 | double q; | 243 | double q; |
244 | 244 | ||
245 | q = dclock(); | 245 | q = dclock(); |
246 | 246 | ||
247 | return q; | 247 | return q; |
248 | } | 248 | } |
249 | #endif | 249 | #endif |
250 | 250 | ||
251 | /**************************************************/ | 251 | /**************************************************/ |
252 | /* FORTRAN dtime() for Cray type systems. */ | 252 | /* FORTRAN dtime() for Cray type systems. */ |
253 | /* This is the preferred timer for Cray systems. */ | 253 | /* This is the preferred timer for Cray systems. */ |
254 | /**************************************************/ | 254 | /**************************************************/ |
255 | #ifdef FORTRAN_SEC | 255 | #ifdef FORTRAN_SEC |
256 | 256 | ||
257 | fortran double second(); | 257 | fortran double second(); |
258 | 258 | ||
259 | double dtime() | 259 | double dtime() |
260 | { | 260 | { |
261 | double q; | 261 | double q; |
262 | 262 | ||
263 | second(&q); | 263 | second(&q); |
264 | 264 | ||
265 | return q; | 265 | return q; |
266 | } | 266 | } |
267 | #endif | 267 | #endif |
268 | 268 | ||
269 | /***********************************************************/ | 269 | /***********************************************************/ |
270 | /* UNICOS C dtime() for Cray UNICOS systems. Don't use */ | 270 | /* UNICOS C dtime() for Cray UNICOS systems. Don't use */ |
271 | /* unless absolutely necessary as returned time includes */ | 271 | /* unless absolutely necessary as returned time includes */ |
272 | /* 'user+system' time. Provided by: R. Mike Dority, */ | 272 | /* 'user+system' time. Provided by: R. Mike Dority, */ |
273 | /* dority@craysea.cray.com */ | 273 | /* dority@craysea.cray.com */ |
274 | /***********************************************************/ | 274 | /***********************************************************/ |
275 | #ifdef CTimer | 275 | #ifdef CTimer |
276 | #include <time.h> | 276 | #include <time.h> |
277 | 277 | ||
278 | double dtime() | 278 | double dtime() |
279 | { | 279 | { |
280 | double q; | 280 | double q; |
281 | clock_t clock(void); | 281 | clock_t clock(void); |
282 | 282 | ||
283 | q = (double)clock() / (double)CLOCKS_PER_SEC; | 283 | q = (double)clock() / (double)CLOCKS_PER_SEC; |
284 | 284 | ||
285 | return q; | 285 | return q; |
286 | } | 286 | } |
287 | #endif | 287 | #endif |
288 | 288 | ||
289 | /********************************************/ | 289 | /********************************************/ |
290 | /* Another UNIX timer using gettimeofday(). */ | 290 | /* Another UNIX timer using gettimeofday(). */ |
291 | /* However, getrusage() is preferred. */ | 291 | /* However, getrusage() is preferred. */ |
292 | /********************************************/ | 292 | /********************************************/ |
293 | #ifdef GTODay | 293 | #ifdef GTODay |
294 | #include <sys/time.h> | 294 | #include <sys/time.h> |
295 | 295 | ||
296 | struct timeval tnow; | 296 | struct timeval tnow; |
297 | 297 | ||
298 | double dtime() | 298 | double dtime() |
299 | { | 299 | { |
300 | double q; | 300 | double q; |
301 | 301 | ||
302 | gettimeofday(&tnow,NULL); | 302 | gettimeofday(&tnow,NULL); |
303 | q = (double)tnow.tv_sec + (double)tnow.tv_usec * 1.0e-6; | 303 | q = (double)tnow.tv_sec + (double)tnow.tv_usec * 1.0e-6; |
304 | 304 | ||
305 | return q; | 305 | return q; |
306 | } | 306 | } |
307 | #endif | 307 | #endif |
308 | 308 | ||
309 | /*****************************************************/ | 309 | /*****************************************************/ |
310 | /* Fujitsu UXP/M timer. */ | 310 | /* Fujitsu UXP/M timer. */ |
311 | /* Provided by: Mathew Lim, ANUSF, M.Lim@anu.edu.au */ | 311 | /* Provided by: Mathew Lim, ANUSF, M.Lim@anu.edu.au */ |
312 | /*****************************************************/ | 312 | /*****************************************************/ |
313 | #ifdef UXPM | 313 | #ifdef UXPM |
314 | #include <sys/types.h> | 314 | #include <sys/types.h> |
315 | #include <sys/timesu.h> | 315 | #include <sys/timesu.h> |
316 | struct tmsu rusage; | 316 | struct tmsu rusage; |
317 | 317 | ||
318 | double dtime() | 318 | double dtime() |
319 | { | 319 | { |
320 | double q; | 320 | double q; |
321 | 321 | ||
322 | timesu(&rusage); | 322 | timesu(&rusage); |
323 | 323 | ||
324 | q = (double)(rusage.tms_utime) * 1.0e-06; | 324 | q = (double)(rusage.tms_utime) * 1.0e-06; |
325 | 325 | ||
326 | return q; | 326 | return q; |
327 | } | 327 | } |
328 | #endif | 328 | #endif |
329 | 329 | ||
330 | /**********************************************/ | 330 | /**********************************************/ |
331 | /* Macintosh (MAC_TMgr) Think C dtime() */ | 331 | /* Macintosh (MAC_TMgr) Think C dtime() */ |
332 | /* requires Think C Language Extensions or */ | 332 | /* requires Think C Language Extensions or */ |
333 | /* #include <MacHeaders> in the prefix */ | 333 | /* #include <MacHeaders> in the prefix */ |
334 | /* provided by Francis H Schiffer 3rd (fhs) */ | 334 | /* provided by Francis H Schiffer 3rd (fhs) */ |
335 | /* skipschiffer@genie.geis.com */ | 335 | /* skipschiffer@genie.geis.com */ |
336 | /**********************************************/ | 336 | /**********************************************/ |
337 | #ifdef MAC_TMgr | 337 | #ifdef MAC_TMgr |
338 | #include <Timer.h> | 338 | #include <Timer.h> |
339 | #include <stdlib.h> | 339 | #include <stdlib.h> |
340 | 340 | ||
341 | static TMTask mgrTimer; | 341 | static TMTask mgrTimer; |
342 | static Boolean mgrInited = false; | 342 | static Boolean mgrInited = false; |
343 | static double mgrClock; | 343 | static double mgrClock; |
344 | 344 | ||
345 | #define RMV_TIMER RmvTime( (QElemPtr)&mgrTimer ) | 345 | #define RMV_TIMER RmvTime( (QElemPtr)&mgrTimer ) |
346 | #define MAX_TIME 1800000000L | 346 | #define MAX_TIME 1800000000L |
347 | /* MAX_TIME limits time between calls to */ | 347 | /* MAX_TIME limits time between calls to */ |
348 | /* dtime( ) to no more than 30 minutes */ | 348 | /* dtime( ) to no more than 30 minutes */ |
349 | /* this limitation could be removed by */ | 349 | /* this limitation could be removed by */ |
350 | /* creating a completion routine to sum */ | 350 | /* creating a completion routine to sum */ |
351 | /* 30 minute segments (fhs 1994 feb 9) */ | 351 | /* 30 minute segments (fhs 1994 feb 9) */ |
352 | 352 | ||
353 | static void Remove_timer( ) | 353 | static void Remove_timer( ) |
354 | { | 354 | { |
355 | RMV_TIMER; | 355 | RMV_TIMER; |
356 | mgrInited = false; | 356 | mgrInited = false; |
357 | } | 357 | } |
358 | 358 | ||
359 | double dtime( ) | 359 | double dtime( ) |
360 | { | 360 | { |
361 | if( mgrInited ) { | 361 | if( mgrInited ) { |
362 | RMV_TIMER; | 362 | RMV_TIMER; |
363 | mgrClock += (MAX_TIME + mgrTimer.tmCount)*1.0e-6; | 363 | mgrClock += (MAX_TIME + mgrTimer.tmCount)*1.0e-6; |
364 | } else { | 364 | } else { |
365 | if( _atexit( &Remove_timer ) == 0 ) mgrInited = true; | 365 | if( _atexit( &Remove_timer ) == 0 ) mgrInited = true; |
366 | mgrClock = 0.0; | 366 | mgrClock = 0.0; |
367 | } | 367 | } |
368 | 368 | ||
369 | if ( mgrInited ) | 369 | if ( mgrInited ) |
370 | { | 370 | { |
371 | mgrTimer.tmAddr = NULL; | 371 | mgrTimer.tmAddr = NULL; |
372 | mgrTimer.tmCount = 0; | 372 | mgrTimer.tmCount = 0; |
373 | mgrTimer.tmWakeUp = 0; | 373 | mgrTimer.tmWakeUp = 0; |
374 | mgrTimer.tmReserved = 0; | 374 | mgrTimer.tmReserved = 0; |
375 | InsTime( (QElemPtr)&mgrTimer ); | 375 | InsTime( (QElemPtr)&mgrTimer ); |
376 | PrimeTime( (QElemPtr)&mgrTimer, -MAX_TIME ); | 376 | PrimeTime( (QElemPtr)&mgrTimer, -MAX_TIME ); |
377 | } | 377 | } |
378 | return( mgrClock ); | 378 | return( mgrClock ); |
379 | } | 379 | } |
380 | #endif | 380 | #endif |
381 | 381 | ||
382 | /***********************************************************/ | 382 | /***********************************************************/ |
383 | /* Parsytec GCel timer. */ | 383 | /* Parsytec GCel timer. */ |
384 | /* Provided by: Georg Wambach, gw@informatik.uni-koeln.de */ | 384 | /* Provided by: Georg Wambach, gw@informatik.uni-koeln.de */ |
385 | /***********************************************************/ | 385 | /***********************************************************/ |
386 | #ifdef PARIX | 386 | #ifdef PARIX |
387 | #include <sys/time.h> | 387 | #include <sys/time.h> |
388 | 388 | ||
389 | double dtime() | 389 | double dtime() |
390 | { | 390 | { |
391 | double q; | 391 | double q; |
392 | 392 | ||
393 | q = (double) (TimeNowHigh()) / (double) CLK_TCK_HIGH; | 393 | q = (double) (TimeNowHigh()) / (double) CLK_TCK_HIGH; |
394 | 394 | ||
395 | return q; | 395 | return q; |
396 | } | 396 | } |
397 | #endif | 397 | #endif |
398 | 398 | ||
399 | /************************************************/ | 399 | /************************************************/ |
400 | /* Sun Solaris POSIX dtime() routine */ | 400 | /* Sun Solaris POSIX dtime() routine */ |
401 | /* Provided by: Case Larsen, CTLarsen.lbl.gov */ | 401 | /* Provided by: Case Larsen, CTLarsen.lbl.gov */ |
402 | /************************************************/ | 402 | /************************************************/ |
403 | #ifdef POSIX | 403 | #ifdef POSIX |
404 | #include <sys/time.h> | 404 | #include <sys/time.h> |
405 | #include <sys/resource.h> | 405 | #include <sys/resource.h> |
406 | #include <sys/rusage.h> | 406 | #include <sys/rusage.h> |
407 | 407 | ||
408 | #ifdef __hpux | 408 | #ifdef __hpux |
409 | #include <sys/syscall.h> | 409 | #include <sys/syscall.h> |
410 | #endif | 410 | #endif |
411 | 411 | ||
412 | struct rusage rusage; | 412 | struct rusage rusage; |
413 | 413 | ||
414 | double dtime() | 414 | double dtime() |
415 | { | 415 | { |
416 | double q; | 416 | double q; |
417 | 417 | ||
418 | getrusage(RUSAGE_SELF,&rusage); | 418 | getrusage(RUSAGE_SELF,&rusage); |
419 | 419 | ||
420 | q = (double)(rusage.ru_utime.tv_sec); | 420 | q = (double)(rusage.ru_utime.tv_sec); |
421 | q = q + (double)(rusage.ru_utime.tv_nsec) * 1.0e-09; | 421 | q = q + (double)(rusage.ru_utime.tv_nsec) * 1.0e-09; |
422 | 422 | ||
423 | return q; | 423 | return q; |
424 | } | 424 | } |
425 | #endif | 425 | #endif |
426 | 426 | ||
427 | 427 | ||
428 | /****************************************************/ | 428 | /****************************************************/ |
429 | /* Windows NT (32 bit) dtime() routine */ | 429 | /* Windows NT (32 bit) dtime() routine */ |
430 | /* Provided by: Piers Haken, piersh@microsoft.com */ | 430 | /* Provided by: Piers Haken, piersh@microsoft.com */ |
431 | /****************************************************/ | 431 | /****************************************************/ |
432 | #ifdef WIN32 | 432 | #ifdef WIN32 |
433 | #include <windows.h> | 433 | #include <windows.h> |
434 | 434 | ||
435 | double dtime(void) | 435 | double dtime(void) |
436 | { | 436 | { |
437 | double q; | 437 | double q; |
438 | 438 | ||
439 | q = (double)GetTickCount() * 1.0e-03; | 439 | q = (double)GetTickCount() * 1.0e-03; |
440 | 440 | ||
441 | return q; | 441 | return q; |
442 | } | 442 | } |
443 | #endif | 443 | #endif |
444 | 444 | ||
445 | /*****************************************************/ | 445 | /*****************************************************/ |
446 | /* Time according to POSIX.1 - <J.Pelan@qub.ac.uk> */ | 446 | /* Time according to POSIX.1 - <J.Pelan@qub.ac.uk> */ |
447 | /* Ref: "POSIX Programmer's Guide" O'Reilly & Assoc.*/ | 447 | /* Ref: "POSIX Programmer's Guide" O'Reilly & Assoc.*/ |
448 | /*****************************************************/ | 448 | /*****************************************************/ |
449 | #ifdef POSIX1 | 449 | #ifdef POSIX1 |
450 | #define _POSIX_SOURCE 1 | 450 | #define _POSIX_SOURCE 1 |
451 | #include <unistd.h> | 451 | #include <unistd.h> |
452 | #include <limits.h> | 452 | #include <limits.h> |
453 | #include <sys/times.h> | 453 | #include <sys/times.h> |
454 | 454 | ||
455 | struct tms tms; | 455 | struct tms tms; |
456 | 456 | ||
457 | double dtime() | 457 | double dtime() |
458 | { | 458 | { |
459 | double q; | 459 | double q; |
460 | times(&tms); | 460 | times(&tms); |
461 | q = (double)tms.tms_utime / (double)CLK_TCK; | 461 | q = (double)tms.tms_utime / (double)CLK_TCK; |
462 | return q; | 462 | return q; |
463 | } | 463 | } |
464 | #endif | 464 | #endif |
465 | /* | 465 | /* |
466 | ************************************************************************* | 466 | ************************************************************************* |
467 | * | 467 | * |
468 | * "DHRYSTONE" Benchmark Program | 468 | * "DHRYSTONE" Benchmark Program |
469 | * ----------------------------- | 469 | * ----------------------------- |
470 | * | 470 | * |
471 | * Version: C, Version 2.1 | 471 | * Version: C, Version 2.1 |
472 | * | 472 | * |
473 | * File: dhry_1.c (part 2 of 3) | 473 | * File: dhry_1.c (part 2 of 3) |
474 | * | 474 | * |
475 | * Date: May 25, 1988 | 475 | * Date: May 25, 1988 |
476 | * | 476 | * |
477 | * Author: Reinhold P. Weicker | 477 | * Author: Reinhold P. Weicker |
478 | * | 478 | * |
479 | ************************************************************************* | 479 | ************************************************************************* |
480 | */ | 480 | */ |
481 | 481 | ||
482 | #include <stdio.h> | 482 | #include <stdio.h> |
483 | #include <stdlib.h> | 483 | #include <stdlib.h> |
484 | #include <string.h> | 484 | #include <string.h> |
485 | #include "dhry.h" | 485 | #include "dhry.h" |
486 | 486 | ||
487 | /* Global Variables: */ | 487 | /* Global Variables: */ |
488 | 488 | ||
489 | Rec_Pointer Ptr_Glob, | 489 | Rec_Pointer Ptr_Glob, |
490 | Next_Ptr_Glob; | 490 | Next_Ptr_Glob; |
491 | int Int_Glob; | 491 | int Int_Glob; |
492 | Boolean Bool_Glob; | 492 | Boolean Bool_Glob; |
493 | char Ch_1_Glob, | 493 | char Ch_1_Glob, |
494 | Ch_2_Glob; | 494 | Ch_2_Glob; |
495 | int Arr_1_Glob [50]; | 495 | int Arr_1_Glob [50]; |
496 | int Arr_2_Glob [50] [50]; | 496 | int Arr_2_Glob [50] [50]; |
497 | 497 | ||
498 | char Reg_Define[32] = "Register option selected."; | 498 | char Reg_Define[32] = "Register option selected."; |
499 | 499 | ||
500 | //extern char *malloc (); | 500 | //extern char *malloc (); |
501 | Enumeration Func_1 (); | 501 | Enumeration Func_1 (); |
502 | /* | 502 | /* |
503 | forward declaration necessary since Enumeration may not simply be int | 503 | forward declaration necessary since Enumeration may not simply be int |
504 | */ | 504 | */ |
505 | 505 | ||
506 | #ifndef ROPT | 506 | #ifndef ROPT |
507 | #define REG | 507 | #define REG |
508 | /* REG becomes defined as empty */ | 508 | /* REG becomes defined as empty */ |
509 | /* i.e. no register variables */ | 509 | /* i.e. no register variables */ |
510 | #else | 510 | #else |
511 | #define REG register | 511 | #define REG register |
512 | #endif | 512 | #endif |
513 | 513 | ||
514 | 514 | ||
515 | /* variables for time measurement: */ | 515 | /* variables for time measurement: */ |
516 | 516 | ||
517 | #define Too_Small_Time 2 | 517 | #define Too_Small_Time 2 |
518 | /* Measurements should last at least 2 seconds */ | 518 | /* Measurements should last at least 2 seconds */ |
519 | 519 | ||
520 | double Begin_Time, | 520 | double Begin_Time, |
521 | End_Time, | 521 | End_Time, |
522 | User_Time; | 522 | User_Time; |
523 | 523 | ||
524 | double Microseconds, | 524 | double Microseconds, |
525 | Dhrystones_Per_Second, | 525 | Dhrystones_Per_Second, |
526 | Vax_Mips; | 526 | Vax_Mips; |
527 | 527 | ||
528 | /* end of variables for time measurement */ | 528 | /* end of variables for time measurement */ |
529 | 529 | ||
530 | /**********************************************************************************************/ | 530 | /**********************************************************************************************/ |
531 | 531 | ||
532 | 532 | ||
533 | Proc_1 (Ptr_Val_Par) | 533 | Proc_1 (Ptr_Val_Par) |
534 | /******************/ | 534 | /******************/ |
535 | 535 | ||
536 | REG Rec_Pointer Ptr_Val_Par; | 536 | REG Rec_Pointer Ptr_Val_Par; |
537 | /* executed once */ | 537 | /* executed once */ |
538 | { | 538 | { |
539 | REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; | 539 | REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; |
540 | /* == Ptr_Glob_Next */ | 540 | /* == Ptr_Glob_Next */ |
541 | /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ | 541 | /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ |
542 | /* corresponds to "rename" in Ada, "with" in Pascal */ | 542 | /* corresponds to "rename" in Ada, "with" in Pascal */ |
543 | 543 | ||
544 | structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); | 544 | structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); |
545 | Ptr_Val_Par->variant.var_1.Int_Comp = 5; | 545 | Ptr_Val_Par->variant.var_1.Int_Comp = 5; |
546 | Next_Record->variant.var_1.Int_Comp | 546 | Next_Record->variant.var_1.Int_Comp |
547 | = Ptr_Val_Par->variant.var_1.Int_Comp; | 547 | = Ptr_Val_Par->variant.var_1.Int_Comp; |
548 | Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; | 548 | Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; |
549 | Proc_3 (&Next_Record->Ptr_Comp); | 549 | Proc_3 (&Next_Record->Ptr_Comp); |
550 | /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp | 550 | /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp |
551 | == Ptr_Glob->Ptr_Comp */ | 551 | == Ptr_Glob->Ptr_Comp */ |
552 | if (Next_Record->Discr == Ident_1) | 552 | if (Next_Record->Discr == Ident_1) |
553 | /* then, executed */ | 553 | /* then, executed */ |
554 | { | 554 | { |
555 | Next_Record->variant.var_1.Int_Comp = 6; | 555 | Next_Record->variant.var_1.Int_Comp = 6; |
556 | Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, | 556 | Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, |
557 | &Next_Record->variant.var_1.Enum_Comp); | 557 | &Next_Record->variant.var_1.Enum_Comp); |
558 | Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; | 558 | Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; |
559 | Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, | 559 | Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, |
560 | &Next_Record->variant.var_1.Int_Comp); | 560 | &Next_Record->variant.var_1.Int_Comp); |
561 | } | 561 | } |
562 | else /* not executed */ | 562 | else /* not executed */ |
563 | structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); | 563 | structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); |
564 | } /* Proc_1 */ | 564 | } /* Proc_1 */ |
565 | 565 | ||
566 | 566 | ||
567 | Proc_2 (Int_Par_Ref) | 567 | Proc_2 (Int_Par_Ref) |
568 | /******************/ | 568 | /******************/ |
569 | /* executed once */ | 569 | /* executed once */ |
570 | /* *Int_Par_Ref == 1, becomes 4 */ | 570 | /* *Int_Par_Ref == 1, becomes 4 */ |
571 | 571 | ||
572 | One_Fifty *Int_Par_Ref; | 572 | One_Fifty *Int_Par_Ref; |
573 | { | 573 | { |
574 | One_Fifty Int_Loc; | 574 | One_Fifty Int_Loc; |
575 | Enumeration Enum_Loc; | 575 | Enumeration Enum_Loc = Ident_2; |
576 | 576 | ||
577 | Int_Loc = *Int_Par_Ref + 10; | 577 | Int_Loc = *Int_Par_Ref + 10; |
578 | do /* executed once */ | 578 | do /* executed once */ |
579 | if (Ch_1_Glob == 'A') | 579 | if (Ch_1_Glob == 'A') |
580 | /* then, executed */ | 580 | /* then, executed */ |
581 | { | 581 | { |
582 | Int_Loc -= 1; | 582 | Int_Loc -= 1; |
583 | *Int_Par_Ref = Int_Loc - Int_Glob; | 583 | *Int_Par_Ref = Int_Loc - Int_Glob; |
584 | Enum_Loc = Ident_1; | 584 | Enum_Loc = Ident_1; |
585 | } /* if */ | 585 | } /* if */ |
586 | while (Enum_Loc != Ident_1); /* true */ | 586 | while (Enum_Loc != Ident_1); /* true */ |
587 | } /* Proc_2 */ | 587 | } /* Proc_2 */ |
588 | 588 | ||
589 | 589 | ||
590 | Proc_3 (Ptr_Ref_Par) | 590 | Proc_3 (Ptr_Ref_Par) |
591 | /******************/ | 591 | /******************/ |
592 | /* executed once */ | 592 | /* executed once */ |
593 | /* Ptr_Ref_Par becomes Ptr_Glob */ | 593 | /* Ptr_Ref_Par becomes Ptr_Glob */ |
594 | 594 | ||
595 | Rec_Pointer *Ptr_Ref_Par; | 595 | Rec_Pointer *Ptr_Ref_Par; |
596 | 596 | ||
597 | { | 597 | { |
598 | if (Ptr_Glob != Null) | 598 | if (Ptr_Glob != Null) |
599 | /* then, executed */ | 599 | /* then, executed */ |
600 | *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; | 600 | *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; |
601 | Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); | 601 | Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); |
602 | } /* Proc_3 */ | 602 | } /* Proc_3 */ |
603 | 603 | ||
604 | 604 | ||
605 | Proc_4 () /* without parameters */ | 605 | Proc_4 () /* without parameters */ |
606 | /*******/ | 606 | /*******/ |
607 | /* executed once */ | 607 | /* executed once */ |
608 | { | 608 | { |
609 | Boolean Bool_Loc; | 609 | Boolean Bool_Loc; |
610 | 610 | ||
611 | Bool_Loc = Ch_1_Glob == 'A'; | 611 | Bool_Loc = Ch_1_Glob == 'A'; |
612 | Bool_Glob = Bool_Loc | Bool_Glob; | 612 | Bool_Glob = Bool_Loc | Bool_Glob; |
613 | Ch_2_Glob = 'B'; | 613 | Ch_2_Glob = 'B'; |
614 | } /* Proc_4 */ | 614 | } /* Proc_4 */ |
615 | 615 | ||
616 | 616 | ||
617 | Proc_5 () /* without parameters */ | 617 | Proc_5 () /* without parameters */ |
618 | /*******/ | 618 | /*******/ |
619 | /* executed once */ | 619 | /* executed once */ |
620 | { | 620 | { |
621 | Ch_1_Glob = 'A'; | 621 | Ch_1_Glob = 'A'; |
622 | Bool_Glob = false; | 622 | Bool_Glob = false; |
623 | } /* Proc_5 */ | 623 | } /* Proc_5 */ |
624 | 624 | ||
625 | 625 | ||
626 | /* Procedure for the assignment of structures, */ | 626 | /* Procedure for the assignment of structures, */ |
627 | /* if the C compiler doesn't support this feature */ | 627 | /* if the C compiler doesn't support this feature */ |
628 | #ifdef NOSTRUCTASSIGN | 628 | #ifdef NOSTRUCTASSIGN |
629 | memcpy (d, s, l) | 629 | memcpy (d, s, l) |
630 | register char *d; | 630 | register char *d; |
631 | register char *s; | 631 | register char *s; |
632 | register int l; | 632 | register int l; |
633 | { | 633 | { |
634 | while (l--) *d++ = *s++; | 634 | while (l--) *d++ = *s++; |
635 | } | 635 | } |
636 | #endif | 636 | #endif |
637 | 637 | ||
638 | 638 | ||
639 | Proc_6 (Enum_Val_Par, Enum_Ref_Par) | 639 | Proc_6 (Enum_Val_Par, Enum_Ref_Par) |
640 | /*********************************/ | 640 | /*********************************/ |
641 | /* executed once */ | 641 | /* executed once */ |
642 | /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */ | 642 | /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */ |
643 | 643 | ||
644 | Enumeration Enum_Val_Par; | 644 | Enumeration Enum_Val_Par; |
645 | Enumeration *Enum_Ref_Par; | 645 | Enumeration *Enum_Ref_Par; |
646 | { | 646 | { |
647 | *Enum_Ref_Par = Enum_Val_Par; | 647 | *Enum_Ref_Par = Enum_Val_Par; |
648 | if (! Func_3 (Enum_Val_Par)) | 648 | if (! Func_3 (Enum_Val_Par)) |
649 | /* then, not executed */ | 649 | /* then, not executed */ |
650 | *Enum_Ref_Par = Ident_4; | 650 | *Enum_Ref_Par = Ident_4; |
651 | switch (Enum_Val_Par) | 651 | switch (Enum_Val_Par) |
652 | { | 652 | { |
653 | case Ident_1: | 653 | case Ident_1: |
654 | *Enum_Ref_Par = Ident_1; | 654 | *Enum_Ref_Par = Ident_1; |
655 | break; | 655 | break; |
656 | case Ident_2: | 656 | case Ident_2: |
657 | if (Int_Glob > 100) | 657 | if (Int_Glob > 100) |
658 | /* then */ | 658 | /* then */ |
659 | *Enum_Ref_Par = Ident_1; | 659 | *Enum_Ref_Par = Ident_1; |
660 | else *Enum_Ref_Par = Ident_4; | 660 | else *Enum_Ref_Par = Ident_4; |
661 | break; | 661 | break; |
662 | case Ident_3: /* executed */ | 662 | case Ident_3: /* executed */ |
663 | *Enum_Ref_Par = Ident_2; | 663 | *Enum_Ref_Par = Ident_2; |
664 | break; | 664 | break; |
665 | case Ident_4: break; | 665 | case Ident_4: break; |
666 | case Ident_5: | 666 | case Ident_5: |
667 | *Enum_Ref_Par = Ident_3; | 667 | *Enum_Ref_Par = Ident_3; |
668 | break; | 668 | break; |
669 | } /* switch */ | 669 | } /* switch */ |
670 | } /* Proc_6 */ | 670 | } /* Proc_6 */ |
671 | 671 | ||
672 | 672 | ||
673 | Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) | 673 | Proc_7 (Int_1_Par_Val, Int_2_Par_Val, Int_Par_Ref) |
674 | /**********************************************/ | 674 | /**********************************************/ |
675 | /* executed three times */ | 675 | /* executed three times */ |
676 | /* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */ | 676 | /* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */ |
677 | /* Int_Par_Ref becomes 7 */ | 677 | /* Int_Par_Ref becomes 7 */ |
678 | /* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ | 678 | /* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */ |
679 | /* Int_Par_Ref becomes 17 */ | 679 | /* Int_Par_Ref becomes 17 */ |
680 | /* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */ | 680 | /* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */ |
681 | /* Int_Par_Ref becomes 18 */ | 681 | /* Int_Par_Ref becomes 18 */ |
682 | One_Fifty Int_1_Par_Val; | 682 | One_Fifty Int_1_Par_Val; |
683 | One_Fifty Int_2_Par_Val; | 683 | One_Fifty Int_2_Par_Val; |
684 | One_Fifty *Int_Par_Ref; | 684 | One_Fifty *Int_Par_Ref; |
685 | { | 685 | { |
686 | One_Fifty Int_Loc; | 686 | One_Fifty Int_Loc; |
687 | 687 | ||
688 | Int_Loc = Int_1_Par_Val + 2; | 688 | Int_Loc = Int_1_Par_Val + 2; |
689 | *Int_Par_Ref = Int_2_Par_Val + Int_Loc; | 689 | *Int_Par_Ref = Int_2_Par_Val + Int_Loc; |
690 | } /* Proc_7 */ | 690 | } /* Proc_7 */ |
691 | 691 | ||
692 | 692 | ||
693 | Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val) | 693 | Proc_8 (Arr_1_Par_Ref, Arr_2_Par_Ref, Int_1_Par_Val, Int_2_Par_Val) |
694 | /*********************************************************************/ | 694 | /*********************************************************************/ |
695 | /* executed once */ | 695 | /* executed once */ |
696 | /* Int_Par_Val_1 == 3 */ | 696 | /* Int_Par_Val_1 == 3 */ |
697 | /* Int_Par_Val_2 == 7 */ | 697 | /* Int_Par_Val_2 == 7 */ |
698 | Arr_1_Dim Arr_1_Par_Ref; | 698 | Arr_1_Dim Arr_1_Par_Ref; |
699 | Arr_2_Dim Arr_2_Par_Ref; | 699 | Arr_2_Dim Arr_2_Par_Ref; |
700 | int Int_1_Par_Val; | 700 | int Int_1_Par_Val; |
701 | int Int_2_Par_Val; | 701 | int Int_2_Par_Val; |
702 | { | 702 | { |
703 | REG One_Fifty Int_Index; | 703 | REG One_Fifty Int_Index; |
704 | REG One_Fifty Int_Loc; | 704 | REG One_Fifty Int_Loc; |
705 | 705 | ||
706 | Int_Loc = Int_1_Par_Val + 5; | 706 | Int_Loc = Int_1_Par_Val + 5; |
707 | Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; | 707 | Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val; |
708 | Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; | 708 | Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc]; |
709 | Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; | 709 | Arr_1_Par_Ref [Int_Loc+30] = Int_Loc; |
710 | for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) | 710 | for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index) |
711 | Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; | 711 | Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc; |
712 | Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; | 712 | Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1; |
713 | Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; | 713 | Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc]; |
714 | Int_Glob = 5; | 714 | Int_Glob = 5; |
715 | } /* Proc_8 */ | 715 | } /* Proc_8 */ |
716 | 716 | ||
717 | 717 | ||
718 | Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val) | 718 | Enumeration Func_1 (Ch_1_Par_Val, Ch_2_Par_Val) |
719 | /*************************************************/ | 719 | /*************************************************/ |
720 | /* executed three times */ | 720 | /* executed three times */ |
721 | /* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */ | 721 | /* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */ |
722 | /* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */ | 722 | /* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */ |
723 | /* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */ | 723 | /* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */ |
724 | 724 | ||
725 | Capital_Letter Ch_1_Par_Val; | 725 | Capital_Letter Ch_1_Par_Val; |
726 | Capital_Letter Ch_2_Par_Val; | 726 | Capital_Letter Ch_2_Par_Val; |
727 | { | 727 | { |
728 | Capital_Letter Ch_1_Loc; | 728 | Capital_Letter Ch_1_Loc; |
729 | Capital_Letter Ch_2_Loc; | 729 | Capital_Letter Ch_2_Loc; |
730 | 730 | ||
731 | Ch_1_Loc = Ch_1_Par_Val; | 731 | Ch_1_Loc = Ch_1_Par_Val; |
732 | Ch_2_Loc = Ch_1_Loc; | 732 | Ch_2_Loc = Ch_1_Loc; |
733 | if (Ch_2_Loc != Ch_2_Par_Val) | 733 | if (Ch_2_Loc != Ch_2_Par_Val) |
734 | /* then, executed */ | 734 | /* then, executed */ |
735 | return (Ident_1); | 735 | return (Ident_1); |
736 | else /* not executed */ | 736 | else /* not executed */ |
737 | { | 737 | { |
738 | Ch_1_Glob = Ch_1_Loc; | 738 | Ch_1_Glob = Ch_1_Loc; |
739 | return (Ident_2); | 739 | return (Ident_2); |
740 | } | 740 | } |
741 | } /* Func_1 */ | 741 | } /* Func_1 */ |
742 | 742 | ||
743 | 743 | ||
744 | Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref) | 744 | Boolean Func_2 (Str_1_Par_Ref, Str_2_Par_Ref) |
745 | /*************************************************/ | 745 | /*************************************************/ |
746 | /* executed once */ | 746 | /* executed once */ |
747 | /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */ | 747 | /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */ |
748 | /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ | 748 | /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */ |
749 | 749 | ||
750 | Str_30 Str_1_Par_Ref; | 750 | Str_30 Str_1_Par_Ref; |
751 | Str_30 Str_2_Par_Ref; | 751 | Str_30 Str_2_Par_Ref; |
752 | { | 752 | { |
753 | REG One_Thirty Int_Loc; | 753 | REG One_Thirty Int_Loc; |
754 | Capital_Letter Ch_Loc; | 754 | Capital_Letter Ch_Loc; |
755 | 755 | ||
756 | Int_Loc = 2; | 756 | Int_Loc = 2; |
757 | while (Int_Loc <= 2) /* loop body executed once */ | 757 | while (Int_Loc <= 2) /* loop body executed once */ |
758 | if (Func_1 (Str_1_Par_Ref[Int_Loc], | 758 | if (Func_1 (Str_1_Par_Ref[Int_Loc], |
759 | Str_2_Par_Ref[Int_Loc+1]) == Ident_1) | 759 | Str_2_Par_Ref[Int_Loc+1]) == Ident_1) |
760 | /* then, executed */ | 760 | /* then, executed */ |
761 | { | 761 | { |
762 | Ch_Loc = 'A'; | 762 | Ch_Loc = 'A'; |
763 | Int_Loc += 1; | 763 | Int_Loc += 1; |
764 | } /* if, while */ | 764 | } /* if, while */ |
765 | if (Ch_Loc >= 'W' && Ch_Loc < 'Z') | 765 | if (Ch_Loc >= 'W' && Ch_Loc < 'Z') |
766 | /* then, not executed */ | 766 | /* then, not executed */ |
767 | Int_Loc = 7; | 767 | Int_Loc = 7; |
768 | if (Ch_Loc == 'R') | 768 | if (Ch_Loc == 'R') |
769 | /* then, not executed */ | 769 | /* then, not executed */ |
770 | return (true); | 770 | return (true); |
771 | else /* executed */ | 771 | else /* executed */ |
772 | { | 772 | { |
773 | if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) | 773 | if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0) |
774 | /* then, not executed */ | 774 | /* then, not executed */ |
775 | { | 775 | { |
776 | Int_Loc += 7; | 776 | Int_Loc += 7; |
777 | Int_Glob = Int_Loc; | 777 | Int_Glob = Int_Loc; |
778 | return (true); | 778 | return (true); |
779 | } | 779 | } |
780 | else /* executed */ | 780 | else /* executed */ |
781 | return (false); | 781 | return (false); |
782 | } /* if Ch_Loc */ | 782 | } /* if Ch_Loc */ |
783 | } /* Func_2 */ | 783 | } /* Func_2 */ |
784 | 784 | ||
785 | 785 | ||
786 | Boolean Func_3 (Enum_Par_Val) | 786 | Boolean Func_3 (Enum_Par_Val) |
787 | /***************************/ | 787 | /***************************/ |
788 | /* executed once */ | 788 | /* executed once */ |
789 | /* Enum_Par_Val == Ident_3 */ | 789 | /* Enum_Par_Val == Ident_3 */ |
790 | Enumeration Enum_Par_Val; | 790 | Enumeration Enum_Par_Val; |
791 | { | 791 | { |
792 | Enumeration Enum_Loc; | 792 | Enumeration Enum_Loc; |
793 | 793 | ||
794 | Enum_Loc = Enum_Par_Val; | 794 | Enum_Loc = Enum_Par_Val; |
795 | if (Enum_Loc == Ident_3) | 795 | if (Enum_Loc == Ident_3) |
796 | /* then, executed */ | 796 | /* then, executed */ |
797 | return (true); | 797 | return (true); |
798 | else /* not executed */ | 798 | else /* not executed */ |
799 | return (false); | 799 | return (false); |
800 | } /* Func_3 */ | 800 | } /* Func_3 */ |
801 | 801 | ||
802 | /*********************************************************************************/ | 802 | /*********************************************************************************/ |
803 | 803 | ||
804 | double dhry_main( int n ) | 804 | double dhry_main( int n ) |
805 | /*****/ | 805 | /*****/ |
806 | 806 | ||
807 | /* main program, corresponds to procedures */ | 807 | /* main program, corresponds to procedures */ |
808 | /* Main and Proc_0 in the Ada version */ | 808 | /* Main and Proc_0 in the Ada version */ |
809 | { | 809 | { |
810 | One_Fifty Int_1_Loc; | 810 | One_Fifty Int_1_Loc; |
811 | REG One_Fifty Int_2_Loc; | 811 | REG One_Fifty Int_2_Loc; |
812 | One_Fifty Int_3_Loc; | 812 | One_Fifty Int_3_Loc; |
813 | REG char Ch_Index; | 813 | REG char Ch_Index; |
814 | Enumeration Enum_Loc; | 814 | Enumeration Enum_Loc; |
815 | Str_30 Str_1_Loc; | 815 | Str_30 Str_1_Loc; |
816 | Str_30 Str_2_Loc; | 816 | Str_30 Str_2_Loc; |
817 | REG int Run_Index; | 817 | REG int Run_Index; |
818 | REG int Number_Of_Runs; | 818 | REG int Number_Of_Runs; |
819 | 819 | ||
820 | FILE *Ap; | 820 | FILE *Ap; |
821 | 821 | ||
822 | /* Initializations */ | 822 | /* Initializations */ |
823 | 823 | ||
824 | /* if ((Ap = fopen("dhry.res","a+")) == NULL) | 824 | /* if ((Ap = fopen("dhry.res","a+")) == NULL) |
825 | { | 825 | { |
826 | printf("Can not open dhry.res\n\n"); | 826 | printf("Can not open dhry.res\n\n"); |
827 | exit(1); | 827 | exit(1); |
828 | } | 828 | } |
829 | */ | 829 | */ |
830 | Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); | 830 | Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); |
831 | Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); | 831 | Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type)); |
832 | 832 | ||
833 | Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; | 833 | Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; |
834 | Ptr_Glob->Discr = Ident_1; | 834 | Ptr_Glob->Discr = Ident_1; |
835 | Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; | 835 | Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; |
836 | Ptr_Glob->variant.var_1.Int_Comp = 40; | 836 | Ptr_Glob->variant.var_1.Int_Comp = 40; |
837 | strcpy (Ptr_Glob->variant.var_1.Str_Comp, | 837 | strcpy (Ptr_Glob->variant.var_1.Str_Comp, |
838 | "DHRYSTONE PROGRAM, SOME STRING"); | 838 | "DHRYSTONE PROGRAM, SOME STRING"); |
839 | strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); | 839 | strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); |
840 | 840 | ||
841 | Arr_2_Glob [8][7] = 10; | 841 | Arr_2_Glob [8][7] = 10; |
842 | /* Was missing in published program. Without this statement, */ | 842 | /* Was missing in published program. Without this statement, */ |
843 | /* Arr_2_Glob [8][7] would have an undefined value. */ | 843 | /* Arr_2_Glob [8][7] would have an undefined value. */ |
844 | /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ | 844 | /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ |
845 | /* overflow may occur for this array element. */ | 845 | /* overflow may occur for this array element. */ |
846 | 846 | ||
847 | /* | 847 | /* |
848 | if (Reg) | 848 | if (Reg) |
849 | { | 849 | { |
850 | printf ("Program compiled with 'register' attribute\n"); | 850 | printf ("Program compiled with 'register' attribute\n"); |
851 | printf ("\n"); | 851 | printf ("\n"); |
852 | } | 852 | } |
853 | else | 853 | else |
854 | { | 854 | { |
855 | printf ("Program compiled without 'register' attribute\n"); | 855 | printf ("Program compiled without 'register' attribute\n"); |
856 | printf ("\n"); | 856 | printf ("\n"); |
857 | } | 857 | } |
858 | */ | 858 | */ |
859 | Number_Of_Runs = n; | 859 | Number_Of_Runs = n; |
860 | 860 | ||
861 | /***************/ | 861 | /***************/ |
862 | /* Start timer */ | 862 | /* Start timer */ |
863 | /***************/ | 863 | /***************/ |
864 | 864 | ||
865 | Begin_Time = dtime(); | 865 | Begin_Time = dtime(); |
866 | 866 | ||
867 | for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) | 867 | for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) |
868 | { | 868 | { |
869 | 869 | ||
870 | Proc_5(); | 870 | Proc_5(); |
871 | Proc_4(); | 871 | Proc_4(); |
872 | /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ | 872 | /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ |
873 | Int_1_Loc = 2; | 873 | Int_1_Loc = 2; |
874 | Int_2_Loc = 3; | 874 | Int_2_Loc = 3; |
875 | strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); | 875 | strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); |
876 | Enum_Loc = Ident_2; | 876 | Enum_Loc = Ident_2; |
877 | Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); | 877 | Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); |
878 | /* Bool_Glob == 1 */ | 878 | /* Bool_Glob == 1 */ |
879 | while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ | 879 | while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ |
880 | { | 880 | { |
881 | Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; | 881 | Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; |
882 | /* Int_3_Loc == 7 */ | 882 | /* Int_3_Loc == 7 */ |
883 | Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); | 883 | Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); |
884 | /* Int_3_Loc == 7 */ | 884 | /* Int_3_Loc == 7 */ |
885 | Int_1_Loc += 1; | 885 | Int_1_Loc += 1; |
886 | } /* while */ | 886 | } /* while */ |
887 | /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ | 887 | /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ |
888 | Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); | 888 | Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); |
889 | /* Int_Glob == 5 */ | 889 | /* Int_Glob == 5 */ |
890 | Proc_1 (Ptr_Glob); | 890 | Proc_1 (Ptr_Glob); |
891 | for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) | 891 | for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) |
892 | /* loop body executed twice */ | 892 | /* loop body executed twice */ |
893 | { | 893 | { |
894 | if (Enum_Loc == Func_1 (Ch_Index, 'C')) | 894 | if (Enum_Loc == Func_1 (Ch_Index, 'C')) |
895 | /* then, not executed */ | 895 | /* then, not executed */ |
896 | { | 896 | { |
897 | Proc_6 (Ident_1, &Enum_Loc); | 897 | Proc_6 (Ident_1, &Enum_Loc); |
898 | strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); | 898 | strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING"); |
899 | Int_2_Loc = Run_Index; | 899 | Int_2_Loc = Run_Index; |
900 | Int_Glob = Run_Index; | 900 | Int_Glob = Run_Index; |
901 | } | 901 | } |
902 | } | 902 | } |
903 | /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ | 903 | /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ |
904 | Int_2_Loc = Int_2_Loc * Int_1_Loc; | 904 | Int_2_Loc = Int_2_Loc * Int_1_Loc; |
905 | Int_1_Loc = Int_2_Loc / Int_3_Loc; | 905 | Int_1_Loc = Int_2_Loc / Int_3_Loc; |
906 | Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; | 906 | Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; |
907 | /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ | 907 | /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ |
908 | Proc_2 (&Int_1_Loc); | 908 | Proc_2 (&Int_1_Loc); |
909 | /* Int_1_Loc == 5 */ | 909 | /* Int_1_Loc == 5 */ |
910 | 910 | ||
911 | } /* loop "for Run_Index" */ | 911 | } /* loop "for Run_Index" */ |
912 | 912 | ||
913 | /**************/ | 913 | /**************/ |
914 | /* Stop timer */ | 914 | /* Stop timer */ |
915 | /**************/ | 915 | /**************/ |
916 | 916 | ||
917 | End_Time = dtime(); | 917 | End_Time = dtime(); |
918 | 918 | ||
919 | /* | 919 | /* |
920 | printf ("Execution ends\n"); | 920 | printf ("Execution ends\n"); |
921 | printf ("\n"); | 921 | printf ("\n"); |
922 | printf ("Final values of the variables used in the benchmark:\n"); | 922 | printf ("Final values of the variables used in the benchmark:\n"); |
923 | printf ("\n"); | 923 | printf ("\n"); |
924 | printf ("Int_Glob: %d\n", Int_Glob); | 924 | printf ("Int_Glob: %d\n", Int_Glob); |
925 | printf (" should be: %d\n", 5); | 925 | printf (" should be: %d\n", 5); |
926 | printf ("Bool_Glob: %d\n", Bool_Glob); | 926 | printf ("Bool_Glob: %d\n", Bool_Glob); |
927 | printf (" should be: %d\n", 1); | 927 | printf (" should be: %d\n", 1); |
928 | printf ("Ch_1_Glob: %c\n", Ch_1_Glob); | 928 | printf ("Ch_1_Glob: %c\n", Ch_1_Glob); |
929 | printf (" should be: %c\n", 'A'); | 929 | printf (" should be: %c\n", 'A'); |
930 | printf ("Ch_2_Glob: %c\n", Ch_2_Glob); | 930 | printf ("Ch_2_Glob: %c\n", Ch_2_Glob); |
931 | printf (" should be: %c\n", 'B'); | 931 | printf (" should be: %c\n", 'B'); |
932 | printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); | 932 | printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); |
933 | printf (" should be: %d\n", 7); | 933 | printf (" should be: %d\n", 7); |
934 | printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); | 934 | printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); |
935 | printf (" should be: Number_Of_Runs + 10\n"); | 935 | printf (" should be: Number_Of_Runs + 10\n"); |
936 | printf ("Ptr_Glob->\n"); | 936 | printf ("Ptr_Glob->\n"); |
937 | printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); | 937 | printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); |
938 | printf (" should be: (implementation-dependent)\n"); | 938 | printf (" should be: (implementation-dependent)\n"); |
939 | printf (" Discr: %d\n", Ptr_Glob->Discr); | 939 | printf (" Discr: %d\n", Ptr_Glob->Discr); |
940 | printf (" should be: %d\n", 0); | 940 | printf (" should be: %d\n", 0); |
941 | printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); | 941 | printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); |
942 | printf (" should be: %d\n", 2); | 942 | printf (" should be: %d\n", 2); |
943 | printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); | 943 | printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); |
944 | printf (" should be: %d\n", 17); | 944 | printf (" should be: %d\n", 17); |
945 | printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); | 945 | printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); |
946 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); | 946 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); |
947 | printf ("Next_Ptr_Glob->\n"); | 947 | printf ("Next_Ptr_Glob->\n"); |
948 | printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); | 948 | printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); |
949 | printf (" should be: (implementation-dependent), same as above\n"); | 949 | printf (" should be: (implementation-dependent), same as above\n"); |
950 | printf (" Discr: %d\n", Next_Ptr_Glob->Discr); | 950 | printf (" Discr: %d\n", Next_Ptr_Glob->Discr); |
951 | printf (" should be: %d\n", 0); | 951 | printf (" should be: %d\n", 0); |
952 | printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); | 952 | printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); |
953 | printf (" should be: %d\n", 1); | 953 | printf (" should be: %d\n", 1); |
954 | printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); | 954 | printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); |
955 | printf (" should be: %d\n", 18); | 955 | printf (" should be: %d\n", 18); |
956 | printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); | 956 | printf (" Str_Comp: %s\n", Next_Ptr_Glob->variant.var_1.Str_Comp); |
957 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); | 957 | printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); |
958 | printf ("Int_1_Loc: %d\n", Int_1_Loc); | 958 | printf ("Int_1_Loc: %d\n", Int_1_Loc); |
959 | printf (" should be: %d\n", 5); | 959 | printf (" should be: %d\n", 5); |
960 | printf ("Int_2_Loc: %d\n", Int_2_Loc); | 960 | printf ("Int_2_Loc: %d\n", Int_2_Loc); |
961 | printf (" should be: %d\n", 13); | 961 | printf (" should be: %d\n", 13); |
962 | printf ("Int_3_Loc: %d\n", Int_3_Loc); | 962 | printf ("Int_3_Loc: %d\n", Int_3_Loc); |
963 | printf (" should be: %d\n", 7); | 963 | printf (" should be: %d\n", 7); |
964 | printf ("Enum_Loc: %d\n", Enum_Loc); | 964 | printf ("Enum_Loc: %d\n", Enum_Loc); |
965 | printf (" should be: %d\n", 1); | 965 | printf (" should be: %d\n", 1); |
966 | printf ("Str_1_Loc: %s\n", Str_1_Loc); | 966 | printf ("Str_1_Loc: %s\n", Str_1_Loc); |
967 | printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); | 967 | printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); |
968 | printf ("Str_2_Loc: %s\n", Str_2_Loc); | 968 | printf ("Str_2_Loc: %s\n", Str_2_Loc); |
969 | printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); | 969 | printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); |
970 | printf ("\n"); | 970 | printf ("\n"); |
971 | */ | 971 | */ |
972 | User_Time = End_Time - Begin_Time; | 972 | User_Time = End_Time - Begin_Time; |
973 | 973 | ||
974 | if (User_Time < Too_Small_Time) return -1; | 974 | if (User_Time < Too_Small_Time) return -1; |
975 | else | 975 | else |
976 | { | 976 | { |
977 | Microseconds = User_Time * Mic_secs_Per_Second | 977 | Microseconds = User_Time * Mic_secs_Per_Second |
978 | / (double) Number_Of_Runs; | 978 | / (double) Number_Of_Runs; |
979 | Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; | 979 | Dhrystones_Per_Second = (double) Number_Of_Runs / User_Time; |
980 | Vax_Mips = Dhrystones_Per_Second / 1757.0; | 980 | Vax_Mips = Dhrystones_Per_Second / 1757.0; |
981 | 981 | ||
982 | #ifdef ROPT | 982 | #ifdef ROPT |
983 | //printf ("Register option selected? YES\n"); | 983 | //printf ("Register option selected? YES\n"); |
984 | #else | 984 | #else |
985 | //printf ("Register option selected? NO\n"); | 985 | //printf ("Register option selected? NO\n"); |
986 | strncpy(Reg_Define, "Register option not selected.", 30); | 986 | strncpy(Reg_Define, "Register option not selected.", 30); |
987 | #endif | 987 | #endif |
988 | printf ("Microseconds for one run through Dhrystone: "); | 988 | printf ("Microseconds for one run through Dhrystone: "); |
989 | printf ("%7.1lf \n", Microseconds); | 989 | printf ("%7.1lf \n", Microseconds); |
990 | printf ("Dhrystones per Second: "); | 990 | printf ("Dhrystones per Second: "); |
991 | printf ("%10.1lf \n", Dhrystones_Per_Second); | 991 | printf ("%10.1lf \n", Dhrystones_Per_Second); |
992 | printf ("VAX MIPS rating = %10.3lf \n",Vax_Mips); | 992 | printf ("VAX MIPS rating = %10.3lf \n",Vax_Mips); |
993 | printf ("\n"); | 993 | printf ("\n"); |
994 | 994 | ||
995 | return Dhrystones_Per_Second; | 995 | return Dhrystones_Per_Second; |
996 | 996 | ||
997 | /* | 997 | /* |
998 | 998 | ||
999 | fprintf(Ap,"\n"); | 999 | fprintf(Ap,"\n"); |
1000 | fprintf(Ap,"Dhrystone Benchmark, Version 2.1 (Language: C)\n"); | 1000 | fprintf(Ap,"Dhrystone Benchmark, Version 2.1 (Language: C)\n"); |
1001 | fprintf(Ap,"%s\n",Reg_Define); | 1001 | fprintf(Ap,"%s\n",Reg_Define); |
1002 | fprintf(Ap,"Microseconds for one loop: %7.1lf\n",Microseconds); | 1002 | fprintf(Ap,"Microseconds for one loop: %7.1lf\n",Microseconds); |
1003 | fprintf(Ap,"Dhrystones per second: %10.1lf\n",Dhrystones_Per_Second); | 1003 | fprintf(Ap,"Dhrystones per second: %10.1lf\n",Dhrystones_Per_Second); |
1004 | fprintf(Ap,"VAX MIPS rating: %10.3lf\n",Vax_Mips); | 1004 | fprintf(Ap,"VAX MIPS rating: %10.3lf\n",Vax_Mips); |
1005 | fclose(Ap); | 1005 | fclose(Ap); |
1006 | */ | 1006 | */ |
1007 | 1007 | ||
1008 | } | 1008 | } |
1009 | 1009 | ||
1010 | } | 1010 | } |