#define NO_LOCKPUBSCREENLIST

#include "MP.h"
#include <clib/extras/exec_protos.h>
#include <clib/alib_protos.h>
#include <extras/libs.h>

#include <utility/hooks.h>
#include <intuition/sghooks.h>
#include "patchdata.h"

#include <proto/locale.h>
#include <debug.h>

#include <extras/macros/exec.h>

long __stack = 4096;

LONG InPatch=0;

UBYTE EnvFile[]   ="ENV:ModePro.pref",
      EnvArcFile[]="ENVARC:ModePro.pref";
       
extern UBYTE   Version[];
extern UBYTE   ModePro[];
extern LONG SemVersion,
            SemRevision;
extern struct List BackdropList;

extern struct SignalSemaphore LockPubSem;

#define NO_WIN_PATCH


BYTE PublicSignal;
struct Process *MPTask;

struct Screen ASM *(*OldOpenScreen)(REG __a0 struct NewScreen *,
                                    REG __a6 struct IntuitionBase *);
struct Screen ASM *(*OldOpenScreenTagList)(REG __a0 struct ExtNewScreen *ns,
                                           REG __a1 struct TagItem *taglist,
                                           REG __a6 struct IntuitionBase * );
LONG ASM (*OldCloseScreen)(REG __a0 struct Screen *,
                           REG __a6 struct IntuitionBase *);
struct Window ASM *(*OldOpenWindow)(REG __a0 struct NewWindow *nw,
                                    REG __a6 struct IntuitionBase *lib);
struct Window ASM *(*OldOpenWindowTagList)(REG __a0 struct NewWindow *nw,
                                           REG __a1 struct TagItem *tags,
                                           REG __a6 struct IntuitionBase *lib);
BOOL ASM *(*OldLayoutMenusA)(REG __a0 struct Menu *fm,
                             REG __a1 APTR vi, 
                             REG __a2 struct TagItem *tags,
                             REG __a6 struct Library *lib);

LONG ASM *(*OldCloseWorkBench)(REG __a6 struct IntuitionBase *lib);

struct Screen * __asm (*OldLockPubScreen)(register __a0 UBYTE *Name,
                                          register __a6 struct Library *);
void __asm (*OldUnlockPubScreen)(register __a0 UBYTE *Name,
                                 register __a1 struct Screeen *,
                                 register __a6 struct Library *);



struct List * __asm (*OldLockPubScreenList)(register __a6 struct Library *);
void __asm (*OldUnlockPubScreenList)(register __a6 struct Library *);



BOOL    V39;
ULONG   Deinstall=FALSE;
                
struct NewBroker NewBroker=
{
  NB_VERSION,
  "ModePro",
  ModePro,
  0,
  NBU_UNIQUE | NBU_NOTIFY,
  COF_SHOW_HIDE,
  0,0,0
};



UWORD NumDriPens;

/*
UWORD defaultpens[]=
{
  0,1,1,2,1,3,1,0,2,1,2,1
};
*/

//void asm _PROLOG(register __a0 const char *where);
//void asm _EPILOG(register __a0 const char *where);

//#define _EPILOG _MYEPILOG
//#define _PROLOG _MYPROLOG

struct TextAttr Topaz8 = { "topaz.font",8,0,0};

struct MsgPort *BrokerPort,
               *CatchPort,
               *ReplyPort;
struct Message *ms;

#include <proto/cybergraphics.h>

struct IntuitionBase *IntuitionBase; 
struct GfxBase       *GfxBase;
struct LocaleBase    *LocaleBase;
struct Library       *AslBase,
                     *CxBase,
                     *CyberGfxBase,
                     *DiskfontBase,
                     //*GadToolsBase,
                     *IconBase,
                     *IFFParseBase,
                     *LayersBase,
                     *UtilityBase,
                     *DataTypesBase;

struct Libs MP_Libs[]=
{
  (APTR *)&AslBase,      "asl.library",         38,0,
  (APTR *)&CxBase,       "commodities.library", 36,0,
  (APTR *)&CyberGfxBase, "cybergraphics.library",39,OLF_OPTIONAL, 
  (APTR *)&DataTypesBase,"datatypes.library"  ,39,OLF_OPTIONAL,
  (APTR *)&DiskfontBase, "diskfont.library",   36,0,
//  (APTR *)&GadToolsBase, "gadtools.library",   36,0,
  (APTR *)&GfxBase,      "graphics.library",   36,0,
  (APTR *)&IconBase,     "icon.library",       36,0,
  (APTR *)&IFFParseBase, "iffparse.library",   36,0,
  (APTR *)&IntuitionBase,"intuition.library",  36,0,
  (APTR *)&LayersBase,   "layers.library",     36,0,
  (APTR *)&UtilityBase,  "utility.library",    36,0,
  0,0,0
};

CxObj   *Broker;
CxMsg   *cxmsg;
ULONG   cxsig;
ULONG   sigrcvd;

/*** Tooltypes ***/

UBYTE *Hotkey="lamiga p",
      Popup=TRUE;
BYTE  Priority=0;
//UBYTE *UserFontName=0;
//LONG   UserFontSize=8;
STRPTR PrefsPath;

struct Catalog *Catalog;

struct MPSem *MPSem;

void main(int argc, char **argv) 
{
  ULONG l;

/*
  DataTypesBase=OpenLibrary("datatypes.library",39);
*/
  if(LocaleBase=(struct LocaleBase *)OpenLibrary("locale.library",38))
    Catalog=OpenCatalog(NULL,(STRPTR)"modepro.catalog", TAG_DONE);
  else
    Catalog=NULL;
  
  InitStrings();

  if(ex_OpenLibs(argc,//                                                                               (4.63.2) (09/17/00)
              "ModePro",
              GetString(MSG_REQ_COULDNT_OPEN_LIBS),
              GetString(MSG_REQ_NAME_VER_FMT),
              GetString(MSG_REQ_OK),
              MP_Libs))
  {
    if(MPSem=AllocVec(sizeof(struct MPSem),MEMF_PUBLIC|MEMF_CLEAR))
    {
      NewList(&MPSem->ForcedEditPort.mp_MsgList);
      NewList(&BackdropList);
      MPSem->ForcedEditPort.mp_Flags=PA_IGNORE;
      
      NewBroker.nb_Descr=GetString(MSG_COMMODITY_TITLE);
  
      if(((struct Library *)IntuitionBase)->lib_Version>38)
      {
        NumDriPens=12;
        V39=TRUE;
      }
      else
      {
        NumDriPens=9;
        V39=FALSE;
      }
      if(GetArgs(argc,argv))
      {
        {
          struct SignalSemaphore *sem;
        
          sem=&MPSem->SharedSem;
          for(l=0;l<SEMAPHORES;l++)
            InitSemaphore(&sem[l]);
        }
        
        InitSemaphore(&LockPubSem);
  
        MPSem->SharedSem.ss_Link.ln_Name =(UBYTE *)"ModePro";
        MPSem->SharedSem.ss_Link.ln_Pri  =0;
        MPSem->Enabled =TRUE;
        MPSem->Version =SemVersion;
        MPSem->Revision=SemRevision;
        MPSem->HotKey  =Hotkey;
        MPSem->FirstPrefsOpen=1;
/*  
        if(ps=LockPubScreen(NULL))
        {
          di=GetScreenDrawInfo(ps);
          for(l=0;l<di->dri_NumPens && l<NumDriPens;l++)
            defaultpens[l]=di->dri_Pens[l];      
          FreeScreenDrawInfo(ps,di);
          UnlockPubScreen(NULL,ps);
        }
*/  
        if(BrokerPort=CreateMsgPort())
        { 
          NewBroker.nb_Pri=Priority;
          NewBroker.nb_Port=BrokerPort;
          if(Broker=CxBroker(&NewBroker,NULL))
          {
            AddHotKey(Broker,BrokerPort,Hotkey,EVT_HOTKEY);
            if(CatchPort=CreateMsgPort())
            {
              if(MPSem->DaemonPort=CreateMsgPort())
              {
                if(ReplyPort=CreateMsgPort())
                {
                  if((PublicSignal=AllocSignal(-1))>=0)
                  {
                    MPTask=(struct Process *)FindTask(0);
                    cxsig=1L<<BrokerPort->mp_SigBit;
                    ActivateCxObj(Broker,1);
          
                    NewList(&MPSem->OpenList);
                    for(l=0;l<NUM_LISTS;l++)
                      NewList(&MPSem->PromotionList[l]);
                    
                    if(!DaemonLoadFile(EnvFile))
                        DaemonLoadFile(EnvArcFile);
                        
                    LoadPalettePrefs();
//#include <pragmas/intuition_pragmas.h>
                    Forbid();
                    OldCloseScreen        =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0x42) ,(FUNCCAST)NewCloseScreen);
                    OldOpenScreenTagList  =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0x264),(FUNCCAST)NewOpenScreenTagList);
                    OldOpenScreen         =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0xc6) ,(FUNCCAST)NewOpenScreen);
                    OldLockPubScreen      =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0x1fe),(FUNCCAST)NewLockPubScreen);
                    OldUnlockPubScreen    =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-516,    (FUNCCAST)NewUnlockPubScreen);

#ifndef NO_LOCKPUBSCREENLIST
                    OldLockPubScreenList  =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0x20a),(FUNCCAST)NewLockPubScreenList);
                    OldUnlockPubScreenList=(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0x210),(FUNCCAST)NewUnlockPubScreenList);
#endif
                    OldCloseWorkBench     =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0x4e) ,(FUNCCAST)NewCloseWorkBench);
                    OldLayoutMenusA       =(FUNCCAST)SetFunction((struct Library *)GadToolsBase ,-(0x42) ,(FUNCCAST)NewLayoutMenusA);
                    OldOpenWindowTagList  =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0x25e),(FUNCCAST)NewOpenWindowTagList);
                    OldOpenWindow         =(FUNCCAST)SetFunction((struct Library *)IntuitionBase,-(0xcc) ,(FUNCCAST)NewOpenWindow);
                    
                    Permit();
                 
                    AddSemaphore((struct SignalSemaphore *)MPSem);
                    ProcessInput();
                    RemSemaphore((struct SignalSemaphore *)MPSem);
                    
                    ObtainSemaphore(&MPSem->ListSem);
                    ReleaseSemaphore(&MPSem->ListSem);
                    ObtainSemaphore(&MPSem->PrefsSem);
                    ReleaseSemaphore(&MPSem->PrefsSem);
  
                    ProcessMPMessages();
  
                    {
                      struct MPMessage *mpm;
                      while(mpm=(struct MPMessage *)GetMsg(ReplyPort))
                        FreeVec(mpm);
                    }
  
                    FreeAllDefLists(MPSem->PromotionList);
                    FreeSignal(PublicSignal);
                  }
                  DeleteMsgPort(ReplyPort);
                }
                DeleteMsgPort(MPSem->DaemonPort);
              }
              DeleteMsgPort(CatchPort);
            }
            DeleteCxObjAll(Broker);
            while(cxmsg=(CxMsg *)GetMsg(BrokerPort))
              ReplyMsg((struct Message *)cxmsg);
          }/* endif CxBroker() */
          DeleteMsgPort(BrokerPort);
        }// endif CreateMsgPort(BrokerPort)
        // ArgArrayDone();
        CleanupArgs(argc);
      }// endif GetArgs() 
      FreeVec(MPSem);
    }
    ex_CloseLibs(MP_Libs);//                                                                           (4.63.1) (09/17/00)
  } 
  if(LocaleBase)
  {
    CloseCatalog(Catalog);
    CloseLibrary((struct Library *)LocaleBase);
  }
}
  
void ProcessInput(void)
{

  struct DefaultNode *catdnode;
  ULONG  replysig,portsig,catchsig,signal,msgtype,pubsig,allsigs,daemonsig;
  LONG msgid;

  
  daemonsig = 1 << MPSem->DaemonPort->mp_SigBit;
  catchsig  = 1 << CatchPort->mp_SigBit;
  portsig   = 1 << BrokerPort->mp_SigBit;
  pubsig    = 1 << PublicSignal; 
  replysig  = 1 << ReplyPort->mp_SigBit;

  allsigs=daemonsig | replysig | pubsig | catchsig | portsig | SIGBREAKF_CTRL_C;

  if(Popup)
    ShowGUI();

  while (!Deinstall)
  {
    signal=Wait (allsigs);

    if(SIGBREAKF_CTRL_C & signal)
      CheckToQuit();

    if(daemonsig & signal)
      ProcessMPMessages();

    if(replysig & signal)
    {
      struct MPMessage *mpm;
      
      while(mpm=(struct MPMessage *)GetMsg(ReplyPort))
        FreeVec(mpm);
    }

    if(pubsig & signal)
    {
      SetSignal(0,pubsig);
      ClosePubScreens();
    }
    
    if(catchsig & signal)
    {
      while(catdnode=(struct DefaultNode *)GetMsg(CatchPort))
      {
        AddDNode(catdnode->Type,catdnode);
      }
//      if(MPSem->CatchPopup)
//      ShowGUI();
    }
        
    if(portsig & signal)
    {
      while(cxmsg=(CxMsg *)GetMsg(BrokerPort))
      {
        msgid=CxMsgID(cxmsg);
        msgtype=CxMsgType(cxmsg);
        ReplyMsg((struct Message *)cxmsg);     
        switch(msgtype)
        {
          case CXM_IEVENT:
            switch(msgid)
            {
              case EVT_HOTKEY:
                ShowGUI();
                break;
              default:
                {
                  struct OpenNode *on;
                  // This was ListSem... why?
                  ObtainSemaphoreShared(&MPSem->OpenListSem);
                  on=(struct OpenNode *)MPSem->OpenList.lh_Head;
                  while(on->on_Node.ln_Succ)
                  {
                    if(on=(struct OpenNode *)msgid)
                    {
                      ScreenToFront(on->Screen);
                      ActivateWindow(on->Screen->FirstWindow);
                      RemoveCxObj(on->Cx);
                      AttachCxObj(Broker,on->Cx);
                      /*
                      
                      DeleteCxObjAll(on->Cx);
                      
                      on->Cx=AddHotKey(Broker,BrokerPort,on->HotKey,(ULONG)on);
                      */
                      break;
                    }
                    on=(struct OpenNode *)on->on_Node.ln_Succ;
                  }
                  ReleaseSemaphore(&MPSem->OpenListSem);
                }
            }
            break;
          case CXM_COMMAND:
            switch(msgid)
            {
              case CXCMD_DISABLE:
                MPSem->Enabled=FALSE;
                ActivateCxObj(Broker,0);
                SendPrefsMsg(MP_REFRESH,0,0);
                break;
              case CXCMD_ENABLE:
                MPSem->Enabled=TRUE;
                ActivateCxObj(Broker,1);
                SendPrefsMsg(MP_REFRESH,0,0);
                break;
              case CXCMD_KILL:
                CheckToQuit();
                break;
              case CXCMD_UNIQUE:
              case CXCMD_APPEAR:
                ShowGUI();
                break;
              case CXCMD_DISAPPEAR:
                HideGUI();
                break;
            }
            break;        
        }
      }
    }
  }
  HideGUI();
}    

void ProcessMPMessages(void)
{
  struct MPMessage *mpm;

  while(mpm=(struct MPMessage *)GetMsg(MPSem->DaemonPort))
  {
DEBUG_CODE(DKP("DaemonMsg ReplyPort %8lx Command %ld  Code %ld  Data %8lx\n",((struct Message *)mpm)->mn_ReplyPort, mpm->Command,mpm->Code,mpm->Data););
    
    switch(mpm->Command)
    {
      case MP_QUIT:
        CheckToQuit();
        break;

      case MP_SHOWGUI:
        mpm->Code=ShowGUI();
        break;

      case MP_SCREENOPENED:
        {
          struct OpenNode *on;
          
          on=(struct OpenNode *)mpm->Data;
          ReplyMsg((struct Message *)mpm);
          mpm=0;
          
          AddBackdrop(on->Screen,on->DN);
        }
        break;
        
      case MP_SCREENCLOSING:
        {
          struct OpenNode *on;
        
          on=(struct OpenNode *)mpm->Data;
          RemoveBackdrop(on->Screen);
        }
        break;

      case MP_PUBSCREEN:
        {
          
        }
        break;

        /*
      case MP_NEWNODE:

        AddDNode(mpm->Code,mpm->Data);
        break;
      case MP_REMNODE:
        RemDNode(mpm->Data);
        break;
        */      
    }
    if(mpm)
      ReplyMsg((struct Message *)mpm);
  }
}


 
void CheckToQuit(void)
{
  APTR  CheckCloseScreen,
        CheckOpenScreen,
        CheckOpenScreenTagList,
        CheckOpenWindow,
        CheckOpenWindowTagList,
        CheckCloseWorkBench,
        CheckLayoutMenusA,
        CheckLockPubScreen,
        CheckUnlockPubScreen;
#ifndef NO_LOCKPUBSCREENLIST
  APTR  CheckLockPubScreenList,
        CheckUnlockPubScreenList;
#endif
  BOOL patchedover=FALSE,
       screensopen=FALSE;
  ULONG len;
  UBYTE *warning=0;
  UBYTE *warn;
  
  ObtainSemaphoreShared(&MPSem->ListSem);
  ObtainSemaphore(&MPSem->OpenListSem);
  Forbid();
  
  if(!Deinstall && !InPatch)
  {
    
    if(IsListEmpty(&MPSem->OpenList))
    {
      /**** check LVOs and make sure their mine ****/
      /**** get LVOs,so put mine in thier, and get the result ****/ 
      CheckCloseScreen        =SetFunction((struct Library *)IntuitionBase,-(0x42), (FUNCCAST)OldCloseScreen);
      CheckOpenScreenTagList  =SetFunction((struct Library *)IntuitionBase,-(0x264),(FUNCCAST)OldOpenScreenTagList);
      CheckOpenScreen         =SetFunction((struct Library *)IntuitionBase,-(0xc6), (FUNCCAST)OldOpenScreen);
      CheckCloseWorkBench     =SetFunction((struct Library *)IntuitionBase,-(0x4e) ,(FUNCCAST)OldCloseWorkBench);
      CheckLockPubScreen      =SetFunction((struct Library *)IntuitionBase,-(0x1fe),(FUNCCAST)OldLockPubScreen);
      CheckUnlockPubScreen    =SetFunction((struct Library *)IntuitionBase,-516,    (FUNCCAST)OldUnlockPubScreen);
#ifndef NO_LOCKPUBSCREENLIST
      CheckLockPubScreenList  =SetFunction((struct Library *)IntuitionBase,-(0x20a),(FUNCCAST)OldLockPubScreenList);
      CheckUnlockPubScreenList=SetFunction((struct Library *)IntuitionBase,-(0x210),(FUNCCAST)OldUnlockPubScreenList);
#endif
      CheckLayoutMenusA       =SetFunction((struct Library *)GadToolsBase ,-(0x42), (FUNCCAST)OldLayoutMenusA);
      CheckOpenWindowTagList  =SetFunction((struct Library *)IntuitionBase,-(0x25e),(FUNCCAST)OldOpenWindowTagList);
      CheckOpenWindow         =SetFunction((struct Library *)IntuitionBase,-(0xcc), (FUNCCAST)OldOpenWindow);
      /**** now restore the LVOs to whatever they were ***/
     
      if((APTR)CheckCloseScreen         != (APTR)NewCloseScreen         ||
         (APTR)CheckOpenScreenTagList   != (APTR)NewOpenScreenTagList   ||
         (APTR)CheckOpenScreen          != (APTR)NewOpenScreen          || 
         (APTR)CheckCloseWorkBench      != (APTR)NewCloseWorkBench      ||
         (APTR)CheckLockPubScreen       != (APTR)NewLockPubScreen       ||
         (APTR)CheckUnlockPubScreen     != (APTR)NewUnlockPubScreen     ||
#ifndef NO_LOCKPUBSCREENLIST
         (APTR)CheckLockPubScreenList   != (APTR)NewLockPubScreenList   ||
         (APTR)CheckUnlockPubScreenList != (APTR)NewUnlockPubScreenList ||
#endif
         (APTR)CheckLayoutMenusA        != (APTR)NewLayoutMenusA        ||
         (APTR)CheckOpenWindowTagList   != (APTR)NewOpenWindowTagList   ||
         (APTR)CheckOpenWindow          != (APTR)NewOpenWindow)

      {                 
        SetFunction((struct Library *)IntuitionBase,-(0x42), (FUNCCAST)CheckCloseScreen);
        SetFunction((struct Library *)IntuitionBase,-(0x264),(FUNCCAST)CheckOpenScreenTagList);
        SetFunction((struct Library *)IntuitionBase,-(0xc6) ,(FUNCCAST)CheckOpenScreen);
        SetFunction((struct Library *)IntuitionBase,-(0x4e) ,(FUNCCAST)CheckCloseWorkBench);  
        SetFunction((struct Library *)IntuitionBase,-(0x1fe),(FUNCCAST)CheckLockPubScreen);
        SetFunction((struct Library *)IntuitionBase,-516,    (FUNCCAST)CheckUnlockPubScreen);
        
#ifndef NO_LOCKPUBSCREENLIST
        SetFunction((struct Library *)IntuitionBase,-(0x20a),(FUNCCAST)CheckLockPubScreenList);
        SetFunction((struct Library *)IntuitionBase,-(0x210),(FUNCCAST)CheckUnlockPubScreenList);
#endif

        SetFunction((struct Library *)GadToolsBase ,-(0x42) ,(FUNCCAST)CheckLayoutMenusA);
        SetFunction((struct Library *)IntuitionBase,-(0x25e),(FUNCCAST)CheckOpenWindowTagList);
        SetFunction((struct Library *)IntuitionBase,-(0xcc) ,(FUNCCAST)CheckOpenWindow);
        
        patchedover=TRUE;
      }
      else
      {
        Deinstall=TRUE;
        SendPrefsMsg(MP_QUIT,0,0);
      }
    }
    else
    {
      struct OpenNode *on;
    
      warn=GetString(MSG_REQ_CANT_QUIT_SCREENS);
      
      len=strlen(warn);
      
      on=(struct OpenNode *)MPSem->OpenList.lh_Head;
      while(on->on_Node.ln_Succ)
      {
        len+=strlen(on->Screen->Title)+4;
        on=(struct OpenNode *)on->on_Node.ln_Succ;
      }
      if(warning=AllocVec(len,MEMF_PUBLIC|MEMF_CLEAR|MEMF_NO_EXPUNGE))    
      {
        strcpy(warning,warn);
        on=(struct OpenNode *)MPSem->OpenList.lh_Head;
        while(on->on_Node.ln_Succ)
        {
          strcat(warning,"\n  ");
          strcat(warning,on->Screen->Title);
          on=(struct OpenNode *)on->on_Node.ln_Succ;
        }
        screensopen=TRUE;
      }
    }
    ReleaseSemaphore(&MPSem->OpenListSem);
    ReleaseSemaphore(&MPSem->ListSem);
    
    Permit();
    
    if(patchedover)
      EZReq(0,0,ModePro,GetString(MSG_REQ_CANT_QUIT_PATCHED_OVER),GetString(MSG_REQ_OK),0);   
    
    if(screensopen && warning)
    {
      EZReq(0,0,ModePro,warning,GetString(MSG_REQ_OK),0);
      FreeVec(warning);
    }
  }
}

LONG SendPrefsMsg(ULONG Command, ULONG Code, APTR Data)
{
  LONG rv=-1;
  struct MPMessage *mpm,*rm;
  struct MsgPort *mp;

  ObtainSemaphore(&MPSem->PortSem);
  if(MPSem->PrefsPort)
  {
    if(mp=CreateMsgPort())
    {
      rv=0;
      if(mpm=AllocVec(sizeof(struct MPMessage),MEMF_PUBLIC|MEMF_CLEAR))
      {
        mpm->Command=Command;
        mpm->Code=Code;
        mpm->Data=Data;
        mpm->mp_Message.mn_ReplyPort=mp;
        PutMsg(MPSem->PrefsPort,(struct Message *)mpm);
         rm=0;
        
        ReleaseSemaphore(&MPSem->PortSem);              
        while(rm!=mpm)
        {
          WaitPort(mp);
          rm=(struct MPMessage *)GetMsg(mp);
        }
        ObtainSemaphore(&MPSem->PortSem);
        
        rv=1; 
      }
      DeleteMsgPort(mp);
    }
  } 
  ReleaseSemaphore(&MPSem->PortSem);
  return(rv);
}

BOOL DaemonLoadFile(STRPTR FileName)
{
  //LONG error;
  BOOL rv;

  // no need for protection, the lists are not public
  // when this function is called.  
  rv=LoadFile(MPSem->PromotionList,FileName);
  /*
  if(error=IoErr())
  {
    UBYTE errstr[91];

    Fault(error,GetString(MSG_REQ_LOAD_ERROR),errstr,90);
    EZReq(0,0,ModePro,errstr,GetString(MSG_REQ_OK),0);
  }
  */
  return(rv);
}    

