home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / on-line / amster / src / search.c < prev    next >
C/C++ Source or Header  |  2000-01-21  |  10KB  |  421 lines

  1. /*
  2. ** Search
  3. */
  4.  
  5. #include "config.h"
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10.  
  11. #include <proto/dos.h>
  12.  
  13. #include "mui.h"
  14. #include <MUI/Lamp_mcc.h>
  15. #include <MUI/NListview_mcc.h>
  16.  
  17. #include "gui.h"
  18. #include "search.h"
  19. #include "napster.h"
  20. #include "download.h"
  21. #include "prefs.h"
  22. #include "amster_Cat.h"
  23.  
  24. ULONG search_new(struct IClass *cl, Object *obj, struct opSet *msg);
  25. MUIF songlistdisp(REG(a2) char **array, REG(a1) songdata sd);
  26. char *strippath(char *buf);
  27. void search_clear(struct searchdata *data, long t);
  28. void search_download(struct searchdata *data);
  29. void search_go(struct searchdata *data);
  30. void search_nick(struct searchdata *data);
  31. void search_stat(struct searchdata *data, int t);
  32. void search_found(struct searchdata *data, songdata song);
  33. void search_reset(struct searchdata *data);
  34.  
  35. int search_count = 0;
  36.  
  37.  
  38. MUIF search_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
  39. {
  40.     struct searchdata *data = INST_DATA(cl,obj);
  41.  
  42.     switch(msg->MethodID) {
  43.         case OM_NEW: return(search_new(cl,obj,(APTR)msg));
  44.         case SEARCH_CLEAR:
  45.             search_clear(data,(long)(((muimsg)msg)->arg1));
  46.             return(0);
  47.         case SEARCH_DOWNLOAD:
  48.             search_download(data);
  49.             return(0);
  50.         case SEARCH_GO:
  51.             search_go(data);
  52.             return(0);
  53.         case SEARCH_NICK:
  54.             search_nick(data);
  55.             return(0);
  56.         case SEARCH_FOUND:
  57.             search_found(data,(songdata)(((muimsg)msg)->arg1));
  58.             return(0);
  59.         case SEARCH_RESET:
  60.             search_reset(data);
  61.             return(0);
  62.         case SEARCH_REFRESH:
  63.             DoMethod(data->list,MUIM_NList_Redraw,MUIV_NList_Redraw_All);
  64.             return(0);
  65.     }
  66.     return(DoSuperMethodA(cl,obj,msg));
  67. }
  68.  
  69.  
  70. ULONG search_new(struct IClass *cl, Object *obj, struct opSet *msg)
  71. {
  72.     static char *numbers = "0123456789";
  73.     static char *opts[5];
  74.     static struct Hook songlistdispHook = { {0,0}, &songlistdisp, NULL, NULL };
  75.     struct searchdata *data;
  76.     Object *str,*maxstr,*snick,*sbut,*nbut;
  77.     Object *pop;
  78.     Object *popspeed,*popspeedval,*popbit,*popbitval,*popfreq,*popfreqval;
  79.     Object *popuse,*popreset;
  80.     Object *result,*list;
  81.     Object *rembut,*clrbut,*dlbut;
  82.  
  83.     opts[0] = (char*)_MSG_COMPARE_NONE,
  84.     opts[1] = (char*)_MSG_COMPARE_ATLEAST,
  85.     opts[2] = (char*)_MSG_COMPARE_EQUALTO,
  86.     opts[3] = (char*)_MSG_COMPARE_ATBEST,
  87.     opts[4] = NULL;
  88.     localize_array(opts);
  89.  
  90.     if (obj = (Object *)DoSuperNew(cl,obj,
  91.         Child, VGroup,
  92.             Child, HGroup,
  93.                 Child, Label2(MSG_SEARCH),
  94.                 Child, str = StringObject,
  95.                     StringFrame,
  96.                     MUIA_HorizWeight, 400,
  97.                     MUIA_String_MaxLen, 80,
  98.                     MUIA_CycleChain, 1,
  99.                 End,
  100.                 Child, sbut = SimpleButton(MSG_SEARCH_GAD),
  101.             End,
  102.             Child, HGroup,
  103.                 Child, Label2(MSG_SEARCHUSER),
  104.                 Child, snick = StringObject,
  105.                     StringFrame,
  106.                     MUIA_HorizWeight, 400,
  107.                     MUIA_String_MaxLen, 20,
  108.                     MUIA_CycleChain, 1,
  109.                     MUIA_ShortHelp, MSG_SEARCHUSER_HELP,
  110.                 End,
  111.                 Child, nbut = SimpleButton(MSG_SEARCHUSER_GAD),
  112.                 Child, Label2(MSG_MAX),
  113.                 Child, maxstr = StringObject,
  114.                     StringFrame,
  115.                     MUIA_String_Accept, numbers,
  116.                     MUIA_String_Integer, 42,
  117.                     MUIA_String_MaxLen, 4,
  118.                     MUIA_CycleChain, 1,
  119.                 End,
  120.                 Child, pop = PopobjectObject,
  121.                     MUIA_Popstring_Button, PopButton(MUII_PopUp),
  122.                     MUIA_Popobject_Object, VGroup,
  123.                         MUIA_Frame, MUIV_Frame_PopUp,
  124.                         Child, TextObject,
  125.                             MUIA_Text_Contents, MSG_ADVSEARCH,
  126.                         End,
  127.                         Child, ColGroup(3),
  128.                             Child, Label2(MSG_LINESPEED),
  129.                             Child, popspeed = CycleObject,
  130.                                 MUIA_Cycle_Active, 0,
  131.                                 MUIA_Cycle_Entries, opts,
  132.                             End,
  133.                             Child, popspeedval = CycleObject,
  134.                                 MUIA_Cycle_Active, 1,
  135.                                 MUIA_Cycle_Entries, nap_linktype,
  136.                             End,
  137.                             Child, Label2(MSG_BITRATE),
  138.                             Child, popbit = CycleObject,
  139.                                 MUIA_Cycle_Active, 0,
  140.                                 MUIA_Cycle_Entries, opts,
  141.                             End,
  142.                             Child, HGroup,
  143.                                 Child, popbitval = StringObject,
  144.                                     StringFrame,
  145.                                     MUIA_String_Accept, numbers,
  146.                                     MUIA_String_Integer, 128,
  147.                                     MUIA_String_MaxLen, 4,
  148.                                     MUIA_CycleChain, 1,
  149.                                 End,
  150.                                 Child, Label2("kbps"),
  151.                             End,
  152.                             Child, Label2(MSG_FREQUENCY),
  153.                             Child, popfreq = CycleObject,
  154.                                 MUIA_Cycle_Active, 0,
  155.                                 MUIA_Cycle_Entries, opts,
  156.                             End,
  157.                             Child, HGroup,
  158.                                 Child, popfreqval = StringObject,
  159.                                     StringFrame,
  160.                                     MUIA_String_Accept, numbers,
  161.                                     MUIA_String_Integer, 44100,
  162.                                     MUIA_String_MaxLen, 6,
  163.                                     MUIA_CycleChain, 1,
  164.                                 End,
  165.                                 Child, Label2("kHz"),
  166.                             End,
  167.                         End,
  168.                         Child, HGroup,
  169.                             Child, popuse = SimpleButton(MSG_ADVUSE_GAD),
  170.                             Child, HSpace(0),
  171.                             Child, popreset = SimpleButton(MSG_ADVRESET_GAD),
  172.                         End,
  173.                     End,
  174.                 End,
  175.             End,
  176.             Child, HGroup,
  177.                 Child, Label(MSG_RESULT),
  178.                 Child, result = TextObject, End,
  179.             End,
  180.             Child, NListviewObject,
  181.                 MUIA_NListview_NList, list = NListObject,
  182.                     InputListFrame,
  183.                     MUIA_NList_Title, TRUE,
  184.                     MUIA_NList_Format, "BAR, BAR, BAR, BAR, BAR, BAR",
  185.                     MUIA_NList_MultiSelect, MUIV_NList_MultiSelect_Default,
  186.                     MUIA_NList_DisplayHook, &songlistdispHook,
  187.                     MUIA_CycleChain, 1,
  188.                 End,
  189.             End,
  190.             Child, HGroup,
  191.                 Child, rembut = SimpleButton(MSG_CLEAR_GAD),
  192.                 Child, clrbut = SimpleButton(MSG_CLEARALL_GAD),
  193.                 Child, dlbut = SimpleButton(MSG_DOWNLOAD_GAD),
  194.             End,
  195.         End,
  196.         TAG_MORE, msg->ops_AttrList))
  197.     {
  198.         data = INST_DATA(cl,obj);
  199.         data->str = str;
  200.         data->maxstr = maxstr;
  201.         data->snick = snick;
  202.         data->pop = pop;
  203.         data->popspeed = popspeed;
  204.         data->popspeedval = popspeedval;
  205.         data->popbit = popbit;
  206.         data->popbitval = popbitval;
  207.         data->popfreq = popfreq;
  208.         data->popfreqval = popfreqval;
  209.         data->result = result;
  210.         data->list = list;
  211.         data->rembut = rembut;
  212.         data->clrbut = clrbut;
  213.         data->dlbut = dlbut;
  214.  
  215.         DoMethod(list,MUIM_NList_UseImage,gui->redlamp,1,0);
  216.         DoMethod(list,MUIM_NList_UseImage,gui->yellowlamp,2,0);
  217.         DoMethod(list,MUIM_NList_UseImage,gui->greenlamp,3,0);
  218.  
  219.         DoMethod(str,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,1,SEARCH_GO);
  220.         DoMethod(sbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,SEARCH_GO);
  221.         DoMethod(snick,MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,obj,1,SEARCH_NICK);
  222.         DoMethod(nbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,SEARCH_NICK);
  223.  
  224.         DoMethod(popuse,MUIM_Notify,MUIA_Pressed,FALSE,pop,2,MUIM_Popstring_Close,TRUE);
  225.         DoMethod(popreset,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,SEARCH_RESET);
  226.  
  227.         DoMethod(rembut,MUIM_Notify,MUIA_Pressed,FALSE,obj,2,SEARCH_CLEAR,0);
  228.         DoMethod(clrbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,2,SEARCH_CLEAR,1);
  229.         DoMethod(dlbut,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,SEARCH_DOWNLOAD);
  230.  
  231.         return((ULONG)obj);
  232.     }
  233.     return(0);
  234. }
  235.  
  236.  
  237. MUIF songlistdisp(REG(a2) char **array, REG(a1) songdata sd)
  238. {
  239.     static char buf[50],buf2[50];
  240.  
  241.     if (sd) {
  242.         if(sd->link < 5)
  243.             *array++ = "\33c\33o[1]";
  244.         else if(sd->link < 8)
  245.             *array++ = "\33c\33o[2]";
  246.         else
  247.             *array++ = "\33c\33o[3]";
  248.  
  249.         if(pref_fullpath)
  250.             *array++ = sd->title;
  251.         else
  252.             *array++ = strippath(sd->title);
  253.  
  254.         sprintf(buf,"\33c%d/%d",sd->bitrate,sd->freq);
  255.         *array++ = buf;
  256.         sprintf(buf2,"\33r%ld",sd->size);
  257.         *array++ = buf2;
  258.         *array++ = sd->user;
  259.         *array = nap_getlinktype(sd->link);
  260.     } else {
  261.         *array++ = "\33c@";
  262.         *array++ = (char *)MSG_LISTHEADER_SONG;
  263.         *array++ = "\33ckbps/kHz";
  264.         *array++ = (char *)MSG_LISTHEADER_SIZE;
  265.         *array++ = (char *)MSG_LISTHEADER_USER;
  266.         *array = (char *)MSG_LISTHEADER_LINK;
  267.     }
  268.     return(0);
  269. }
  270.  
  271.  
  272. char *strippath(char *buf)
  273. {
  274.     char tmp;
  275.     int i;
  276.  
  277.     for(i=strlen(buf)-1;i>0;i--) {
  278.         tmp = buf[i];
  279.         if(tmp==':' || tmp=='/' || tmp=='\\') return(buf+i+1);
  280.     }
  281.     return(buf);
  282. }
  283.  
  284.  
  285. void search_clear(struct searchdata *data, long t)
  286. {
  287.     u_long item;
  288.  
  289.     switch(t) {
  290.         case 0:
  291.             DoMethod(data->list,MUIM_NList_GetEntry,MUIV_NList_GetEntry_Active,&item);
  292.             if(item) {
  293.                 DoMethod(data->list,MUIM_NList_Remove,MUIV_NList_Remove_Active);
  294.                 free((songdata)item);
  295.             }
  296.             break;
  297.  
  298.         case 1:
  299.             set(data->list,MUIA_NList_Quiet, MUIV_NList_Quiet_Visual);
  300.             while(1) {
  301.                 DoMethod(data->list,MUIM_NList_GetEntry,0,&item);
  302.                 if(!item) break;
  303.                 DoMethod(data->list,MUIM_NList_Remove,MUIV_NList_Remove_First);
  304.                 free((songdata)item);
  305.             }
  306.             set(data->list,MUIA_NList_Quiet, MUIV_NList_Quiet_None);
  307.             break;
  308.     }
  309. }
  310.  
  311.  
  312. void search_download(struct searchdata *data)
  313. {
  314.     u_long item;
  315.     long listid;
  316.  
  317.     if(!gui_napon) return;
  318.     listid = MUIV_NList_NextSelected_Start;
  319.     for(;;) {
  320.         DoMethod(data->list,MUIM_NList_NextSelected,&listid);
  321.         if (listid==MUIV_NList_NextSelected_End) break;
  322.         DoMethod(data->list,MUIM_NList_GetEntry,listid,&item);
  323.         if(item) nap_request((songdata)item);
  324.     }
  325. }
  326.  
  327.  
  328. void search_go(struct searchdata *data)
  329. {
  330.     u_long tmp,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7,tmp8;
  331.  
  332.     if(!gui_napon) return;
  333.     GetAttr(MUIA_String_Acknowledge,data->str,&tmp);
  334.     GetAttr(MUIA_String_Integer,data->maxstr,&tmp2);
  335.     GetAttr(MUIA_Cycle_Active,data->popspeed,&tmp3);
  336.     GetAttr(MUIA_Cycle_Active,data->popspeedval,&tmp4);
  337.     GetAttr(MUIA_Cycle_Active,data->popbit,&tmp5);
  338.     GetAttr(MUIA_String_Integer,data->popbitval,&tmp6);
  339.     GetAttr(MUIA_Cycle_Active,data->popfreq,&tmp7);
  340.     GetAttr(MUIA_String_Integer,data->popfreqval,&tmp8);
  341.  
  342.     if(tmp2<3) tmp2=3;
  343.     if(tmp2>100) tmp2=100;
  344.  
  345.     if(tmp) {
  346.         search_count=0;
  347.         if(pref_clrlist) search_clear(data,1);
  348.         nap_search((char *)tmp,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7,tmp8);
  349.         search_stat(data,1);
  350.     }
  351. }
  352.  
  353.  
  354. void search_nick(struct searchdata *data)
  355. {
  356.     u_long tmp;
  357.  
  358.     if(!gui_napon) return;
  359.     GetAttr(MUIA_String_Acknowledge,data->snick,&tmp);
  360.     if(tmp) {
  361.         search_count=0;
  362.         if(pref_clrlist) search_clear(data,1);
  363.         nap_browseuser((char *)tmp);
  364.         search_stat(data,3);
  365.     }
  366. }
  367.  
  368.  
  369. void search_stat(struct searchdata *data, int t)
  370. {
  371.     static char buf[80];
  372.     char *txt;
  373.  
  374.     switch(t) {
  375.         case 0:
  376.             txt = "";
  377.             break;
  378.  
  379.         case 1:
  380.             txt = (char*)MSG_STATUS1_SEARCHING;
  381.             break;
  382.  
  383.         case 2:
  384.             if(search_count==0)
  385.                 txt = (char*)MSG_STATUS1_NOFILES;
  386.             else {
  387.                 sprintf(buf,MSG_STATUS1_FOUND,search_count);
  388.                 txt = buf;
  389.             }
  390.             break;
  391.  
  392.         case 3:
  393.             txt = (char*)MSG_STATUS1_REQLIST;
  394.             break;
  395.     }
  396.  
  397.     set(data->result,MUIA_Text_Contents,txt);
  398. }
  399.  
  400.  
  401. void search_found(struct searchdata *data, songdata song)
  402. {
  403.     if(song) {
  404.         DoMethod(data->list,MUIM_NList_InsertSingle,song,MUIV_NList_Insert_Bottom);
  405.         search_count++;
  406.     } else {
  407.         search_stat(data,2);
  408.     }
  409. }
  410.  
  411.  
  412. void search_reset(struct searchdata *data)
  413. {
  414.     set(data->popspeed,MUIA_Cycle_Active,0);
  415.     set(data->popspeedval,MUIA_Cycle_Active,1);
  416.     set(data->popbit,MUIA_Cycle_Active,0);
  417.     set(data->popbitval,MUIA_String_Integer,128);
  418.     set(data->popfreq,MUIA_Cycle_Active,0);
  419.     set(data->popfreqval,MUIA_String_Integer,44100);
  420. }
  421.