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 / proxy / al / proxyapp.c < prev    next >
C/C++ Source or Header  |  2000-09-05  |  5KB  |  238 lines

  1. /* Main code for Proxy App Launcher */
  2.  
  3. #include <Pilot.h>
  4. #include "callback.h"
  5.  
  6. #include "linkaware.h"
  7. #include "proxyappRsc.h"
  8.  
  9. typedef struct {
  10.    DWord creator;
  11.    DWord app_creator;
  12. } LaunchLinkInfoType;
  13. typedef LaunchLinkInfoType* LaunchLinkInfoPtr;
  14.  
  15. static Handle happlist;
  16. static SysDBListItemType* papplist;
  17.  
  18. static void AppDrawFunc(UInt index, RectanglePtr bounds, CharPtr* data)
  19. {
  20.    SysDBListItemType* item;
  21.    CALLBACK_PROLOGUE;
  22.    item=papplist+index;
  23.    WinDrawChars(item->name, StrLen(item->name),
  24.         bounds->topLeft.x, bounds->topLeft.y);
  25.    CALLBACK_EPILOGUE;
  26. }
  27.  
  28. static void MainFormInit()
  29. {
  30.    FormPtr frm;
  31.    Word appcount;
  32.    ListPtr list;
  33.  
  34.    frm=FrmGetActiveForm();
  35.  
  36.    if (!SysCreateDataBaseList('appl', 0, &appcount, &happlist, true))
  37.       ErrDisplay("Error getting list of applications");
  38.    papplist=MemHandleLock((VoidHand)happlist);
  39.  
  40.    list=FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, MainList));
  41.    LstSetListChoices(list, NULL, appcount);
  42.    LstSetDrawFunction(list, AppDrawFunc);
  43.    LstSetSelection(list, 0);
  44. }
  45.  
  46. static void CleanUp()
  47. {
  48.    MemHandleUnlock((VoidHand)happlist);
  49.    MemHandleFree((VoidHand)happlist);
  50. }
  51.  
  52. LaunchLinkInfoPtr LaunchLinkNew(DWord creator, CharPtr title)
  53. {
  54.    LaunchLinkInfoPtr linkinfo;
  55.  
  56.    if (title) {
  57.       /* title is truncated to 32 chars or at the first \n */
  58.       int titlelen=32;
  59.       int tmp;
  60.  
  61.       tmp=StrLen(title);
  62.       if (tmp<titlelen) titlelen=tmp;
  63.  
  64.       tmp=StrChr(title, '\n')-title;
  65.       if ((tmp>0)&&(tmp<titlelen)) titlelen=tmp;
  66.  
  67.       linkinfo=MemPtrNew(65+titlelen);
  68.       MemSet(linkinfo, 65+titlelen, 0);
  69.       ErrFatalDisplayIf(!linkinfo, "Not enough memory");
  70.       StrNCopy(((CharPtr)linkinfo)+64, title, titlelen);
  71.       ((CharPtr)linkinfo)[64+titlelen]=0;
  72.    } else {
  73.       linkinfo=MemPtrNew(64);
  74.       MemSet(linkinfo, 64, 0);
  75.    };
  76.  
  77.    linkinfo->creator='LPal';
  78.    linkinfo->app_creator=creator;
  79.  
  80.    return linkinfo;
  81. }
  82.  
  83. static void Publish()
  84. {
  85.    DWord creator;
  86.    char title[32];
  87.    Word selection;
  88.    ListPtr list;
  89.    FormPtr frm;
  90.  
  91.    /* get selection */
  92.    frm=FrmGetActiveForm();
  93.    list=FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, MainList));
  94.    selection=LstGetSelection(list);
  95.    if (selection==-1)
  96.       return;
  97.  
  98.    /* get title */
  99.    StrCopy(title, "");
  100.    StrNCopy(title, papplist[selection].name, 31);
  101.  
  102.    creator=papplist[selection].creator;
  103.  
  104.    LinkPublish((LinkInfoPtr)LaunchLinkNew(creator, title));
  105. }
  106.  
  107. static Boolean MainFormHandleEvent (EventPtr e)
  108. {
  109.    Boolean handled = false;
  110.    FormPtr frm;
  111.     
  112.    CALLBACK_PROLOGUE
  113.  
  114.       switch (e->eType) {
  115.       case frmOpenEvent:
  116.      MainFormInit();
  117.      frm = FrmGetActiveForm();
  118.      FrmDrawForm(frm);
  119.      handled = true;
  120.      break;
  121.  
  122.       case frmCloseEvent:
  123.      CleanUp();
  124.      break;
  125.  
  126.       case menuEvent:
  127.      MenuEraseStatus(NULL);
  128.  
  129.      switch(e->data.menu.itemID) {
  130.      }
  131.  
  132.      handled = true;
  133.      break;
  134.  
  135.       case ctlSelectEvent:
  136.      switch(e->data.ctlSelect.controlID) {
  137.      case MainPublishButton:
  138.         Publish();
  139.         handled=true;
  140.         break;
  141.      }
  142.      break;
  143.  
  144.       default:
  145.      break;
  146.       }
  147.  
  148.    CALLBACK_EPILOGUE
  149.  
  150.       return handled;
  151. }
  152.  
  153. static Boolean ApplicationHandleEvent(EventPtr e)
  154. {
  155.    FormPtr frm;
  156.    Word    formId;
  157.    Boolean handled = false;
  158.  
  159.    if (e->eType == frmLoadEvent) {
  160.       formId = e->data.frmLoad.formID;
  161.       frm = FrmInitForm(formId);
  162.       FrmSetActiveForm(frm);
  163.  
  164.       switch(formId) {
  165.       case MainForm:
  166.      FrmSetEventHandler(frm, MainFormHandleEvent);
  167.      break;
  168.       }
  169.       handled = true;
  170.    }
  171.  
  172.    return handled;
  173. }
  174.  
  175. /* Get preferences, open (or create) app database */
  176. static Word StartApplication(void)
  177. {
  178.    FrmGotoForm(MainForm);
  179.    return 0;
  180. }
  181.  
  182. /* Save preferences, close forms, close app database */
  183. static void StopApplication(void)
  184. {
  185.    FrmSaveAllForms();
  186.    FrmCloseAllForms();
  187. }
  188.  
  189. /* The main event loop */
  190. static void EventLoop(void)
  191. {
  192.    Word err;
  193.    EventType e;
  194.  
  195.    do {
  196.       EvtGetEvent(&e, evtWaitForever);
  197.       if (! SysHandleEvent (&e))
  198.      if (! MenuHandleEvent (NULL, &e, &err))
  199.         if (! ApplicationHandleEvent (&e))
  200.            FrmDispatchEvent (&e);
  201.    } while (e.eType != appStopEvent);
  202. }
  203.  
  204. /* Main entry point; it is unlikely you will need to change this except to
  205.    handle other launch command codes */
  206. DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
  207. {
  208.    Word err;
  209.  
  210.    switch (cmd) {
  211.    case sysAppLaunchCmdNormalLaunch:
  212.    case linkAppLaunchRequestLink:
  213.       err = StartApplication();
  214.       if (err) return err;
  215.       EventLoop();
  216.       StopApplication();
  217.       break;
  218.  
  219.    case linkAppLaunchFollowLinkSubCall: {
  220.       LaunchLinkInfoPtr linkinfo=(LaunchLinkInfoPtr)cmdPBP;
  221.       DmSearchStateType searchstate;
  222.       UInt cardno;
  223.       LocalID dbid;
  224.        
  225.       DmGetNextDatabaseByTypeCreator(true, &searchstate,
  226.                      'appl', linkinfo->app_creator,
  227.                      true, &cardno, &dbid);
  228.       SysUIAppSwitch(cardno, dbid, sysAppLaunchCmdNormalLaunch, NULL);
  229.       break;
  230.    };
  231.  
  232.    default:
  233.       return sysErrParamErr;
  234.    };
  235.  
  236.    return 0;
  237. }
  238.