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 >
Wrap
C/C++ Source or Header
|
2000-09-05
|
5KB
|
228 lines
#include <Pilot.h>
#include "callback.h"
#include "linkaware.h"
#include "linkmaster.h"
#include "linkmasterRsc.h"
typedef struct {
ULong type;
ULong creator;
Char name;
} CacheEntryType;
static DmOpenRef cache;
static void UpdateCache();
static void AppDrawFunc(UInt index, RectanglePtr bounds,
CharPtr* data)
{
VoidHand hrec;
CacheEntryType* prec;
CALLBACK_PROLOGUE;
hrec=DmQueryRecord(cache, index);
prec=MemHandleLock(hrec);
WinDrawChars(&prec->name, StrLen(&prec->name),
bounds->topLeft.x, bounds->topLeft.y);
MemHandleUnlock(hrec);
CALLBACK_EPILOGUE;
}
static void SetupList(FormPtr frm)
{
ListPtr list;
list=FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NewLinkAppList));
LstSetListChoices(list, NULL, DmNumRecords(cache));
LstSetDrawFunction(list, AppDrawFunc);
LstSetSelection(list, 0);
}
static void InitForm(FormPtr frm)
{
cache=DmOpenDatabaseByTypeCreator('CACH', 'Link', dmModeReadOnly);
if (!cache)
UpdateCache();
SetupList(frm);
};
static Int CacheEntryCompare(CacheEntryType* rec1, CacheEntryType* rec2,
Int other, SortRecordInfoPtr sort1,
SortRecordInfoPtr sort2, VoidHand happinfo)
{
return StrCompare(&rec1->name, &rec2->name);
}
static void UpdateCache()
{
DmSearchStateType searchstate;
UInt cardno;
LocalID dbid;
Err err;
Boolean newsearch;
ULong searchtype;
if (!DmGetNextDatabaseByTypeCreator(true, &searchstate, 'CACH', 'Link',
true, &cardno, &dbid))
DmDeleteDatabase(cardno, dbid);
DmCreateDatabase(0, "LinkMaster Cache", 'Link', 'CACH', false);
cache=DmOpenDatabaseByTypeCreator('CACH', 'Link', dmModeReadWrite);
newsearch=true;
searchtype='PROX';
while (1) {
CacheEntryType entry;
VoidHand hrec;
Word index=0;
Ptr prec;
Boolean aware=false;
DmOpenRef app;
Int resindex;
VoidHand hres;
CharPtr pres;
Char name[33];
err=DmGetNextDatabaseByTypeCreator(newsearch, &searchstate, searchtype,
0, true, &cardno, &dbid);
newsearch=false;
if (err) {
if (searchtype=='PROX') {
searchtype='appl';
newsearch=true;
continue;
} else
break;
};
DmDatabaseInfo(cardno, dbid, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, &entry.type, &entry.creator);
app=DmOpenDatabase(cardno, dbid, dmModeReadOnly);
if (entry.type=='PROX')
aware=true;
else {
/* check Link0001 resource */
resindex=DmFindResource(app, 'Link', 1, NULL);
if (resindex!=-1) {
hres=DmGetResourceIndex(app, resindex);
pres=(CharPtr)MemHandleLock(hres);
if (*pres=='a')
aware=true;
MemHandleUnlock(hres);
DmReleaseResource(hres);
};
};
/* lookup name */
resindex=DmFindResource(app, 'tAIN', 0x03e8, NULL);
if (resindex==-1) {
hres=0;
pres=name;
DmDatabaseInfo(cardno, dbid, name, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL);
} else {
hres=DmGetResourceIndex(app, resindex);
pres=(CharPtr)MemHandleLock(hres);
};
if (aware) {
hrec=DmNewRecord(cache, &index, StrLen(pres)+9);
prec=MemHandleLock(hrec);
DmWrite(prec, 0, &entry, 8);
DmWrite(prec, 8, pres, StrLen(pres)+1);
MemHandleUnlock(hrec);
DmReleaseRecord(cache, index, true);
};
if (resindex!=-1) {
MemHandleUnlock(hres);
DmReleaseResource(hres);
};
DmCloseDatabase(app);
}
DmQuickSort(cache, (DmComparF*)CacheEntryCompare, 0);
};
static void CleanUp()
{
if (cache)
DmCloseDatabase(cache);
cache=0;
}
static void LaunchApp()
{
FormPtr frm;
ListPtr list;
Word selection;
VoidHand hrec;
CacheEntryType* prec;
DmSearchStateType searchstate;
UInt cardno;
LocalID dbid;
frm=FrmGetActiveForm();
list=FrmGetObjectPtr(frm, FrmGetObjectIndex(frm, NewLinkAppList));
selection=LstGetSelection(list);
hrec=DmQueryRecord(cache, selection);
prec=MemHandleLock(hrec);
DmGetNextDatabaseByTypeCreator(true, &searchstate,
prec->type, prec->creator, true,
&cardno, &dbid);
MemHandleUnlock(hrec);
SysUIAppSwitch(cardno, dbid,
linkAppLaunchRequestLink, 0);
CleanUp();
}
Boolean NewLinkFormHandleEvent(EventPtr e)
{
Boolean handled=false;
FormPtr frm;
CALLBACK_PROLOGUE;
switch (e->eType) {
case frmOpenEvent:
frm=FrmGetActiveForm();
InitForm(frm);
FrmDrawForm(frm);
handled=true;
break;
case ctlSelectEvent:
switch (e->data.ctlSelect.controlID) {
case Cancel:
CleanUp();
FrmReturnToForm(0);
handled=true;
break;
case UpdateButton:
CleanUp();
UpdateCache();
SetupList(FrmGetActiveForm());
FrmUpdateForm(NewLinkForm, frmRedrawUpdateCode);
break;
};
break;
case lstSelectEvent:
LaunchApp();
handled=true;
break;
default:
break;
};
CALLBACK_EPILOGUE;
return handled;
}