4 * wmdonkeymon 0.9 (C) 2002 Marcelo Burgos Morgade Cortizo (marcelomorgade@ig.com.br)
6 * - Show status of edonkey downloads based on '*.part.met' files
23 #include "../wmgeneral/wmgeneral.h"
24 #include "wmdonkeymon_master.xpm"
25 #include "wmdonkeymon_mask.xbm"
33 int xpos
[] = { 66, 71, 76, 81, 86, 91, /* A B C D E F */
34 66, 71, 76, 81, 86, 91, /* G H I J K L */
35 66, 71, 76, 81, 86, 91, /* M N O P Q R */
36 66, 71, 76, 81, 86, 91, /* S T U V W X */
37 66, 71, 76, 81, 86, 91, /* Y Z / _ - . */
45 int ypos
[] = { 4, 4, 4, 4, 4, 4,
47 14, 14, 14, 14, 14, 14,
48 19, 19, 19, 19, 19, 19,
49 24, 24, 24, 24, 24, 24,
78 void showString(char * buf
, int row
);
79 void pressEvent(XButtonEvent
* xev
);
80 void getStatus(int i
,char * st
);
81 void loadConfig(char * dir
);
84 int main(int argc
, char *argv
[])
86 int i
=0,debug
=0,r
,j
=0,x
=0,selected
=-1;
88 int colord
=66,colorg
=71;
89 struct dirent
**namelist
;
91 unsigned char buf
[516] ;
93 for (i
=1; i
<argc
; i
++) {
99 printf("Using temp dir %s\n",tmpdir
);
103 if (!strcasecmp(argv
[i
+1],"red")) colord
=71;
104 else if (!strcasecmp(argv
[i
+1],"blue")) colord
=76;
105 else if (!strcasecmp(argv
[i
+1],"yellow")) colord
=81;
106 else if (!strcasecmp(argv
[i
+1],"white")) colord
=86;
107 else if (!strcasecmp(argv
[i
+1],"cyan")) colord
=91;
108 else if (!strcasecmp(argv
[i
+1],"black")) colord
=96;
109 else if (!strcasecmp(argv
[i
+1],"blank")) colord
=101;
110 else printf("Invalid color %s\n",argv
[i
+1]);
111 }else {usage();exit(-1);}
115 if (!strcasecmp(argv
[i
+1],"green")) colorg
=66;
116 else if (!strcasecmp(argv
[i
+1],"blue")) colorg
=76;
117 else if (!strcasecmp(argv
[i
+1],"yellow")) colorg
=81;
118 else if (!strcasecmp(argv
[i
+1],"white")) colorg
=86;
119 else if (!strcasecmp(argv
[i
+1],"cyan")) colorg
=91;
120 else if (!strcasecmp(argv
[i
+1],"black")) colorg
=96;
121 else if (!strcasecmp(argv
[i
+1],"blank")) colorg
=101;
122 else printf("Invalid color %s\n",argv
[i
+1]);
123 }else {usage();exit(-1);}
131 printf("Debuggin mode: \n");
140 if (!tmpdir
) { usage(); exit(-1);}
142 openXwindow(argc
, argv
, wmdonkeymon_master_xpm
, wmdonkeymon_mask_bits
, wmdonkeymon_mask_width
, wmdonkeymon_mask_height
);
143 copyXPMArea(5,60,52,54,5,3);
153 short int len
=0,vlen
=0;
154 int gaps
=0, firstgap
= 0x7fffffff, miss
=0, fsize
=0,metcount
=0;
155 long int fileSize
=0, num
=0;
156 char nvalue
[516],value
[516];
159 // Search for files in temp directory
160 ls
= scandir(tmpdir
, &namelist
, 0, alphasort
);
162 printf("Can't find files in %s",tmpdir
);
166 while(ls
-- && (metcount
<4)) {
168 pt
= strstr(namelist
[ls
]->d_name
,".part.met");
169 if (pt
&& !strcmp(pt
,".part.met")) {
170 if(debug
)printf("File: %s\n",namelist
[ls
]->d_name
);
171 strcpy(files
[metcount
].metname
,namelist
[ls
]->d_name
);
178 for (metnum
=0; metnum
< metcount
; metnum
++) {
180 sprintf(buf
,"%s%s",tmpdir
,files
[metnum
].metname
);
181 files
[metnum
].t_miss
=0;
182 if(debug
)printf("opening %s\n",buf
);
183 if ( (met
= fopen(buf
,"rb")) != NULL
) {}
184 else {printf("Nada\n");};
187 i
+= fread(buf
,1,1,met
);
188 if(debug
){ printf("Version: %x\n",buf
[0]); }
191 i
+= fread(buf
,1,4,met
);
192 if(debug
) { printf("Date: %x %x %x %x \n",buf
[0],buf
[1],buf
[2],buf
[3]); }
195 i
+= fread(buf
,1,16,met
);
196 if(debug
){ printf("Hash: "); for (j
=0;j
<16;j
++) printf("%x ",buf
[j
]); printf("\n"); }
200 i
+= fread(buf
,1,2,met
);
202 if(debug
) printf("Num of Hashes: %d\n",j
);
207 if(debug
){printf("Hash %d: ",i
+1); for (x
=0;x
<16;x
++) printf("%x ",buf
[x
]); printf("\n");}
211 i
= fread(buf
,1,4,met
);
213 if(debug
){printf("Num of Meta Tags: %ld\n",num
);}
218 fread(&type
,1,1,met
);
220 fread(nvalue
,1,len
,met
);
223 fread(&vlen
,1,2,met
);
224 fread(value
,1,vlen
,met
);
230 strcpy(files
[metnum
].name
,value
);
231 if(debug
){printf("File Name: %s\n",value
);}
234 if(debug
){printf("File Type: %s\n",value
);}
235 strcpy(files
[metnum
].type
,value
);
238 if(debug
){printf("File Format: %s\n",value
);}
241 if(debug
){printf("Temp file: %s\n",value
);}
246 } else if (debug
)printf("Unknow String Tag %d: %s",nvalue
[0],value
);
248 fread(&fsize
,1,4,met
);
253 if(debug
)printf("File Size: %d KB\n",fsize
/(1024));
257 if(debug
)printf("Copied so Far: %d KB\n",fsize
/(1024));
258 files
[metnum
].copied
=fsize
;
261 if(debug
) printf("Priority: %d\n",fsize
);
264 if(debug
)printf("Status: %d\n",fsize
);
265 files
[metnum
].status
= fsize
;
268 if(debug
)printf("Unknow Tag %d: %d\n",nvalue
[0],fsize
);
274 if(debug
)printf("gap %3s from %10d", &nvalue
[1], fsize
);
276 if (gaps
< firstgap
) firstgap
= gaps
;
277 }else if (nvalue
[0]==10){
279 gi
= (long int)((SLOT_SIZE
* (gaps
/1024)) / (fileSize
/1024));
280 gf
= (long int)((SLOT_SIZE
* (fsize
/1024)) / (fileSize
/1024));
282 files
[metnum
].gappos
[x
][0] = gi
;
283 files
[metnum
].gappos
[x
][1] = gf
;
286 files
[metnum
].t_miss
+= miss
;
287 if(debug
)printf(" to %10d = %10d Size(%d) Gaprel: %d-%d\n",fsize
,miss
,9728000,files
[metnum
].gappos
[x
][0],files
[metnum
].gappos
[x
][1]);
294 files
[metnum
].gapnum
= x
;
295 files
[metnum
].firstgap
= firstgap
;
296 files
[metnum
].lastsize
= files
[metnum
].copied
;
297 files
[metnum
].size
= fileSize
;
301 * for (i=0; i<x; i++)
302 for (j=0; j<x; j++) {
303 if (files[0].gappos[i][0]<files[0].gappos[j][0]) {
304 z = files[0].gappos[i][0];
305 files[0].gappos[i][0] = files[0].gappos[j][0];
306 files[0].gappos[j][0] = z;
307 z = files[0].gappos[i][1];
308 files[0].gappos[i][1] = files[0].gappos[j][1];
309 files[0].gappos[j][1] = z;
312 if(debug)for (i=0; i<x; i++){ printf("[%d-%d]",files[0].gappos[i][0],files[0].gappos[i][1]); }
315 if(debug
)printf("%d bytes = %.2f mb missing\n", files
[metnum
].t_miss
, (double)files
[metnum
].t_miss
/(1024*1024));
316 if(debug
)if (firstgap
< 0x7fffffff) printf("first gap starts at %d (%d blocks are complete)\n", firstgap
, firstgap
/(9500*1024));
325 while (XPending(display
)) {
326 XNextEvent(display
, &Event
);
327 switch (Event
.type
) {
332 but_stat
= CheckMouseRegion(Event
.xbutton
.x
, Event
.xbutton
.y
);
335 i
= CheckMouseRegion(Event
.xbutton
.x
, Event
.xbutton
.y
);
336 if (but_stat
== i
&& but_stat
>= 0) {
337 if (selected
>-1) selected
=-1;
344 for (j
=0;j
<15;j
++) DelMouseRegion(j
);
348 showString("NO FILES",8);
349 showString("FOUND IN",9);
350 showString("TEMP DIR",10);
351 }else if (selected
>-1){
353 char unit
[4] = " KMG";
356 copyXPMArea(5,60,52,54,5,3);
357 AddMouseRegion(0,5,5,54,54);
358 showString(files
[selected
].name
,1);
360 s
=files
[selected
].size
;
361 while (s
>1024){s
/=1024;sk
++;}
362 c
=files
[selected
].copied
;
363 while (c
>1024){c
/=1024;ck
++;}
365 sprintf(out
,"%ld%c/%ld%c",c
,unit
[ck
],s
,unit
[sk
]);
368 sprintf(out
,"%s",files
[selected
].type
);
373 // Don't work unless edonkey update met files more frequently
375 // s = (files[selected].copied) - (files[selected].lastsize);
376 // sprintf(out,"%ld B/S",(s/REF_RATE));
377 // showString(out,8);
379 //************************
381 //status tag is always "Looking..." :(
383 //getStatus(files[selected].status,out);
385 sprintf(out
,"%.3f%%", (( 1.0 * files
[selected
].copied
/ files
[selected
].size
))*100);
388 copyXPMArea(66,colord
,52,5,5,11);
389 for (i
=0; i
< files
[selected
].gapnum
; i
++) {
390 copyXPMArea(66,colorg
,files
[selected
].gappos
[i
][1]-files
[selected
].gappos
[i
][0],5,files
[selected
].gappos
[i
][0]+5 ,11);
393 copyXPMArea(5,60,52,54,5,3);
394 for (j
=0; j
<metnum
; j
++){
395 showString(files
[j
].name
,(j
*2)+1+j
);
396 copyXPMArea(66,colord
,52,5,5,(j
+1)*10+(j
*5) );
397 // printf("top: %d\n",((j+1)*10+(j*5)));
398 for (i
=0; i
< files
[j
].gapnum
; i
++) {
399 copyXPMArea(66,colorg
,files
[j
].gappos
[i
][1]-files
[j
].gappos
[i
][0],5,files
[j
].gappos
[i
][0]+5 ,(j
+1)*10+(j
*5));
401 AddMouseRegion(j
,5,(j
+1)*5,52,(j
+1)*10+(j
*5)+5);
408 if (r
==REF_RATE
) r
=0;
419 printf("\nwmdonkeymon %s: \n",VERSION
);
420 printf("\nusage: wmdonkeymon -t tmpdir [-w color] [-g color]\n");
421 printf("\t-t\t\tPath to edonkey temp dir.\n");
422 printf("\t-w\t\tColor for downloaded parts\n");
423 printf("\t-g\t\tColor for gaps\n");
424 printf("\t-d\t\tDump a lot of debug messages\n");
425 printf("\t-h\t\tDisplay help screen.\n");
426 printf("\t\tColors: green,red,blue,yellow,white,cyan,black,blank\n");
430 printf("\nwmfsm version: \n");
433 void pressEvent(XButtonEvent
* xev
)
438 void strcaseup(char * str
){
441 if (str
[i
]>='a' && str
[i
]<='z') { str
[i
]-=32;}
446 void showString(char * buf
, int row
){
449 for (i
=0; buf
[i
] && i
<10;i
++){
450 if (buf
[i
]>='0' && buf
[i
]<='9') copyXPMArea(xpos
[buf
[i
]-18],ypos
[buf
[i
]-18],5,5,(i
+1)*5,(row
*5));
451 else if((buf
[i
]>='A' && buf
[i
]<='Z')) copyXPMArea(xpos
[buf
[i
]-65],ypos
[buf
[i
]-65],5,5,(i
+1)*5,(row
*5));
452 else if((buf
[i
]==' ')) copyXPMArea(66,44,5,5,(i
+1)*5,(row
*5));
453 else if((buf
[i
]=='/')) copyXPMArea(76,24,5,5,(i
+1)*5,(row
*5));
454 else if((buf
[i
]=='.')) copyXPMArea(91,24,5,5,(i
+1)*5,(row
*5));
455 else if((buf
[i
]=='%')) copyXPMArea(106,24,5,5,(i
+1)*5,(row
*5));
456 else copyXPMArea(xpos
[28],ypos
[28],5,5,(i
+1)*5,(row
*5));
460 void getStatus(int i
,char * st
){
461 if (i
==0) strcpy(st
,"Looking...");
462 else if(i
==1) strcpy(st
,"Paused");
469 char * s
= ".WMDONKEY.";
473 copyXPMArea(70,47,47,19,9,20);