author | erik <erik> | 2007-01-24 19:57:51 (UTC) |
---|---|---|
committer | erik <erik> | 2007-01-24 19:57:51 (UTC) |
commit | 48d9219a96096cf44df8ac24413b36d1b718b1d5 (patch) (unidiff) | |
tree | ef49f0d2b778283221ebbb8634f1a59710ddd108 | |
parent | 89e81059e832ff77c2f0ac8b9db12f80eafa03fc (diff) | |
download | opie-48d9219a96096cf44df8ac24413b36d1b718b1d5.zip opie-48d9219a96096cf44df8ac24413b36d1b718b1d5.tar.gz opie-48d9219a96096cf44df8ac24413b36d1b718b1d5.tar.bz2 |
Each file in this commit has the issue where a function can return a
negative result but the result is used in a context that can only be
positive.
-rw-r--r-- | noncore/games/kpacman/score.cpp | 4 | ||||
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/http.c | 95 |
2 files changed, 49 insertions, 50 deletions
diff --git a/noncore/games/kpacman/score.cpp b/noncore/games/kpacman/score.cpp index 6878b81..737f03b 100644 --- a/noncore/games/kpacman/score.cpp +++ b/noncore/games/kpacman/score.cpp | |||
@@ -1,575 +1,575 @@ | |||
1 | 1 | ||
2 | #include "portable.h" | 2 | #include "portable.h" |
3 | 3 | ||
4 | #if defined( KDE2_PORT ) | 4 | #if defined( KDE2_PORT ) |
5 | #include <score.h> | 5 | #include <score.h> |
6 | #include <score.moc> | 6 | #include <score.moc> |
7 | 7 | ||
8 | #include <kaccel.h> | 8 | #include <kaccel.h> |
9 | #include <kapp.h> | 9 | #include <kapp.h> |
10 | #include <kconfig.h> | 10 | #include <kconfig.h> |
11 | #include <kstddirs.h> | 11 | #include <kstddirs.h> |
12 | #include <kmessagebox.h> | 12 | #include <kmessagebox.h> |
13 | #elif defined( QPE_PORT ) | 13 | #elif defined( QPE_PORT ) |
14 | #include <qaccel.h> | 14 | #include <qaccel.h> |
15 | #include <qpe/config.h> | 15 | #include <qpe/config.h> |
16 | #include "score.h" | 16 | #include "score.h" |
17 | #endif | 17 | #endif |
18 | 18 | ||
19 | #include <stdlib.h> | 19 | #include <stdlib.h> |
20 | #include <ctype.h> | 20 | #include <ctype.h> |
21 | 21 | ||
22 | #include <qtimer.h> | 22 | #include <qtimer.h> |
23 | 23 | ||
24 | 24 | ||
25 | Score::Score(QWidget *parent, const char *name, int Scheme, int Mode, Bitfont *font) : QWidget(parent, name) | 25 | Score::Score(QWidget *parent, const char *name, int Scheme, int Mode, Bitfont *font) : QWidget(parent, name) |
26 | { | 26 | { |
27 | setFocusPolicy(QWidget::StrongFocus); | 27 | setFocusPolicy(QWidget::StrongFocus); |
28 | 28 | ||
29 | paused = FALSE; | 29 | paused = FALSE; |
30 | 30 | ||
31 | lastScore = -1; | 31 | lastScore = -1; |
32 | lastPlayer = -1; | 32 | lastPlayer = -1; |
33 | 33 | ||
34 | cursorBlinkTimer = 0; | 34 | cursorBlinkTimer = 0; |
35 | cursorBlinkMS = -1; | 35 | cursorBlinkMS = -1; |
36 | cursor.x = -1; | 36 | cursor.x = -1; |
37 | cursor.y = -1; | 37 | cursor.y = -1; |
38 | cursor.on = FALSE; | 38 | cursor.on = FALSE; |
39 | cursor.chr = QChar('?'); | 39 | cursor.chr = QChar('?'); |
40 | 40 | ||
41 | initKeys(); | 41 | initKeys(); |
42 | 42 | ||
43 | scheme = Scheme; | 43 | scheme = Scheme; |
44 | mode = Mode; | 44 | mode = Mode; |
45 | confScheme(); | 45 | confScheme(); |
46 | 46 | ||
47 | bitfont = font; | 47 | bitfont = font; |
48 | 48 | ||
49 | highscoreFile.setName(locateHighscoreFilePath().filePath()); | 49 | highscoreFile.setName(locateHighscoreFilePath().filePath()); |
50 | read(); | 50 | read(); |
51 | 51 | ||
52 | for (int p = 0; p < maxPlayer; p++) { | 52 | for (int p = 0; p < maxPlayer; p++) { |
53 | playerScore[p] = 0; | 53 | playerScore[p] = 0; |
54 | playerName[p] = getenv("LOGNAME"); | 54 | playerName[p] = getenv("LOGNAME"); |
55 | if (playerName[p].length() < minPlayerNameLength) | 55 | if (playerName[p].length() < minPlayerNameLength) |
56 | playerName[p].setExpand(minPlayerNameLength-1, ' '); | 56 | playerName[p].setExpand(minPlayerNameLength-1, ' '); |
57 | 57 | ||
58 | for (uint i = 0; i < playerName[p].length(); i++) | 58 | for (uint i = 0; i < playerName[p].length(); i++) |
59 | if (playerName[p].at(i) < bitfont->firstChar() || | 59 | if (playerName[p].at(i) < bitfont->firstChar() || |
60 | playerName[p].at(i) > bitfont->lastChar()) | 60 | playerName[p].at(i) > bitfont->lastChar()) |
61 | playerName[p].at(i) = playerName[p].at(i).upper(); | 61 | playerName[p].at(i) = playerName[p].at(i).upper(); |
62 | } | 62 | } |
63 | } | 63 | } |
64 | 64 | ||
65 | Score::~Score() | 65 | Score::~Score() |
66 | { | 66 | { |
67 | // write(); | 67 | // write(); |
68 | } | 68 | } |
69 | 69 | ||
70 | void Score::paintEvent( QPaintEvent *e) | 70 | void Score::paintEvent( QPaintEvent *e) |
71 | { | 71 | { |
72 | if (rect(1, 0, tr(" 1UP ")).intersects(e->rect())) { | 72 | if (rect(1, 0, tr(" 1UP ")).intersects(e->rect())) { |
73 | QPixmap pix; | 73 | QPixmap pix; |
74 | QColor fg = BLACK; | 74 | QColor fg = BLACK; |
75 | if (cursor.on || paused || lastPlayer != 0) | 75 | if (cursor.on || paused || lastPlayer != 0) |
76 | fg = WHITE; | 76 | fg = WHITE; |
77 | pix = bitfont->text(tr(" 1UP "), fg, BLACK); | 77 | pix = bitfont->text(tr(" 1UP "), fg, BLACK); |
78 | bitBlt(this, x(1), y(0), &pix); | 78 | bitBlt(this, x(1), y(0), &pix); |
79 | } | 79 | } |
80 | 80 | ||
81 | if (rect(8, 0, tr(" HIGH SCORE ")).intersects(e->rect())) { | 81 | if (rect(8, 0, tr(" HIGH SCORE ")).intersects(e->rect())) { |
82 | QPixmap pix = bitfont->text(tr(" HIGH SCORE "), WHITE, BLACK); | 82 | QPixmap pix = bitfont->text(tr(" HIGH SCORE "), WHITE, BLACK); |
83 | bitBlt(this, x(8), y(0), &pix); | 83 | bitBlt(this, x(8), y(0), &pix); |
84 | } | 84 | } |
85 | 85 | ||
86 | if (maxPlayer > 1 && rect(21, 0, tr(" 2UP ")).intersects(e->rect())) { | 86 | if (maxPlayer > 1 && rect(21, 0, tr(" 2UP ")).intersects(e->rect())) { |
87 | QPixmap pix; | 87 | QPixmap pix; |
88 | QColor fg = BLACK; | 88 | QColor fg = BLACK; |
89 | if (cursor.on || paused || lastPlayer != 1) | 89 | if (cursor.on || paused || lastPlayer != 1) |
90 | fg = WHITE; | 90 | fg = WHITE; |
91 | pix = bitfont->text(tr(" 2UP "), fg, BLACK); | 91 | pix = bitfont->text(tr(" 2UP "), fg, BLACK); |
92 | bitBlt(this, x(21), y(0), &pix); | 92 | bitBlt(this, x(21), y(0), &pix); |
93 | } | 93 | } |
94 | 94 | ||
95 | QString s; | 95 | QString s; |
96 | 96 | ||
97 | s.sprintf("%6d0", playerScore[0]/10); | 97 | s.sprintf("%6d0", playerScore[0]/10); |
98 | if (rect(0, 1, s).intersects(e->rect())) { | 98 | if (rect(0, 1, s).intersects(e->rect())) { |
99 | QPixmap pix = bitfont->text(s, WHITE, BLACK); | 99 | QPixmap pix = bitfont->text(s, WHITE, BLACK); |
100 | bitBlt(this, x(0), y(1), &pix); | 100 | bitBlt(this, x(0), y(1), &pix); |
101 | } | 101 | } |
102 | 102 | ||
103 | s.sprintf("%8d0", HighScore/10); | 103 | s.sprintf("%8d0", HighScore/10); |
104 | if (rect(8, 1, s).intersects(e->rect())) { | 104 | if (rect(8, 1, s).intersects(e->rect())) { |
105 | QPixmap pix = bitfont->text(s, WHITE, BLACK); | 105 | QPixmap pix = bitfont->text(s, WHITE, BLACK); |
106 | bitBlt(this, x(8), y(1), &pix); | 106 | bitBlt(this, x(8), y(1), &pix); |
107 | } | 107 | } |
108 | 108 | ||
109 | if (lastScore >= 0) { | 109 | if (lastScore >= 0) { |
110 | if (rect(1, 4*1.25, tr(" CONGRATULATIONS ")).intersects(e->rect())) { | 110 | if (rect(1, 4*1.25, tr(" CONGRATULATIONS ")).intersects(e->rect())) { |
111 | QPixmap pix = bitfont->text(tr(" CONGRATULATIONS "), YELLOW, BLACK); | 111 | QPixmap pix = bitfont->text(tr(" CONGRATULATIONS "), YELLOW, BLACK); |
112 | bitBlt(this, x(1), y(4*1.25), &pix); | 112 | bitBlt(this, x(1), y(4*1.25), &pix); |
113 | } | 113 | } |
114 | if (rect(1, 6*1.25, tr(" YOU HAVE ARCHIEVED ")).intersects(e->rect())) { | 114 | if (rect(1, 6*1.25, tr(" YOU HAVE ARCHIEVED ")).intersects(e->rect())) { |
115 | QPixmap pix = bitfont->text(tr(" YOU HAVE ARCHIEVED "), CYAN, BLACK); | 115 | QPixmap pix = bitfont->text(tr(" YOU HAVE ARCHIEVED "), CYAN, BLACK); |
116 | bitBlt(this, x(1), y(6*1.25), &pix); | 116 | bitBlt(this, x(1), y(6*1.25), &pix); |
117 | } | 117 | } |
118 | if (rect(1, 7*1.25, tr(" A SCORE IN THE TOP 10. ")).intersects(e->rect())) { | 118 | if (rect(1, 7*1.25, tr(" A SCORE IN THE TOP 10. ")).intersects(e->rect())) { |
119 | QPixmap pix = bitfont->text(tr(" A SCORE IN THE TOP 10. "), CYAN, BLACK); | 119 | QPixmap pix = bitfont->text(tr(" A SCORE IN THE TOP 10. "), CYAN, BLACK); |
120 | bitBlt(this, x(1), y(7*1.25), &pix); | 120 | bitBlt(this, x(1), y(7*1.25), &pix); |
121 | } | 121 | } |
122 | if (rect(1, 8*1.25, tr(" ")).intersects(e->rect())) { | 122 | if (rect(1, 8*1.25, tr(" ")).intersects(e->rect())) { |
123 | QPixmap pix = bitfont->text(tr(" "), CYAN, BLACK); | 123 | QPixmap pix = bitfont->text(tr(" "), CYAN, BLACK); |
124 | bitBlt(this, x(1), y(8*1.25), &pix); | 124 | bitBlt(this, x(1), y(8*1.25), &pix); |
125 | } | 125 | } |
126 | } | 126 | } |
127 | 127 | ||
128 | if (rect(1, 9.5*1.25, tr("RNK SCORE NAME DATE")).intersects(e->rect())) { | 128 | if (rect(1, 9.5*1.25, tr("RNK SCORE NAME DATE")).intersects(e->rect())) { |
129 | QPixmap pix = bitfont->text(tr("RNK SCORE NAME DATE"), WHITE, BLACK); | 129 | QPixmap pix = bitfont->text(tr("RNK SCORE NAME DATE"), WHITE, BLACK); |
130 | bitBlt(this, x(1), y(9.5*1.25), &pix); | 130 | bitBlt(this, x(1), y(9.5*1.25), &pix); |
131 | } | 131 | } |
132 | 132 | ||
133 | for (int i = 0; i < 10; i++) { | 133 | for (int i = 0; i < 10; i++) { |
134 | s.sprintf("%2d%9d %-3.3s %-8.8s", | 134 | s.sprintf("%2d%9d %-3.3s %-8.8s", |
135 | i+1, hallOfFame[i].points, hallOfFame[i].name.utf8().data(), | 135 | i+1, hallOfFame[i].points, hallOfFame[i].name.utf8().data(), |
136 | formatDate(hallOfFame[i].moment.date()).data()); | 136 | formatDate(hallOfFame[i].moment.date()).data()); |
137 | if (rect(1, (11+i)*1.25, s).intersects(e->rect())) { | 137 | if (rect(1, (11+i)*1.25, s).intersects(e->rect())) { |
138 | QPixmap pix = bitfont->text(s, (i == lastScore) ? YELLOW : WHITE, BLACK); | 138 | QPixmap pix = bitfont->text(s, (i == lastScore) ? YELLOW : WHITE, BLACK); |
139 | bitBlt(this, x(1), y((11+i)*1.25), &pix); | 139 | bitBlt(this, x(1), y((11+i)*1.25), &pix); |
140 | } | 140 | } |
141 | } | 141 | } |
142 | 142 | ||
143 | if (cursor.x != -1 && cursor.y != -1 && cursor.on) { | 143 | if (cursor.x != -1 && cursor.y != -1 && cursor.on) { |
144 | if (rect(cursor.x, (cursor.y*1.25), cursor.chr).intersects(e->rect())) { | 144 | if (rect(cursor.x, (cursor.y*1.25), cursor.chr).intersects(e->rect())) { |
145 | QPixmap pix = bitfont->text(cursor.chr, BLACK, YELLOW); | 145 | QPixmap pix = bitfont->text(cursor.chr, BLACK, YELLOW); |
146 | bitBlt(this, x(cursor.x), y(cursor.y*1.25), &pix); | 146 | bitBlt(this, x(cursor.x), y(cursor.y*1.25), &pix); |
147 | } | 147 | } |
148 | } | 148 | } |
149 | 149 | ||
150 | if (paused) { | 150 | if (paused) { |
151 | 151 | ||
152 | QPixmap pix = bitfont->text(tr("PAUSED"), RED, BLACK); | 152 | QPixmap pix = bitfont->text(tr("PAUSED"), RED, BLACK); |
153 | QRect r = bitfont->rect(tr("PAUSED")); | 153 | QRect r = bitfont->rect(tr("PAUSED")); |
154 | r.moveCenter(QPoint(this->width()/2, this->height()/2)); | 154 | r.moveCenter(QPoint(this->width()/2, this->height()/2)); |
155 | 155 | ||
156 | bitBlt(this, r.x(), r.y(), &pix); | 156 | bitBlt(this, r.x(), r.y(), &pix); |
157 | } | 157 | } |
158 | } | 158 | } |
159 | 159 | ||
160 | void Score::timerEvent(QTimerEvent*) | 160 | void Score::timerEvent(QTimerEvent*) |
161 | { | 161 | { |
162 | cursor.on = !cursor.on; | 162 | cursor.on = !cursor.on; |
163 | 163 | ||
164 | if (paused) | 164 | if (paused) |
165 | return; | 165 | return; |
166 | 166 | ||
167 | if (cursor.x != -1 && cursor.y != -1) | 167 | if (cursor.x != -1 && cursor.y != -1) |
168 | repaint(rect(cursor.x, cursor.y*1.25, cursor.chr), FALSE); | 168 | repaint(rect(cursor.x, cursor.y*1.25, cursor.chr), FALSE); |
169 | scrollRepeat = FALSE; | 169 | scrollRepeat = FALSE; |
170 | 170 | ||
171 | if (lastPlayer == 0) | 171 | if (lastPlayer == 0) |
172 | repaint(rect(1, 0, tr(" 1UP ")), FALSE); | 172 | repaint(rect(1, 0, tr(" 1UP ")), FALSE); |
173 | 173 | ||
174 | if (lastPlayer == 1) | 174 | if (lastPlayer == 1) |
175 | repaint(rect(21, 0, tr(" 2UP ")), FALSE); | 175 | repaint(rect(21, 0, tr(" 2UP ")), FALSE); |
176 | } | 176 | } |
177 | 177 | ||
178 | void Score::keyPressEvent(QKeyEvent *k) | 178 | void Score::keyPressEvent(QKeyEvent *k) |
179 | { | 179 | { |
180 | if (lastScore < 0 || lastPlayer < 0 || lastPlayer >= maxPlayer || paused) { | 180 | if (lastScore < 0 || lastPlayer < 0 || lastPlayer >= maxPlayer || paused) { |
181 | k->ignore(); | 181 | k->ignore(); |
182 | return; | 182 | return; |
183 | } | 183 | } |
184 | 184 | ||
185 | int x = cursor.x; | 185 | int x = cursor.x; |
186 | int y = cursor.y; | 186 | int y = cursor.y; |
187 | 187 | ||
188 | uint key = k->key(); | 188 | uint key = k->key(); |
189 | 189 | ||
190 | if (scrollRepeat && (key == UpKey || key == Key_Up || key == DownKey || key == Key_Down)) { | 190 | if (scrollRepeat && (key == UpKey || key == Key_Up || key == DownKey || key == Key_Down)) { |
191 | k->ignore(); | 191 | k->ignore(); |
192 | return; | 192 | return; |
193 | } | 193 | } |
194 | 194 | ||
195 | if (key != Key_Return) { | 195 | if (key != Key_Return) { |
196 | if (key == RightKey || key == Key_Right) | 196 | if (key == RightKey || key == Key_Right) |
197 | if (++cursor.x > 16) | 197 | if (++cursor.x > 16) |
198 | cursor.x = 14; | 198 | cursor.x = 14; |
199 | if (key == LeftKey || key == Key_Left) | 199 | if (key == LeftKey || key == Key_Left) |
200 | if (--cursor.x < 14) | 200 | if (--cursor.x < 14) |
201 | cursor.x = 16; | 201 | cursor.x = 16; |
202 | if (key == UpKey || key == Key_Up) | 202 | if (key == UpKey || key == Key_Up) |
203 | if (cursor.chr.unicode() < bitfont->lastChar()) | 203 | if (cursor.chr.unicode() < bitfont->lastChar()) |
204 | cursor.chr = cursor.chr.unicode()+1; | 204 | cursor.chr = cursor.chr.unicode()+1; |
205 | else | 205 | else |
206 | cursor.chr = bitfont->firstChar(); | 206 | cursor.chr = bitfont->firstChar(); |
207 | if (key == DownKey || key == Key_Down) | 207 | if (key == DownKey || key == Key_Down) |
208 | if (cursor.chr.unicode() > bitfont->firstChar()) | 208 | if (cursor.chr.unicode() > bitfont->firstChar()) |
209 | cursor.chr = cursor.chr.unicode()-1; | 209 | cursor.chr = cursor.chr.unicode()-1; |
210 | else | 210 | else |
211 | cursor.chr = bitfont->lastChar(); | 211 | cursor.chr = bitfont->lastChar(); |
212 | 212 | ||
213 | if (cursor.x == x && cursor.y == y && | 213 | if (cursor.x == x && cursor.y == y && |
214 | cursor.chr == hallOfFame[lastScore].name.at(cursor.x-14)) { | 214 | cursor.chr == hallOfFame[lastScore].name.at(cursor.x-14)) { |
215 | uint ascii = k->ascii(); | 215 | uint ascii = k->ascii(); |
216 | 216 | ||
217 | if (ascii < bitfont->firstChar() || ascii > bitfont->lastChar()) | 217 | if (ascii < bitfont->firstChar() || ascii > bitfont->lastChar()) |
218 | ascii = toupper(ascii); | 218 | ascii = toupper(ascii); |
219 | 219 | ||
220 | if (ascii >= bitfont->firstChar() && ascii <= bitfont->lastChar()) { | 220 | if (ascii >= bitfont->firstChar() && ascii <= bitfont->lastChar()) { |
221 | cursor.chr = ascii; | 221 | cursor.chr = ascii; |
222 | hallOfFame[lastScore].name.at(cursor.x-14) = cursor.chr; | 222 | hallOfFame[lastScore].name.at(cursor.x-14) = cursor.chr; |
223 | if (++cursor.x > 16) | 223 | if (++cursor.x > 16) |
224 | cursor.x = 14; | 224 | cursor.x = 14; |
225 | } | 225 | } |
226 | } | 226 | } |
227 | } | 227 | } |
228 | 228 | ||
229 | if (key == Key_Return) { | 229 | if (key == Key_Return) { |
230 | playerName[lastPlayer] = hallOfFame[lastScore].name; | 230 | playerName[lastPlayer] = hallOfFame[lastScore].name; |
231 | write(); | 231 | write(); |
232 | read(); | 232 | read(); |
233 | lastScore = -1; | 233 | lastScore = -1; |
234 | cursor.x = -1; | 234 | cursor.x = -1; |
235 | cursor.y = -1; | 235 | cursor.y = -1; |
236 | // killTimers(); | 236 | // killTimers(); |
237 | emit toggleNew(); | 237 | emit toggleNew(); |
238 | end(); | 238 | end(); |
239 | } | 239 | } |
240 | 240 | ||
241 | if (x != cursor.x || y != cursor.y) { | 241 | if (x != cursor.x || y != cursor.y) { |
242 | if (cursor.x != -1) | 242 | if (cursor.x != -1 && lastScore >= 0) |
243 | cursor.chr = hallOfFame[lastScore].name.at(cursor.x-14); | 243 | cursor.chr = hallOfFame[lastScore].name.at(cursor.x-14); |
244 | scrollRepeat = FALSE; | 244 | scrollRepeat = FALSE; |
245 | repaint(rect(x, y*1.25, cursor.chr), FALSE); | 245 | repaint(rect(x, y*1.25, cursor.chr), FALSE); |
246 | } else | 246 | } else if (lastScore >= 0) |
247 | hallOfFame[lastScore].name.at(cursor.x-14) = cursor.chr; | 247 | hallOfFame[lastScore].name.at(cursor.x-14) = cursor.chr; |
248 | 248 | ||
249 | if (key == UpKey || key == Key_Up || key == DownKey || key == Key_Down) | 249 | if (key == UpKey || key == Key_Up || key == DownKey || key == Key_Down) |
250 | scrollRepeat = TRUE; | 250 | scrollRepeat = TRUE; |
251 | else | 251 | else |
252 | repaint(rect(cursor.x, cursor.y*1.25, cursor.chr), FALSE); | 252 | repaint(rect(cursor.x, cursor.y*1.25, cursor.chr), FALSE); |
253 | } | 253 | } |
254 | 254 | ||
255 | void Score::initKeys() | 255 | void Score::initKeys() |
256 | { | 256 | { |
257 | APP_CONFIG_BEGIN( cfg ); | 257 | APP_CONFIG_BEGIN( cfg ); |
258 | QString up("Up"); | 258 | QString up("Up"); |
259 | up = cfg->readEntry("upKey", (const char*) up); | 259 | up = cfg->readEntry("upKey", (const char*) up); |
260 | UpKey = KAccel::stringToKey(up); | 260 | UpKey = KAccel::stringToKey(up); |
261 | 261 | ||
262 | QString down("Down"); | 262 | QString down("Down"); |
263 | down = cfg->readEntry("downKey", (const char*) down); | 263 | down = cfg->readEntry("downKey", (const char*) down); |
264 | DownKey = KAccel::stringToKey(down); | 264 | DownKey = KAccel::stringToKey(down); |
265 | 265 | ||
266 | QString left("Left"); | 266 | QString left("Left"); |
267 | left = cfg->readEntry("leftKey", (const char*) left); | 267 | left = cfg->readEntry("leftKey", (const char*) left); |
268 | LeftKey = KAccel::stringToKey(left); | 268 | LeftKey = KAccel::stringToKey(left); |
269 | 269 | ||
270 | QString right("Right"); | 270 | QString right("Right"); |
271 | right = cfg->readEntry("rightKey", (const char*) right); | 271 | right = cfg->readEntry("rightKey", (const char*) right); |
272 | RightKey = KAccel::stringToKey(right); | 272 | RightKey = KAccel::stringToKey(right); |
273 | APP_CONFIG_END( cfg ); | 273 | APP_CONFIG_END( cfg ); |
274 | } | 274 | } |
275 | 275 | ||
276 | void Score::confTiming(bool defGroup) | 276 | void Score::confTiming(bool defGroup) |
277 | { | 277 | { |
278 | APP_CONFIG_BEGIN( cfg ); | 278 | APP_CONFIG_BEGIN( cfg ); |
279 | if (defGroup || cfg->hasKey("CursorBlinkMS")) | 279 | if (defGroup || cfg->hasKey("CursorBlinkMS")) |
280 | cursorBlinkMS = cfg->readNumEntry("CursorBlinkMS", 250); | 280 | cursorBlinkMS = cfg->readNumEntry("CursorBlinkMS", 250); |
281 | if (defGroup || cfg->hasKey("HallOfFameMS")) | 281 | if (defGroup || cfg->hasKey("HallOfFameMS")) |
282 | hallOfFameMS = cfg->readNumEntry("HallOfFameMS", 7000); | 282 | hallOfFameMS = cfg->readNumEntry("HallOfFameMS", 7000); |
283 | if (defGroup || cfg->hasKey("AfterPauseMS")) | 283 | if (defGroup || cfg->hasKey("AfterPauseMS")) |
284 | afterPauseMS = cfg->readNumEntry("AfterPauseMS", 1000); | 284 | afterPauseMS = cfg->readNumEntry("AfterPauseMS", 1000); |
285 | APP_CONFIG_END( cfg ); | 285 | APP_CONFIG_END( cfg ); |
286 | } | 286 | } |
287 | 287 | ||
288 | void Score::confScheme() | 288 | void Score::confScheme() |
289 | { | 289 | { |
290 | APP_CONFIG_BEGIN( cfg ); | 290 | APP_CONFIG_BEGIN( cfg ); |
291 | SAVE_CONFIG_GROUP( cfg, oldgroup ); | 291 | SAVE_CONFIG_GROUP( cfg, oldgroup ); |
292 | QString newgroup; | 292 | QString newgroup; |
293 | 293 | ||
294 | // if not set, read mode and scheme from the configfile | 294 | // if not set, read mode and scheme from the configfile |
295 | if (mode == -1 && scheme == -1) { | 295 | if (mode == -1 && scheme == -1) { |
296 | scheme = cfg->readNumEntry("Scheme", -1); | 296 | scheme = cfg->readNumEntry("Scheme", -1); |
297 | mode = cfg->readNumEntry("Mode", -1); | 297 | mode = cfg->readNumEntry("Mode", -1); |
298 | 298 | ||
299 | // if mode is not set in the defGroup-group, lookup the scheme group | 299 | // if mode is not set in the defGroup-group, lookup the scheme group |
300 | if (scheme != -1 || mode == -1) { | 300 | if (scheme != -1 || mode == -1) { |
301 | newgroup.sprintf("Scheme %d", scheme); | 301 | newgroup.sprintf("Scheme %d", scheme); |
302 | cfg->setGroup(newgroup); | 302 | cfg->setGroup(newgroup); |
303 | 303 | ||
304 | mode = cfg->readNumEntry("Mode", -1); | 304 | mode = cfg->readNumEntry("Mode", -1); |
305 | RESTORE_CONFIG_GROUP( cfg, oldgroup ); | 305 | RESTORE_CONFIG_GROUP( cfg, oldgroup ); |
306 | } | 306 | } |
307 | } | 307 | } |
308 | 308 | ||
309 | int oldCursorBlinkMS = cursorBlinkMS; | 309 | int oldCursorBlinkMS = cursorBlinkMS; |
310 | 310 | ||
311 | confTiming(); | 311 | confTiming(); |
312 | 312 | ||
313 | if (mode != -1) { | 313 | if (mode != -1) { |
314 | newgroup.sprintf("Mode %d", mode); | 314 | newgroup.sprintf("Mode %d", mode); |
315 | cfg->setGroup(newgroup); | 315 | cfg->setGroup(newgroup); |
316 | 316 | ||
317 | confTiming(FALSE); | 317 | confTiming(FALSE); |
318 | } | 318 | } |
319 | 319 | ||
320 | if (scheme != -1) { | 320 | if (scheme != -1) { |
321 | newgroup.sprintf("Scheme %d", scheme); | 321 | newgroup.sprintf("Scheme %d", scheme); |
322 | cfg->setGroup(newgroup); | 322 | cfg->setGroup(newgroup); |
323 | 323 | ||
324 | confTiming(FALSE); | 324 | confTiming(FALSE); |
325 | } | 325 | } |
326 | 326 | ||
327 | if (cursorBlinkMS != oldCursorBlinkMS) { | 327 | if (cursorBlinkMS != oldCursorBlinkMS) { |
328 | if (cursorBlinkTimer) | 328 | if (cursorBlinkTimer) |
329 | killTimer(cursorBlinkTimer); | 329 | killTimer(cursorBlinkTimer); |
330 | cursorBlinkTimer = startTimer(cursorBlinkMS); | 330 | cursorBlinkTimer = startTimer(cursorBlinkMS); |
331 | } | 331 | } |
332 | 332 | ||
333 | RESTORE_CONFIG_GROUP( cfg, oldgroup ); | 333 | RESTORE_CONFIG_GROUP( cfg, oldgroup ); |
334 | APP_CONFIG_END( cfg ); | 334 | APP_CONFIG_END( cfg ); |
335 | } | 335 | } |
336 | 336 | ||
337 | void Score::setScheme(int Scheme, int Mode, Bitfont *font) | 337 | void Score::setScheme(int Scheme, int Mode, Bitfont *font) |
338 | { | 338 | { |
339 | mode = Mode; | 339 | mode = Mode; |
340 | scheme = Scheme; | 340 | scheme = Scheme; |
341 | 341 | ||
342 | confScheme(); | 342 | confScheme(); |
343 | 343 | ||
344 | bitfont = font; | 344 | bitfont = font; |
345 | 345 | ||
346 | for (int p = 0; p < maxPlayer; p++) | 346 | for (int p = 0; p < maxPlayer; p++) |
347 | for (uint i = 0; i < playerName[p].length(); i++) | 347 | for (uint i = 0; i < playerName[p].length(); i++) |
348 | if (playerName[p].at(i) < bitfont->firstChar() || | 348 | if (playerName[p].at(i) < bitfont->firstChar() || |
349 | playerName[p].at(i) > bitfont->lastChar()) | 349 | playerName[p].at(i) > bitfont->lastChar()) |
350 | playerName[p].at(i) = playerName[p].at(i).upper(); | 350 | playerName[p].at(i) = playerName[p].at(i).upper(); |
351 | 351 | ||
352 | for (int i = 0; i < 10; i++) | 352 | for (int i = 0; i < 10; i++) |
353 | for (uint j = 0; j < hallOfFame[i].name.length(); j++) | 353 | for (uint j = 0; j < hallOfFame[i].name.length(); j++) |
354 | if (hallOfFame[i].name.at(j) < bitfont->firstChar() || | 354 | if (hallOfFame[i].name.at(j) < bitfont->firstChar() || |
355 | hallOfFame[i].name.at(j) > bitfont->lastChar()) | 355 | hallOfFame[i].name.at(j) > bitfont->lastChar()) |
356 | hallOfFame[i].name.at(j) = hallOfFame[i].name.at(j).upper(); | 356 | hallOfFame[i].name.at(j) = hallOfFame[i].name.at(j).upper(); |
357 | 357 | ||
358 | if (cursor.chr.unicode() < bitfont->firstChar() || | 358 | if (cursor.chr.unicode() < bitfont->firstChar() || |
359 | cursor.chr.unicode() > bitfont->lastChar()) | 359 | cursor.chr.unicode() > bitfont->lastChar()) |
360 | cursor.chr = cursor.chr.upper(); | 360 | cursor.chr = cursor.chr.upper(); |
361 | } | 361 | } |
362 | 362 | ||
363 | void Score::set(int score) | 363 | void Score::set(int score) |
364 | { | 364 | { |
365 | set(score, 0); | 365 | set(score, 0); |
366 | } | 366 | } |
367 | 367 | ||
368 | void Score::set(int score, int player) | 368 | void Score::set(int score, int player) |
369 | { | 369 | { |
370 | if (player < 0 || player >= maxPlayer) | 370 | if (player < 0 || player >= maxPlayer) |
371 | return; | 371 | return; |
372 | 372 | ||
373 | lastPlayer = player; | 373 | lastPlayer = player; |
374 | playerScore[lastPlayer] = score; | 374 | playerScore[lastPlayer] = score; |
375 | 375 | ||
376 | QString s; | 376 | QString s; |
377 | 377 | ||
378 | s.sprintf("%6d0", playerScore[lastPlayer]/10); | 378 | s.sprintf("%6d0", playerScore[lastPlayer]/10); |
379 | repaint(rect(0, 1, s), FALSE); | 379 | repaint(rect(0, 1, s), FALSE); |
380 | 380 | ||
381 | if (score > HighScore) { | 381 | if (score > HighScore) { |
382 | HighScore = score; | 382 | HighScore = score; |
383 | s.sprintf("%8d0", HighScore/10); | 383 | s.sprintf("%8d0", HighScore/10); |
384 | repaint(rect(8, 1, s), FALSE); | 384 | repaint(rect(8, 1, s), FALSE); |
385 | } | 385 | } |
386 | } | 386 | } |
387 | 387 | ||
388 | /* | 388 | /* |
389 | * Set the score for player after the game if over. If the score is in the | 389 | * Set the score for player after the game if over. If the score is in the |
390 | * high scores then the hall of fame is updated (shifted) and the scoreboard | 390 | * high scores then the hall of fame is updated (shifted) and the scoreboard |
391 | * is shown. | 391 | * is shown. |
392 | */ | 392 | */ |
393 | 393 | ||
394 | void Score::setScore(int level, int player) | 394 | void Score::setScore(int level, int player) |
395 | { | 395 | { |
396 | lastScore = -1; | 396 | lastScore = -1; |
397 | 397 | ||
398 | if (player < 0 || player >= maxPlayer || level == 0) { | 398 | if (player < 0 || player >= maxPlayer || level == 0) { |
399 | if (level != 0) | 399 | if (level != 0) |
400 | emit toggleNew(); | 400 | emit toggleNew(); |
401 | QTimer::singleShot(hallOfFameMS, this, SLOT(end())); | 401 | QTimer::singleShot(hallOfFameMS, this, SLOT(end())); |
402 | return; | 402 | return; |
403 | } | 403 | } |
404 | 404 | ||
405 | lastPlayer = player; | 405 | lastPlayer = player; |
406 | 406 | ||
407 | for (int i = 0; i < 10; i++) | 407 | for (int i = 0; i < 10; i++) |
408 | if ( playerScore[lastPlayer] > hallOfFame[i].points) { | 408 | if ( playerScore[lastPlayer] > hallOfFame[i].points) { |
409 | lastScore = i; | 409 | lastScore = i; |
410 | break; | 410 | break; |
411 | } | 411 | } |
412 | 412 | ||
413 | if (lastScore < 0) { | 413 | if (lastScore < 0) { |
414 | emit toggleNew(); | 414 | emit toggleNew(); |
415 | QTimer::singleShot(hallOfFameMS, this, SLOT(end())); | 415 | QTimer::singleShot(hallOfFameMS, this, SLOT(end())); |
416 | return; | 416 | return; |
417 | } | 417 | } |
418 | 418 | ||
419 | for (int i = 9; i > lastScore && i > 0; i--) | 419 | for (int i = 9; i > lastScore && i > 0; i--) |
420 | hallOfFame[i] = hallOfFame[i-1]; | 420 | hallOfFame[i] = hallOfFame[i-1]; |
421 | 421 | ||
422 | hallOfFame[lastScore].points = playerScore[lastPlayer]; | 422 | hallOfFame[lastScore].points = playerScore[lastPlayer]; |
423 | hallOfFame[lastScore].levels = level; | 423 | hallOfFame[lastScore].levels = level; |
424 | hallOfFame[lastScore].moment = QDateTime::currentDateTime(); | 424 | hallOfFame[lastScore].moment = QDateTime::currentDateTime(); |
425 | hallOfFame[lastScore].name = playerName[lastPlayer]; | 425 | hallOfFame[lastScore].name = playerName[lastPlayer]; |
426 | 426 | ||
427 | cursor.x = 14; | 427 | cursor.x = 14; |
428 | cursor.y = 11+lastScore; | 428 | cursor.y = 11+lastScore; |
429 | cursor.chr = hallOfFame[lastScore].name.at(cursor.x-14); | 429 | cursor.chr = hallOfFame[lastScore].name.at(cursor.x-14); |
430 | 430 | ||
431 | // startTimer(cursorBlinkMS); | 431 | // startTimer(cursorBlinkMS); |
432 | setFocus(); | 432 | setFocus(); |
433 | } | 433 | } |
434 | 434 | ||
435 | /* | 435 | /* |
436 | * Read the highscores, if no file or a file shorter than 4 bytes (versions before 0.2.4 stores only | 436 | * Read the highscores, if no file or a file shorter than 4 bytes (versions before 0.2.4 stores only |
437 | * the points of one highscore) exists - the highscores were initialized with default values. | 437 | * the points of one highscore) exists - the highscores were initialized with default values. |
438 | */ | 438 | */ |
439 | void Score::read() | 439 | void Score::read() |
440 | { | 440 | { |
441 | if (highscoreFile.exists() && highscoreFile.size() > 4) { | 441 | if (highscoreFile.exists() && highscoreFile.size() > 4) { |
442 | if (highscoreFile.open(IO_ReadOnly)) { | 442 | if (highscoreFile.open(IO_ReadOnly)) { |
443 | QDataStream s(&highscoreFile); | 443 | QDataStream s(&highscoreFile); |
444 | char *name; | 444 | char *name; |
445 | for (int i = 0; i < 10; i++) { | 445 | for (int i = 0; i < 10; i++) { |
446 | s >> hallOfFame[i].points >> hallOfFame[i].levels >> hallOfFame[i].duration >> | 446 | s >> hallOfFame[i].points >> hallOfFame[i].levels >> hallOfFame[i].duration >> |
447 | hallOfFame[i].moment >> name; | 447 | hallOfFame[i].moment >> name; |
448 | hallOfFame[i].name = QString::fromLatin1(name); | 448 | hallOfFame[i].name = QString::fromLatin1(name); |
449 | delete(name); | 449 | delete(name); |
450 | } | 450 | } |
451 | highscoreFile.close(); | 451 | highscoreFile.close(); |
452 | } | 452 | } |
453 | } else { | 453 | } else { |
454 | for (int i = 0; i < 10; i++) { | 454 | for (int i = 0; i < 10; i++) { |
455 | hallOfFame[i].points = 5000; | 455 | hallOfFame[i].points = 5000; |
456 | hallOfFame[i].levels = 0; | 456 | hallOfFame[i].levels = 0; |
457 | hallOfFame[i].duration = QTime(); | 457 | hallOfFame[i].duration = QTime(); |
458 | hallOfFame[i].moment = QDateTime(); | 458 | hallOfFame[i].moment = QDateTime(); |
459 | hallOfFame[i].name = "???"; | 459 | hallOfFame[i].name = "???"; |
460 | } | 460 | } |
461 | // write(); | 461 | // write(); |
462 | } | 462 | } |
463 | 463 | ||
464 | for (int i = 0; i < 10; i++) | 464 | for (int i = 0; i < 10; i++) |
465 | for (uint j = 0; j < hallOfFame[i].name.length(); j++) | 465 | for (uint j = 0; j < hallOfFame[i].name.length(); j++) |
466 | if (hallOfFame[i].name.at(j) < bitfont->firstChar() || | 466 | if (hallOfFame[i].name.at(j) < bitfont->firstChar() || |
467 | hallOfFame[i].name.at(j) > bitfont->lastChar()) | 467 | hallOfFame[i].name.at(j) > bitfont->lastChar()) |
468 | hallOfFame[i].name.at(j) = hallOfFame[i].name.at(j).upper(); | 468 | hallOfFame[i].name.at(j) = hallOfFame[i].name.at(j).upper(); |
469 | 469 | ||
470 | HighScore = hallOfFame[0].points; | 470 | HighScore = hallOfFame[0].points; |
471 | } | 471 | } |
472 | 472 | ||
473 | void Score::write() | 473 | void Score::write() |
474 | { | 474 | { |
475 | if (highscoreFile.open(IO_WriteOnly)) { | 475 | if (highscoreFile.open(IO_WriteOnly)) { |
476 | QDataStream s(&highscoreFile); | 476 | QDataStream s(&highscoreFile); |
477 | for (int i = 0; i < 10; i++) | 477 | for (int i = 0; i < 10; i++) |
478 | s << hallOfFame[i].points << hallOfFame[i].levels << hallOfFame[i].duration << | 478 | s << hallOfFame[i].points << hallOfFame[i].levels << hallOfFame[i].duration << |
479 | hallOfFame[i].moment << hallOfFame[i].name.latin1(); | 479 | hallOfFame[i].moment << hallOfFame[i].name.latin1(); |
480 | highscoreFile.close(); | 480 | highscoreFile.close(); |
481 | } | 481 | } |
482 | } | 482 | } |
483 | 483 | ||
484 | void Score::setPause(bool Paused) | 484 | void Score::setPause(bool Paused) |
485 | { | 485 | { |
486 | paused = Paused; | 486 | paused = Paused; |
487 | 487 | ||
488 | QRect r = bitfont->rect(tr("PAUSED")); | 488 | QRect r = bitfont->rect(tr("PAUSED")); |
489 | r.moveCenter(QPoint(this->width()/2, this->height()/2)); | 489 | r.moveCenter(QPoint(this->width()/2, this->height()/2)); |
490 | repaint(r, TRUE); | 490 | repaint(r, TRUE); |
491 | 491 | ||
492 | // repaint 1UP or 2UP | 492 | // repaint 1UP or 2UP |
493 | repaint(FALSE); | 493 | repaint(FALSE); |
494 | } | 494 | } |
495 | 495 | ||
496 | void Score::end() | 496 | void Score::end() |
497 | { | 497 | { |
498 | if (paused) { | 498 | if (paused) { |
499 | QTimer::singleShot(afterPauseMS, this, SLOT(end())); | 499 | QTimer::singleShot(afterPauseMS, this, SLOT(end())); |
500 | return; | 500 | return; |
501 | } | 501 | } |
502 | 502 | ||
503 | // repaint 1UP or 2UP | 503 | // repaint 1UP or 2UP |
504 | lastPlayer = -1; | 504 | lastPlayer = -1; |
505 | repaint(FALSE); | 505 | repaint(FALSE); |
506 | 506 | ||
507 | emit forcedHallOfFame(FALSE); | 507 | emit forcedHallOfFame(FALSE); |
508 | } | 508 | } |
509 | 509 | ||
510 | /* | 510 | /* |
511 | * Return the date in a formatted QString. The format can be changed using internationalization | 511 | * Return the date in a formatted QString. The format can be changed using internationalization |
512 | * of the string "YY/MM/DD". Invalid QDate's where returned as "00/00/00". | 512 | * of the string "YY/MM/DD". Invalid QDate's where returned as "00/00/00". |
513 | */ | 513 | */ |
514 | QString Score::formatDate(QDate date) | 514 | QString Score::formatDate(QDate date) |
515 | { | 515 | { |
516 | QString s = tr("@YY@/@MM@/@DD@"); | 516 | QString s = tr("@YY@/@MM@/@DD@"); |
517 | 517 | ||
518 | QString dd; | 518 | QString dd; |
519 | dd.sprintf("%02d", date.isValid() ? date.year() % 100 : 0); | 519 | dd.sprintf("%02d", date.isValid() ? date.year() % 100 : 0); |
520 | s.replace(QRegExp("@YY@"), dd); | 520 | s.replace(QRegExp("@YY@"), dd); |
521 | dd.sprintf("%02d", date.isValid() ? date.month() : 0); | 521 | dd.sprintf("%02d", date.isValid() ? date.month() : 0); |
522 | s.replace(QRegExp("@MM@"), dd); | 522 | s.replace(QRegExp("@MM@"), dd); |
523 | dd.sprintf("%02d", date.isValid() ? date.day() : 0); | 523 | dd.sprintf("%02d", date.isValid() ? date.day() : 0); |
524 | s.replace(QRegExp("@DD@"), dd); | 524 | s.replace(QRegExp("@DD@"), dd); |
525 | 525 | ||
526 | return s; | 526 | return s; |
527 | } | 527 | } |
528 | 528 | ||
529 | QRect Score::rect(int col, float row, QString str, int align) | 529 | QRect Score::rect(int col, float row, QString str, int align) |
530 | { | 530 | { |
531 | QRect r = bitfont->rect(str); | 531 | QRect r = bitfont->rect(str); |
532 | r.moveBy(x(col), y(row)); | 532 | r.moveBy(x(col), y(row)); |
533 | 533 | ||
534 | int dx = 0; | 534 | int dx = 0; |
535 | int dy = 0; | 535 | int dy = 0; |
536 | 536 | ||
537 | if (align & AlignLeft || align & AlignRight) { | 537 | if (align & AlignLeft || align & AlignRight) { |
538 | dx = (str.length()-1) * (bitfont->width()/2); | 538 | dx = (str.length()-1) * (bitfont->width()/2); |
539 | if (align & AlignRight) | 539 | if (align & AlignRight) |
540 | dx *= -1; | 540 | dx *= -1; |
541 | } | 541 | } |
542 | 542 | ||
543 | if (align & AlignTop || align & AlignBottom) { | 543 | if (align & AlignTop || align & AlignBottom) { |
544 | dy = bitfont->height()/2; | 544 | dy = bitfont->height()/2; |
545 | if (align & AlignBottom) | 545 | if (align & AlignBottom) |
546 | dy *= -1; | 546 | dy *= -1; |
547 | } | 547 | } |
548 | 548 | ||
549 | if (dx != 0 || dy != 0) | 549 | if (dx != 0 || dy != 0) |
550 | r.moveBy(dx, dy); | 550 | r.moveBy(dx, dy); |
551 | 551 | ||
552 | return r; | 552 | return r; |
553 | } | 553 | } |
554 | 554 | ||
555 | int Score::x(int col) | 555 | int Score::x(int col) |
556 | { | 556 | { |
557 | return col*bitfont->width(); | 557 | return col*bitfont->width(); |
558 | } | 558 | } |
559 | 559 | ||
560 | int Score::y(float row) | 560 | int Score::y(float row) |
561 | { | 561 | { |
562 | return (int) (row*(bitfont->height()+bitfont->height()/4)); | 562 | return (int) (row*(bitfont->height()+bitfont->height()/4)); |
563 | } | 563 | } |
564 | 564 | ||
565 | /** | 565 | /** |
566 | * Ermittelt die zu benutzende "highscore"-Datei, in die auch geschrieben werden kann. | 566 | * Ermittelt die zu benutzende "highscore"-Datei, in die auch geschrieben werden kann. |
567 | * Über den "highscoreFilePath"-KConfig-Eintrag, kann abweichend von der Standardlokation | 567 | * Über den "highscoreFilePath"-KConfig-Eintrag, kann abweichend von der Standardlokation |
568 | * der Standort der "highscore"-Datei spezifiziert werden. | 568 | * der Standort der "highscore"-Datei spezifiziert werden. |
569 | * Wenn die systemweite "highscore"-Datei nicht beschrieben werden kann, wird mit einer | 569 | * Wenn die systemweite "highscore"-Datei nicht beschrieben werden kann, wird mit einer |
570 | * privaten Datei gearbeitet. | 570 | * privaten Datei gearbeitet. |
571 | */ | 571 | */ |
572 | QFileInfo Score::locateHighscoreFilePath() | 572 | QFileInfo Score::locateHighscoreFilePath() |
573 | { | 573 | { |
574 | return privateHighscoreFileInfo; | 574 | return privateHighscoreFileInfo; |
575 | } | 575 | } |
diff --git a/noncore/todayplugins/stockticker/libstocks/http.c b/noncore/todayplugins/stockticker/libstocks/http.c index cc78ab7..155ce4b 100644 --- a/noncore/todayplugins/stockticker/libstocks/http.c +++ b/noncore/todayplugins/stockticker/libstocks/http.c | |||
@@ -1,303 +1,302 @@ | |||
1 | /* libstocks - Library to get current stock quotes from Yahoo Finance | 1 | /* libstocks - Library to get current stock quotes from Yahoo Finance |
2 | * | 2 | * |
3 | * Copyright (C) 2000 Eric Laeuffer | 3 | * Copyright (C) 2000 Eric Laeuffer |
4 | * | 4 | * |
5 | * This library is free software; you can redistribute it and/or | 5 | * This library is free software; you can redistribute it and/or |
6 | * modify it under the terms of the GNU Library General Public | 6 | * modify it under the terms of the GNU Library General Public |
7 | * License as published by the Free Software Foundation; either | 7 | * License as published by the Free Software Foundation; either |
8 | * version 2 of the License, or (at your option) any later version. | 8 | * version 2 of the License, or (at your option) any later version. |
9 | * | 9 | * |
10 | * This library is distributed in the hope that it will be useful, | 10 | * This library is distributed in the hope that it will be useful, |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | * Library General Public License for more details. | 13 | * Library General Public License for more details. |
14 | * | 14 | * |
15 | * You should have received a copy of the GNU Library General Public | 15 | * You should have received a copy of the GNU Library General Public |
16 | * License along with this library; if not, write to the | 16 | * License along with this library; if not, write to the |
17 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 17 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
18 | * Boston, MA 02111-1307, USA. | 18 | * Boston, MA 02111-1307, USA. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #define __HTTP_C__ | 21 | #define __HTTP_C__ |
22 | #ifndef __UNIX__ | 22 | #ifndef __UNIX__ |
23 | #define __UNIX__ | 23 | #define __UNIX__ |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | #ifdef __UNIX__ | 26 | #ifdef __UNIX__ |
27 | #include <sys/socket.h> | 27 | #include <sys/socket.h> |
28 | #include <netinet/in.h> | 28 | #include <netinet/in.h> |
29 | #include <arpa/inet.h> | 29 | #include <arpa/inet.h> |
30 | #include <netdb.h> | 30 | #include <netdb.h> |
31 | #include <unistd.h> | 31 | #include <unistd.h> |
32 | #elif __WINDOWS__ | 32 | #elif __WINDOWS__ |
33 | #include <winsock.h> | 33 | #include <winsock.h> |
34 | #include <mbstring.h> | 34 | #include <mbstring.h> |
35 | #endif | 35 | #endif |
36 | 36 | ||
37 | #include <sys/types.h> | 37 | #include <sys/types.h> |
38 | #include <ctype.h> | 38 | #include <ctype.h> |
39 | #include <string.h> | 39 | #include <string.h> |
40 | #include <stdlib.h> | 40 | #include <stdlib.h> |
41 | #include <stdio.h> | 41 | #include <stdio.h> |
42 | 42 | ||
43 | #include "http.h" | 43 | #include "http.h" |
44 | #include "stocks.h" | 44 | #include "stocks.h" |
45 | 45 | ||
46 | #define BUF_SIZE 1024 | 46 | #define BUF_SIZE 1024 |
47 | #define HEADER_MAXBUF 512 | 47 | #define HEADER_MAXBUF 512 |
48 | 48 | ||
49 | /* pointer to proxy server name or NULL */ | 49 | /* pointer to proxy server name or NULL */ |
50 | char *http_proxy_server=NULL; | 50 | char *http_proxy_server=NULL; |
51 | /* proxy server port number or 0 */ | 51 | /* proxy server port number or 0 */ |
52 | int http_proxy_port=0; | 52 | int http_proxy_port=0; |
53 | 53 | ||
54 | /*****************************************************************************/ | 54 | /*****************************************************************************/ |
55 | /* Gets the file from http://http_server/http_file */ | 55 | /* Gets the file from http://http_server/http_file */ |
56 | /* This function is used to get quotes csv file from yahoo. */ | 56 | /* This function is used to get quotes csv file from yahoo. */ |
57 | /* It allocates memory for the file and defines *pdata (the pointer of datas)*/ | 57 | /* It allocates memory for the file and defines *pdata (the pointer of datas)*/ |
58 | /*****************************************************************************/ | 58 | /*****************************************************************************/ |
59 | libstocks_return_code http_get(char *http_file, char *http_server, char **pdata) | 59 | libstocks_return_code http_get(char *http_file, char *http_server, char **pdata) |
60 | { | 60 | { |
61 | struct hostent *host; /* structs needed by socket */ | 61 | struct hostent *host; /* structs needed by socket */ |
62 | struct sockaddr_in server; | 62 | struct sockaddr_in server; |
63 | int s; /* socket descriptor */ | 63 | int s; /* socket descriptor */ |
64 | char header[HEADER_MAXBUF]; /* request header */ | 64 | char header[HEADER_MAXBUF]; /* request header */ |
65 | int hlg; /* header length */ | 65 | int hlg; /* header length */ |
66 | char buf[BUF_SIZE+1]; /* tempory buffer from socket read */ | 66 | char buf[BUF_SIZE+1]; /* tempory buffer from socket read */ |
67 | int r; /* number of bytes read by read function */ | 67 | int r; /* number of bytes read by read function */ |
68 | char *data=NULL; /* http server response */ | 68 | char *data=NULL; /* http server response */ |
69 | int data_lgr; /* http server response length */ | 69 | int data_lgr; /* http server response length */ |
70 | char *temp; /* pointer used to split header and csv */ | 70 | char *temp; /* pointer used to split header and csv */ |
71 | int error_code; /* error code returned by http server */ | 71 | int error_code; /* error code returned by http server */ |
72 | char *csv_ptr; /* pointer to the csv content */ | 72 | char *csv_ptr; /* pointer to the csv content */ |
73 | int header_founded; /* test if header is founded */ | 73 | int header_founded; /* test if header is founded */ |
74 | 74 | ||
75 | #ifdef DEBUG | 75 | #ifdef DEBUG |
76 | printf("*http_get\n"); | 76 | printf("*http_get\n"); |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | /* get host info by name :*/ | 79 | /* get host info by name :*/ |
80 | if ((host = gethostbyname( http_proxy_server ? http_proxy_server : http_server))) | 80 | if ((host = gethostbyname( http_proxy_server ? http_proxy_server : http_server))) |
81 | { | 81 | { |
82 | memset((char *) &server,0, sizeof(server)); | 82 | memset((char *) &server,0, sizeof(server)); |
83 | memmove((char *) &server.sin_addr, host->h_addr, host->h_length); | 83 | memmove((char *) &server.sin_addr, host->h_addr, host->h_length); |
84 | server.sin_family = host->h_addrtype; | 84 | server.sin_family = host->h_addrtype; |
85 | server.sin_port = (unsigned short) htons( http_proxy_server ? http_proxy_port : 80 ); | 85 | server.sin_port = (unsigned short) htons( http_proxy_server ? http_proxy_port : 80 ); |
86 | 86 | ||
87 | } else | 87 | } |
88 | { | 88 | else |
89 | 89 | { | |
90 | #ifdef DEBUG | 90 | #ifdef DEBUG |
91 | printf(" gethostbyname : NOK\n"); | 91 | printf(" gethostbyname : NOK\n"); |
92 | #endif | 92 | #endif |
93 | return ERRHOST; | 93 | return ERRHOST; |
94 | } | 94 | } |
95 | 95 | ||
96 | /* create socket */ | 96 | /* create socket */ |
97 | if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) | 97 | if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) |
98 | { | 98 | { |
99 | |||
100 | #ifdef DEBUG | 99 | #ifdef DEBUG |
101 | printf(" create socket : NOK\n"); | 100 | printf(" create socket : NOK\n"); |
102 | #endif | 101 | #endif |
103 | return ERRSOCK; | 102 | return ERRSOCK; |
104 | } | 103 | } |
105 | 104 | ||
106 | setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0); | 105 | setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0); |
107 | 106 | ||
108 | /* connect to server */ | 107 | /* connect to server */ |
109 | if (connect(s, &server, sizeof(server)) < 0) | 108 | if (connect(s, &server, sizeof(server)) < 0) |
110 | { | 109 | { |
111 | #ifdef DEBUG | 110 | #ifdef DEBUG |
112 | printf(" connect to server : NOK\n"); | 111 | printf(" connect to server : NOK\n"); |
113 | #endif | 112 | #endif |
114 | 113 | ||
115 | #ifdef __UNIX__ | 114 | #ifdef __UNIX__ |
116 | close(s); | 115 | close(s); |
117 | #elif __WINDOWS__ | 116 | #elif __WINDOWS__ |
118 | closesocket(s); | 117 | closesocket(s); |
119 | #endif | 118 | #endif |
120 | return ERRCONN; | 119 | return ERRCONN; |
121 | } | 120 | } |
122 | 121 | ||
123 | /* create header */ | 122 | /* create header */ |
124 | if (http_proxy_server) | 123 | if (http_proxy_server) |
125 | { | 124 | { |
126 | sprintf(header,"GET http://%.128s:80%.256s HTTP/1.0\015\012\015\012", | 125 | sprintf(header,"GET http://%.128s:80%.256s HTTP/1.0\015\012\015\012", |
127 | http_server, http_file); | 126 | http_server, http_file); |
128 | } | 127 | } |
129 | else | 128 | else |
130 | { | 129 | { |
131 | sprintf(header,"GET %s HTTP/1.0\015\012\015\012",http_file); | 130 | sprintf(header,"GET %s HTTP/1.0\015\012\015\012",http_file); |
132 | } | 131 | } |
133 | 132 | ||
134 | hlg=strlen(header); | 133 | hlg=strlen(header); |
135 | 134 | ||
136 | /* send header */ | 135 | /* send header */ |
137 | #ifdef __UNIX__ | 136 | #ifdef __UNIX__ |
138 | if (write(s,header,hlg)!=hlg) | 137 | if (write(s,header,hlg)!=hlg) |
139 | #elif __WINDOWS__ | 138 | #elif __WINDOWS__ |
140 | if (send(s,header,hlg, 0)!=hlg) | 139 | if (send(s,header,hlg, 0)!=hlg) |
141 | #endif | 140 | #endif |
142 | { | 141 | { |
143 | #ifdef DEBUG | 142 | #ifdef DEBUG |
144 | printf(" send header : NOK\n"); | 143 | printf(" send header : NOK\n"); |
145 | #endif | 144 | #endif |
146 | return ERRWHEA; | 145 | return ERRWHEA; |
147 | } | 146 | } |
148 | 147 | ||
149 | data_lgr = 0; | 148 | data_lgr = 0; |
150 | r=1; | 149 | r=1; |
151 | while(r) | 150 | while(r) |
152 | { | 151 | { |
153 | /* Clear Buffer */ | 152 | /* Clear Buffer */ |
154 | memset(buf,0,BUF_SIZE+1); | 153 | memset(buf,0,BUF_SIZE+1); |
155 | 154 | ||
156 | #ifdef __UNIX__ | 155 | #ifdef __UNIX__ |
157 | r=read(s,buf,BUF_SIZE); | 156 | r=read(s,buf,BUF_SIZE); |
158 | #elif __WINDOWS__ | 157 | #elif __WINDOWS__ |
159 | r=recv(s,buf,BUF_SIZE,0); | 158 | r=recv(s,buf,BUF_SIZE,0); |
160 | #endif | 159 | #endif |
161 | 160 | ||
162 | if (r) | 161 | if (r > 0) |
163 | { | 162 | { |
164 | if(!data_lgr) | 163 | if(!data_lgr) |
165 | { | 164 | { |
166 | if((data = malloc(r+1))==NULL) | 165 | if((data = malloc(r+1))==NULL) |
167 | { | 166 | { |
168 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 167 | fprintf(stderr,"Memory allocating error (%s line %d)\n", |
169 | ,__FILE__, __LINE__); | 168 | __FILE__, __LINE__); |
170 | exit(1); | 169 | exit(1); |
171 | } | 170 | } |
172 | 171 | ||
173 | memcpy(data,buf,r); | 172 | memcpy(data,buf,r); |
174 | data_lgr = r; | 173 | data_lgr = r; |
175 | data[r]=0; | 174 | data[r]=0; |
176 | } | 175 | } |
177 | else | 176 | else |
178 | { | 177 | { |
179 | if((temp = malloc(r+data_lgr+1))==NULL) | 178 | if((temp = malloc(r+data_lgr+1))==NULL) |
180 | { | 179 | { |
181 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 180 | fprintf(stderr,"Memory allocating error (%s line %d)\n", |
182 | ,__FILE__, __LINE__); | 181 | __FILE__, __LINE__); |
183 | exit(1); | 182 | exit(1); |
184 | } | 183 | } |
185 | memcpy(temp, data, data_lgr); | 184 | memcpy(temp, data, data_lgr); |
186 | memcpy(temp+data_lgr, buf, r); | 185 | memcpy(temp+data_lgr, buf, r); |
187 | temp[r+data_lgr]=0; | 186 | temp[r+data_lgr]=0; |
188 | data_lgr += r; | 187 | data_lgr += r; |
189 | free(data); | 188 | free(data); |
190 | data = temp; | 189 | data = temp; |
191 | } | 190 | } |
192 | } | 191 | } |
193 | } | 192 | } |
194 | 193 | ||
195 | /* close socket */ | 194 | /* close socket */ |
196 | #ifdef __UNIX__ | 195 | #ifdef __UNIX__ |
197 | close(s); | 196 | close(s); |
198 | #elif __WINDOWS__ | 197 | #elif __WINDOWS__ |
199 | closesocket(s); | 198 | closesocket(s); |
200 | #endif | 199 | #endif |
201 | 200 | ||
202 | #ifdef DEBUG | 201 | #ifdef DEBUG |
203 | printf("%s\n", data); | 202 | printf("%s\n", data); |
204 | #endif | 203 | #endif |
205 | 204 | ||
206 | /* get headers to test status line */ | 205 | /* get headers to test status line */ |
207 | /* and to split headers and content */ | 206 | /* and to split headers and content */ |
208 | 207 | ||
209 | temp = data; | 208 | temp = data; |
210 | header_founded = 0; | 209 | header_founded = 0; |
211 | while( !header_founded ) | 210 | while( !header_founded ) |
212 | { | 211 | { |
213 | if (!temp || *temp==0) return ERRRHEA; | 212 | if (!temp || *temp==0) return ERRRHEA; |
214 | 213 | ||
215 | if( *temp==0x0A ) | 214 | if( *temp==0x0A ) |
216 | { | 215 | { |
217 | /* test if it is the header end */ | 216 | /* test if it is the header end */ |
218 | temp ++; | 217 | temp ++; |
219 | if (*temp == 0x0D) temp++; | 218 | if (*temp == 0x0D) temp++; |
220 | if (*temp == 0x0A) header_founded = 1; | 219 | if (*temp == 0x0A) header_founded = 1; |
221 | } | 220 | } |
222 | else | 221 | else |
223 | temp++; | 222 | temp++; |
224 | } | 223 | } |
225 | 224 | ||
226 | *temp = 0; | 225 | *temp = 0; |
227 | temp++; | 226 | temp++; |
228 | 227 | ||
229 | sscanf(data,"HTTP/1.%*d %03d",&error_code); | 228 | sscanf(data,"HTTP/1.%*d %03d",&error_code); |
230 | 229 | ||
231 | if (error_code != 200) | 230 | if (error_code != 200) |
232 | { | 231 | { |
233 | #ifdef DEBUG | 232 | #ifdef DEBUG |
234 | printf(" HTTP error code : %d\n", error_code); | 233 | printf(" HTTP error code : %d\n", error_code); |
235 | #endif | 234 | #endif |
236 | free(data); | 235 | free(data); |
237 | return ERRPAHD; | 236 | return ERRPAHD; |
238 | } | 237 | } |
239 | 238 | ||
240 | if ((csv_ptr = malloc(strlen(temp)+1))==NULL) | 239 | if ((csv_ptr = malloc(strlen(temp)+1))==NULL) |
241 | { | 240 | { |
242 | free(data); | 241 | free(data); |
243 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | 242 | fprintf(stderr,"Memory allocating error (%s line %d)\n", |
244 | ,__FILE__, __LINE__); | 243 | __FILE__, __LINE__); |
245 | exit(1); | 244 | exit(1); |
246 | } | 245 | } |
247 | 246 | ||
248 | memcpy(csv_ptr, temp, strlen(temp)+1); | 247 | memcpy(csv_ptr, temp, strlen(temp)+1); |
249 | free(data); | 248 | free(data); |
250 | 249 | ||
251 | #ifdef DEBUG | 250 | #ifdef DEBUG |
252 | printf(" CSV\n"); | 251 | printf(" CSV\n"); |
253 | printf("%s,\n", csv_ptr); | 252 | printf("%s,\n", csv_ptr); |
254 | #endif | 253 | #endif |
255 | 254 | ||
256 | *pdata = csv_ptr; | 255 | *pdata = csv_ptr; |
257 | 256 | ||
258 | return 0; | 257 | return 0; |
259 | } | 258 | } |
260 | 259 | ||
261 | /******************************************************************************/ | 260 | /******************************************************************************/ |
262 | /* Set the proxy server to use */ | 261 | /* Set the proxy server to use */ |
263 | /******************************************************************************/ | 262 | /******************************************************************************/ |
264 | libstocks_return_code set_proxy(char *proxy) | 263 | libstocks_return_code set_proxy(char *proxy) |
265 | { | 264 | { |
266 | char *ptr; | 265 | char *ptr; |
267 | char c; | 266 | char c; |
268 | 267 | ||
269 | #ifdef DEBUG | 268 | #ifdef DEBUG |
270 | printf("*set_proxy\n"); | 269 | printf("*set_proxy\n"); |
271 | #endif | 270 | #endif |
272 | 271 | ||
273 | /* Parse the proxy URL - It must start with http:// */ | 272 | /* Parse the proxy URL - It must start with http:// */ |
274 | #ifdef __UNIX__ | 273 | #ifdef __UNIX__ |
275 | if (strncasecmp("http://",proxy,7)) return ERRPROX; | 274 | if (strncasecmp("http://",proxy,7)) return ERRPROX; |
276 | #elif __WINDOWS__ | 275 | #elif __WINDOWS__ |
277 | if (_mbsnbicmp("http://",proxy,7)) return ERRPROX; | 276 | if (_mbsnbicmp("http://",proxy,7)) return ERRPROX; |
278 | #endif | 277 | #endif |
279 | 278 | ||
280 | proxy+=7; | 279 | proxy+=7; |
281 | 280 | ||
282 | /* find ":" in the proxy url */ | 281 | /* find ":" in the proxy url */ |
283 | ptr = proxy; | 282 | ptr = proxy; |
284 | for (c=*ptr; (c && c!=':');) c=*ptr++; | 283 | for (c=*ptr; (c && c!=':');) c=*ptr++; |
285 | 284 | ||
286 | /* ptr points just after the ":" or at the end of proxy if : not founded */ | 285 | /* ptr points just after the ":" or at the end of proxy if : not founded */ |
287 | *(ptr-1)=0; /* clear the ":" */ | 286 | *(ptr-1)=0; /* clear the ":" */ |
288 | 287 | ||
289 | http_proxy_server=strdup(proxy); | 288 | http_proxy_server=strdup(proxy); |
290 | 289 | ||
291 | #ifdef DEBUG | 290 | #ifdef DEBUG |
292 | printf("http_proxy_server : %s\n", http_proxy_server); | 291 | printf("http_proxy_server : %s\n", http_proxy_server); |
293 | #endif | 292 | #endif |
294 | 293 | ||
295 | /* get the port number of the url */ | 294 | /* get the port number of the url */ |
296 | if (sscanf(ptr,"%d",&http_proxy_port)!=1) return ERRPROX; | 295 | if (sscanf(ptr,"%d",&http_proxy_port)!=1) return ERRPROX; |
297 | 296 | ||
298 | #ifdef DEBUG | 297 | #ifdef DEBUG |
299 | printf("http_proxy_port : %d\n", http_proxy_port); | 298 | printf("http_proxy_port : %d\n", http_proxy_port); |
300 | #endif | 299 | #endif |
301 | 300 | ||
302 | return 0; | 301 | return 0; |
303 | } | 302 | } |