home *** CD-ROM | disk | FTP | other *** search
/ linuxmafia.com 2016 / linuxmafia.com.tar / linuxmafia.com / pub / palmos / linkmaster-src-1.0.4.tar.gz / linkmaster-src-1.0.4.tar / linkmaster-1.0.4 / newlink.c < prev    next >
C/C++ Source or Header  |  2000-09-05  |  5KB  |  228 lines

  1. #include <Pilot.h>
  2. #include "callback.h"
  3.  
  4. #include "linkaware.h"
  5. #include "linkmaster.h"
  6. #include "linkmasterRsc.h"
  7.  
  8. typedef struct {
  9.    ULong type;
  10.    ULong creator;
  11.    Char name;
  12. } CacheEntryType;
  13.  
  14. static DmOpenRef cache;
  15. static void UpdateCache();
  16.  
  17. static void AppDrawFunc(UInt index, RectanglePtr bounds,
  18.             CharPtr* data)
  19. {
  20.    VoidHand hrec;
  21.    CacheEntryType* prec;
  22.    CALLBACK_PROLOGUE;
  23.  
  24.    hrec=DmQueryRecord(cache, index);
  25.    prec=MemHandleLock(hrec);
  26.    WinDrawChars(&prec->name, StrLen(&prec->name),
  27.         bounds->topLeft.x, bounds->topLeft.y);
  28.    MemHandleUnlock(hrec);
  29.    
  30.    CALLBACK_EPILOGUE;
  31. }
  32.  
  33. static void SetupList(FormPtr frm)
  34. {
  35.    ListPtr list;
  36.    
  37.    list=FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NewLinkAppList));
  38.    LstSetListChoices(list, NULL, DmNumRecords(cache));
  39.    LstSetDrawFunction(list, AppDrawFunc);
  40.    LstSetSelection(list, 0);
  41. }
  42.  
  43. static void InitForm(FormPtr frm)
  44. {
  45.    cache=DmOpenDatabaseByTypeCreator('CACH', 'Link', dmModeReadOnly);
  46.    if (!cache) 
  47.       UpdateCache();
  48.  
  49.    SetupList(frm);
  50. };
  51.  
  52. static Int CacheEntryCompare(CacheEntryType* rec1, CacheEntryType* rec2,
  53.                  Int other, SortRecordInfoPtr sort1,
  54.                  SortRecordInfoPtr sort2, VoidHand happinfo)
  55. {
  56.    return StrCompare(&rec1->name, &rec2->name);
  57. }
  58.  
  59. static void UpdateCache()
  60. {
  61.    DmSearchStateType searchstate;
  62.    UInt cardno;
  63.    LocalID dbid;
  64.    Err err;
  65.    Boolean newsearch;
  66.    ULong searchtype;
  67.  
  68.    if (!DmGetNextDatabaseByTypeCreator(true, &searchstate, 'CACH', 'Link',
  69.                        true, &cardno, &dbid))
  70.       DmDeleteDatabase(cardno, dbid);
  71.    
  72.    DmCreateDatabase(0, "LinkMaster Cache", 'Link', 'CACH', false);
  73.    cache=DmOpenDatabaseByTypeCreator('CACH', 'Link', dmModeReadWrite);
  74.  
  75.    newsearch=true;
  76.    searchtype='PROX';
  77.    while (1) {
  78.       CacheEntryType entry;
  79.       VoidHand hrec;
  80.       Word index=0;
  81.       Ptr prec;
  82.       Boolean aware=false;
  83.       DmOpenRef app;
  84.       Int resindex;
  85.       VoidHand hres;
  86.       CharPtr pres;
  87.       Char name[33];
  88.       
  89.       err=DmGetNextDatabaseByTypeCreator(newsearch, &searchstate, searchtype,
  90.                      0, true, &cardno, &dbid);
  91.       newsearch=false;
  92.       if (err) {
  93.      if (searchtype=='PROX') {
  94.         searchtype='appl';
  95.         newsearch=true;
  96.         continue;
  97.      } else
  98.         break;
  99.       };
  100.  
  101.       DmDatabaseInfo(cardno, dbid, NULL, NULL, NULL, NULL, NULL, NULL,
  102.              NULL, NULL, NULL, &entry.type, &entry.creator);
  103.       app=DmOpenDatabase(cardno, dbid, dmModeReadOnly);
  104.       
  105.       if (entry.type=='PROX')
  106.      aware=true;
  107.       else {
  108.      /* check Link0001 resource */
  109.      resindex=DmFindResource(app, 'Link', 1, NULL);
  110.      if (resindex!=-1) {
  111.         hres=DmGetResourceIndex(app, resindex);
  112.         pres=(CharPtr)MemHandleLock(hres);
  113.         if (*pres=='a')
  114.            aware=true;
  115.         MemHandleUnlock(hres);
  116.         DmReleaseResource(hres);
  117.      };
  118.       };
  119.       
  120.       /* lookup name */
  121.       resindex=DmFindResource(app, 'tAIN', 0x03e8, NULL);
  122.       if (resindex==-1) {
  123.      hres=0;
  124.      pres=name;
  125.      DmDatabaseInfo(cardno, dbid, name, NULL, NULL, NULL, NULL, NULL,
  126.             NULL, NULL, NULL, NULL, NULL);
  127.       } else {
  128.      hres=DmGetResourceIndex(app, resindex);
  129.      pres=(CharPtr)MemHandleLock(hres);
  130.       };
  131.             
  132.       if (aware) {
  133.      hrec=DmNewRecord(cache, &index, StrLen(pres)+9);
  134.      prec=MemHandleLock(hrec);
  135.      DmWrite(prec, 0, &entry, 8);
  136.      DmWrite(prec, 8, pres, StrLen(pres)+1);
  137.      MemHandleUnlock(hrec);
  138.      DmReleaseRecord(cache, index, true);
  139.       };
  140.       if (resindex!=-1) {
  141.      MemHandleUnlock(hres);
  142.      DmReleaseResource(hres);
  143.       };
  144.       DmCloseDatabase(app);
  145.    }
  146.  
  147.    DmQuickSort(cache, (DmComparF*)CacheEntryCompare, 0);
  148. };
  149.  
  150. static void CleanUp()
  151. {
  152.    if (cache)
  153.       DmCloseDatabase(cache);
  154.    cache=0;
  155. }
  156.  
  157. static void LaunchApp()
  158. {
  159.    FormPtr frm;
  160.    ListPtr list;
  161.    Word selection;
  162.    VoidHand hrec;
  163.    CacheEntryType* prec;
  164.    DmSearchStateType searchstate;
  165.    UInt cardno;
  166.    LocalID dbid;
  167.  
  168.    frm=FrmGetActiveForm();
  169.    list=FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NewLinkAppList));
  170.    selection=LstGetSelection(list);
  171.  
  172.    hrec=DmQueryRecord(cache, selection);
  173.    prec=MemHandleLock(hrec);
  174.    DmGetNextDatabaseByTypeCreator(true, &searchstate,
  175.                   prec->type, prec->creator, true,
  176.                   &cardno, &dbid);
  177.    MemHandleUnlock(hrec);
  178.  
  179.    SysUIAppSwitch(cardno, dbid,
  180.           linkAppLaunchRequestLink, 0);
  181.    CleanUp();
  182. }
  183.  
  184. Boolean NewLinkFormHandleEvent(EventPtr e)
  185. {
  186.    Boolean handled=false;
  187.    FormPtr frm;
  188.  
  189.    CALLBACK_PROLOGUE;
  190.  
  191.    switch (e->eType) {
  192.    case frmOpenEvent:
  193.       frm=FrmGetActiveForm();
  194.       InitForm(frm);
  195.       FrmDrawForm(frm);
  196.       handled=true;
  197.       break;
  198.  
  199.    case ctlSelectEvent:
  200.       switch (e->data.ctlSelect.controlID) {
  201.       case Cancel:
  202.      CleanUp();
  203.      FrmReturnToForm(0);
  204.      handled=true;
  205.      break;
  206.  
  207.       case UpdateButton:
  208.      CleanUp();
  209.      UpdateCache();
  210.      SetupList(FrmGetActiveForm());
  211.      FrmUpdateForm(NewLinkForm, frmRedrawUpdateCode);
  212.      break;
  213.       };
  214.       break;
  215.  
  216.    case lstSelectEvent:
  217.       LaunchApp();
  218.       handled=true;
  219.       break;
  220.  
  221.    default:
  222.       break;
  223.    };
  224.       
  225.    CALLBACK_EPILOGUE;
  226.    return handled;
  227. }
  228.