home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / doors / multinode / multinode.c < prev   
Encoding:
C/C++ Source or Header  |  1992-12-26  |  7.2 KB  |  281 lines

  1. #include <exec/exec.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #define gu getuserstring
  5. #define pu putuserstring
  6. #define sm sendmessage
  7. #include "dh1:source/doors/romconf/doorheader.h"
  8.  
  9. char MultiName[] = "MULTINODE";
  10. #define ALL -1
  11. #define NEW 1
  12. #define N_TEXT 2
  13. #define QUIT 3
  14. #define ACTIVE 1
  15. #define INACTIVE 2
  16. int my_node;
  17. void LastCommand(void);
  18. void end(void);
  19. void InitMultiNode(void);
  20. void SendSig(int node,int Type,int ch);
  21. void my_Interact(void);
  22. void ProcessInfo(int node);
  23. extern struct JHMessage *Jhmsg;
  24. int LastNode=0;
  25. void ListNodes(void);
  26. struct NodeData
  27. {
  28.   int nodeid;
  29.   unsigned long tasksignal;
  30.   struct Task *mytask;
  31.   int Type;
  32.   int status;
  33.   char string[100];
  34.   int ch;
  35.   
  36.   struct NodeData *NextNode;
  37.   
  38. } *MyNode=NULL;
  39. struct MultiPort
  40. {
  41.   struct SignalSemaphore semi;
  42.   struct NodeData *NodeInfo;
  43.   int FromNode;
  44.   int TotalNodes;
  45. } *Nodes=NULL;
  46.  
  47. main(int argc,char *argv[])
  48. {
  49.    char t[200];
  50.   if(argc!=2)
  51.   {
  52.     printf("MultiNode Experiment\n");
  53.     exit(0);
  54.   }
  55.   my_node=argv[1][0]-'0';
  56.   Register(argv[1][0]-'0');
  57.   getuserstring(t,BB_TASKPRI);
  58.   Forbid();
  59.   SetTaskPri(FindTask(0),atol(t));
  60.  
  61.   InitMultiNode();
  62.   my_Interact();
  63. }
  64. void LastCommand(void)
  65. {
  66.              // ObtainSemaphore((struct SignalSemaphore *)Nodes);
  67.               SendSig(ALL,QUIT,NULL);
  68.              // 
  69.              // ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  70. }
  71.  
  72. void end(void)
  73. {
  74.   exit(0);
  75. }
  76. void InitMultiNode(void)
  77. {
  78.   unsigned long signal;
  79.   struct NodeData *it;
  80.   struct NodeData *new=NULL;
  81.   char *Name;
  82.   int found=0;
  83.   char myname[40];
  84.   signal=getsignal();
  85.  pu("",BB_GETTASK);
  86.   gu(myname,DT_NAME);
  87.   if(!(Nodes=(struct MultiPort *)FindSemaphore(MultiName)))
  88.   {
  89.  
  90.        Nodes=(struct MultiPort *)AllocMem(sizeof(struct MultiPort),MEMF_PUBLIC|MEMF_CLEAR);
  91.        Name=(char *)AllocMem((strlen(MultiName)+1)*sizeof(char),MEMF_PUBLIC|MEMF_CLEAR);
  92.        strcpy(Name,MultiName);
  93.  
  94.        Nodes->semi.ss_Link.ln_Pri=0;
  95.        Nodes->semi.ss_Link.ln_Name=Name;
  96.        Nodes->NodeInfo=(struct NodeData *)AllocMem(sizeof(struct NodeData),MEMF_PUBLIC|MEMF_CLEAR);
  97.        AddSemaphore((struct SignalSemaphore *)Nodes);
  98.        Nodes->NodeInfo->NextNode=NULL; 
  99.        Nodes->NodeInfo->nodeid=my_node;
  100.        Nodes->NodeInfo->tasksignal=signal;
  101.        Nodes->TotalNodes=1; 
  102.        Nodes->NodeInfo->mytask=(struct Task *)Jhmsg->aeproc;
  103.        Nodes->NodeInfo->status=ACTIVE;
  104.        strcpy(Nodes->NodeInfo->string,myname);
  105.        MyNode=Nodes->NodeInfo;
  106.        
  107.   }
  108.   else
  109.   {
  110.     found=1;
  111.     ObtainSemaphore((struct SignalSemaphore *)Nodes);
  112.     for(it=(struct NodeData *)Nodes->NodeInfo;it->NextNode;it=it->NextNode)
  113.     { 
  114.       if(it->nodeid==my_node) new=(struct NodeData *)it;
  115.     }
  116.       if(it->nodeid==my_node) new=(struct NodeData *)it;
  117.          if(it->NextNode==NULL && new==NULL)
  118.          {
  119.             new=(struct NodeData *)AllocMem(sizeof(struct NodeData),MEMF_PUBLIC|MEMF_CLEAR);
  120.             if(my_node!=it->nodeid)it->NextNode=new;
  121.             new->NextNode=NULL;
  122.             new->nodeid=my_node;
  123.          }
  124.     MyNode=new;
  125.     new->tasksignal=signal;
  126.     new->mytask=(struct Task *)Jhmsg->aeproc;
  127.     new->nodeid=my_node;
  128.     strcpy(new->string,myname);
  129.     new->status=ACTIVE;
  130.     
  131.     ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  132.     
  133.   }
  134. if(!found)sm("Can't Find Semaphore",1);
  135. SendSig(ALL,NEW,NULL);
  136. }
  137.  
  138. void SendSig(int node,int Type,int ch)
  139. {
  140.   struct NodeData *it;
  141.   int value=0;
  142.   char temp[100];
  143.   ObtainSemaphore((struct SignalSemaphore *)Nodes);
  144.   Nodes->FromNode=MyNode->nodeid;
  145.   MyNode->Type=Type;
  146.   MyNode->ch=ch;
  147.   if(Type==QUIT)MyNode->status=INACTIVE;
  148.   switch(node)
  149.   {
  150.     case ALL: 
  151.        for(it=(struct NodeData *)Nodes->NodeInfo;it;it=it->NextNode)
  152.        {
  153.          if(it->nodeid!=MyNode->nodeid && it->status==ACTIVE)
  154.          {
  155.            if(Type==NEW)
  156.            {
  157.               if(value==0)
  158.               {
  159.                 sm("",1);
  160.                 sm("Users in Chat:",1);
  161.                 value=1;
  162.               }
  163.              sprintf(temp,"%dm",(it->nodeid)+1);
  164.              sm("\t\t",0); sm(temp,0); sm(it->string,0); sm("",1);
  165.            }
  166.            Signal(it->mytask,it->tasksignal);
  167.          }
  168.        }break;
  169.     default:
  170.        for(it=(struct NodeData *)Nodes->NodeInfo;it;it=it->NextNode)
  171.        {
  172.          if(it->nodeid!=MyNode->nodeid && it->nodeid==node && it->status==ACTIVE)
  173.          {
  174.            Signal(it->mytask,it->tasksignal);
  175.            ReleaseSemaphore((struct SignalSemaphore *)Nodes); return;
  176.          }
  177.        }
  178.        break;
  179.   }
  180. ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  181.   if(value && Type==NEW) sm("",1);
  182.   else if(Type==NEW)
  183.   {
  184.     sm("",1);
  185.     sm("The Chat Room isEmpty!",1); sm("",1);
  186.   }
  187.   
  188.   
  189. }
  190.  
  191. void my_Interact(void)
  192. {
  193.    char mes[10];
  194.    char temp[100];
  195.    strcpy(mes,"");
  196.    strcpy(temp,"");
  197.    mes[1]='\0';
  198.    LastNode=-1;
  199.    while(1)
  200.    {
  201.       mes[0]=sigkey();
  202.       switch(mes[0])
  203.       {
  204.          case 0:
  205.               ObtainSemaphore((struct SignalSemaphore *)Nodes);
  206.               ProcessInfo(Nodes->FromNode);
  207.               ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  208.               break;
  209.          case '\\': ShutDown(); end();
  210.               break;
  211.          case '/': ListNodes(); break;
  212.          default:
  213.               if(LastNode!=MyNode->nodeid)
  214.               {
  215.                 sprintf(temp,"%dm%s>",MyNode->nodeid+1,MyNode->string);
  216.                 sm("",1);
  217.                 sm(temp,0);
  218.                 LastNode=MyNode->nodeid;
  219.               }
  220.               if(mes[0]==13 || mes[0]==12 ) sm("",1);else
  221.               sm(mes,0);
  222.               //ObtainSemaphore((struct SignalSemaphore *)Nodes);
  223.               SendSig(ALL,N_TEXT,mes[0]);
  224.               //ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  225.               break;
  226.       }
  227.    }
  228. }
  229.  
  230. void ProcessInfo(int node)
  231. {
  232.    struct NodeData *it;
  233.    char temp[200];
  234.        for(it=(struct NodeData *)Nodes->NodeInfo;it;it=it->NextNode)
  235.        {
  236.          if(it->nodeid!=MyNode->nodeid && it->nodeid==node)
  237.          {
  238.            switch(it->Type)
  239.            {
  240.              case QUIT:
  241.                   sprintf(temp,"%dm%s>Exits chat",it->nodeid+1,it->string);
  242.                   sm("",1);
  243.                   sm(temp,1);
  244.                   LastNode=-1;
  245.                   break;
  246.              case N_TEXT:
  247.                   if(LastNode!=it->nodeid)
  248.                   {
  249.                     LastNode=it->nodeid;
  250.                     sm("",1);
  251.                     sprintf(temp,"%dm%s>",LastNode+1,it->string);
  252.                     sm(temp,0);
  253.                   }
  254.                   sprintf(temp,"%c",it->ch);
  255.     if(it->ch=='\r' || it->ch=='\n') sm("",1);else
  256.                   sm(temp,0);
  257.                   break;
  258.              case NEW:
  259.                   sprintf(temp,"%dm%s>Enters chat",it->nodeid+1,it->string);
  260.                   sm("",1);
  261.                   sm(temp,1);
  262.                   LastNode=-1;
  263.                   break;
  264.             }
  265.          }
  266.        }
  267. }
  268.  
  269. void ListNodes(void)
  270. {
  271.   struct NodeData *it;
  272.    char temp[200];
  273.    sm("",1);
  274.        ObtainSemaphore((struct SignalSemaphore *)Nodes);
  275.        for(it=(struct NodeData *)Nodes->NodeInfo;it;it=it->NextNode)
  276.        {
  277.          sprintf(temp,"Name: %s, status %d, type %d",it->string,it->status,it->Type);
  278.          sm(temp,1);
  279.        }
  280.        ReleaseSemaphore((struct SignalSemaphore *)Nodes);
  281. }