home *** CD-ROM | disk | FTP | other *** search
/ Audio Version 4.94 / audioversion4.94knowledgemediaresourcelibraryoctober1994.iso / amiga / utils / exp_iv / requestr.c < prev    next >
C/C++ Source or Header  |  1991-05-06  |  4KB  |  184 lines

  1. /* requester.c */
  2.  
  3. /*
  4.  * $Author: Espie $
  5.  * $Date: 91/05/06 23:37:25 $
  6.  * $Revision: 1.9 $
  7.  * $Log:    requester.c,v $
  8.  * Revision 1.9  91/05/06  23:37:25  Espie
  9.  * New calling sequence, returns a WBArg, much better !!
  10.  * 
  11.  * Revision 1.8  91/05/05  04:02:18  Espie
  12.  * Suppress .info files now that we support workbench.
  13.  * 
  14.  * Revision 1.7  91/05/03  02:48:24  Espie
  15.  * *** empty log message ***
  16.  * 
  17.  * Revision 1.6  91/05/02  23:31:40  Espie
  18.  * Got rid of the 2.0 file requester for the time being...
  19.  * 
  20.  * Revision 1.5  91/05/02  11:21:13  Espie
  21.  * Small cosmetic changes. Test if we really have a requester,
  22.  * so that we don't add the gadget for nothing.
  23.  * (NB: interface should exit if no requester and no song loaded :-).
  24.  * 
  25.  * Revision 1.4  91/05/02  01:31:53  Espie
  26.  * New interface to the event handler... still needs
  27.  * a separate task. The kludge start_ticking()/stop_ticking()
  28.  * isn't enough...
  29.  * 
  30.  * Revision 1.3  91/04/30  16:52:41  Espie
  31.  * Added music:.
  32.  * 
  33.  * Revision 1.2  91/04/30  00:35:08  Espie
  34.  * Stable version III.
  35.  * 
  36.  * Revision 1.1  91/04/29  23:54:50  Espie
  37.  * Initial revision
  38.  * 
  39.  *
  40.  */
  41.  
  42. /* this file will not compile under 1.3 currently,
  43.  * just get rid of the excess luggage...
  44.  */
  45.  
  46. #define SONG_DIR "Music:"
  47. #include <exec/types.h>
  48. #include <libraries/asl.h>
  49. #include <dos/dos.h>
  50. #include <dos/dosasl.h>
  51. #include <proto/dos.h>
  52. #include <proto/exec.h>
  53. #include <proto/asl.h>
  54. #include <proto/arp.h>
  55. #include <string.h>
  56. #include <stdio.h>
  57. #include <custom/cleanup.h>
  58. #include "proto.h"
  59.  
  60. /* try to get a file requester *somewhere*
  61.  */
  62.  
  63. /* WE TAKE ADVANTAGE OF THE FACT THAT THE TWO FILEREQUESTER
  64.  * STRUCTURES ARE VERY SIMILAR. THIS MIGHT NOT BE A GOOD IDEA...
  65.  */
  66.  
  67. /* novice mistake: taking the file name on the directory...
  68.  * It is much more consistent to get a lock on that directory,
  69.  * and return the result as a WBArg, even if it means some
  70.  * juggling.
  71.  *
  72.  * It is this module responsibility to unlock everything it
  73.  * might lock.
  74.  */
  75.   
  76. LOCAL struct FileRequester *request;
  77. LOCAL int req_type;
  78. LOCAL BPTR last_lock;
  79.  
  80.  
  81. LOCAL BOOL get_requester(void)
  82.     {
  83.         req_type = requester_type();
  84.         switch(req_type)
  85.             {
  86.             case ARP:
  87.                 request = ArpAllocFreq();
  88.                 return request != 0;
  89.                 
  90.             case OS_20:
  91.                 request = AllocFileRequest();
  92.                 return request != 0;
  93.             default:
  94.                 return NULL;
  95.             }
  96.     }
  97.  
  98. /* this manual check can weed out .info files */
  99.  
  100. BOOL is_info(char *name)
  101.     {
  102.     int l;
  103.         l = strlen(name);
  104.         if (l < 5)
  105.             return FALSE;
  106.         if (name[l-5] != '.' || name[l-4] != 'i' || name[l-3] != 'n'
  107.             || name[l-2] != 'f' || name[l-1] != 'o')
  108.             return FALSE;
  109.         else
  110.             return TRUE;
  111.     }
  112.  
  113. LOCAL ULONG newdo(ULONG flags, void *object)
  114.     {
  115.         if (flags & RFF_DOMSGFUNC)
  116.             {
  117.                 message_interface((struct IntuiMessage *)object);
  118.                 clear_abort();
  119.             }
  120.         if (flags & RFF_DOWILDFUNC)
  121.             {
  122.             struct AnchorPath *ap;
  123.                 ap = (struct AnchorPath *)object;
  124.             return is_info(ap->ap_Info.fib_FileName);
  125.             }
  126.         return 0;
  127.     }
  128.     
  129. void cleanlock(void)
  130.     {
  131.         if (last_lock)
  132.             {
  133.                 UnLock(last_lock);
  134.                 last_lock = NULL;
  135.             }
  136.     }
  137.                 
  138. BOOL init_requester(struct Window *w)
  139.     {
  140.         if (get_requester())
  141.             {
  142.                 strcpy(request->rf_Dir, SONG_DIR);
  143.                 last_lock = NULL;
  144.                 ToClean0(cleanlock);
  145.                 request->rf_Window = w;
  146.                 request->rf_Function = &newdo;
  147.                 request->rf_FuncFlags |= RFF_DOMSGFUNC | RFF_DOWILDFUNC;
  148.                 return TRUE;
  149.             }
  150.         else
  151.             return FALSE;    
  152.     }    
  153.                 
  154. BOOL query_name(char *banner, struct WBArg *result)
  155.     {
  156.     char *ok;
  157.         if (req_type == NO_REQ)
  158.             return NULL;
  159.         request->rf_Hail = banner;
  160.         switch(req_type)
  161.             {
  162.             case ARP:
  163.                 ok = FileRequest(request);
  164.                 break;
  165.             case OS_20:
  166.                 ok = RequestFile(request);
  167.             }    
  168.         if (!ok)
  169.             return FALSE;
  170.         else
  171.             {
  172.                 cleanlock();
  173.                 last_lock = Lock(request->rf_Dir, ACCESS_READ);
  174.                 if (last_lock)
  175.                     {
  176.                         result->wa_Lock = last_lock;
  177.                         result->wa_Name = request->rf_File;
  178.                         return TRUE;
  179.                     }
  180.                 else
  181.                     return FALSE;
  182.             }
  183.     }
  184.