From 5a08fd92ac139820e1a1202d0b4b67190f24ccdb Mon Sep 17 00:00:00 2001 From: llornkcor Date: Thu, 31 Oct 2002 00:09:31 +0000 Subject: added - initial check in --- diff --git a/noncore/todayplugins/stockticker/libstocks/.cvsignore b/noncore/todayplugins/stockticker/libstocks/.cvsignore new file mode 100644 index 0000000..c9bb88e --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/.cvsignore @@ -0,0 +1,3 @@ +Makefile* +moc_* +*.moc \ No newline at end of file diff --git a/noncore/todayplugins/stockticker/libstocks/csv.c b/noncore/todayplugins/stockticker/libstocks/csv.c new file mode 100644 index 0000000..99a44e4 --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/csv.c @@ -0,0 +1,402 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#define __CSV_C__ + +#include +#include +#include + +#ifdef __WINDOWS__ +#include +#endif + +#include "csv.h" +#include "stocks.h" +#include "lists.h" + +#define DATE_LENGTH 7 /*YYMMDD*/ + +const char *months[12]= +{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" +}; + +/*****************************************************************************/ +/* Replacement of the strtok function. This one forgets "delim" when it is */ +/* between two commas. */ +/* Thanks to Julio Lucas who has told me the bug and has proposed me a patch */ +/*****************************************************************************/ +char *csv_strtok(char *s, char *delim) +{ + static char *next=NULL; + char *temp, *first; + int comma=0; + + if (s!=NULL) first=s; + else first=next; + + temp=first; + if (*temp=='\0') return NULL; + + while (*temp!='\0' && ((*temp!=*delim) || comma)) + { + if (*temp=='"') comma ^= 1; + temp++; + } + + if (*temp=='\0') next=temp; + else + { + *temp='\0'; + next=temp+1; + } + + return first; +} + +/*****************************************************************************/ +/* Parses the csv file and return a list of stocks structure. */ +/* *csv points on the csv file in memory */ +/* count defines the country, because csv depends on the country */ +/*****************************************************************************/ +stock *parse_csv_file(char *csv) +{ + char *line; + char *end_line; + + char *ptr; + + char *date; + char *time; + char *name; + char *symbol; + + stock *StockPtr=NULL; + stock *LastStockPtr=NULL; + + /* Used to return the pointer to the list */ + stock *FirstStockPtr=NULL; + + /* used to see if symbol is valid */ + int valid; + char *test; + + line = csv; + end_line = csv; + + while ((end_line = strstr(line, "\n"))) + { + *end_line = 0; + + /* Check if symbol valid */ + /* if 1 "N/A" then ok because Indices have N/A for volume */ + /* if 4 "N/A" then ok because Mutual funds have */ + /* if 5 "N/A" then ok because currencies have */ + /* So if >5 then stock not valid */ + + test = line; + valid = 0; + while ( (test = strstr(test, "N/A")) ) + { + valid ++; + test = test +3; + } + + if (valid < 6) + { + /* This Symbol is valid */ + + StockPtr = malloc_stock(); + + ptr = csv_strtok(line, ","); + if (!ptr) return 0; + + symbol = (char *)malloc(strlen(ptr)+1); + if (symbol==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + strcpy((char *)(symbol), ptr); + StockPtr->Symbol = symbol; + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + + name = (char *)malloc(strlen(ptr)+1); + if (name==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + strcpy((char *)(name), ptr); + StockPtr->Name = name; + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->CurrentPrice)); + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + + date = (char *)malloc(strlen(ptr)+1); + if (date==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + strcpy((char *)(date), ptr); + StockPtr->Date = date; + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + + time = (char *)malloc(strlen(ptr)+1); + if (time==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + strcpy((char *)(time), ptr); + StockPtr->Time = time; + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->Variation)); + + StockPtr->Pourcentage = 100 * StockPtr->Variation / + (StockPtr->CurrentPrice - StockPtr->Variation); + + StockPtr->LastPrice = StockPtr->CurrentPrice - StockPtr->Variation; + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->OpenPrice)); + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->MaxPrice)); + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->MinPrice)); + + ptr = csv_strtok(NULL, ","); + if (!ptr) return 0; + StockPtr->Volume = atoi(ptr); + + if( !FirstStockPtr ) + { + FirstStockPtr = StockPtr; + StockPtr->PreviousStock = 0; + } + + StockPtr->NextStock = 0; + + if (LastStockPtr) + { + LastStockPtr->NextStock = StockPtr; + StockPtr->PreviousStock = LastStockPtr; + } + + LastStockPtr = StockPtr; + + } + else + { + /* this symbol is not valid */ + /* Set the stock struct just with Symbol, all other are NULL */ + /* This can be used to see if the symbol has been reached are not */ + + StockPtr = malloc_stock(); + + ptr = csv_strtok(line, ","); + if (!ptr) return 0; + + symbol = (char *)malloc(strlen(ptr)+1); + if (symbol==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + strcpy((char *)(symbol), ptr); + StockPtr->Symbol = symbol; + + if( !FirstStockPtr ) + { + FirstStockPtr = StockPtr; + StockPtr->PreviousStock = 0; + } + + StockPtr->NextStock = 0; + + if (LastStockPtr) + { + LastStockPtr->NextStock = StockPtr; + StockPtr->PreviousStock = LastStockPtr; + } + + LastStockPtr = StockPtr; + } + + end_line++; + line = end_line; + + } + + return (FirstStockPtr); +} + +/*****************************************************************************/ +/* Parses the history quotes file and return a stock structure list. */ +/*****************************************************************************/ +stock *parse_csv_history_file(char *csv_file) +{ + + char *line; + char *end_line; + char *ptr; + + int day; + char smonth[10]; + int month; + int year; + + char *date; + + int i; + int test; + + stock *StockPtr=NULL; + stock *LastStockPtr=NULL; + + /* Used to return the pointer to the list */ + stock *FirstStockPtr=NULL; + + line = csv_file; + end_line = csv_file; + + /* do not use the first line */ + end_line = strstr(line, "\n"); + *end_line = 0; + end_line++; + line = end_line; + + while ((end_line = strstr(line, "\n"))) + { + *end_line = 0; + + StockPtr = malloc_stock(); + + /* Date */ + ptr = strtok(line, ","); + if (!ptr) return 0; + + sscanf(ptr,"%d-%3s-%d",&day,smonth,&year); + + i=0; + +#ifdef __UNIX__ + while((test=strcasecmp(months[i], smonth))) i++; +#elif __WINDOWS__ + while(test=_mbsnbicmp(months[i], smonth, strlen(months[i]))) i++; +#endif + + month = i+1; + + date = (char *)malloc(DATE_LENGTH); + if (date==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + sprintf(date,"%.2d%.2d%.2d", year, month, day); + StockPtr->Date = date; + + /* Open */ + ptr = strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->OpenPrice)); + + /* High */ + ptr = strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->MaxPrice)); + + /* Low */ + ptr = strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->MinPrice)); + + /* Close */ + ptr = strtok(NULL, ","); + if (!ptr) return 0; + sscanf(ptr,"%f",&(StockPtr->LastPrice)); + + /* Volume */ + + ptr = strtok(NULL, ","); + if (!ptr) + /* It seems to be an indice */ + /* No volume for indices */ + StockPtr->Volume = 0; + else + StockPtr->Volume = atoi(ptr); + + if( !FirstStockPtr ) + { + FirstStockPtr = StockPtr; + StockPtr->PreviousStock = 0; + } + + StockPtr->NextStock = 0; + + if (LastStockPtr) + { + LastStockPtr->NextStock = StockPtr; + StockPtr->PreviousStock = LastStockPtr; + } + + LastStockPtr = StockPtr; + + end_line++; + line = end_line; + } + + return (FirstStockPtr); +} diff --git a/noncore/todayplugins/stockticker/libstocks/csv.h b/noncore/todayplugins/stockticker/libstocks/csv.h new file mode 100644 index 0000000..4205c61 --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/csv.h @@ -0,0 +1,36 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __CSV_H__ +#define __CSV_H__ + +#ifndef __CSV_C__ +#define PUBEXT_CSV extern +#else +#define PUBEXT_CSV +#endif + +#include "stocks.h" + +PUBEXT_CSV stock *parse_csv_file(char *); +PUBEXT_CSV char *csv_strtok(char *, char *); +PUBEXT_CSV stock *parse_csv_history_file(char *); + +#endif /* __CSV_H__ */ diff --git a/noncore/todayplugins/stockticker/libstocks/currency.c b/noncore/todayplugins/stockticker/libstocks/currency.c new file mode 100644 index 0000000..9a08a9d --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/currency.c @@ -0,0 +1,66 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#define __CURRENCY_C__ + + +#include +#include +#include +#include + +#include "stocks.h" + +/*****************************************************************************/ +/* returns the currency exchange rate of "from" currency into */ +/* "into" currency. */ +/*****************************************************************************/ +libstocks_return_code get_currency_exchange(char *from, + char *into, + float *exchange) +{ + char *symbol; + stock *data; + libstocks_return_code error; + + if((symbol = (char *)malloc(strlen(from)+strlen(into)+3))==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + + strcpy(symbol, from); + strcat(symbol, into); + strcat(symbol, "=X"); + + error = get_stocks(symbol, &data); + if (error) + { + *exchange = 0; + return(error); + } + + free_stocks(data); + + *exchange = data->CurrentPrice; + return(error); + +} diff --git a/noncore/todayplugins/stockticker/libstocks/history.c b/noncore/todayplugins/stockticker/libstocks/history.c new file mode 100644 index 0000000..61f57d1 --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/history.c @@ -0,0 +1,149 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#define __HISTORY_C__ + +#include +#include + +#ifdef __WINDOWS__ +#include +#endif + +#include "stocks.h" +#include "http.h" +#include "csv.h" + +const char history_stocks_server[]="chart.yahoo.com"; +const char url_history_beg[]="/table.csv?s="; + +/*****************************************************************************/ +/* Gets the stock history csv file and return in csv_file the result. */ +/* The stock is defined by its symbol. */ +/* The history file starts at date1 and stops at date2. */ +/*****************************************************************************/ +libstocks_return_code get_history_csv(char *symbol, + char *date1, + char *date2, + char **csv_file) +{ + char *data; + char url[80]; + + char adate[12]; + + char *y1, *y2; + char *m1, *m2; + char *d1, *d2; + + libstocks_return_code error; + + char *test; + + strcpy(url, url_history_beg); + strcat(url, symbol); + + strcpy(adate, date1); + + y1=strtok(adate, "/"); + if(!y1) return ERRDATE; + m1 = strtok(NULL, "/"); + if(!m1) return ERRDATE; + d1 = strtok(NULL, "/"); + if(!m1) return ERRDATE; + + strcat(url, "&a="); + strcat(url, m1); + strcat(url, "&b="); + strcat(url, d1); + strcat(url, "&c="); + strcat(url, y1); + + strcpy(adate, date2); + + y2=strtok(adate, "/"); + if(!y2) return ERRDATE; + m2 = strtok(NULL, "/"); + if(!m2) return ERRDATE; + d2 = strtok(NULL, "/"); + if(!d2) return ERRDATE; + + strcat(url, "&d="); + strcat(url, m2); + strcat(url, "&e="); + strcat(url, d2); + strcat(url, "&f="); + strcat(url, y2); + strcat(url, "&g=d&q=q&y=0&x=.csv"); + + error=http_get(url, (char *)history_stocks_server, &data); + if (error) return error; + + /* tests if data is valid */ + + /* The server returns "No data available for symbol" */ + /* when the stock is not available */ + test = strstr(data, "No data available"); + if (test) + { + free(data); + return ERRDATA; + } + + /* The server return "No Prices in this date range" */ + /* when dates have not the good range */ + test = strstr(data, "No Prices in this date range"); + if (test) + { + free(data); + return ERRRANG; + } + + *csv_file = data; + + return(0); +} + +/*****************************************************************************/ +/* Gets the stock history and return a stock structure list. */ +/* The stock is defined by its symbol. */ +/* The history file starts at date1 and stops at date2. */ +/*****************************************************************************/ +libstocks_return_code get_stock_history(char *symbol, + char *date1, + char *date2, + stock **stock_history) +{ + libstocks_return_code error; + char *csv_file; + stock *stock_parsed; + + error = get_history_csv(symbol, date1, date2, &csv_file); + if (error) return error; + + stock_parsed = parse_csv_history_file(csv_file); + + free(csv_file); + + if (!stock_parsed) return ERRPCSV; + *stock_history = stock_parsed; + + return(0); +} diff --git a/noncore/todayplugins/stockticker/libstocks/http.c b/noncore/todayplugins/stockticker/libstocks/http.c new file mode 100644 index 0000000..462080d --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/http.c @@ -0,0 +1,300 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#define __HTTP_C__ + +#ifdef __UNIX__ +#include +#include +#include +#include +#include +#elif __WINDOWS__ +#include +#include +#endif + +#include +#include +#include +#include +#include + +#include "http.h" +#include "stocks.h" + +#define BUF_SIZE 1024 +#define HEADER_MAXBUF 512 + +/* pointer to proxy server name or NULL */ +char *http_proxy_server=NULL; +/* proxy server port number or 0 */ +int http_proxy_port=0; + +/*****************************************************************************/ +/* Gets the file from http://http_server/http_file */ +/* This function is used to get quotes csv file from yahoo. */ +/* It allocates memory for the file and defines *pdata (the pointer of datas)*/ +/*****************************************************************************/ +libstocks_return_code http_get(char *http_file, char *http_server, char **pdata) +{ + struct hostent *host; /* structs needed by socket */ + struct sockaddr_in server; + int s; /* socket descriptor */ + char header[HEADER_MAXBUF]; /* request header */ + int hlg; /* header length */ + char buf[BUF_SIZE+1]; /* tempory buffer from socket read */ + int r; /* number of bytes read by read function */ + char *data=NULL; /* http server response */ + int data_lgr; /* http server response length */ + char *temp; /* pointer used to split header and csv */ + int error_code; /* error code returned by http server */ + char *csv_ptr; /* pointer to the csv content */ + int header_founded; /* test if header is founded */ + +#ifdef DEBUG + printf("*http_get\n"); +#endif + + /* get host info by name :*/ + if ((host = gethostbyname( http_proxy_server ? http_proxy_server : http_server))) + { + memset((char *) &server,0, sizeof(server)); + memmove((char *) &server.sin_addr, host->h_addr, host->h_length); + server.sin_family = host->h_addrtype; + server.sin_port = (unsigned short) htons( http_proxy_server ? http_proxy_port : 80 ); + + } else + { + +#ifdef DEBUG + printf(" gethostbyname : NOK\n"); +#endif + return ERRHOST; + } + + /* create socket */ + if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) + { + +#ifdef DEBUG + printf(" create socket : NOK\n"); +#endif + return ERRSOCK; + } + + setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0); + + /* connect to server */ + if (connect(s, &server, sizeof(server)) < 0) + { +#ifdef DEBUG + printf(" connect to server : NOK\n"); +#endif + +#ifdef __UNIX__ + close(s); +#elif __WINDOWS__ + closesocket(s); +#endif + return ERRCONN; + } + + /* create header */ + if (http_proxy_server) + { + sprintf(header,"GET http://%.128s:80%.256s HTTP/1.0\015\012\015\012", + http_server, http_file); + } + else + { + sprintf(header,"GET %s HTTP/1.0\015\012\015\012",http_file); + } + + hlg=strlen(header); + + /* send header */ +#ifdef __UNIX__ + if (write(s,header,hlg)!=hlg) +#elif __WINDOWS__ + if (send(s,header,hlg, 0)!=hlg) +#endif + { +#ifdef DEBUG + printf(" send header : NOK\n"); +#endif + return ERRWHEA; + } + + data_lgr = 0; + r=1; + while(r) + { + /* Clear Buffer */ + memset(buf,0,BUF_SIZE+1); + +#ifdef __UNIX__ + r=read(s,buf,BUF_SIZE); +#elif __WINDOWS__ + r=recv(s,buf,BUF_SIZE,0); +#endif + + if (r) + { + if(!data_lgr) + { + if((data = malloc(r+1))==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + + memcpy(data,buf,r); + data_lgr = r; + data[r]=0; + } + else + { + if((temp = malloc(r+data_lgr+1))==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + memcpy(temp, data, data_lgr); + memcpy(temp+data_lgr, buf, r); + temp[r+data_lgr]=0; + data_lgr += r; + free(data); + data = temp; + } + } + } + + /* close socket */ +#ifdef __UNIX__ + close(s); +#elif __WINDOWS__ + closesocket(s); +#endif + +#ifdef DEBUG + printf("%s\n", data); +#endif + + /* get headers to test status line */ + /* and to split headers and content */ + + temp = data; + header_founded = 0; + while( !header_founded ) + { + if (*temp==0) return ERRRHEA; + + if( *temp==0x0A ) + { + /* test if it is the header end */ + temp ++; + if (*temp == 0x0D) temp++; + if (*temp == 0x0A) header_founded = 1; + } + else + temp++; + } + + *temp = 0; + temp++; + + sscanf(data,"HTTP/1.%*d %03d",&error_code); + + if (error_code != 200) + { +#ifdef DEBUG + printf(" HTTP error code : %d\n", error_code); +#endif + free(data); + return ERRPAHD; + } + + if ((csv_ptr = malloc(strlen(temp)+1))==NULL) + { + free(data); + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + + memcpy(csv_ptr, temp, strlen(temp)+1); + free(data); + +#ifdef DEBUG + printf(" CSV\n"); + printf("%s,\n", csv_ptr); +#endif + + *pdata = csv_ptr; + + return 0; +} + +/******************************************************************************/ +/* Set the proxy server to use */ +/******************************************************************************/ +libstocks_return_code set_proxy(char *proxy) +{ + char *ptr; + char c; + +#ifdef DEBUG + printf("*set_proxy\n"); +#endif + + /* Parse the proxy URL - It must start with http:// */ +#ifdef __UNIX__ + if (strncasecmp("http://",proxy,7)) return ERRPROX; +#elif __WINDOWS__ + if (_mbsnbicmp("http://",proxy,7)) return ERRPROX; +#endif + + proxy+=7; + + /* find ":" in the proxy url */ + ptr = proxy; + for (c=*ptr; (c && c!=':');) c=*ptr++; + + /* ptr points just after the ":" or at the end of proxy if : not founded */ + *(ptr-1)=0; /* clear the ":" */ + + http_proxy_server=strdup(proxy); + +#ifdef DEBUG + printf("http_proxy_server : %s\n", http_proxy_server); +#endif + + /* get the port number of the url */ + if (sscanf(ptr,"%d",&http_proxy_port)!=1) return ERRPROX; + +#ifdef DEBUG + printf("http_proxy_port : %d\n", http_proxy_port); +#endif + + return 0; +} diff --git a/noncore/todayplugins/stockticker/libstocks/http.h b/noncore/todayplugins/stockticker/libstocks/http.h new file mode 100644 index 0000000..33346f3 --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/http.h @@ -0,0 +1,35 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __HTTP_H__ +#define __HTTP_H__ + +#ifndef __HTTP_C__ +#define PUBEXT_HTTP extern +#else +#define PUBEXT_HTTP +#endif + +#include "stocks.h" + +PUBEXT_HTTP libstocks_return_code http_get(char *, char *, char **); + +#endif /* __HTTP_H__ */ diff --git a/noncore/todayplugins/stockticker/libstocks/lists.c b/noncore/todayplugins/stockticker/libstocks/lists.c new file mode 100644 index 0000000..1ed66b3 --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/lists.c @@ -0,0 +1,123 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#define __LISTS_C__ + +#include +#include +#include + +#ifdef __WINDOWS__ +#include +#endif + +#include "stocks.h" +#include "lists.h" + +/******************************************************************************/ +/* Finds a stock in the stocks list and return the stock pointer. */ +/* *stocks points to the stocks list */ +/* *stock_to_find is the stock to find :)) */ +/******************************************************************************/ +stock *find_stock(stock *stocks, char *stock_to_find) +{ + char *test=NULL; + + while(stocks != NULL) + { + test = strstr(stocks->Symbol, stock_to_find); + if(test) return(stocks); + stocks = stocks->NextStock; + } + + return(0); +} + +/******************************************************************************/ +/* Allocate memory for a stock structure and return the pointer of this */ +/* structure. */ +/******************************************************************************/ +stock *malloc_stock(void) +{ + stock *stockptr; + + if((stockptr = (stock *)malloc(sizeof(stock)))==NULL) + { + fprintf(stderr,"Memory allocating error (%s line %d)\n" + ,__FILE__, __LINE__); + exit(1); + } + + stockptr->Symbol=NULL; + stockptr->Name=NULL; + stockptr->Time=NULL; + stockptr->Date=NULL; + stockptr->CurrentPrice=0; + stockptr->LastPrice=0; + stockptr->OpenPrice=0; + stockptr->MinPrice=0; + stockptr->MaxPrice=0; + stockptr->Variation=0; + stockptr->Pourcentage=0; + stockptr->Volume=0; + stockptr->PreviousStock=0; + stockptr->NextStock=0; + + return(stockptr); +} + +/******************************************************************************/ +/* Deallocates a stock structure. */ +/* *stocks_to_free is the pointer of the structure to free */ +/******************************************************************************/ +void free_stocks(stock *stock_to_free) +{ + stock *next_stock; + + while(stock_to_free) + { + next_stock = stock_to_free->NextStock; + free(stock_to_free->Symbol); + free(stock_to_free->Name); + free(stock_to_free->Time); + free(stock_to_free->Date); + free(stock_to_free); + stock_to_free = next_stock; + } +} + +/******************************************************************************/ +/* Returns the next stock structure from the list. */ +/* *the_stocks points to the list. */ +/******************************************************************************/ +stock *next_stock(stock *the_stock) +{ + return((stock *)(the_stock->NextStock)); +} + +/******************************************************************************/ +/* Returns the previous stock structure from the list. */ +/* *the_stocks points to the list. */ +/******************************************************************************/ +stock *previous_stock(stock *the_stock) +{ + return((stock *)(the_stock->PreviousStock)); +} + diff --git a/noncore/todayplugins/stockticker/libstocks/lists.h b/noncore/todayplugins/stockticker/libstocks/lists.h new file mode 100644 index 0000000..0132317 --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/lists.h @@ -0,0 +1,35 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __LISTS_H__ +#define __LISTS_H__ + +#ifndef __LISTS_C__ +#define PUBEXT_LISTS extern +#else +#define PUBEXT_LISTS +#endif + +#include "stocks.h" + +PUBEXT_LISTS stock *malloc_stock(void); + + +#endif /* __LISTS_H */ diff --git a/noncore/todayplugins/stockticker/libstocks/stocks.c b/noncore/todayplugins/stockticker/libstocks/stocks.c new file mode 100644 index 0000000..eb04ba9 --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/stocks.c @@ -0,0 +1,347 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#define __STOCKS_C__ + +#include +#include +#include +#include + +#ifdef __WINDOWS__ +#include +#endif + +#include "http.h" +#include "csv.h" + +#include "stocks.h" + +/* +s = symbol +n = name +l1 = last trade +d1 = date +t1 = time +c1 = variation +o = open +h = higher price +g = lower price +v = volume +*/ + +const char yahoo_us_stocks_server[]="finance.yahoo.com"; +const char yahoo_eu_stocks_server[]="finance.yahoo.com"; +//const char yahoo_eu_stocks_server[]="fr.finance.yahoo.com"; + +const char yahoo_url_beg[]="/d/quotes.csv?s="; +const char yahoo_url_end[]="&f=snl1d1t1c1ohgv&e=.csv"; + +typedef enum { + YAHOO_EUROPE, + YAHOO_US +} yahoo_source; + +#define YAHOO_US_EXT_NB 11 +const char *yahoo_us_ext[YAHOO_US_EXT_NB] = +{ + ".US", /* United States */ + ".TO", /* Canada */ + ".M", /* Canada */ + ".V", /* Canada */ + ".AL", /* Canada */ + ".MX", /* Mexico */ + ".SA", /* Brasil */ + ".BA", /* Argentina */ + ".CR", /* Venezuela */ + ".SN", /* Chili */ + ".AX" /* Australia */ +}; + +/*****************************************************************************/ +/* Finds, according to the symbol extension, the http source of the quotes. */ +/* Actually just finance.yahoo.com and fr.finance.yahoo.com are supported. */ +/* The function returns the country source (US or EUROPE). */ +/*****************************************************************************/ +yahoo_source find_yahoo_source(char *symbol) +{ + char *ptr; + int i; + int test; + + ptr = strrchr(symbol, '.'); + + /* If no extension we suppose it is a US stock */ + if (!ptr) return YAHOO_US; + + /* extension is found */ + + /* Test if it is canadian stock */ + for (i=0; iNextStock = stocks_getted; + stocks_getted->PreviousStock = last_stock; + + } + else (stocks_tmp = stocks_getted); + } + + *stock_datas = stocks_tmp; + + return(0); +} diff --git a/noncore/todayplugins/stockticker/libstocks/stocks.h b/noncore/todayplugins/stockticker/libstocks/stocks.h new file mode 100644 index 0000000..13250ca --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/stocks.h @@ -0,0 +1,116 @@ +/* libstocks - Library to get current stock quotes from Yahoo Finance + * + * Copyright (C) 2000 Eric Laeuffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __STOCKS_H__ +#define __STOCKS_H__ + +/* Defines for prototypes */ +#ifndef __LISTS_C__ +#define _LISTS_C_EXT extern +#else +#define _LISTS_C_EXT +#endif /* __LISTS_C__ */ + +#ifndef __STOCKS_C__ +#define _STOCKS_C_EXT extern +#else +#define _STOCKS_C_EXT +#endif /* __STOCKS_C__ */ + +#ifndef __HTTP_C__ +#define _HTTP_C_EXT extern +#else +#define _HTTP_C_EXT +#endif /* __HTTP_C__ */ + +#ifndef __CURRENCY_C__ +#define _CURRENCY_C_EXT extern +#else +#define _CURRENCY_C_EXT +#endif /* __CURRENCY_C__ */ + +#ifndef __HISTORY_C__ +#define _HISTORY_C_EXT extern +#else +#define _HISTORY_C_EXT +#endif /* __HISTORY_C__ */ + +typedef struct stockstruct stock; + +struct stockstruct { + char *Symbol; + char *Name; + char *Time; + char *Date; + float CurrentPrice; + float LastPrice; + float OpenPrice; + float MinPrice; + float MaxPrice; + float Variation; + float Pourcentage; + int Volume; + stock *PreviousStock; + stock *NextStock; +}; + +/* Errors generates by the library */ +typedef enum { + NOERR = 0, /* No error */ + ERRHOST = 1, /* No such host */ + ERRSOCK = 2, /* Can't create socket */ + ERRCONN = 3, /* Can't connect to host */ + ERRWHEA = 4, /* Write error on socket while writing */ + ERRRHEA = 5, /* Cannot find header in http response */ + ERRPAHD = 7, /* Invalid answer from data server */ + ERRPCSV = 8, /* Error in parsing csv file */ + ERRPROX = 20, /* Bad proxy url */ + ERRDATE = 30, /* Bad date format */ + ERRDATA = 40, /* No data available */ + ERRRANG = 50 /* No prices for this date range */ + +} libstocks_return_code; + +_LISTS_C_EXT stock *next_stock(stock *); +_LISTS_C_EXT stock *previous_stock(stock *); +_LISTS_C_EXT void free_stocks(stock *); +_LISTS_C_EXT stock *find_stock(stock *stocks, char *); + +_STOCKS_C_EXT libstocks_return_code get_stocks(const char *, stock **); + +_HTTP_C_EXT libstocks_return_code set_proxy(char *); + + +_CURRENCY_C_EXT libstocks_return_code get_currency_exchange(char *, + char *, + float *); + +_HISTORY_C_EXT libstocks_return_code get_history_csv(char *, + char *, + char *, + char **); + +_HISTORY_C_EXT libstocks_return_code get_stock_history(char *, + char *, + char *, + stock **); + + +#endif /* __STOCKS_H__ */ diff --git a/noncore/todayplugins/stockticker/opie-today-stocktickerplugin.control b/noncore/todayplugins/stockticker/opie-today-stocktickerplugin.control new file mode 100644 index 0000000..ddfe9b0 --- a/dev/null +++ b/noncore/todayplugins/stockticker/opie-today-stocktickerplugin.control @@ -0,0 +1,8 @@ +Files: plugins/today/libtodaystocktickerplugin.so* bin/stockticker +Priority: optional +Section: opie/applications +Maintainer: ljp +Architecture: arm +Version: $QPE_VERSION-$SUB_VERSION +Depends: qt-embedded (>=$QTE_VERSION), opie-today +Description: stockticker plugin for today diff --git a/noncore/todayplugins/stockticker/stockticker.pro b/noncore/todayplugins/stockticker/stockticker.pro new file mode 100644 index 0000000..96319da --- a/dev/null +++ b/noncore/todayplugins/stockticker/stockticker.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +unix:SUBDIRS = stockticker stocktickerlib diff --git a/noncore/todayplugins/stockticker/stockticker/.cvsignore b/noncore/todayplugins/stockticker/stockticker/.cvsignore new file mode 100644 index 0000000..c9bb88e --- a/dev/null +++ b/noncore/todayplugins/stockticker/stockticker/.cvsignore @@ -0,0 +1,3 @@ +Makefile* +moc_* +*.moc \ No newline at end of file diff --git a/noncore/todayplugins/stockticker/stockticker/inputDialog.cpp b/noncore/todayplugins/stockticker/stockticker/inputDialog.cpp new file mode 100644 index 0000000..ad841f2 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stockticker/inputDialog.cpp @@ -0,0 +1,143 @@ +#include "inputDialog.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +InputDialog::InputDialog( ) + : QMainWindow( 0x0, 0x0, WStyle_ContextHelp ) { + setCaption( tr("Enter Stock Symbols")); + + connect( qApp,SIGNAL( aboutToQuit()),SLOT( cleanUp()) ); + + QGridLayout *layout = new QGridLayout( this ); + layout->setSpacing(6); + layout->setMargin( 2); + + LineEdit1 = new QLineEdit( this, "LineEdit1" ); + LineEdit1->setFocus(); + QWhatsThis::add( LineEdit1, tr("Enter the stock symbols you want to be shown here.")); + + layout->addMultiCellWidget( LineEdit1, 0, 0, 0, 3); + + Config cfg( "stockticker"); + cfg.setGroup( "Symbols" ); + QString symbollist; + symbollist = cfg.readEntry("Symbols", ""); + LineEdit1->setText(symbollist); + + QLabel *label; + label = new QLabel(this); + label->setText( tr("Enter stock symbols seperated\nby a space.")); + label->setMaximumHeight(60); + layout->addMultiCellWidget( label, 1, 1, 0, 3); + + cfg.setGroup( "Fields" ); + + timeCheck= new QCheckBox ( "Time",this ); + timeCheck->setChecked( cfg.readBoolEntry("timeCheck",1)); + layout->addMultiCellWidget(timeCheck, 2, 2, 0, 0 ); + QWhatsThis::add( timeCheck, tr("Toggles Time Field")); + + dateCheck= new QCheckBox ( "Date", this ); + dateCheck->setChecked( cfg.readBoolEntry("dateCheck",1)); + layout->addMultiCellWidget( dateCheck, 2, 2, 1, 1 ); + QWhatsThis::add(dateCheck, tr("Toggles date field")); + + symbolCheck= new QCheckBox ( "Symbol", this ); + symbolCheck->setChecked( cfg.readBoolEntry("symbolCheck",1)); + layout->addMultiCellWidget( symbolCheck, 3, 3, 0, 0 ); + QWhatsThis::add(symbolCheck, tr("Toggles Symbol field")); + + nameCheck= new QCheckBox ( "Name", this ); + nameCheck->setChecked( cfg.readBoolEntry("nameCheck",1)); + layout->addMultiCellWidget( nameCheck, 3, 3, 1, 1 ); + QWhatsThis::add(nameCheck, tr("Toggles Name field")); + + currentPriceCheck= new QCheckBox ( "Current Price", this ); + currentPriceCheck->setChecked( cfg.readBoolEntry("currentPriceCheck",1)); + layout->addMultiCellWidget( currentPriceCheck, 4, 4, 0, 0 ); + QWhatsThis::add(currentPriceCheck, tr("Toggles current Price field")); + + + lastPriceCheck= new QCheckBox ( "Last Price", this ); + lastPriceCheck->setChecked( cfg.readBoolEntry("lastPriceCheck",1)); + layout->addMultiCellWidget(lastPriceCheck, 4, 4, 1, 1); + QWhatsThis::add(lastPriceCheck, tr("Toggles last price field")); + + openPriceCheck= new QCheckBox ( "Open Price", this); + openPriceCheck->setChecked( cfg.readBoolEntry("openPriceCheck",1)); + layout->addMultiCellWidget( openPriceCheck, 5, 5, 0, 0 ); + QWhatsThis::add(openPriceCheck, tr("Toggles opening price field")); + + minPriceCheck= new QCheckBox ( "Min Price", this ); + minPriceCheck->setChecked( cfg.readBoolEntry("minPriceCheck",1)); + layout->addMultiCellWidget( minPriceCheck, 5, 5, 1, 1); + QWhatsThis::add(minPriceCheck, tr("Toggles minamum price field")); + + maxPriceCheck= new QCheckBox ( "Max Price", this); + maxPriceCheck->setChecked( cfg.readBoolEntry("maxPriceCheck",1)); + layout->addMultiCellWidget( maxPriceCheck, 6, 6, 0, 0 ); + QWhatsThis::add(maxPriceCheck, tr("Toggles maximum price field")); + + variationCheck= new QCheckBox ( "Variation", this ); + variationCheck->setChecked( cfg.readBoolEntry("variationCheck",1)); + layout->addMultiCellWidget( variationCheck, 6, 6, 1, 1 ); + QWhatsThis::add(variationCheck, tr("Toggles daily variation field")); + + volumeCheck= new QCheckBox ( "Volume", this ); + volumeCheck->setChecked( cfg.readBoolEntry("volumeCheck",1)); + layout->addMultiCellWidget( volumeCheck , 7, 7, 0, 0); + QWhatsThis::add(volumeCheck, tr("Toggles volume field")); + + + QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Expanding ); + layout->addItem( spacer, 8, 0 ); + +} + +QString InputDialog::text() const { + return LineEdit1->text(); +} + +InputDialog::~InputDialog() { +} + +void InputDialog::cleanUp(){ + Config cfg( "stockticker"); + cfg.setGroup( "Symbols" ); + QString outText = text().upper(); + outText.stripWhiteSpace(); + cfg.writeEntry("Symbols", outText ); + qDebug( "<<<<<<<<<<<>>>>>>>>>>>>"+text()); + + cfg.setGroup( "Fields" ); + + cfg.writeEntry("timeCheck",timeCheck->isChecked()); + cfg.writeEntry("dateCheck",dateCheck->isChecked()); + cfg.writeEntry("symbolCheck",symbolCheck->isChecked()); + cfg.writeEntry("nameCheck",nameCheck->isChecked()); + cfg.writeEntry("currentPriceCheck",currentPriceCheck->isChecked()); + cfg.writeEntry("lastPriceCheck",lastPriceCheck->isChecked()); + cfg.writeEntry("openPriceCheck",openPriceCheck->isChecked()); + cfg.writeEntry("minPriceCheck",minPriceCheck->isChecked()); + cfg.writeEntry("maxPriceCheck",maxPriceCheck->isChecked()); + cfg.writeEntry("variationCheck",variationCheck->isChecked()); + cfg.writeEntry("volumeCheck",volumeCheck->isChecked()); + + + cfg.write(); +} + + diff --git a/noncore/todayplugins/stockticker/stockticker/inputDialog.h b/noncore/todayplugins/stockticker/stockticker/inputDialog.h new file mode 100644 index 0000000..8fda6ad --- a/dev/null +++ b/noncore/todayplugins/stockticker/stockticker/inputDialog.h @@ -0,0 +1,30 @@ + +#ifndef INPUTDIALOG_H +#define INPUTDIALOG_H + +#include +#include +#include + +class QLineEdit; +class QCheckBox; + +class InputDialog : public QMainWindow { + Q_OBJECT + +public: + InputDialog( ); +// InputDialog( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); + ~InputDialog(); + QString text()const; + +private: + QLineEdit* LineEdit1; + QCheckBox *timeCheck, *dateCheck, *symbolCheck, *nameCheck, *currentPriceCheck, *lastPriceCheck, *openPriceCheck, *minPriceCheck, *maxPriceCheck, *variationCheck, *volumeCheck; +private slots: + void cleanUp(); +protected slots: + +}; + +#endif // INPUTDIALOG_H diff --git a/noncore/todayplugins/stockticker/stockticker/main.cpp b/noncore/todayplugins/stockticker/stockticker/main.cpp new file mode 100644 index 0000000..da8da66 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stockticker/main.cpp @@ -0,0 +1,25 @@ + +/*************************************************************************** + main.cpp - description + ------------------- + begin : March 10, 2002 + copyright : (C) 2002 by llornkcor + email : ljp@llornkcor.com + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ +#include +#include "inputDialog.h" + +int main(int argc, char *argv[]) +{ + QPEApplication a(argc, argv); + + InputDialog input; + a.showMainWidget( &input); + return a.exec(); +} + + diff --git a/noncore/todayplugins/stockticker/stockticker/stockticker.pro b/noncore/todayplugins/stockticker/stockticker/stockticker.pro new file mode 100644 index 0000000..0e970f1 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stockticker/stockticker.pro @@ -0,0 +1,10 @@ +TEMPLATE = app +CONFIG = qt warn_on release +HEADERS = inputDialog.h +SOURCES = inputDialog.cpp main.cpp +INTERFACES = +TARGET = stockticker +INCLUDEPATH += $(OPIEDIR)/include +DEPENDPATH += $(OPIEDIR)/include +LIBS+= -lqpe +DESTDIR = $(OPIEDIR)/bin diff --git a/noncore/todayplugins/stockticker/stocktickerlib/.cvsignore b/noncore/todayplugins/stockticker/stocktickerlib/.cvsignore new file mode 100644 index 0000000..c9bb88e --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/.cvsignore @@ -0,0 +1,3 @@ +Makefile* +moc_* +*.moc \ No newline at end of file diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktickerlib.pro b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerlib.pro new file mode 100644 index 0000000..28ef072 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerlib.pro @@ -0,0 +1,27 @@ +TEMPLATE = lib +CONFIG -= moc +CONFIG += qt debug + +HEADERS = stocktickerplugin.h stocktickeruginimpl.h stocktickerpluginwidget.h ticker.h \ + ../libstocks/csv.h \ + ../libstocks/http.h \ + ../libstocks/lists.h \ + ../libstocks/stocks.h +SOURCES = stocktickerplugin.cpp stocktickerpluginimpl.cpp stocktickerpluginwidget.cpp ticker.cpp \ + ../libstocks/csv.c \ + ../libstocks/currency.c \ + ../libstocks/history.c \ + ../libstocks/http.c \ + ../libstocks/lists.c \ + ../libstocks/stocks.c + +INCLUDEPATH += $(OPIEDIR)/include \ + ../ ../library +DEPENDPATH += $(OPIEDIR)/include \ + ../ ../library + +LIBS+= -lqpe -lopie +TMAKE_CFLAGS += -D__UNIX__ + +DESTDIR = $(OPIEDIR)/plugins/today +TARGET = todaystocktickerplugin diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktickerplugin.cpp b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerplugin.cpp new file mode 100644 index 0000000..82dfb13 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerplugin.cpp @@ -0,0 +1,56 @@ +/* + * stocktickerplugin.cpp + * + * copyright : (c) 2002 by L.J. Potter + * email : llornkcor@handhelds.org + * + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "stocktickerplugin.h" +#include "stocktickerpluginwidget.h" + + +StockTickerPlugin::StockTickerPlugin() { +} + +StockTickerPlugin::~StockTickerPlugin() { +} + +QString StockTickerPlugin::pluginName() const { + return QObject::tr( "StockTicker plugin" ); +} + +double StockTickerPlugin::versionNumber() const { + return 0.6; +} + +QString StockTickerPlugin::pixmapNameWidget() const { + return "pass"; +} + +QWidget* StockTickerPlugin::widget( QWidget * wid ) { + return new StockTickerPluginWidget( wid, "StockTicker " ); +} + +QString StockTickerPlugin::pixmapNameConfig() const { + return 0l; +} + +TodayConfigWidget* StockTickerPlugin::configWidget( QWidget* wid ) { + return 0l; +} + +QString StockTickerPlugin::appName() const { + return "stockticker"; +} + + diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktickerplugin.h b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerplugin.h new file mode 100644 index 0000000..9f174bf --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerplugin.h @@ -0,0 +1,47 @@ +/* + * stocktickerplugin.h + * + * copyright : (c) 2002 by L.J. Potter + * email : llornkcor@handhelds.org + * + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef STOCKTICKER_PLUGIN_H +#define STOCKTICKER_PLUGIN_H + +#include +#include + +#include +#include + +#include +#include + +class StockTickerPlugin : public TodayPluginObject { + +public: + StockTickerPlugin(); + ~StockTickerPlugin(); + + QString pluginName() const; + double versionNumber() const; + QString pixmapNameWidget() const; + QWidget* widget(QWidget *); + QString pixmapNameConfig() const; + TodayConfigWidget* configWidget(QWidget *); + QString appName() const; + + +}; + +#endif diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginimpl.cpp b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginimpl.cpp new file mode 100644 index 0000000..9a640d4 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginimpl.cpp @@ -0,0 +1,45 @@ +/* + * stocktickerpluginimpl.cpp + * + * copyright : (c) 2002 by L.J. Potter + * email : llornkcor@handhelds.org + * + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + + +#include "stocktickerplugin.h" +#include "stocktickerpluginimpl.h" + +StockTickerPluginImpl::StockTickerPluginImpl() { + stocktickerPlugin = new StockTickerPlugin(); +} + +StockTickerPluginImpl::~StockTickerPluginImpl() { +} + + +TodayPluginObject* StockTickerPluginImpl::guiPart() { + return stocktickerPlugin; +} + +QRESULT StockTickerPluginImpl::queryInterface( const QUuid & uuid, QUnknownInterface **iface ) { + *iface = 0; + if ( ( uuid == IID_QUnknown ) || ( uuid == IID_TodayPluginInterface ) ) { + *iface = this, (*iface)->addRef(); + } + return QS_OK; + +} + +Q_EXPORT_INTERFACE() { + Q_CREATE_INSTANCE( StockTickerPluginImpl ); +} diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginimpl.h b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginimpl.h new file mode 100644 index 0000000..300c545 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginimpl.h @@ -0,0 +1,40 @@ +/* + * stocktickerpluginimpl.h + * + * copyright : (c) 2002 by L.J. Potter + * email : llornkcor@handhelds.org + * + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef STOCKTICKER_PLUGIN_IMPL_H +#define STOCKTICKER_PLUGIN_IMPL_H + +#include + +class StockTickerPlugin; + +class StockTickerPluginImpl : public TodayPluginInterface{ + +public: + StockTickerPluginImpl(); + virtual ~StockTickerPluginImpl(); + + QRESULT queryInterface( const QUuid &, QUnknownInterface** ); + Q_REFCOUNT + + virtual TodayPluginObject *guiPart(); + +private: + StockTickerPlugin *stocktickerPlugin; + ulong ref; +}; + +#endif diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginwidget.cpp b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginwidget.cpp new file mode 100644 index 0000000..3eaade4 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginwidget.cpp @@ -0,0 +1,239 @@ +/* + * stocktickerpluginwidget.cpp + * + * copyright : (c) 2002 by L.J. Potter + * email : llornkcor@handhelds.org + * + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "ticker.h" + +extern "C" { +#include "libstocks/stocks.h" +} + +#include "stocktickerpluginwidget.h" + +StockTickerPluginWidget::StockTickerPluginWidget( QWidget *parent, const char* name) + : QWidget(parent, name ) { + init(); +} + +StockTickerPluginWidget::~StockTickerPluginWidget() { +} + +void StockTickerPluginWidget::init() { + + QHBoxLayout* layout = new QHBoxLayout( this ); + + stocktickerTicker = new Ticker(this); + stocktickerTicker->setMinimumHeight(15); + connect( stocktickerTicker, SIGNAL( mousePressed()), this, SLOT( doStocks() )); + + layout->addWidget( stocktickerTicker); +} + +void StockTickerPluginWidget::doStocks() { + + Config cfg( "stockticker"); + cfg.setGroup( "Symbols" ); + QString symbollist; + symbollist = cfg.readEntry("Symbols", ""); + symbollist.replace(QRegExp(" "),"+");//seperated by + +// qDebug(symbollist); + + getStocks( symbollist.latin1()); + + stocktickerTicker->setText( output ); +} + +void StockTickerPluginWidget::getStocks( const char *blah) { + + stock *stocks_quotes=NULL; + stock *stocks_tmp; + + QString tempString; + output = ""; + + libstocks_return_code error; + + Config cfg( "stockticker"); + cfg.setGroup( "Fields" ); + bool dotimeCheck, dodateCheck, dosymbolCheck, donameCheck; + bool docurrentPriceCheck, dolastPriceCheck, doopenPriceCheck; + bool dominPriceCheck, domaxPriceCheck, dovariationCheck, dovolumeCheck; + + dotimeCheck=dodateCheck=dosymbolCheck=donameCheck= docurrentPriceCheck=dolastPriceCheck=doopenPriceCheck=dominPriceCheck=domaxPriceCheck=dovariationCheck=dovolumeCheck=false; + + dotimeCheck=cfg.readBoolEntry("timeCheck",1); + dodateCheck=cfg.readBoolEntry("dateCheck",1); + dosymbolCheck=cfg.readBoolEntry("symbolCheck",1); + donameCheck=cfg.readBoolEntry("nameCheck",1); + docurrentPriceCheck=cfg.readBoolEntry("currentPriceCheck",1); + dolastPriceCheck=cfg.readBoolEntry("lastPriceCheck",1); + doopenPriceCheck=cfg.readBoolEntry("openPriceCheck",1); + dominPriceCheck=cfg.readBoolEntry("minPriceCheck",1); + domaxPriceCheck=cfg.readBoolEntry("maxPriceCheck",1); + dovariationCheck=cfg.readBoolEntry("variationCheck",1); + dovolumeCheck=cfg.readBoolEntry("volumeCheck",1); + + DefProxy(); + char *stock_liste = (char *)blah; + /* Get the stocks and process errors */ + error = get_stocks( stock_liste, &stocks_quotes); + + if (error) { + printf("Error in getting stocks (%d)\n", error); + tempString.sprintf("Error in getting stocks (%d)\n", error); + output =tempString; + return; +// exit(1); + } + + stocks_tmp = stocks_quotes; + + /* Displays the stocks */ + while(stocks_tmp!=0){ + + if (stocks_tmp->Time) { +// printf("%s ", stocks_tmp->Time); + tempString.sprintf("|| %s ", stocks_tmp->Time); + tempString.replace(QRegExp("\""),""); + if( dotimeCheck) + output +=tempString; + } + if (stocks_tmp->Date) { +// printf("%s ", stocks_tmp->Date); + tempString.sprintf("| %s ", stocks_tmp->Date); + tempString.replace(QRegExp("\""),""); + if(dodateCheck) + output +=tempString; + } +// printf("\n"); + +// printf("----------------------------------------\n"); + + if ( strlen(stocks_tmp->Symbol) > 20 ) { +// printf("| Symbol | %.20s |\n",stocks_tmp->Symbol); + tempString.sprintf("| Symbol %s ",stocks_tmp->Symbol); + if(dosymbolCheck) + output +=tempString; + } + else { +// printf("| Symbol | %-20s |\n",stocks_tmp->Symbol); + tempString.sprintf("| Symbol %s ",stocks_tmp->Symbol); + if(dosymbolCheck) + output +=tempString; + } + + if (stocks_tmp->Name) { + if ( strlen(stocks_tmp->Name) > 20 ) { +// printf("| Name %.20s |\n",stocks_tmp->Name); + tempString.sprintf("| Name %s ",stocks_tmp->Name); + tempString.stripWhiteSpace(); + if(donameCheck) + output +=tempString; + } else { +// printf("| Name | %-20s |\n",stocks_tmp->Name); + tempString.sprintf("| Name %s ",stocks_tmp->Name); + tempString.stripWhiteSpace(); + if(donameCheck) + output +=tempString; + } + } + else { +// printf("| Name | |\n"); + tempString.sprintf("| Name | |"); + if(donameCheck) + output +=tempString; + } + +// printf("| Price | %-7.2f |\n", stocks_tmp->CurrentPrice); + tempString.sprintf("| Price %-7.2f ", stocks_tmp->CurrentPrice); + if(docurrentPriceCheck) + output +=tempString; + +// printf("| Yesterday | %-7.2f |\n",stocks_tmp->LastPrice); + tempString.sprintf("| Yesterday %-7.2f ",stocks_tmp->LastPrice); + if(dolastPriceCheck) + output +=tempString; + +// printf("| Open | %-7.2f |\n",stocks_tmp->OpenPrice); + tempString.sprintf("| Open %-7.2f ",stocks_tmp->OpenPrice); + if(doopenPriceCheck) + output +=tempString; + +// printf("| Min | %-7.2f |\n", stocks_tmp->MinPrice); + tempString.sprintf("| Min %-7.2f ", stocks_tmp->MinPrice); + if(dominPriceCheck) + output +=tempString; + +// printf("| Max | %-7.2f |\n",stocks_tmp->MaxPrice); + tempString.sprintf("| Max %-7.2f ",stocks_tmp->MaxPrice); + if(domaxPriceCheck) + output +=tempString; + +// printf("| Var | %-6.2f (%5.2f %%) |\n", stocks_tmp->Variation, stocks_tmp->Pourcentage); + tempString.sprintf("| Var %-6.2f (%5.2f %%) ", stocks_tmp->Variation, stocks_tmp->Pourcentage); + if(dovariationCheck) + output +=tempString; + +// printf("| Volume | %-9d |\n", stocks_tmp->Volume); + tempString.sprintf("| Volume %-9d ", stocks_tmp->Volume); + if(dovolumeCheck) + output +=tempString; + +// printf("----------------------------------------\n\n"); + tempString.sprintf("||==++=="); + output +=tempString; + + /* Simple function which help to browse in the stocks list */ + stocks_tmp = next_stock(stocks_tmp); + } + + /* frees stocks */ + free_stocks(stocks_quotes); + +} + +void StockTickerPluginWidget::DefProxy(void) { + char *proxy; + libstocks_return_code error; + + /* Proxy support */ + /* Checks for "http_proxy" environment variable */ + proxy = getenv("http_proxy"); + if(proxy) { + /* printf("proxy set\n"); */ + error = set_proxy(proxy); + if (error) { +// printf("Proxy error (%d)\n", error); + QString tempString; + tempString.sprintf("Proxy error (%d)\n", error); + output = tempString; + return; +// exit(1); + } + } +} diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginwidget.h b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginwidget.h new file mode 100644 index 0000000..6524ae4 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktickerpluginwidget.h @@ -0,0 +1,62 @@ +/* + * stocktickerpluginwidget.h + * + * copyright : (c) 2002 by L.J. Potter + * email : lornkcor@handhelds.org + * + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef STOCKTICKERL_PLUGIN_WIDGET_H +#define STOCKTICKERL_PLUGIN_WIDGET_H + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "ticker.h" + +/* extern "C" { */ +/* #include "stocks.h" */ +/* } */ + +class StockTickerPluginWidget : public QWidget { + + Q_OBJECT + +public: + StockTickerPluginWidget( QWidget *parent, const char *name ); + ~StockTickerPluginWidget(); + QString output; + +protected slots: + void doStocks(); + +private: + Ticker *stocktickerTicker; + + void init(); + void getStocks( const char *stock_liste); + void DefProxy(void); + +}; + +#endif diff --git a/noncore/todayplugins/stockticker/stocktickerlib/stocktimerpluginwidget.h b/noncore/todayplugins/stockticker/stocktickerlib/stocktimerpluginwidget.h new file mode 100644 index 0000000..2feef80 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/stocktimerpluginwidget.h @@ -0,0 +1,45 @@ +/* + * mailpluginwidget.h + * + * copyright : (c) 2002 by Maximilian Reiß + * email : harlekin@handhelds.org + * + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef MAIL_PLUGIN_WIDGET_H +#define MAIL_PLUGIN_WIDGET_H + +#include +#include + +#include +#include + +class MailPluginWidget : public QWidget { + + Q_OBJECT + + +public: + MailPluginWidget( QWidget *parent, const char *name ); + ~MailPluginWidget(); + +protected slots: + void startMail(); + +private: + OClickableLabel *mailLabel; + void readConfig(); + void getInfo(); +}; + +#endif diff --git a/noncore/todayplugins/stockticker/stocktickerlib/ticker.cpp b/noncore/todayplugins/stockticker/stocktickerlib/ticker.cpp new file mode 100644 index 0000000..6e6273b --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/ticker.cpp @@ -0,0 +1,93 @@ +/* +                This file is part of the Opie Project + +              Copyright (c) 2002 Max Reiss + Copyright (c) 2002 L. Potter + Copyright (c) 2002 Holger Freyther + =. + .=l. +           .>+-= + _;:,     .>    :=|. This program is free software; you can +.> <`_,   >  .   <= redistribute it and/or modify it under +:`=1 )Y*s>-.--   : the terms of the GNU General Public +.="- .-=="i,     .._ License as published by the Free Software + - .   .-<_>     .<> Foundation; either version 2 of the License, +     ._= =}       : or (at your option) any later version. +    .%`+i>       _;_. +    .i_,=:_.      -`: PARTICULAR PURPOSE. See the GNU +..}^=.=       =       ; Library General Public License for more +++=   -.     .`     .: details. + :     =  ...= . :.=- + -.   .:....=;==+<; You should have received a copy of the GNU +  -_. . .   )=.  = Library General Public License along with +    --        :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ticker.h" + +Ticker::Ticker( QWidget* parent=0 ) : QFrame( parent ) { + setFrameStyle( NoFrame/*WinPanel | Sunken */); +} + +Ticker::~Ticker() { +} + +void Ticker::setText( const QString& text ) { + + pos = 0; // reset it everytime the text is changed + scrollText = text; + + int pixelLen = fontMetrics().width( text ); + QPixmap pm( pixelLen, contentsRect().height() ); + pm.fill( QColor( 167, 212, 167 ) ); + QPainter pmp( &pm ); + pmp.setPen( Qt::black ); + pmp.drawText( 0, 0, pixelLen, contentsRect().height(), AlignVCenter, scrollText ); + pmp.end(); + scrollTextPixmap = pm; + + killTimers(); + if ( pixelLen > contentsRect().width() ) + startTimer( 50 ); + update(); +} + + +void Ticker::timerEvent( QTimerEvent * ) { + pos = ( pos <= 0 ) ? scrollTextPixmap.width() : pos - 1; + repaint( FALSE ); +} + +void Ticker::drawContents( QPainter *p ) { + int pixelLen = scrollTextPixmap.width(); + p->drawPixmap( pos, contentsRect().y(), scrollTextPixmap ); + if ( pixelLen > contentsRect().width() ) // Scrolling + p->drawPixmap( pos - pixelLen, contentsRect().y(), scrollTextPixmap ); +} + +void Ticker::mouseReleaseEvent( QMouseEvent * e) { + qDebug("<<<<<<<>>>>>>>>>"); + emit mousePressed(); +} diff --git a/noncore/todayplugins/stockticker/stocktickerlib/ticker.h b/noncore/todayplugins/stockticker/stocktickerlib/ticker.h new file mode 100644 index 0000000..3b68928 --- a/dev/null +++ b/noncore/todayplugins/stockticker/stocktickerlib/ticker.h @@ -0,0 +1,32 @@ +#ifndef TICKER_H +#define TICKER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class Ticker : public QFrame { + Q_OBJECT + +public: + Ticker( QWidget* parent=0 ); + ~Ticker(); + void setText( const QString& text ) ; +signals: + void mousePressed(); +protected: + void timerEvent( QTimerEvent * ); + void drawContents( QPainter *p ); + void mouseReleaseEvent ( QMouseEvent *); +private: + QString scrollText; + QPixmap scrollTextPixmap; + int pos;//, pixelLen; +}; + +#endif -- cgit v0.9.0.2