home *** CD-ROM | disk | FTP | other *** search
/ Amiga Times / AmigaTimes.iso / sonstiges / tools / amiCheck / Source / keyPanel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-06  |  6.8 KB  |  307 lines

  1. /* keyPanel.c 
  2.  *
  3.  *  defines the GUIFront characteristics of the keyfile panel 
  4.  */
  5.   
  6. #include <stdio.h>  
  7. #include <intuition/gadgetclass.h>
  8. #include "amiCheck.h"
  9. #include "regGadget.h"
  10. #include "dataBase.h"
  11. #include "keyPanel.h"
  12. #include <string.h>
  13.  
  14. /* Key Globals */
  15. usrkey *ptrKey, tempkey, usrKey = {
  16.     0x0,
  17.     NULL,
  18.     "",
  19. };
  20.  
  21. /* prototypes */
  22. BOOL KeyHandleGadget(struct IntuiMessage *);
  23. void KeyInit(void);
  24. long KeyCRC (long byte, long lastcrc);
  25.  
  26.  
  27. ExtErrorData KeyExtData;
  28. GUIFront *keyGUI;
  29.  
  30. struct TagItem strKeyTags[] =
  31. {
  32.     /*{STRINGA_ExitHelp,TRUE},*/
  33.     {GTIN_Number, 1},
  34.     {GTIN_MaxChars,20},
  35.     {TAG_DONE},
  36. };
  37.  
  38.  
  39. /* define gadgetspec */
  40. GadgetSpec KEYgadgetspecs[] = 
  41. {
  42.  
  43.         {INTEGER_KIND,30,0,{0,0,0,0,"User _ID", NULL, GID_KEYID,         
  44.                 PLACETEXT_LEFT}, strKeyTags, GS_DefaultTags},
  45.  
  46.         {STRING_KIND,30,0,{0,0,0,0,"User _Name", NULL, GID_KEYNAME,         
  47.                 PLACETEXT_LEFT}, strNameTags, GS_DefaultTags},
  48.  
  49.         {BUTTON_KIND,6,0,{0,0,0,0,"_Cancel", NULL, GID_KEYCANCEL,         
  50.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  51.  
  52.         {BUTTON_KIND,6,0,{0,0,0,0,"_Register", NULL, GID_KEYREG,         
  53.                 PLACETEXT_IN}, NULL, GS_DefaultTags}, 
  54. };
  55.  
  56. /* set up array of pointers to our specs */
  57. GadgetSpec *KEY_KeySpecs[] =
  58. {
  59.         &KEYgadgetspecs[0],
  60.         &KEYgadgetspecs[1],
  61.         &KEYgadgetspecs[2],
  62.         &KEYgadgetspecs[3],
  63.         NULL,
  64. };
  65.  
  66.  
  67. /* define the layout of this panel */
  68. ULONG KEY_KeyPanel[] =
  69. {
  70.    GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_LabelAlign,
  71.  
  72.    GUIL_HorizGroup,1,
  73.        GUIL_FrameType, GUILFT_Recess,
  74.        GUIL_VertGroup, 1,
  75.          GUIL_Flags, GUILF_PropShare | GUILF_LabelAlign,
  76.         GUIL_GadgetSpecID, GID_KEYID,
  77.         GUIL_GadgetSpecID, GID_KEYNAME,
  78.        TAG_DONE,
  79.    TAG_DONE,
  80.         
  81.    GUIL_HorizGroup,1,
  82.         GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
  83.         GUIL_GadgetSpecID, GID_KEYREG,
  84.     GUIL_GadgetSpecID, GID_KEYCANCEL,
  85.    TAG_DONE,   
  86.            
  87. TAG_DONE,
  88. };
  89.  
  90.  
  91. /****************************************************
  92. * KeyGUI ()
  93. *
  94. *    Creates the GUI for the key panel.
  95. *****************************************************/
  96. void  KeyGUI(void)
  97. {
  98.  BOOL done = FALSE;
  99.  UWORD ordinal;
  100.  ULONG signal;
  101.      
  102.  AmiLock();
  103.  
  104.  
  105.  GF_SetGUIAttr(keyGUI, GUI_OpenGUI, TRUE, TAG_DONE);
  106.  KeyInit();
  107.  
  108.  /* Process input events */
  109.  while (!done)   {
  110.    struct IntuiMessage *imsg;
  111.  
  112.                     /* Wait for an event to occur */
  113.  
  114.                     signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
  115.             if (signal & AmigaGuideSignal(agc)) {
  116.             AmiHelpMsg();
  117.             continue;
  118.             }
  119.     
  120.                     /* We only bother to listen for CLOSEWINDOW events.
  121.                      * Of course, in a real application, you would be
  122.                      * examining the Class field for IDCMP_GADGETUP
  123.                      * messages and act accordingly.
  124.                      */
  125.  
  126.                     while (imsg = GF_GetIMsg(guiapp))
  127.                     {
  128.                         switch (imsg->Class) {
  129.                                 case IDCMP_CLOSEWINDOW:
  130.                     done = TRUE;
  131.                                         break;
  132.  
  133.                 case IDCMP_RAWKEY:
  134.                     AmiHelpKey(imsg,KEY_PANEL);
  135.                     break;
  136.  
  137.                 case IDCMP_GADGETUP:
  138.                     done=KeyHandleGadget(imsg);
  139.                     break;
  140.  
  141.                 case IDCMP_REFRESHWINDOW:
  142.                     RegRefresh(TRUE);
  143.                     break;
  144.                         }
  145.                                                  
  146.                         GF_ReplyIMsg(imsg);
  147.                }
  148.         }
  149.  
  150.    GF_SetGUIAttr(keyGUI, GUI_OpenGUI, FALSE, TAG_DONE);               
  151.    AmiUnlock();
  152. }
  153.  
  154. /***************************************************
  155. * KeyHandleGadget()
  156. *
  157. *    Handles gadget events for this panel
  158. ****************************************************/
  159. BOOL KeyHandleGadget(struct IntuiMessage *imsg)
  160. {
  161.  BOOL done = FALSE;
  162.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  163.  UWORD code = imsg->Code;
  164.  
  165.  switch (gad->GadgetID) {
  166.  
  167.     case GID_KEYNAME:
  168.         strncpy(tempkey.id_name,((struct StringInfo *)gad->SpecialInfo)->Buffer, STRINGSIZE);
  169.         break;
  170.  
  171.     case GID_KEYID:
  172.         tempkey.id=((struct StringInfo *)gad->SpecialInfo)->LongInt;
  173.         break;
  174.  
  175.     case GID_KEYREG:
  176.         /* grab final values */
  177.         strncpy(tempkey.id_name,
  178.             ((struct StringInfo *)(KEY_KeySpecs[GID_KEYNAME]->gs_Gadget)->SpecialInfo)->Buffer,
  179.             STRINGSIZE);
  180.         tempkey.id = ((struct StringInfo *)(KEY_KeySpecs[GID_KEYID]->gs_Gadget)->SpecialInfo)->LongInt;
  181.  
  182.         if (KeyWriteFile(&tempkey)) {
  183.             memcpy(&usrKey,&tempkey,sizeof(usrkey));
  184.             AmiAnnounce("Keyfile updated.  Restart amiCheck");
  185.         }
  186.         else    AmiAnnounce("Trouble writing keyfile");
  187.  
  188.             /* FALL THROUGH */
  189.  
  190.     case GID_KEYCANCEL:
  191.         done = TRUE;    
  192.         break;
  193.  }
  194.  
  195.  return (done);
  196. }
  197.  
  198. /****************************************************
  199. * KeyInit()
  200. *
  201. *    Set up some globals
  202. *****************************************************/
  203. void KeyInit(void)
  204. {
  205.  memcpy(&tempkey, &usrKey,sizeof(usrkey));
  206.  
  207.  GF_SetGadgetAttrs (keyGUI, KEY_KeySpecs[GID_KEYID]->gs_Gadget,
  208.     GTIN_Number,tempkey.id,
  209.     TAG_DONE);
  210.  
  211.  GF_SetGadgetAttrs (keyGUI, KEY_KeySpecs[GID_KEYNAME]->gs_Gadget,
  212.     GTST_String,tempkey.id_name,
  213.     TAG_DONE);
  214. }
  215.  
  216. /****************************************************
  217. * KeyWriteFile()
  218. *
  219. *    Writes out usrKey data to PROGDIR:keyfile
  220. ****************************************************/
  221. BOOL KeyWriteFile(usrkey *temp)
  222. {
  223.  FILE *key;
  224.  
  225.  if ( (key=fopen("PROGDIR:keyfile","w")) != NULL) {
  226.     fprintf(key,"%u\n", temp->id);
  227.     fprintf(key,"%s\n", temp->id_name);
  228.     
  229.     fclose(key);
  230.     return (TRUE);
  231.  }
  232.  
  233.  return (FALSE);
  234. }
  235.  
  236. /*****************************************************
  237. * KeyReadFile()
  238. *
  239. *    Reads in the usrKey data from PROGDIR:keyfile
  240. ******************************************************/
  241. BOOL KeyReadFile(void)
  242. {
  243.  FILE *key;
  244.  
  245.  if ( (key=fopen("PROGDIR:keyfile","r")) != NULL) {
  246.     fscanf(key,"%u\n", &usrKey.id);
  247.     fgets(usrKey.id_name, STRINGSIZE, key);
  248.     if (strlen(usrKey.id_name) > 0)
  249.         usrKey.id_name[strlen(usrKey.id_name)-1] = 0;
  250.     
  251.     fclose(key);
  252.     return (TRUE);
  253.  }
  254.  
  255.  /* DMD - Damn Im generous :) */
  256.  return (TRUE);
  257. }
  258.  
  259. /*****************************************************
  260. * KeyCheck()
  261. *
  262. *    Returns TRUE if OK
  263. ******************************************************/
  264. BOOL KeyCheck(void)
  265. {
  266.  /* DMD - give this all away to the good public :) */
  267.  return (TRUE /*usrKey.id == usrKey.verify*/);
  268. }
  269.  
  270. /*****************************************************
  271. * KeyVerify()
  272. *
  273. *    Verifies the usrKey data
  274. ******************************************************/
  275. void KeyVerify(usrkey *temp)
  276. {
  277.  int x,y = strlen(temp->id_name);
  278.  
  279.  temp->verify = 0xbabe;
  280.  for (x=0;x< ((y<5)?5:y) ;x++)
  281.     temp->verify = KeyCRC(temp->id_name[x],temp->verify);    
  282. }
  283.  
  284. /****************************************************
  285. * KeyCRC()
  286. *
  287. *    Calculate the CRC 
  288. *****************************************************/
  289. long KeyCRC (long byte, long lastcrc)
  290. {
  291.  long  n;
  292.  long  crc = lastcrc;
  293.  
  294.  crc ^= byte;
  295.  
  296.  for (n=0; n<=7; n++) {
  297.      if (crc & 0x1)  {
  298.            crc >>= 1;
  299.            crc ^=  0x900A001;
  300.      }
  301.                 else
  302.      crc >>= 1;
  303.  }
  304.  
  305.  return crc;
  306. }
  307.