home *** CD-ROM | disk | FTP | other *** search
- /* requester.c */
-
- /*
- * $Author: Espie $
- * $Date: 91/05/06 23:37:25 $
- * $Revision: 1.9 $
- * $Log: requester.c,v $
- * Revision 1.9 91/05/06 23:37:25 Espie
- * New calling sequence, returns a WBArg, much better !!
- *
- * Revision 1.8 91/05/05 04:02:18 Espie
- * Suppress .info files now that we support workbench.
- *
- * Revision 1.7 91/05/03 02:48:24 Espie
- * *** empty log message ***
- *
- * Revision 1.6 91/05/02 23:31:40 Espie
- * Got rid of the 2.0 file requester for the time being...
- *
- * Revision 1.5 91/05/02 11:21:13 Espie
- * Small cosmetic changes. Test if we really have a requester,
- * so that we don't add the gadget for nothing.
- * (NB: interface should exit if no requester and no song loaded :-).
- *
- * Revision 1.4 91/05/02 01:31:53 Espie
- * New interface to the event handler... still needs
- * a separate task. The kludge start_ticking()/stop_ticking()
- * isn't enough...
- *
- * Revision 1.3 91/04/30 16:52:41 Espie
- * Added music:.
- *
- * Revision 1.2 91/04/30 00:35:08 Espie
- * Stable version III.
- *
- * Revision 1.1 91/04/29 23:54:50 Espie
- * Initial revision
- *
- *
- */
-
- /* this file will not compile under 1.3 currently,
- * just get rid of the excess luggage...
- */
-
- #define SONG_DIR "Music:"
- #include <exec/types.h>
- #include <libraries/asl.h>
- #include <dos/dos.h>
- #include <dos/dosasl.h>
- #include <proto/dos.h>
- #include <proto/exec.h>
- #include <proto/asl.h>
- #include <proto/arp.h>
- #include <string.h>
- #include <stdio.h>
- #include <custom/cleanup.h>
- #include "proto.h"
-
- /* try to get a file requester *somewhere*
- */
-
- /* WE TAKE ADVANTAGE OF THE FACT THAT THE TWO FILEREQUESTER
- * STRUCTURES ARE VERY SIMILAR. THIS MIGHT NOT BE A GOOD IDEA...
- */
-
- /* novice mistake: taking the file name on the directory...
- * It is much more consistent to get a lock on that directory,
- * and return the result as a WBArg, even if it means some
- * juggling.
- *
- * It is this module responsibility to unlock everything it
- * might lock.
- */
-
- LOCAL struct FileRequester *request;
- LOCAL int req_type;
- LOCAL BPTR last_lock;
-
-
- LOCAL BOOL get_requester(void)
- {
- req_type = requester_type();
- switch(req_type)
- {
- case ARP:
- request = ArpAllocFreq();
- return request != 0;
-
- case OS_20:
- request = AllocFileRequest();
- return request != 0;
- default:
- return NULL;
- }
- }
-
- /* this manual check can weed out .info files */
-
- BOOL is_info(char *name)
- {
- int l;
- l = strlen(name);
- if (l < 5)
- return FALSE;
- if (name[l-5] != '.' || name[l-4] != 'i' || name[l-3] != 'n'
- || name[l-2] != 'f' || name[l-1] != 'o')
- return FALSE;
- else
- return TRUE;
- }
-
- LOCAL ULONG newdo(ULONG flags, void *object)
- {
- if (flags & RFF_DOMSGFUNC)
- {
- message_interface((struct IntuiMessage *)object);
- clear_abort();
- }
- if (flags & RFF_DOWILDFUNC)
- {
- struct AnchorPath *ap;
- ap = (struct AnchorPath *)object;
- return is_info(ap->ap_Info.fib_FileName);
- }
- return 0;
- }
-
- void cleanlock(void)
- {
- if (last_lock)
- {
- UnLock(last_lock);
- last_lock = NULL;
- }
- }
-
- BOOL init_requester(struct Window *w)
- {
- if (get_requester())
- {
- strcpy(request->rf_Dir, SONG_DIR);
- last_lock = NULL;
- ToClean0(cleanlock);
- request->rf_Window = w;
- request->rf_Function = &newdo;
- request->rf_FuncFlags |= RFF_DOMSGFUNC | RFF_DOWILDFUNC;
- return TRUE;
- }
- else
- return FALSE;
- }
-
- BOOL query_name(char *banner, struct WBArg *result)
- {
- char *ok;
- if (req_type == NO_REQ)
- return NULL;
- request->rf_Hail = banner;
- switch(req_type)
- {
- case ARP:
- ok = FileRequest(request);
- break;
- case OS_20:
- ok = RequestFile(request);
- }
- if (!ok)
- return FALSE;
- else
- {
- cleanlock();
- last_lock = Lock(request->rf_Dir, ACCESS_READ);
- if (last_lock)
- {
- result->wa_Lock = last_lock;
- result->wa_Name = request->rf_File;
- return TRUE;
- }
- else
- return FALSE;
- }
- }
-