875 lines
20 KiB
C
875 lines
20 KiB
C
/*
|
|
|
|
YAWMPPP - PPP dock app/helper for WindowMaker
|
|
Copyright (C) 2000:
|
|
|
|
Author: Felipe Bergo (bergo@seul.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.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
$Id: loglist.c,v 1.1.1.1 2001/02/22 07:35:59 bergo Exp $
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <gtk/gtk.h>
|
|
#include "loglist.h"
|
|
#include "about.h"
|
|
|
|
#include "status_error.xpm"
|
|
#include "status_crash.xpm"
|
|
#include "status_ok.xpm"
|
|
#include "stepphone.xpm"
|
|
|
|
GtkWidget *applet,*loglist,*lresume[2],*hgraph,*wgraph;
|
|
GdkPixmap *iconmap[3];
|
|
GdkBitmap *maskmap[3];
|
|
|
|
GdkPixmap *hcanvas=NULL;
|
|
GdkPixmap *wcanvas=NULL;
|
|
|
|
GList *log=NULL;
|
|
|
|
/* start end difftime statuspix staustext handle name phone user */
|
|
static int colsize[8]={160,160,64,54,45,110,64,64};
|
|
|
|
static char *resumeo[]=
|
|
{
|
|
"All time",
|
|
"Today",
|
|
"Yesterday",
|
|
"This week",
|
|
"This month",
|
|
"This year",
|
|
"Last 24 hours",
|
|
"Last 7 days",
|
|
"Last 30 days",
|
|
"Last 365 days"
|
|
};
|
|
|
|
static char *titles[8]={"Start time",
|
|
"End time",
|
|
"Online time",
|
|
"Status",
|
|
"ISP",
|
|
"Dialup entry",
|
|
"Phone",
|
|
"User"};
|
|
|
|
static char *wdays[]={
|
|
"Sun","Mon","Tue","Wed","Thu","Fri","Sat"
|
|
};
|
|
|
|
static long hourly[24],weekly[7];
|
|
|
|
int nsrc[256];
|
|
|
|
GList *users=NULL;
|
|
GList *isps=NULL;
|
|
|
|
/* constraints */
|
|
|
|
time_t time_cons[2];
|
|
int useridx,ispidx;
|
|
|
|
int
|
|
main(int argc,char **argv)
|
|
{
|
|
int i;
|
|
|
|
for(i=0;i<24;i++)
|
|
hourly[i]=0;
|
|
for(i=0;i<7;i++)
|
|
weekly[i]=0;
|
|
for(i=0;i<256;i++)
|
|
nsrc[i]=i;
|
|
|
|
time_cons[0]=0;
|
|
time_cons[1]=0;
|
|
useridx=ispidx=0;
|
|
|
|
gtk_init(&argc,&argv);
|
|
gdk_rgb_init();
|
|
load_log();
|
|
create_loglist();
|
|
update_list();
|
|
|
|
make_resume();
|
|
|
|
gtk_main();
|
|
|
|
g_list_free(users);
|
|
g_list_free(isps);
|
|
for(i=0;i<3;i++)
|
|
gdk_pixmap_unref(iconmap[i]);
|
|
|
|
free_log();
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
create_loglist(void)
|
|
{
|
|
GtkWidget *mvb,*sw,*dhb,*dhw[30];
|
|
GdkBitmap *mask;
|
|
GdkPixmap *myicon;
|
|
GtkStyle *style;
|
|
GList *pt;
|
|
int i;
|
|
|
|
applet=gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
gtk_window_set_default_size(GTK_WINDOW(applet),780,510);
|
|
gtk_window_set_title (GTK_WINDOW (applet), "YAWMPPP Connection Log");
|
|
gtk_window_set_wmclass(GTK_WINDOW(applet),"yawmppp","log");
|
|
gtk_container_set_border_width(GTK_CONTAINER(applet),4);
|
|
gtk_widget_show (applet);
|
|
|
|
style=gtk_widget_get_style(applet);
|
|
myicon = gdk_pixmap_create_from_xpm_d (applet->window, &mask,
|
|
&style->bg[GTK_STATE_NORMAL],
|
|
(gchar **) stepphone_xpm);
|
|
gdk_window_set_icon (applet->window, NULL, myicon, mask);
|
|
gdk_window_set_icon_name(applet->window,"The Log");
|
|
|
|
mvb=gtk_vbox_new(FALSE,0);
|
|
gtk_container_add(GTK_CONTAINER(applet),mvb);
|
|
|
|
dhb=gtk_hbox_new(FALSE,0);
|
|
gtk_box_pack_start(GTK_BOX(mvb),dhb,FALSE,TRUE,0);
|
|
|
|
/* data */
|
|
dhw[0]=gtk_label_new("Show summary for:");
|
|
gtk_box_pack_start(GTK_BOX(dhb),dhw[0],FALSE,FALSE,4);
|
|
|
|
dhw[1]=gtk_option_menu_new();
|
|
gtk_box_pack_start(GTK_BOX(dhb),dhw[1],FALSE,FALSE,2);
|
|
|
|
dhw[2]=gtk_menu_new();
|
|
|
|
for(i=0;i<10;i++) {
|
|
dhw[3]=gtk_menu_item_new_with_label(resumeo[i]);
|
|
gtk_signal_connect(GTK_OBJECT(dhw[3]),"activate",
|
|
GTK_SIGNAL_FUNC(time_menu),&nsrc[i]);
|
|
gtk_menu_append(GTK_MENU(dhw[2]),dhw[3]);
|
|
gtk_widget_show(dhw[3]);
|
|
}
|
|
|
|
gtk_option_menu_set_menu(GTK_OPTION_MENU(dhw[1]),dhw[2]);
|
|
|
|
dhw[12]=gtk_label_new("include entries from");
|
|
gtk_box_pack_start(GTK_BOX(dhb),dhw[12],FALSE,FALSE,4);
|
|
dhw[13]=gtk_option_menu_new();
|
|
gtk_box_pack_start(GTK_BOX(dhb),dhw[13],FALSE,FALSE,2);
|
|
|
|
dhw[14]=gtk_menu_new();
|
|
|
|
for(i=0,pt=isps;pt!=NULL;pt=g_list_next(pt),i++) {
|
|
dhw[3]=gtk_menu_item_new_with_label((char *)(pt->data));
|
|
gtk_signal_connect(GTK_OBJECT(dhw[3]),"activate",
|
|
GTK_SIGNAL_FUNC(isp_menu),&nsrc[i]);
|
|
gtk_menu_append(GTK_MENU(dhw[14]),dhw[3]);
|
|
gtk_widget_show(dhw[3]);
|
|
}
|
|
|
|
gtk_option_menu_set_menu(GTK_OPTION_MENU(dhw[13]),dhw[14]);
|
|
|
|
|
|
dhw[15]=gtk_label_new("include connections as");
|
|
gtk_box_pack_start(GTK_BOX(dhb),dhw[15],FALSE,FALSE,4);
|
|
dhw[16]=gtk_option_menu_new();
|
|
gtk_box_pack_start(GTK_BOX(dhb),dhw[16],FALSE,FALSE,2);
|
|
|
|
dhw[17]=gtk_menu_new();
|
|
|
|
for(i=0,pt=users;pt!=NULL;pt=g_list_next(pt),i++) {
|
|
dhw[3]=gtk_menu_item_new_with_label((char *)(pt->data));
|
|
gtk_signal_connect(GTK_OBJECT(dhw[3]),"activate",
|
|
GTK_SIGNAL_FUNC(user_menu),&nsrc[i]);
|
|
gtk_menu_append(GTK_MENU(dhw[17]),dhw[3]);
|
|
gtk_widget_show(dhw[3]);
|
|
}
|
|
|
|
gtk_option_menu_set_menu(GTK_OPTION_MENU(dhw[16]),dhw[17]);
|
|
|
|
dhw[5]=gtk_hseparator_new();
|
|
gtk_box_pack_start(GTK_BOX(mvb),dhw[5],FALSE,FALSE,3);
|
|
|
|
dhw[3]=gtk_hbox_new(FALSE,4);
|
|
gtk_box_pack_start(GTK_BOX(mvb),dhw[3],FALSE,TRUE,3);
|
|
|
|
dhw[4]=lresume[0]=gtk_label_new("\n\n\n\n\n");
|
|
dhw[6]=lresume[1]=gtk_label_new("\n\n\n\n\n");
|
|
|
|
for(i=0;i<2;i++)
|
|
gtk_label_set_justify(GTK_LABEL(lresume[i]),GTK_JUSTIFY_LEFT);
|
|
|
|
gtk_box_pack_start(GTK_BOX(dhw[3]),dhw[4],FALSE,TRUE,4);
|
|
gtk_box_pack_start(GTK_BOX(dhw[3]),dhw[6],FALSE,TRUE,4);
|
|
|
|
hgraph=dhw[7]=gtk_drawing_area_new();
|
|
gtk_drawing_area_size(GTK_DRAWING_AREA(dhw[7]),24*9+2,120);
|
|
gtk_widget_set_events(dhw[7],GDK_EXPOSURE_MASK);
|
|
|
|
gtk_box_pack_start(GTK_BOX(dhw[3]),dhw[7],FALSE,FALSE,4);
|
|
|
|
wgraph=dhw[8]=gtk_drawing_area_new();
|
|
gtk_drawing_area_size(GTK_DRAWING_AREA(dhw[8]),7*20+2,120);
|
|
gtk_widget_set_events(dhw[8],GDK_EXPOSURE_MASK);
|
|
|
|
gtk_box_pack_start(GTK_BOX(dhw[3]),dhw[8],FALSE,FALSE,4);
|
|
|
|
dhw[11]=gtk_hseparator_new();
|
|
gtk_box_pack_start(GTK_BOX(mvb),dhw[11],FALSE,FALSE,4);
|
|
|
|
dhw[9]=gtk_hbox_new(FALSE,2);
|
|
dhw[10]=gtk_label_new("Raw log listing (unfiltered):");
|
|
|
|
gtk_box_pack_start(GTK_BOX(mvb),dhw[9],FALSE,FALSE,4);
|
|
gtk_box_pack_start(GTK_BOX(dhw[9]),dhw[10],FALSE,FALSE,2);
|
|
|
|
/* list */
|
|
|
|
sw=gtk_scrolled_window_new(NULL,NULL);
|
|
gtk_box_pack_start(GTK_BOX(mvb),sw,TRUE,TRUE,4);
|
|
gtk_widget_show(sw);
|
|
gtk_container_set_border_width(GTK_CONTAINER(sw),0);
|
|
|
|
loglist=gtk_clist_new(8);
|
|
gtk_clist_set_shadow_type(GTK_CLIST(loglist),GTK_SHADOW_IN);
|
|
gtk_clist_set_selection_mode(GTK_CLIST(loglist),GTK_SELECTION_SINGLE);
|
|
for(i=0;i<8;i++) {
|
|
gtk_clist_set_column_title(GTK_CLIST(loglist),i,titles[i]);
|
|
gtk_clist_set_column_width(GTK_CLIST(loglist),i,colsize[i]);
|
|
}
|
|
gtk_clist_column_titles_passive(GTK_CLIST(loglist));
|
|
gtk_clist_column_titles_show(GTK_CLIST(loglist));
|
|
gtk_clist_set_row_height(GTK_CLIST(loglist),16);
|
|
gtk_clist_set_column_auto_resize(GTK_CLIST(loglist),1,FALSE);
|
|
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
|
|
GTK_POLICY_AUTOMATIC,
|
|
GTK_POLICY_ALWAYS);
|
|
gtk_container_add(GTK_CONTAINER(sw),loglist);
|
|
gtk_widget_show(loglist);
|
|
|
|
/* bottom */
|
|
|
|
dhw[18]=gtk_hseparator_new();
|
|
gtk_box_pack_start(GTK_BOX(mvb),dhw[18],FALSE,FALSE,4);
|
|
|
|
dhw[19]=gtk_table_new(1,6,TRUE);
|
|
dhw[21]=gtk_button_new_with_label(" About... ");
|
|
dhw[22]=gtk_button_new_with_label(" Close ");
|
|
|
|
dhw[23]=gtk_hbox_new(TRUE,6);
|
|
|
|
gtk_box_pack_start(GTK_BOX(mvb),dhw[19],FALSE,FALSE,4);
|
|
|
|
gtk_table_attach_defaults(GTK_TABLE(dhw[19]),dhw[23],4,6,0,1);
|
|
|
|
gtk_box_pack_start(GTK_BOX(dhw[23]),dhw[21],FALSE,TRUE,4);
|
|
gtk_box_pack_start(GTK_BOX(dhw[23]),dhw[22],FALSE,TRUE,4);
|
|
|
|
for(i=0;i<24;i++)
|
|
if (i!=20)
|
|
gtk_widget_show(dhw[i]);
|
|
gtk_widget_show(dhb);
|
|
gtk_widget_show(mvb);
|
|
|
|
iconmap[0] = gdk_pixmap_create_from_xpm_d (applet->window, &maskmap[0],
|
|
&style->bg[GTK_STATE_NORMAL],
|
|
(gchar **) status_ok_xpm);
|
|
iconmap[1] = gdk_pixmap_create_from_xpm_d (applet->window, &maskmap[1],
|
|
&style->bg[GTK_STATE_NORMAL],
|
|
(gchar **) status_error_xpm);
|
|
iconmap[2] = gdk_pixmap_create_from_xpm_d (applet->window, &maskmap[2],
|
|
&style->bg[GTK_STATE_NORMAL],
|
|
(gchar **) status_crash_xpm);
|
|
|
|
/* signal plumbing */
|
|
gtk_signal_connect (GTK_OBJECT (applet), "delete_event",
|
|
GTK_SIGNAL_FUNC (applet_kill), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (applet), "destroy",
|
|
GTK_SIGNAL_FUNC (applet_destroy), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (hgraph), "expose_event",
|
|
GTK_SIGNAL_FUNC (hgra_expose), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (hgraph), "configure_event",
|
|
GTK_SIGNAL_FUNC (hgra_configure), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (wgraph), "expose_event",
|
|
GTK_SIGNAL_FUNC (wgra_expose), NULL);
|
|
gtk_signal_connect (GTK_OBJECT (wgraph), "configure_event",
|
|
GTK_SIGNAL_FUNC (wgra_configure), NULL);
|
|
|
|
gtk_signal_connect (GTK_OBJECT (dhw[21]), "clicked",
|
|
GTK_SIGNAL_FUNC (applet_about),
|
|
(gpointer)GTK_WINDOW(applet));
|
|
gtk_signal_connect (GTK_OBJECT (dhw[22]), "clicked",
|
|
GTK_SIGNAL_FUNC (applet_destroy), NULL);
|
|
}
|
|
|
|
void
|
|
load_log(void)
|
|
{
|
|
FILE *f;
|
|
char *p;
|
|
char temp[256],aux[256];
|
|
GList *pt;
|
|
struct logentry *le;
|
|
|
|
if (users)
|
|
g_list_free(users);
|
|
if (isps)
|
|
g_list_free(isps);
|
|
users=NULL;
|
|
isps=NULL;
|
|
|
|
users=g_list_append(users,"All users");
|
|
isps=g_list_append(isps,"All ISPs");
|
|
|
|
p=getenv("HOME");
|
|
sprintf(temp,"%s/.yawmppp2/logfile",p);
|
|
|
|
if (log)
|
|
free_log();
|
|
|
|
f=fopen(temp,"r");
|
|
if (!f)
|
|
return;
|
|
|
|
while(fgets(aux,255,f))
|
|
prepend_log_entry(aux);
|
|
|
|
fclose(f);
|
|
|
|
for(pt=log;pt!=NULL;pt=g_list_next(pt)) {
|
|
le=(struct logentry *)(pt->data);
|
|
|
|
if (!already_exists(le->user,users)) {
|
|
users=g_list_append(users,(gpointer)(le->user));
|
|
}
|
|
|
|
if (!already_exists(le->shortname,isps))
|
|
isps=g_list_append(isps,(gpointer)(le->shortname));
|
|
}
|
|
}
|
|
|
|
void
|
|
prepend_log_entry(char *logline)
|
|
{
|
|
char *p;
|
|
struct logentry *le;
|
|
|
|
le=(struct logentry *)g_malloc0(sizeof(struct logentry));
|
|
|
|
if ((p=strtok(logline,"\t\n"))==NULL) { g_free(le); return; }
|
|
le->start=(time_t)atol(p);
|
|
|
|
if ((p=strtok(NULL,"\t\n"))==NULL) { g_free(le); return; }
|
|
le->end=(time_t)atol(p);
|
|
|
|
if ((p=strtok(NULL,"\t\n"))==NULL) { g_free(le); return; }
|
|
le->status=atoi(p);
|
|
|
|
if ((p=strtok(NULL,"\t\n"))==NULL) { g_free(le); return; }
|
|
strncpy(le->longname,p,128);
|
|
|
|
if ((p=strtok(NULL,"\t\n"))==NULL) { g_free(le); return; }
|
|
strncpy(le->shortname,p,16);
|
|
|
|
if ((p=strtok(NULL,"\t\n"))==NULL) { g_free(le); return; }
|
|
strncpy(le->phone,p,32);
|
|
|
|
if ((p=strtok(NULL,"\t\n"))==NULL) { g_free(le); return; }
|
|
strncpy(le->user,p,32);
|
|
|
|
log=g_list_prepend(log,(gpointer)(le));
|
|
}
|
|
|
|
void
|
|
free_log(void)
|
|
{
|
|
GList *pt;
|
|
|
|
for(pt=log;pt!=NULL;pt=g_list_next(pt))
|
|
g_free(pt->data);
|
|
|
|
g_list_free(log);
|
|
log=NULL;
|
|
}
|
|
|
|
void
|
|
update_list(void)
|
|
{
|
|
GList *pt;
|
|
struct logentry *le;
|
|
char tmp[8][128];
|
|
gchar *pp[8];
|
|
int ontime,h,m,s,i;
|
|
int lc;
|
|
|
|
gtk_clist_freeze(GTK_CLIST(loglist));
|
|
gtk_clist_clear(GTK_CLIST(loglist));
|
|
|
|
for(i=0;i<8;i++)
|
|
pp[i]=tmp[i];
|
|
|
|
for(lc=0,pt=log;pt!=NULL;pt=g_list_next(pt),lc++) {
|
|
le=(struct logentry *)(pt->data);
|
|
strcpy(tmp[0],ctime(&(le->start)));
|
|
strcpy(tmp[1],ctime(&(le->end)));
|
|
ontime=(int)(le->end - le->start);
|
|
h=ontime/3600;
|
|
ontime-=3600*h;
|
|
m=ontime/60;
|
|
ontime-=60*m;
|
|
s=ontime;
|
|
sprintf(tmp[2],"%.4d:%.2d:%.2d",h,m,s);
|
|
switch(le->status) {
|
|
case 0:
|
|
strcpy(tmp[3],"OK");
|
|
break;
|
|
case 1:
|
|
strcpy(tmp[3],"Error");
|
|
break;
|
|
default:
|
|
strcpy(tmp[3],"Crash");
|
|
}
|
|
strcpy(tmp[4],le->shortname);
|
|
strcpy(tmp[5],le->longname);
|
|
strcpy(tmp[6],le->phone);
|
|
strcpy(tmp[7],le->user);
|
|
|
|
gtk_clist_append(GTK_CLIST(loglist),pp);
|
|
gtk_clist_set_pixtext(GTK_CLIST(loglist),lc,3,
|
|
tmp[3],6,
|
|
iconmap[le->status%3],
|
|
maskmap[le->status%3]);
|
|
}
|
|
|
|
gtk_clist_thaw(GTK_CLIST(loglist));
|
|
}
|
|
|
|
|
|
gint
|
|
applet_kill (GtkWidget * widget, GdkEvent * event, gpointer data)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
void
|
|
applet_destroy (GtkWidget * widget, gpointer data)
|
|
{
|
|
gtk_main_quit();
|
|
}
|
|
|
|
void
|
|
make_resume(void)
|
|
{
|
|
static char temp[1024],aux[256];
|
|
GList *pt;
|
|
long olt,ldiff,avg,maior,menor;
|
|
struct logentry *le;
|
|
int h,m,s,
|
|
i,n,t,
|
|
j,o,u,
|
|
k,p,v;
|
|
int ec;
|
|
int sv[3];
|
|
|
|
for(i=0;i<24;i++)
|
|
hourly[i]=0;
|
|
for(i=0;i<7;i++)
|
|
weekly[i]=0;
|
|
|
|
strcpy(temp,"Summary:\n\n");
|
|
|
|
olt=0;
|
|
sv[0]=sv[1]=sv[2]=0;
|
|
ec=0;
|
|
maior=0;
|
|
menor=time(NULL); /* unless you've been wired since
|
|
Jan 1 1970 this will work... ;-) */
|
|
for(pt=log;pt!=NULL;pt=g_list_next(pt)) {
|
|
le=(struct logentry *)(pt->data);
|
|
|
|
if (time_cons[1]!=0)
|
|
if ((le->end < time_cons[0])||(le->start > time_cons[1]))
|
|
continue;
|
|
if (useridx)
|
|
if (strcmp((char *)(g_list_nth_data(users,useridx)),le->user))
|
|
continue;
|
|
if (ispidx)
|
|
if (strcmp((char *)(g_list_nth_data(isps,ispidx)),le->shortname))
|
|
continue;
|
|
|
|
ec++;
|
|
ldiff=(le->end - le->start);
|
|
olt+=ldiff;
|
|
sv[le->status]++;
|
|
add_hourly(le->start,le->end);
|
|
add_weekly(le->start,le->end);
|
|
|
|
if (ldiff>maior)
|
|
maior=ldiff;
|
|
if (ldiff<menor)
|
|
menor=ldiff;
|
|
}
|
|
|
|
sprintf(aux,"Connections: %d\n"\
|
|
"Disconnected OK: %d\n"\
|
|
"Disconnected Error: %d\n"\
|
|
"Disconnected Crash: %d\n",ec,sv[0],sv[1],sv[2]);
|
|
strcat(temp,aux);
|
|
|
|
gtk_label_set_text(GTK_LABEL(lresume[0]),temp);
|
|
|
|
if (ec)
|
|
avg=olt/ec;
|
|
else
|
|
avg=0;
|
|
|
|
h=olt/3600;
|
|
olt-=3600*h;
|
|
m=olt/60;
|
|
olt-=60*m;
|
|
s=olt;
|
|
|
|
i=avg/3600;
|
|
avg-=3600*i;
|
|
n=avg/60;
|
|
avg-=60*n;
|
|
t=avg;
|
|
|
|
j=maior/3600;
|
|
maior-=3600*j;
|
|
o=maior/60;
|
|
maior-=60*o;
|
|
u=maior;
|
|
|
|
k=menor/3600;
|
|
menor-=3600*k;
|
|
p=menor/60;
|
|
menor-=60*p;
|
|
v=menor;
|
|
|
|
strcpy(temp,"\n\n");
|
|
sprintf(aux,"Online time: %.4d:%.2d:%.2d\n"\
|
|
"Average connection length: %.4d:%.2d:%.2d\n"\
|
|
"Longer connection: %.4d:%.2d:%.2d\n"\
|
|
"Shorter connection: %.4d:%.2d:%.2d\n",
|
|
h,m,s,
|
|
i,n,t,
|
|
j,o,u,
|
|
k,p,v);
|
|
strcat(temp,aux);
|
|
|
|
gtk_label_set_text(GTK_LABEL(lresume[1]),temp);
|
|
gtk_widget_queue_resize(hgraph);
|
|
gtk_widget_queue_resize(wgraph);
|
|
}
|
|
|
|
void
|
|
add_hourly(long s,long e)
|
|
{
|
|
time_t t;
|
|
struct tm *st;
|
|
|
|
for(t=s;t<=e;t+=30) {
|
|
st=localtime(&t);
|
|
if (!st)
|
|
exit(2);
|
|
hourly[st->tm_hour]++;
|
|
}
|
|
}
|
|
|
|
void
|
|
add_weekly(long s,long e)
|
|
{
|
|
time_t t;
|
|
struct tm *st;
|
|
|
|
for(t=s;t<=e;t+=30) {
|
|
st=localtime(&t);
|
|
if (!st)
|
|
exit(2);
|
|
weekly[st->tm_wday]++;
|
|
}
|
|
}
|
|
|
|
gint
|
|
hgra_expose(GtkWidget *widget,GdkEventExpose *ee,gpointer data)
|
|
{
|
|
gdk_draw_pixmap(widget->window,
|
|
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
|
|
hcanvas,
|
|
ee->area.x, ee->area.y,
|
|
ee->area.x, ee->area.y,
|
|
ee->area.width, ee->area.height);
|
|
return FALSE;
|
|
}
|
|
|
|
gint
|
|
hgra_configure(GtkWidget *widget,GdkEventConfigure *ee,gpointer data)
|
|
{
|
|
GdkGC *mygc;
|
|
int x,y,cx,xs;
|
|
int i,v;
|
|
long max;
|
|
float fac;
|
|
GdkFont *fn;
|
|
char tmp[64];
|
|
|
|
if (hcanvas!=NULL)
|
|
gdk_pixmap_unref(hcanvas);
|
|
|
|
mygc=gdk_gc_new(widget->window);
|
|
|
|
hcanvas=gdk_pixmap_new(widget->window,x=widget->allocation.width,
|
|
y=widget->allocation.height,-1);
|
|
gdk_draw_rectangle(hcanvas,widget->style->white_gc,TRUE,0,0,x,y);
|
|
gdk_draw_rectangle(hcanvas,widget->style->black_gc,FALSE,0,0,x-1,y-1);
|
|
|
|
max=0;
|
|
for(i=0;i<24;i++)
|
|
if (hourly[i]>max)
|
|
max=hourly[i];
|
|
|
|
if (max==0) max=1;
|
|
fac=((float)(y-18-16))/((float)max);
|
|
|
|
cx=1;
|
|
xs=(x-2)/24;
|
|
fn=gdk_font_load("-*-helvetica-medium-r-*-*-8-*-*-*-*-*-*-*");
|
|
for (i=0;i<24;i++) {
|
|
v=(int)(((float)hourly[i])*fac);
|
|
gdk_rgb_gc_set_foreground(mygc,0xc0c0c0);
|
|
gdk_draw_line(hcanvas,mygc,cx,1,cx,y-2);
|
|
gdk_rgb_gc_set_foreground(mygc,0x004080);
|
|
gdk_draw_rectangle(hcanvas,mygc,TRUE,cx,y-18-v,xs,v);
|
|
cx+=xs;
|
|
}
|
|
|
|
gdk_rgb_gc_set_foreground(mygc,0x000000);
|
|
for(cx=1,i=0;i<24;i+=2) {
|
|
sprintf(tmp,"%2d",i);
|
|
gdk_draw_string(hcanvas,fn,mygc,cx,y-6,tmp);
|
|
cx+=2*xs;
|
|
}
|
|
|
|
gdk_draw_line(hcanvas,widget->style->black_gc,0,y-18,x-1,y-18);
|
|
|
|
gdk_rgb_gc_set_foreground(mygc,0xffffff);
|
|
gdk_draw_rectangle(hcanvas,mygc,TRUE,0,0,22*4,13);
|
|
gdk_rgb_gc_set_foreground(mygc,0x000000);
|
|
gdk_draw_rectangle(hcanvas,mygc,FALSE,0,0,22*4,13);
|
|
|
|
gdk_font_unref(fn);
|
|
fn=gdk_font_load("-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*");
|
|
|
|
gdk_draw_string(hcanvas,fn,mygc,5,10,"hourly summary");
|
|
|
|
gdk_font_unref(fn);
|
|
gdk_gc_destroy(mygc);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
gint
|
|
wgra_expose(GtkWidget *widget,GdkEventExpose *ee,gpointer data)
|
|
{
|
|
gdk_draw_pixmap(widget->window,
|
|
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
|
|
wcanvas,
|
|
ee->area.x, ee->area.y,
|
|
ee->area.x, ee->area.y,
|
|
ee->area.width, ee->area.height);
|
|
return FALSE;
|
|
}
|
|
|
|
gint
|
|
wgra_configure(GtkWidget *widget,GdkEventConfigure *ee,gpointer data)
|
|
{
|
|
GdkGC *mygc;
|
|
int x,y,cx,xs;
|
|
int i,v;
|
|
long max;
|
|
float fac;
|
|
GdkFont *fn;
|
|
|
|
if (wcanvas!=NULL)
|
|
gdk_pixmap_unref(wcanvas);
|
|
|
|
mygc=gdk_gc_new(widget->window);
|
|
|
|
wcanvas=gdk_pixmap_new(widget->window,x=widget->allocation.width,
|
|
y=widget->allocation.height,-1);
|
|
gdk_draw_rectangle(wcanvas,widget->style->white_gc,TRUE,0,0,x,y);
|
|
gdk_draw_rectangle(wcanvas,widget->style->black_gc,FALSE,0,0,x-1,y-1);
|
|
|
|
max=0;
|
|
for(i=0;i<7;i++)
|
|
if (weekly[i]>max)
|
|
max=weekly[i];
|
|
|
|
if (!max) max=1;
|
|
fac=((float)(y-18-16))/((float)max);
|
|
|
|
cx=1;
|
|
xs=(x-2)/7;
|
|
fn=gdk_font_load("-*-helvetica-medium-r-*-*-8-*-*-*-*-*-*-*");
|
|
for (i=0;i<7;i++) {
|
|
v=(int)(((float)weekly[i])*fac);
|
|
gdk_rgb_gc_set_foreground(mygc,0xc0c0c0);
|
|
gdk_draw_line(wcanvas,mygc,cx,1,cx,y-2);
|
|
gdk_rgb_gc_set_foreground(mygc,0x004080);
|
|
gdk_draw_rectangle(wcanvas,mygc,TRUE,cx,y-18-v,xs,v);
|
|
gdk_rgb_gc_set_foreground(mygc,0x000000);
|
|
gdk_draw_string(wcanvas,fn,mygc,cx,y-6,wdays[i]);
|
|
cx+=xs;
|
|
}
|
|
|
|
gdk_draw_line(wcanvas,widget->style->black_gc,0,y-18,x-1,y-18);
|
|
|
|
gdk_rgb_gc_set_foreground(mygc,0xffffff);
|
|
gdk_draw_rectangle(wcanvas,mygc,TRUE,0,0,23*4,13);
|
|
gdk_rgb_gc_set_foreground(mygc,0x000000);
|
|
gdk_draw_rectangle(wcanvas,mygc,FALSE,0,0,23*4,13);
|
|
|
|
gdk_font_unref(fn);
|
|
fn=gdk_font_load("-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*");
|
|
|
|
gdk_draw_string(wcanvas,fn,mygc,5,10,"weekday summary");
|
|
|
|
gdk_font_unref(fn);
|
|
gdk_gc_destroy(mygc);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void
|
|
time_menu(GtkMenuItem *gmi,gpointer data)
|
|
{
|
|
int x;
|
|
struct tm *his;
|
|
time_t t;
|
|
|
|
x=*((int *)data);
|
|
|
|
t=time(NULL);
|
|
his=localtime(&t);
|
|
|
|
switch(x) {
|
|
case 0: /* all */
|
|
time_cons[0]=time_cons[1]=0;
|
|
break;
|
|
case 1: /* today */
|
|
his->tm_sec=0;
|
|
his->tm_min=0;
|
|
his->tm_hour=0;
|
|
time_cons[0]=mktime(his);
|
|
his->tm_sec=59;
|
|
his->tm_min=59;
|
|
his->tm_hour=23;
|
|
time_cons[1]=mktime(his);
|
|
break;
|
|
case 2: /* yesterday */
|
|
t-=24*3600;
|
|
his=localtime(&t);
|
|
his->tm_sec=0;
|
|
his->tm_min=0;
|
|
his->tm_hour=0;
|
|
time_cons[0]=mktime(his);
|
|
his->tm_sec=59;
|
|
his->tm_min=59;
|
|
his->tm_hour=23;
|
|
time_cons[1]=mktime(his);
|
|
break;
|
|
case 3: /* this week */
|
|
t-=((long)(24*3600))*((long)(his->tm_wday));
|
|
his=localtime(&t);
|
|
his->tm_sec=0;
|
|
his->tm_min=0;
|
|
his->tm_hour=0;
|
|
time_cons[0]=mktime(his);
|
|
time_cons[1]=time(NULL);
|
|
break;
|
|
case 4: /* this month */
|
|
t-=((long)(24*3600))*((long)(his->tm_mday));
|
|
his=localtime(&t);
|
|
his->tm_sec=0;
|
|
his->tm_min=0;
|
|
his->tm_hour=0;
|
|
time_cons[0]=mktime(his);
|
|
time_cons[1]=time(NULL);
|
|
break;
|
|
case 5: /* this year */
|
|
t-=((long)(24*3600))*((long)(his->tm_yday));
|
|
his=localtime(&t);
|
|
his->tm_sec=0;
|
|
his->tm_min=0;
|
|
his->tm_hour=0;
|
|
time_cons[0]=mktime(his);
|
|
time_cons[1]=time(NULL);
|
|
break;
|
|
case 6: /* Last 24 hours */
|
|
time_cons[0]=t-24*3600;
|
|
time_cons[1]=t;
|
|
break;
|
|
case 7: /* Last 7 days */
|
|
time_cons[0]=t-7*24*3600;
|
|
time_cons[1]=t;
|
|
break;
|
|
case 8: /* Last 30 days */
|
|
time_cons[0]=t-30*24*3600;
|
|
time_cons[1]=t;
|
|
break;
|
|
case 9:
|
|
time_cons[0]=t-365*24*3600;
|
|
time_cons[1]=t;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
make_resume();
|
|
}
|
|
|
|
void
|
|
user_menu(GtkMenuItem *gmi,gpointer data)
|
|
{
|
|
useridx=*((int *)data);
|
|
make_resume();
|
|
}
|
|
|
|
void
|
|
isp_menu(GtkMenuItem *gmi,gpointer data)
|
|
{
|
|
ispidx=*((int *)data);
|
|
make_resume();
|
|
}
|
|
|
|
int
|
|
already_exists(char *s,GList *pt)
|
|
{
|
|
GList *w;
|
|
for(w=pt;w!=NULL;w=g_list_next(w)) {
|
|
if (!strcmp((char *)(w->data),s))
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|