Main Page | File List | Globals | Related Pages

gtalk.c

Go to the documentation of this file.
00001 
00012 /*
00013    Copyright (C) 1999-2004 Christian Claveleira (Christian.Claveleira@cru.fr)
00014 
00015    This program is free software; you can redistribute it and/or
00016    modify it under the terms of the GNU General Public License
00017    as published by the Free Software Foundation; either version 2
00018    of the License, or (at your option) any later version.
00019    
00020    This program is distributed in the hope that it will be useful,
00021    but WITHOUT ANY WARRANTY; without even the implied warranty of
00022    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023    GNU General Public License for more details.
00024    
00025    You should have received a copy of the GNU General Public License
00026    along with this program; if not, write to the Free Software
00027    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00028 */
00029 
00030 #ifdef DEBUG
00031 static char rcsid[] = "$Id: gtalk.c,v 1.40 2004/04/10 20:25:52 clavelei Exp clavelei $";
00032 static char * GetCharEncoding(void);
00033 #endif
00034 
00035 #define ALLOW_ACCESS_TO_INTERNALS_OF_LISTS // very dirty, en attendant que pilrc permette hascrollbar pour les listes $$
00036 
00037 #include <PalmOS.h>
00038 #include <PalmCompatibility.h>
00039 #include <string.h>
00040 #include <stdio.h>
00041 #include "gtalkRsc.h"
00042 #include "latlong.h"
00043 #include "MathLib.h"
00044 #include "gpslib.h"
00045 #include "gtalk.h"
00046 #include "route.h"
00047 #include "gpsutil.h"
00048 #include "log.h"
00049 #include "map.h"
00050 #include "gpsio.h"
00051 #include "memo.h"
00052 #include "dbio.h"
00053 #include "track.h"
00054 #include <LstGlue.h>
00055 #include <TxtGlue.h>
00056 
00057 // The minimum OS version supported :
00058 #define ourMinVersion           sysMakeROMVersion(3,0,0,sysROMStageRelease,0)
00059 #define MaxDBNames  10 /* maximum data bases names managed by SetPreferences */
00060 
00061 PrefType Prefs =
00062     { DispWpt, dmAllCategories, 0, Alpha, metric, DMM, 0, WGS84Index, 0, DBVersion, GIIPlus, 10,
00063       dmAllCategories, dmAllCategories, dmAllCategories, false, 0, WptDBName, RteDBName, TrkDBName, 0
00064 };
00065 int DebugLevel;
00066 const char *DistanceUnitNames[] = { "km", "nm", "mi" };
00067 char *BeamTypes[] = { "Un", "Wp", "Rt", "Tk" }; /* see ItemToDisplay enum for order */
00068 EditWptMode EditMode;
00069 Semicircle_Type ReferencePt = { 0, 0 }; /* coordonnees point de reference pour tri wpts */
00070 char ReferencePtName[32] = "";
00071 
00072 
00073 UInt CurrentRecordIndex,               /* current record index */
00074   CurrentRouteIndex,
00075  *CurrentCategory;
00076 
00077 UInt New,
00078   Replaced,
00079   Sent;
00080 char gbuf1[512],
00081   gbuf2[128],                          /* buffers "general purpose" */
00082 
00083   search_buf[6];                       /* buffer recherche par debut de nom */
00084 
00085 
00086 Semicircle_Type CurrentWGS84Pos;
00087 Boolean MustCallGpslibTicks = 0;
00088 Boolean OnlyNews,
00089   Furuno,
00090   CompactTracks = 0;
00091 Boolean MainListDirty = 1;
00092 DmOpenRef CurrentDB,
00093   WptDB,
00094   TrkDB,
00095   RteDB,
00096   LogDB;
00097 
00098 static UInt lastrecordindex,
00099   lastitemnum = -2;
00100 static ULong CurrentRecordID;          /* current record id */
00101 static char CategoryName[dmCategoryLength];
00102 static WinHandle SymbolsWH;            /* offscreen window containing symbols bitmaps */
00103 
00104 // prototypes :
00105 static Boolean MainFormHandleEvent (EventPtr e);
00106 static Boolean ApplicationHandleEvent (EventPtr e);
00107 static Word StartApplication (void);
00108 static void StopApplication (void);
00109 static void EventLoop (void);
00110 DWord PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags);
00111 static Err OpenOrCreateDB (DmOpenRef * DBP, char *DBName, ULong DBType, ULong creator);
00112 static void UpdateMainForm (void);
00113 static void AlarmProc (void);
00114 static Err RomVersionCompatible (UInt32 requiredVersion, UInt16 launchFlags);
00115 #ifdef SELECT
00116 static Boolean CatFormHandleEvent (EventPtr e);
00117 static Err RecSetSecret (DmOpenRef * DBP, UInt16 index, Boolean value);
00118 #endif
00119 static void NewDB (void);
00120 static UInt16 FindDBNames(UInt32 type, UInt32 creator,  char * namep,Int16 * matched, char * bufp, char ** bufpp,UInt16 bufpsize);
00121 static Err SwitchDB(DmOpenRef * DBP, char *DBName, ULong DBType);
00122 static void ChangeDB (void);
00123 #ifdef DEBUG
00124 static void SetDebug (void);
00125 #endif
00126 
00127 #ifdef EXPORT
00128 static void ExportWpt (void);
00129 
00130 
00137 static void
00138 ExportWpt ()                           /* experimental, not tested */
00139 {
00140     UInt i,
00141       l,
00142       pos = 0;
00143     Custom_Wpt_Type wpt;
00144     FormPtr fp = NULL;
00145     double latitude,
00146       longitude;
00147     char *p;
00148 
00149     fp = FrmInitForm (ExportForm);
00150     FrmDrawForm (fp);
00151 
00152     memo_open ("GPilotS waypoints\n");
00153     for (i = DmNumRecordsInCategory (WptDB, Prefs.wptcategory); i > 0; i--)
00154     {
00155         DmQueryNextInCategory (WptDB, &pos, Prefs.wptcategory);
00156         IndexToCustomWpt (pos, WptDB, &wpt);
00157         pos++;
00158         SemiToDegre (&wpt.posn, &latitude, &longitude);
00159         p = DegreToChars (latitude, 0, Prefs.displaymode);
00160         l = StrPrintF (gbuf1, "W\t%s\t%s\t", wpt.ident, p);
00161         p = DegreToChars (longitude, 1, Prefs.displaymode);
00162         l += StrPrintF (gbuf1 + l, "%s\t%s\t%s", p, DToA (wpt.alt, 0, 0), wpt.cmnt);
00163         memo_write (gbuf1);
00164     }                                                      /* for */
00165     memo_close (NULL);
00166     FrmEraseForm (fp);
00167     FrmDeleteForm (fp);
00168 }                                                          /* ExportWpt */
00169 #endif
00170 
00171 
00181 void
00182 DrawSymbol (unsigned int lid, int x, int y)
00183 {
00184 #define SymbH 14                                           // height
00185 #define SymbW 16                                           // width
00186 #define SymbO 2                                            // y offset
00187     RectangleType rect = { {lid * SymbW, SymbO}, {SymbW, SymbH} };
00188 
00189     if (SymbolsWH)
00190         WinCopyRectangle (SymbolsWH, WinGetDrawWindow (), &rect, x - SymbW / 2, y - SymbH / 2,
00191                           scrCopy);
00192 }                                                          /* DrawSymbol */
00193 
00194 
00195 #if 0
00196 GetWptName (Custom_Wpt_Type * wp, char *Header)
00197 {
00198     UInt i;
00199 
00200     for (i = 1; i < 100; i++)
00201     {
00202         StrNCopySafe (wp->ident, Header, sizeof (wp->ident));
00203         StrIToA (&name[4], i);
00204         if (SearchWptByName (name, 1, 1) < 0)
00205             break;
00206     }
00207     StrNCopySafe (wp.ident, name, sizeof (wp.ident));
00208 }
00209 #endif
00210 
00211 
00225 Int
00226 CompareWpt (void *p1, void *p2, Int other,
00227             SortRecordInfoPtr sp1, SortRecordInfoPtr sp2, VoidHand aph)
00228 {
00229     Int c,b1,b2;
00230 
00231     Custom_Wpt_Type wpt1,
00232       wpt2;
00233 
00234     PtrToCustomWpt (p1, &wpt1);
00235     PtrToCustomWpt (p2, &wpt2);
00236     switch (Prefs.wptsortcrit)
00237     {
00238     case Lat:
00239         c = wpt1.posn.lat > wpt2.posn.lat ? 1 : wpt1.posn.lat == wpt2.posn.lat ? 0 : -1;
00240         break;
00241 
00242     case Lon:
00243         c = wpt1.posn.lon > wpt2.posn.lon ? 1 : wpt1.posn.lon == wpt2.posn.lon ? 0 : -1;
00244         break;
00245 
00246     case Dist:
00247         c = DistComp (wpt1.posn.lat, wpt1.posn.lon, wpt2.posn.lat, wpt2.posn.lon, ReferencePt.lat,
00248                       ReferencePt.lon);
00249         break;
00250 
00251     case Symbol:
00252         if (wpt1.smbl == wpt2.smbl)
00253             c = StrCompare (wpt1.ident, wpt2.ident);
00254         else
00255             c = wpt1.smbl > wpt2.smbl ? 1 : -1;
00256         break;
00257 
00258     case Alt:
00259         c = wpt1.alt > wpt2.alt ? 1 : wpt1.alt == wpt2.alt ? 0 : -1;
00260         break;
00261 
00262     case Bear:
00263       b1 = Bearing (ReferencePt.lat, ReferencePt.lon, wpt1.posn.lat, wpt1.posn.lon);
00264       b2 = Bearing (ReferencePt.lat, ReferencePt.lon, wpt2.posn.lat, wpt2.posn.lon);
00265       c = b1 > b2 ? 1 :b1 ==b2 ? 0 : -1;
00266       break;
00267 
00268     case Alpha:
00269     default:
00270         c = StrCompare (wpt1.ident, wpt2.ident);
00271     }
00272     return c;
00273 }                                                          /* CompareWpt */
00274 
00275 
00285 void
00286 SortWpts (WptSortCritType s)
00287 {
00288     FormPtr fp = NULL;
00289 
00290     if (Prefs.wptsortcrit == s)
00291         return;
00292     Prefs.wptsortcrit = s == Current ? Prefs.wptsortcrit : s;
00293     fp = FrmInitForm (SortForm);
00294     FrmDrawForm (fp);
00295     DmQuickSort (WptDB, (DmComparF *) & CompareWpt, 0);
00296     FrmEraseForm (fp);
00297     FrmDeleteForm (fp);
00298     MainListDirty = 1;
00299 }                                                          /* SortWpts */
00300 
00301 
00311 long
00312 SearchWptByName (char *name, Boolean exact, Boolean all)
00313 {
00314     ObjectHandle RecH;
00315     //    Raw_D103_Wpt_Type *wp;
00316     Custom_Wpt_Type wp;
00317     UInt i,
00318       c = 0;
00319     Boolean stop = 0;
00320 
00321     while ((RecH =
00322             (ObjectHandle) DmQueryNextInCategory (WptDB, &c,
00323                                                   all ? dmAllCategories : Prefs.wptcategory))
00324            && !stop)
00325     {
00326         c++;
00327         //      wp = MemHandleLock (RecH);
00328         HandleToCustomWpt (RecH, &wp);
00329         i = sizeof (wp.ident);
00330         if (exact)
00331         {
00332             for (; wp.ident[i - 1] == ' '; i--)
00333                 if (i == 0)
00334                     break;                                 /* pour ignorer blancs en fin de nom */
00335             i = max (i, StrLen (name));
00336         }
00337         if (StrNCaselessCompare (wp.ident, name, min (i, StrLen (name))) == 0)
00338             stop = 1;
00339         //      MemHandleUnlock (RecH);
00340         if (stop)
00341             break;
00342     }
00343     if (stop)
00344         return (c - 1);
00345     else
00346         return (-1);
00347 }                                                          /* SearchWptByName */
00348 
00349 #define XName 1                                            /* coord. aff. nom */
00350 #define XCmnt 48                                           /* coord. aff. commentaire */
00351 #define XBear 105                                          /* coord. aff. bearing */
00352 #define XSymb 136                                          /* coord. aff. symbole */
00353 #define XEnd 150
00354 
00366 void
00367 MainListDraw (Int16 itemNum, RectanglePtr bounds, CharPtr * itemsText)
00368 {
00369     VoidHand RecH = NULL;
00370     Custom_Wpt_Type wpt;
00371     Custom_Rte_Hdr_Type rth;
00372     Object *TRecP;
00373     LocalFormatID wptformat;
00374     Object *objp;
00375     Err error;
00376     char *p;
00377     int i,
00378       l;
00379     double latitude,
00380       longitude;
00381     double d;
00382 
00383     debug (GTALKDBG_INFOS, ("MainListDraw(): itemNum=%d", itemNum));
00384     if (*CurrentCategory == dmAllCategories)
00385     {
00386         RecH = DmQueryRecord (CurrentDB, (UInt) itemNum);
00387         lastrecordindex = itemNum + 1;
00388     }
00389     else
00390     {                                                      /* categorie particuliere */
00391         if (itemNum == (lastitemnum + 1))                  /* optimisation */
00392         {
00393             RecH = DmQueryNextInCategory (CurrentDB, &lastrecordindex, *CurrentCategory);
00394         }
00395         else
00396         {
00397             lastrecordindex = 0;
00398             error =
00399                 DmSeekRecordInCategory (CurrentDB, &lastrecordindex, itemNum, dmSeekForward,
00400                                         *CurrentCategory);
00401             RecH = DmQueryRecord (CurrentDB, lastrecordindex);
00402         }
00403         lastitemnum = itemNum;
00404         lastrecordindex++;
00405     }
00406     error = DmGetLastErr ();                               // debug
00407 
00408     if (RecH)
00409     {
00410         switch (Prefs.todisplay)
00411         {
00412         case DispWpt:                                      /* affichage de waypoints */
00413 /*          WRecP = MemHandleLock (RecH); */
00414 /*          if (MemHandleSize (RecH)==sizeof(Raw_D107_Wpt_Type)) G107ToCustom((Raw_D107_Wpt_Type *)WRecP,&wpt); */
00415 /*  else G103ToCustom(WRecP,&wpt); */
00416             wptformat = HandleToCustomWpt ((ObjectHandle) RecH, &wpt);
00417             DrawCharsInWidth (wpt.ident, XName, bounds->topLeft.y, XCmnt - XName, 0);
00418             switch (Prefs.wptsortcrit)
00419             {
00420             case Dist:
00421             case Bear:
00422                 d = Distance (ReferencePt.lat, ReferencePt.lon, wpt.posn.lat, wpt.posn.lon,
00423                               Prefs.distunit);
00424                 l = StrPrintF (gbuf1, "%s %s", DToA (d, 0, 2), DistanceUnitNames[Prefs.distunit]);
00425                 DrawCharsInWidth (gbuf1, XCmnt, bounds->topLeft.y, XBear - XCmnt, 1);
00426                 i = Bearing (ReferencePt.lat, ReferencePt.lon, wpt.posn.lat, wpt.posn.lon);
00427                 l = StrPrintF (gbuf1, "%d °", i);
00428                 DrawCharsInWidth (gbuf1, XBear, bounds->topLeft.y, XSymb - XBear, 1);
00429                 break;
00430             case Alpha:
00431             case Symbol:
00432                 DrawCharsInWidth (wpt.cmnt, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 0);
00433                 break;
00434             case Lat:
00435                 SemiToDegre (&wpt.posn, &latitude, &longitude);
00436                 translate (FromWGS84, &latitude, &longitude, Prefs.datum);
00437                 p = DegreToChars (latitude, 0, Prefs.displaymode);
00438                 DrawCharsInWidth (p, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 0);
00439                 break;
00440             case Lon:
00441                 SemiToDegre (&wpt.posn, &latitude, &longitude);
00442                 translate (FromWGS84, &latitude, &longitude, Prefs.datum);
00443                 p = DegreToChars (longitude, 1, Prefs.displaymode);
00444                 DrawCharsInWidth (p, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 0);
00445                 break;
00446             case Alt:
00447                 l = StrPrintF (gbuf1, "%s m", DToA (wpt.alt, 0, 0));
00448                 DrawCharsInWidth (gbuf1, XCmnt, bounds->topLeft.y, XSymb - XCmnt, 1);
00449                 break;
00450             default:
00451             }
00452 #ifdef SELECT
00453             if (Prefs.selectmode)
00454             {
00455                 FontID fnt = FntSetFont (symbol11Font);
00456 
00457                 if (RecIsSecret (CurrentDB, lastrecordindex - 1))
00458                     WinDrawChar (1, XSymb + 3, bounds->topLeft.y);
00459                 else
00460                     WinDrawChar (0, XSymb + 3, bounds->topLeft.y);
00461                 FntSetFont (fnt);
00462             }
00463             else
00464 #endif
00465               {   /* optimisable avec DrawSymbol $$ */
00466                 if ((wptformat == G103Type) || (wptformat == Garmin107Type))
00467                   {
00468                     BitmapPtr BitP;
00469                     VoidHand BitH =  DmGetResource ('Tbmp',  SymbolTypeTosmbl (wpt.smbl)  + DotBMID);
00470                     if (BitH)
00471                       {
00472                         BitP = MemHandleLock (BitH);
00473                         WinDrawBitmap ( BitP, bounds->extent.x-13, bounds->topLeft.y-1);
00474                         MemHandleUnlock (BitH);
00475                         DmReleaseResource (BitH);
00476                       }
00477                   }
00478                 else            DrawSymbol (symb_gid2lid (wpt.smbl), bounds->extent.x - /* 12 */5, bounds->topLeft.y + 7);
00479               }
00480             break;
00481 
00482         case DispTrk:                                      /* affichage de track */
00483             TRecP = MemHandleLock (RecH);
00484             if (lastrecordindex == Prefs.PermTrackIndex)
00485                 WinDrawChars ("*", 1, XName, bounds->topLeft.y);
00486             l = XName + FntCharWidth ('*');
00487             DrawCharsInWidth (TRecP->d.CustTrkHdr.name, l, bounds->topLeft.y, XBear - l, 0);
00488             l = StrPrintF (gbuf1, "%d %spts", (int) TrkptsInTrkDB (RecH),
00489                            TRecP->d.CustTrkHdr.type == CompactTrkPt ? "c-" : "  ");
00490             DrawCharsInWidth (gbuf1, XBear, bounds->topLeft.y, XEnd - XBear, 0);
00491             MemHandleUnlock (RecH);
00492 #ifdef SELECT
00493             if (Prefs.selectmode)
00494             {
00495                 FontID fnt = FntSetFont (symbol11Font);
00496 
00497                 if (RecIsSecret (CurrentDB, lastrecordindex - 1))
00498                     WinDrawChar (1, XSymb + 3, bounds->topLeft.y);
00499                 else
00500                     WinDrawChar (0, XSymb + 3, bounds->topLeft.y);
00501                 FntSetFont (fnt);
00502             }
00503 #endif
00504             break;
00505 
00506         case DispRte:                                      /* affichage de route */
00507             objp = MemHandleLock (RecH);
00508             PtrToCustomRteHdr (objp, &rth);
00509             StrIToA (gbuf1, (long) (rth.nmbr));
00510             StrNCat (gbuf1, " : ", sizeof (gbuf1));
00511             if (rth.cmnt[0] && StrNCompare (rth.cmnt, "________", 8))
00512                 StrNCatSafe (gbuf1, rth.cmnt, sizeof (gbuf1), sizeof (rth.cmnt));
00513             else if (ObjectsInRec (RecH) > 1)
00514             {                                              /* pas de nom : on affiche les extremites */
00515                 PtrToCustomWpt ((void *) objp + OffsetOfObjectInRec (RecH, 1), &wpt);
00516                 StrNCatSafe (gbuf1, wpt.ident, sizeof (gbuf1), sizeof (wpt.ident));     /* $$ */
00517                 StrNCatSafe (gbuf1, " to ", sizeof (gbuf1), 4);
00518                 PtrToCustomWpt ((void *) objp + OffsetOfObjectInRec (RecH, ObjectsInRec (RecH) - 1),
00519                                 &wpt);
00520                 StrNCatSafe (gbuf1, wpt.ident, sizeof (gbuf1), sizeof (wpt.ident));     /* $$ */
00521             }
00522             //              buf[sizeof (buf) - 1] = 0;
00523             //      WinDrawChars (gbuf1, StrLen (gbuf1), bounds->topLeft.x + XName, bounds->topLeft.y);
00524             DrawCharsInWidth (gbuf1, bounds->topLeft.x + XName, bounds->topLeft.y, XBear - XName,
00525                               0);
00526             l = StrPrintF (gbuf1, "(%d pts)", (int) WptsInRteDB (RecH));
00527             //      WinDrawChars (gbuf1, l, 100, bounds->topLeft.y);
00528             DrawCharsInWidth (gbuf1, bounds->topLeft.x + XBear, bounds->topLeft.y, XEnd - XBear, 0);
00529             MemHandleUnlock (RecH);
00530 #ifdef SELECT
00531             if (Prefs.selectmode)
00532             {
00533                 FontID fnt = FntSetFont (symbol11Font);
00534                 if (RecIsSecret (CurrentDB, lastrecordindex - 1))
00535                     WinDrawChar (1, XSymb + 3, bounds->topLeft.y);
00536                 else
00537                     WinDrawChar (0, XSymb + 3, bounds->topLeft.y);
00538                 FntSetFont (fnt);
00539             }
00540 #endif
00541 
00542         case DispUnknown:
00543         }
00544 /*      MemHandleUnlock (RecH); */
00545     }
00546     else
00547         WinDrawChars ("******", 6, bounds->topLeft.x, bounds->topLeft.y);
00548 
00549 }                                                          // MainListDraw
00550 
00551 
00552 
00561 int
00562 SetReferencePt (UInt index, Boolean ask)
00563 {
00564     int r = 0;
00565     Custom_Wpt_Type wpt;
00566 
00567     IndexToCustomWpt (index, WptDB, &wpt);
00568     SysCopyStringResource (gbuf1, StrWptRefFormat);
00569     StrPrintF (gbuf2, gbuf1, wpt.ident);
00570     if (!ask || FrmCustomAlert (ConfID, gbuf2, " ", " "))
00571     {
00572         ReferencePt.lat = wpt.posn.lat;
00573         ReferencePt.lon = wpt.posn.lon;
00574         StrNCopySafe (ReferencePtName, wpt.ident, sizeof (ReferencePtName));
00575         DmRecordInfo (WptDB, index, NULL, &Prefs.refptuid, NULL);
00576         r = 1;
00577     }
00578     return (r);
00579 }                                                          /* SetReferencePt */
00580 
00581 
00590 static void
00591 UpdateScrollBar (ListPtr LstPtr, Word ScrollId)
00592 {
00593   ScrollBarPtr scrollp = GetObjPtr (ScrollId);
00594     Word currentPosition,
00595       textHeight,
00596       fieldHeight,
00597       maxValue;
00598 
00599     //    FldGetScrollValues (FdPtr, &currentPosition, &textHeight, &fieldHeight);
00600     textHeight=LstGetNumberOfItems (LstPtr);
00601     fieldHeight=LstGetVisibleItems (LstPtr);
00602     currentPosition=LstGlueGetTopItem (LstPtr);
00603     if (textHeight > fieldHeight)
00604         maxValue = textHeight - fieldHeight;
00605     else if (currentPosition)
00606         maxValue = currentPosition;
00607     else
00608         maxValue = 0;
00609     SclSetScrollBar (scrollp, currentPosition, 0, maxValue, fieldHeight - 1);
00610 }     /* UpdateScrollBar */
00611 
00612 
00623 static void
00624 ScrollLines (ListPtr LstPtr,Word ScrollId, int numLinesToScroll, Boolean redraw)
00625 {
00626 
00627     if (numLinesToScroll < 0)
00628          LstScrollList(LstPtr, winUp, -numLinesToScroll );
00629     else
00630         LstScrollList (LstPtr, winDown, numLinesToScroll );
00631 /*     if ((FldGetNumberOfBlankLines (FdPtr) && numLinesToScroll < 0) || redraw) */
00632         UpdateScrollBar (LstPtr,ScrollId);
00633 }  /* ScrollLines */
00634 
00635 
00644 static void
00645 UpdateMainForm ()
00646 {
00647   //    char buf[20];
00648     UInt RecordsNumber;
00649     Boolean AtTop = 0,
00650       fit;
00651     Word pos = -2;
00652     ListPtr LstPtr = (ListPtr) GetObjPtr (MainListID);
00653     FormPtr frm = FrmGetActiveForm ();
00654     static ItemToDisplay PrevDisplay = -1;
00655     static UInt PrevCategory = dmAllCategories;
00656     static Boolean selmode = 0;
00657     Int16 width,length;
00658 
00659     debug_in (GTALKDBG_CALLS, ("->UpdateMainForm()"));
00660     if ((Prefs.todisplay != PrevDisplay) || ((CurrentDB != WptDB)&&(CurrentDB != TrkDB)&&(CurrentDB != RteDB))
00661 #ifdef SELECT
00662         || (Prefs.selectmode != selmode)
00663 #endif
00664         )
00665     {
00666         switch (Prefs.todisplay)
00667           {
00668           default:
00669             Prefs.todisplay = DispWpt;
00670 
00671           case DispWpt:
00672             CurrentDB = WptDB;
00673             CurrentCategory = &Prefs.wptcategory;
00674 #ifdef SELECT
00675             if (Prefs.selectmode)
00676               FrmSetMenu (frm, MainSelMenuID);
00677             else
00678 #endif
00679               FrmSetMenu (frm, MainMenuID);
00680             MainListDirty = 1;
00681             break;
00682 
00683           case DispTrk:
00684             CurrentDB = TrkDB;
00685             CurrentCategory = &Prefs.trkcategory;
00686 #ifdef SELECT
00687             if (Prefs.selectmode)
00688               FrmSetMenu (frm, MainSelMenuID2);
00689             else
00690 #endif
00691               FrmSetMenu (frm, MainMenuID2);
00692             MainListDirty = 1;
00693             break;
00694 
00695           case DispRte:
00696             //        ToDisplay = DispRte;                                   /* garde-fou */
00697             CurrentDB = RteDB;
00698             CurrentCategory = &Prefs.rtecategory;
00699 #ifdef SELECT
00700             if (Prefs.selectmode)
00701               FrmSetMenu (frm, MainSelMenuID3);
00702             else
00703 #endif
00704               FrmSetMenu (frm, MainMenuID3);
00705             MainListDirty = 1;
00706             break;
00707             /*          default: */
00708             /*              MainListDirty = 0; */
00709           }
00710         PrevDisplay = Prefs.todisplay;
00711         selmode = Prefs.selectmode;
00712         AtTop = 1;
00713         //      MainListDirty = 1;
00714         debug (GTALKDBG_INFOS, ("UpdateMainForm(): ToDisplay changed to %d", Prefs.todisplay));
00715     }
00716     else
00717     {
00718         if (*CurrentCategory != PrevCategory)
00719         {
00720             debug (GTALKDBG_INFOS,
00721                    ("UpdateMainForm(): cat changed from %d to %d", PrevCategory, *CurrentCategory));
00722             MainListDirty = 1;
00723             if ((*CurrentCategory != dmAllCategories) && (PrevCategory != dmAllCategories))
00724                 AtTop = 1;
00725         }
00726     }
00727     PrevCategory = *CurrentCategory;
00728     if (MainListDirty)
00729       {
00730         debug (GTALKDBG_INFOS, ("UpdateMainForm(): MainListDirty=1"));
00731         if((Prefs.todisplay==DispWpt)&&(Prefs.wptsortcrit==Alpha)){
00732           ShowObject (MainSearchID);
00733           ShowObject (MainFdSearchID);
00734         }
00735         else {
00736           HideObject (MainSearchID);
00737           HideObject (MainFdSearchID);
00738         }
00739         CategoryGetName (CurrentDB, *CurrentCategory, CategoryName);
00740         CategorySetTriggerLabel (GetObjPtr (MainCatPopupID), CategoryName);
00741 
00742         RecordsNumber = DmNumRecordsInCategory (CurrentDB, *CurrentCategory);
00743         length=StrPrintF (gbuf1, "%s",
00744                           Prefs.todisplay == DispWpt ?  Prefs.CurWptDBName:
00745                           Prefs.todisplay == DispTrk ?  Prefs.CurTrkDBName: 
00746                           Prefs.CurRteDBName);
00747         width=80;
00748         //length=StrLen(gbuf1);
00749         FntCharsInWidth (gbuf1, &width, &length, &fit);
00750         gbuf1[length]=0;
00751         FrmCopyTitle (frm, gbuf1);
00752         length=StrPrintF (gbuf1, "%d %s", RecordsNumber, 
00753                           Prefs.todisplay == DispWpt ? "Waypoint(s)" :
00754                           Prefs.todisplay == DispTrk ? "Track(s)" : "Route(s)");
00755         HideObject (MainLabelID);
00756         FrmCopyLabel (frm, MainLabelID,gbuf1);
00757         ShowObject (MainLabelID);
00758         LstSetListChoices (LstPtr, NULL, RecordsNumber);
00759         pos = RecIdToPosition (CurrentDB, *CurrentCategory, CurrentRecordID, NULL);
00760         LstSetSelection (LstPtr, pos);
00761         debug (GTALKDBG_INFOS, ("UpdateMainForm(): before if (pos"));
00762         if (pos != -1)
00763           {
00764             //    if (AtTop)LstSetTopItem (LstPtr,0);
00765             /*  else */ LstMakeItemVisible (LstPtr, LstGetSelection (LstPtr));
00766           }
00767         else
00768           LstSetTopItem (LstPtr, 0);
00769         debug (GTALKDBG_INFOS, ("UpdateMainForm(): before LstDrawList"));
00770         if (FrmVisible (frm))
00771           LstDrawList (LstPtr);
00772         UpdateScrollBar (LstPtr,MainScrollID);
00773       }
00774     debug_out (GTALKDBG_CALLS,
00775                ("<-UpdateMainForm(), AtTop=%d, pos=%d, %s", AtTop, pos,
00776                 MainListDirty ? "updated" : "unchanged"));
00777     MainListDirty = 0;
00778 }                                                          /* UpdateMainForm */
00779 
00780 
00788 static Boolean
00789 MainFormHandleEvent (EventPtr e)
00790 {
00791     Boolean handled = false,
00792       Edited;
00793     static FormPtr frm;
00794     UInt category,
00795       itemNum,
00796       windex,
00797       d,
00798       t;
00799     static ListPtr LstPtr;
00800     VoidHand RecH;
00801     VoidHand ResH;
00802     Err error;
00803     BitmapPtr BitP;
00804 #ifdef SELECT
00805     Int16 x,
00806       y;
00807 #endif
00808 
00809     if (e->eType != nilEvent) debug_in (GTALKDBG_CALLS, ("->MainFormHandleEvent(%s)", e->eType > LASTVALIDEVTNAME ?StrIToA(gbuf1,e->eType):EvtNames[e->eType]));
00810     switch (e->eType)
00811     {
00812     case frmOpenEvent:
00813         frm = FrmGetActiveForm ();
00814         LstPtr = (ListPtr) (GetObjPtr (MainListID));
00815         LstPtr->attr.hasScrollBar =1; // very dirty, en attendant correction pilrc $$
00816         LstSetDrawFunction (LstPtr, &MainListDraw);
00817         //      CurrentCategory = &Prefs.wptcategory;
00818         UpdateMainForm ();
00819         SymbolsWH = WinCreateOffscreenWindow (2400, 17, screenFormat, &error);  /* offscreen work window for bitmaps */
00820         if (SymbolsWH)
00821         {
00822             ResH = DmGetResource ('Tbmp', SymbolsBMID);
00823             if (ResH)
00824             {
00825                 WinHandle CurWH = WinGetDrawWindow ();
00826                 BitP = MemHandleLock (ResH);
00827                 WinSetDrawWindow (SymbolsWH);
00828                 WinDrawBitmap (BitP, 0, 0);
00829                 MemHandleUnlock (ResH);
00830                 WinSetDrawWindow (CurWH);
00831                 DmReleaseResource (ResH);
00832             }
00833         }
00834         else
00835             FrmCustomAlert (ErrorID, "Can't create window (error ", StrIToA (gbuf1, error), ")");
00836         if (RecIdToPosition (WptDB, dmAllCategories, Prefs.refptuid, &windex) >= 0)
00837             SetReferencePt (windex, 0);                    /* recherche point de ref */
00838         else
00839         {
00840             StrNCopySafe (ReferencePtName, "??????", sizeof (ReferencePtName));
00841             ReferencePt.lat = 0;
00842             ReferencePt.lon = 0;
00843         }
00844         FrmSetFocus (frm, FrmGetObjectIndex (frm, MainFdSearchID));
00845         FrmDrawForm (frm);
00846         //      UpdateMainForm ();
00847         //      FrmDrawForm (frm);
00848         search_buf[0] = OnlyNews = 0;
00849 #ifdef NEWSERIALMGR
00850         GpslibSetSerialPort (Prefs.portid);
00851 #endif
00852         handled = true;
00853         break;
00854 
00855     case frmCloseEvent:
00856       if(SymbolsWH)WinDeleteWindow (SymbolsWH, 0);
00857         break;
00858 
00859     case /*  frmUpdateEvent */ winEnterEvent:
00860         if ((e->data.winEnter.enterWindow == FrmGetWindowHandle (frm)) && FrmVisible (frm))
00861             UpdateMainForm ();
00862         break;
00863 
00864     case lstSelectEvent:                                   // un element est designe
00865         if (e->data.lstSelect.listID == MainListID)
00866         {
00867             RectangleType r;
00868 
00869             EditMode = EditWpt;
00870             itemNum = e->data.lstSelect.selection;
00871             CurrentRecordIndex = 0;
00872             (void) DmSeekRecordInCategory (CurrentDB, &CurrentRecordIndex, itemNum, dmSeekForward,
00873                                            *CurrentCategory);
00874             CurrentRecordID = GetRecordID (CurrentDB, CurrentRecordIndex);
00875 #ifdef SELECT
00876             EvtGetPen (&x, &y, &Edited);                   // test si colonne des check boxes
00877             GetObjectBounds (MainListID, &r);
00878             if ((x > XSymb + 4) && (x < XSymb + 14))
00879             {
00880                 //toggle select flag
00881                 RecSetSecret (CurrentDB, CurrentRecordIndex,
00882                               !RecIsSecret (CurrentDB, CurrentRecordIndex));
00883                 MainListDirty = 1;
00884                 UpdateMainForm ();
00885                 handled = true;
00886                 break;
00887             }
00888 #endif
00889             switch (Prefs.todisplay)
00890             {
00891             case DispWpt:
00892 #ifndef SKIPEDIT
00893                 FrmPopupForm (EditForm);
00894                 //      MainListDirty=1;
00895 #endif
00896                 break;
00897             case DispTrk:
00898                 FrmPopupForm (TrackForm);
00899                 break;
00900             case DispRte:
00901                 CurrentRouteIndex = CurrentRecordIndex;
00902                 FrmPopupForm (RouteForm);
00903             default:
00904             }
00905             handled = true;
00906         }
00907         break;
00908 
00909     case menuEvent:
00910         MenuEraseStatus (NULL);
00911         search_buf[0] = 0;
00912         switch (e->data.menu.itemID)
00913         {
00914         case MenuWptID:
00915             Prefs.todisplay = DispWpt;
00916             break;
00917 
00918         case MenuRteID:
00919             Prefs.todisplay = DispRte;
00920             break;
00921 
00922         case MenuTrkID:
00923             Prefs.todisplay = DispTrk;
00924             break;
00925 
00926 #ifdef SELECT
00927         case MenuSelID:
00928             Prefs.selectmode = !Prefs.selectmode;
00929             break;
00930 #endif
00931 
00932         case MenuViewID:
00933             if (Prefs.todisplay == DispTrk)
00934             {
00935                 MapFlags.AllowedOps = MapOpMapTrack;
00936             }
00937             else
00938             {
00939                 MapFlags.AllowedOps = MapOpWptDisp;
00940                 Prefs.PermTrackIndex = 0;
00941                 MapFlags.DrawWpts = 1;
00942             }
00943             FrmPopupForm (MapForm);
00944             break;
00945 
00946         case MenuNavID:
00947             MapFlags.AllowedOps = /*  MapOpWptDisp| */ MapOpActiveRte | MapOpTrack;
00948             FrmPopupForm (MapForm);
00949             break;
00950 
00951 #ifdef EXPORT
00952         case MenuExportID:
00953             ExportWpt ();
00954             break;
00955 #endif
00956 
00957         case MenuLatID:
00958             SortWpts (Lat);
00959             break;
00960 
00961         case MenuLonID:
00962             SortWpts (Lon);
00963             break;
00964 
00965         case MenuNameID:
00966             SortWpts (Alpha);
00967             break;
00968 
00969         case MenuSymbID:
00970             SortWpts (Symbol);
00971             break;
00972 
00973         case MenuDistID:
00974             SortWpts (Dist);
00975             break;
00976 
00977         case MenuAltID:
00978             SortWpts (Alt);
00979             break;
00980 
00981         case MenuBearID:
00982             SortWpts (Bear);
00983             break;
00984 
00985         case MenuNewDBID:
00986             NewDB();
00987             MainListDirty = 1;
00988             break;
00989 
00990         case MenuPrefID:                                   /* preferences */
00991             d = Prefs.distunit;
00992             SetPreferences ();
00993             //      if (Prefs.distunit != d)
00994             MainListDirty = 1;
00995             break;
00996 
00997         case MenuAboutID:
00998             FrmAlert (idAbout);
00999             break;
01000 
01001         case MenuDeleteID:                                 /* suppression contenu catégorie */
01002             CategoryGetName (CurrentDB, *CurrentCategory, CategoryName);
01003 #ifdef SELECT
01004             if (Prefs.selectmode)
01005             {
01006                 SysCopyStringResource (gbuf1, StrRmSelItemsID);
01007                 CategoryName[0] = 0;
01008             }
01009             else
01010 #endif
01011                 SysCopyStringResource (gbuf1, StrRemoveItemsID);
01012             if (FrmCustomAlert (ConfID, gbuf1, CategoryName, " ?"))
01013             {
01014                 d = 0;
01015                 for (t = DmNumRecordsInCategory (CurrentDB, *CurrentCategory); t > 0; t--)
01016                 {
01017                     RecH = DmQueryNextInCategory (CurrentDB, &d, *CurrentCategory);
01018 #ifdef SELECT
01019                     if (Prefs.selectmode)
01020                     {
01021                         if (RecIsSecret (CurrentDB, d))
01022                             DmRemoveRecord (CurrentDB, d);
01023                         else
01024                             d++;
01025                     }
01026                     else
01027 #endif
01028 
01029                         DmRemoveRecord (CurrentDB, d);
01030                 }
01031                 MainListDirty = 1;
01032             }
01033             break;
01034 
01035 #ifdef SELECT
01036         case MenuSelAllID:
01037             d = 0;
01038             while ((RecH = DmQueryNextInCategory (CurrentDB, &d, *CurrentCategory)))
01039                 RecSetSecret (CurrentDB, d++, 1);
01040             MainListDirty = 1;
01041             break;
01042 
01043         case MenuUnSelAllID:
01044             d = 0;
01045             while ((RecH = DmQueryNextInCategory (CurrentDB, &d, *CurrentCategory)))
01046                 RecSetSecret (CurrentDB, d++, 0);
01047             MainListDirty = 1;
01048             break;
01049 
01050         case MenuCatID:
01051             FrmPopupForm (CategoryForm);
01052             break;
01053 #endif
01054 
01055         case MenuDBID:
01056              ChangeDB();
01057             MainListDirty = 1;
01058             break;
01059 
01060         case MenuNewID:                            /* nouveau waypoint/route */
01061             EditMode = NewWpt;
01062             OnlyNews = 0;
01063             if (Prefs.todisplay == DispWpt)
01064 #ifndef SKIPEDIT
01065                 FrmPopupForm (EditForm)
01066 #endif
01067                     ;
01068             else
01069             {
01070 #ifdef GRAPHICALROUTEEDIT
01071                 CurrentRouteIndex = 0;
01072                 MapFlags.DrawRtes = 1;
01073                 MapFlags.AllowedOps = MapOpRteNew | MapOpWptDisp;
01074                 FrmPopupForm (MapForm);
01075 #else
01076                 FrmPopupForm (EditRouteForm);
01077 #endif
01078             }
01079             break;
01080 
01081         case MenuNewFRID:                                  /* nouveau waypoint a partir de ref. */
01082             EditMode = FromRefWpt;
01083             //      (void) memcpy (&CurrentWGS84Pos, &ReferencePt, sizeof (CurrentWGS84Pos));
01084             FrmPopupForm (EditRefForm);
01085             break;
01086 
01087         case MenuMarkID:                                   /* marque position actuelle */
01088             GpsOp = gpsGetPosition;
01089             FrmPopupForm (ProgressForm);
01090             break;
01091 
01092         case MenuTimeID:                                   /* time request */
01093             GpsOp = gpsGetTime;
01094             FrmPopupForm (ProgressForm);
01095             break;
01096 
01097         case MenuCheckID:                                  /* check gps  */
01098             GpsOp = gpsGetInfos;
01099             FrmPopupForm (ProgressForm);
01100             break;
01101 
01102         case MenuHostID:                                   /* host mode */
01103             FrmPopupForm (HostForm);
01104             break;
01105 
01106         case MenuUploadID:                                 /* upload */
01107 #ifdef SELECT
01108             if (Prefs.selectmode)
01109             {
01110                 GpsOp = gpsUpload;
01111                 FrmPopupForm (ProgressForm);
01112             }
01113             else
01114 #endif
01115                 FrmPopupForm (UploadForm);
01116             break;
01117 
01118         case MenuDownNewID:
01119             OnlyNews = 1;
01120         case MenuDownloadID:                               /* download */
01121             FrmPopupForm (DownloadForm);
01122             break;
01123 
01124 #ifdef EVENTS
01125         case MenuLogEventsID:                              /* log d'evenements asynchrones */
01126           GpsOp = gpsEnableAsyncEvts;
01127             //              for (t = DmNumRecords(LogDB);t;t--)DmRemoveRecord(LogDB,t-1);
01128             FrmPopupForm (ProgressForm);
01129             break;
01130 #endif
01131             //            case MenuDumpEventsID:                      /* (r)envoi des evenements asynchrones */
01132             //              ToDisplay += 16;
01133             //              FrmGotoForm (ProgressForm);
01134             //              break;
01135 
01136         }
01137         UpdateMainForm ();
01138         handled = true;
01139         break;
01140 
01141     case sclRepeatEvent:
01142         ScrollLines (LstPtr,MainScrollID,e->data.sclRepeat.newValue - e->data.sclRepeat.value, false);
01143         break;
01144 
01145     case ctlSelectEvent:
01146         search_buf[0] = 0;
01147         switch (e->data.ctlSelect.controlID)
01148         {
01149         case MainCatPopupID:
01150             category = *CurrentCategory;
01151             Edited =
01152                 CategorySelect (CurrentDB, frm, MainCatPopupID, MainCatListID, true,
01153                                 CurrentCategory, CategoryName, 1, 0);
01154             if (category != *CurrentCategory)
01155             {                                              /* changement de categorie ? */
01156                 UpdateMainForm ();
01157             }
01158             break;
01159         }
01160         handled = true;
01161         break;
01162 
01163     case ctlRepeatEvent:
01164         switch (e->data.ctlSelect.controlID)
01165         {
01166 
01167         }
01168         break;
01169 
01170     case keyDownEvent:
01171         switch (e->data.keyDown.chr)
01172         {
01173         case pageUpChr:
01174           //        LstScrollList (LstPtr, winUp, LstGetVisibleItems (LstPtr) - 1);
01175         ScrollLines (LstPtr,MainScrollID,1-LstGetVisibleItems (LstPtr) , false);
01176         handled = true;
01177             break;
01178         case pageDownChr:
01179           //        LstScrollList (LstPtr, winDown, LstGetVisibleItems (LstPtr) - 1);
01180         ScrollLines (LstPtr,MainScrollID,LstGetVisibleItems (LstPtr)- 1 , false);
01181         handled = true;
01182             break;
01183 #ifdef DEBUG
01184         case '.':
01185           SetDebug ();
01186           //        SndPlaySystemSound (sndConfirmation /*  sndInfo */ );
01187             handled = true;
01188             break;
01189 #endif
01190         default:                                           /* recherche dans les noms */
01191             if ((Prefs.todisplay == DispWpt) && (e->data.keyDown.chr))
01192             {
01193                 long l;
01194                 char c = e->data.keyDown.chr;
01195                 if (c == backspaceChr)
01196                 {
01197                     if (StrLen (search_buf) > 0)
01198                         search_buf[StrLen (search_buf) - 1] = 0;
01199                     else
01200                         SndPlaySystemSound (sndError);
01201                 }
01202                 else
01203                     StrNCatSafe (search_buf, &c, sizeof (search_buf), 1);
01204                 //              LstPtr = (ListPtr) (GetObjPtr (MainListID));
01205                 if (StrLen (search_buf))
01206                 {
01207                     l = SearchWptByName (search_buf, 0, 0);
01208                     if (l >= 0)
01209                     {
01210                         CurrentRecordIndex = l;
01211                         CurrentRecordID = GetRecordID (CurrentDB, CurrentRecordIndex);
01212                         //LstMakeItemVisible (LstPtr, DmPositionInCategory (CurrentDB, c, *CurrentCategory));
01213                         LstSetSelection (LstPtr,
01214                                          DmPositionInCategory (CurrentDB, CurrentRecordIndex,
01215                                                                *CurrentCategory));
01216                     }
01217                     else
01218                     {
01219                         SndPlaySystemSound (sndError);
01220                         if (StrLen (search_buf) > 0)
01221                             search_buf[StrLen (search_buf) - 1] = 0;
01222                     }
01223                 }
01224                 else
01225                     LstSetSelection (LstPtr, -1);
01226             }
01227         }                                                  /* switch */
01228         break;
01229 
01230     default:
01231         break;
01232     }
01233      if (e->eType != nilEvent) debug_out (GTALKDBG_CALLS, ("<-MainFormHandleEvent(%s)=%d", e->eType > LASTVALIDEVTNAME ?StrIToA(gbuf1,e->eType):EvtNames[e->eType], handled));
01234 
01235     return handled;
01236 }                                                          // MainFormHandleEvent
01237 
01238 
01245 void
01246 SetPreferences ()
01247 {
01248   Err error;
01249   FormPtr previousForm = FrmGetActiveForm ();
01250   FormPtr frm = FrmInitForm (PrefForm);
01251   ControlPtr DupPtr,
01252     PopupOffsetPtr,
01253     PopupUnitPtr,
01254     PopupDispPtr,
01255     PopupGPSPtr,
01256     PopupLogPtr,
01257     PopupSerPtr,
01258     PopupWptPtr,
01259     PopupRtePtr,
01260     PopupTrkPtr,
01261     LoosePtr;
01262   Int16 offset = Prefs.utcoffset,
01263     i,
01264     j,matched;
01265   unsigned int index;
01266   ListPtr LstOffsetPtr,
01267     LstUnitPtr,
01268     LstDispPtr,
01269     LstGPSPtr,
01270     LstDatumPtr,
01271     LstLogPtr,
01272     LstSerPtr,
01273     LstWptPtr,
01274     LstRtePtr,
01275     LstTrkPtr;
01276   static const UInt LogIntervals[] =
01277     { 5, 10, 15, 20, 30, 40, 50, 60, 120, 180, 300, 600, 900, 1200 };
01278   char *DatumNames[nDatums];
01279 #ifdef NEWSERIALMGR
01280   SerialDevInfo DevInfos;
01281 #endif
01282   char * WptNames[MaxDBNames],
01283     * RteNames[MaxDBNames],
01284     * TrkNames[MaxDBNames];
01285 
01286   FrmSetActiveForm (frm);
01287 
01288   LstOffsetPtr = (ListPtr) (GetObjPtr (PrefListID));
01289   LstUnitPtr = (ListPtr) (GetObjPtr (PrefUnitListID));
01290   LstDispPtr = (ListPtr) (GetObjPtr (PrefDispListID));
01291   LstGPSPtr = (ListPtr) (GetObjPtr (PrefGPSListID));
01292   LstLogPtr = (ListPtr) (GetObjPtr (PrefLogListID));
01293   LstWptPtr = (ListPtr) (GetObjPtr (PrefWptListID));
01294   LstRtePtr = (ListPtr) (GetObjPtr (PrefRteListID));
01295   LstTrkPtr = (ListPtr) (GetObjPtr (PrefTrkListID));
01296 #ifdef NEWSERIALMGR
01297   LstSerPtr = (ListPtr) (GetObjPtr (PrefSerListID));
01298 #endif
01299   DupPtr = GetObjPtr (PrefDupID);
01300 #ifdef LOOSE
01301   LoosePtr=GetObjPtr (PrefLooseID);
01302 #endif
01303   PopupOffsetPtr = (ControlPtr) (GetObjPtr (PrefPopupID));
01304   PopupUnitPtr = (ControlPtr) (GetObjPtr (PrefPopUnitID));
01305   PopupDispPtr = (ControlPtr) (GetObjPtr (PrefPopDispID));
01306   PopupGPSPtr = (ControlPtr) (GetObjPtr (PrefGPSPopID));
01307   PopupLogPtr = (ControlPtr) (GetObjPtr (PrefPopLogID));
01308   PopupWptPtr = (ControlPtr) (GetObjPtr (PrefWptPopID));
01309   PopupRtePtr = (ControlPtr) (GetObjPtr (PrefRtePopID));
01310   PopupTrkPtr = (ControlPtr) (GetObjPtr (PrefTrkPopID));
01311 #ifdef NEWSERIALMGR
01312   PopupSerPtr = (ControlPtr) (GetObjPtr (PrefSerPopID));
01313 #endif
01314   for (i = 0; i < nDatums; i++)
01315     DatumNames[i] = gDatum[i].name;
01316   LstDatumPtr = (ListPtr) (GetObjPtr (PrefDatumListID));
01317   LstSetListChoices (LstDatumPtr, DatumNames, nDatums);
01318   LstSetSelection (LstDatumPtr, Prefs.datum);
01319   LstMakeItemVisible (LstDatumPtr, Prefs.datum);
01320   CtlSetLabel (GetObjPtr (PrefDatumPopupID), DatumNames[Prefs.datum]);
01321 
01322   if ((offset < -12) || (offset > 13))             /* UTC offset */
01323     offset = 0;
01324   index = -offset + 13;
01325   LstSetSelection (LstOffsetPtr, index);
01326   LstMakeItemVisible (LstOffsetPtr, index);
01327   CtlSetLabel (PopupOffsetPtr, LstGetSelectionText (LstOffsetPtr, index));
01328 
01329   LstSetSelection (LstUnitPtr, Prefs.distunit);    /* distance units */
01330   // LstMakeItemVisible (LstUnitPtr,DistUnit);
01331   CtlSetLabel (PopupUnitPtr, LstGetSelectionText (LstUnitPtr, Prefs.distunit));
01332 
01333   if (Prefs.displaymode > DDD)
01334     Prefs.displaymode = DDD;                       /* display format */
01335   LstSetSelection (LstDispPtr, Prefs.displaymode);
01336   CtlSetLabel (PopupDispPtr, LstGetSelectionText (LstDispPtr, Prefs.displaymode));
01337 
01338   if (Prefs.emulatedgps > GPS76)
01339     Prefs.emulatedgps = GIIPlus;                           /* emulated GPS */
01340   LstSetSelection (LstGPSPtr, Prefs.emulatedgps);
01341   CtlSetLabel (PopupGPSPtr, LstGetSelectionText (LstGPSPtr, Prefs.emulatedgps));
01342 
01343   for (i = (sizeof (LogIntervals) / sizeof (UInt)) - 1; i >= 0; i--)    /* log interval */
01344     if (Prefs.loginterval == LogIntervals[i])
01345       break;
01346   if (i < 0)
01347     i = 0;
01348   LstSetSelection (LstLogPtr, i);
01349   LstMakeItemVisible (LstLogPtr, i);
01350   CtlSetLabel (PopupLogPtr, LstGetSelectionText (LstLogPtr, i));
01351 
01352 #ifdef NEWSERIALMGR
01353   i = GetSerialDevsInfos (&DevInfos);                      /* serial port */
01354   for (j = i - 1; j; j--)
01355     if (Prefs.portid == DevInfos.u[j].serDevCreator)
01356       break;
01357   //    if (!j)Prefs.portid=DevInfos.serDevCreator[0];
01358   LstSetHeight (LstSerPtr, min (i, 6));
01359   LstSetListChoices (LstSerPtr, DevInfos.serDevPortInfoStr, i);
01360   LstSetSelection (LstSerPtr, j);
01361   //    LstMakeItemVisible (LstDatumPtr, Prefs.datum);
01362   CtlSetLabel (PopupSerPtr, DevInfos.serDevPortInfoStr[j]);
01363 #endif
01364   CtlSetValue (DupPtr, Prefs.allowduplicate);              /* duplicatas */
01365 #ifdef LOOSE
01366   CtlSetValue (LoosePtr, Prefs.looseprotocol);             /* loose protocol */
01367 #endif
01368 
01369   i=FindDBNames(WptDBType,GPilotSID,Prefs.CurWptDBName,&matched,gbuf1,WptNames,MaxDBNames);  /* Wpt DB names */
01370   LstSetHeight (LstWptPtr, min (i, 6));
01371   LstSetListChoices (LstWptPtr, WptNames, i                    );
01372   LstSetSelection (LstWptPtr,matched);
01373   CtlSetLabel (PopupWptPtr,WptNames[matched]);
01374 
01375   i=FindDBNames(RteDBType,GPilotSID,Prefs.CurRteDBName,&matched,WptNames[i-1]+StrLen(WptNames[i-1])+1,RteNames,MaxDBNames);  /* Rte DB names */
01376   LstSetHeight (LstRtePtr, min (i, 6));
01377   LstSetListChoices (LstRtePtr, RteNames, i                    );
01378   LstSetSelection (LstRtePtr,matched);
01379   CtlSetLabel (PopupRtePtr,RteNames[matched]);
01380 
01381   i=FindDBNames(TrkDBType,GPilotSID,Prefs.CurTrkDBName,&matched,RteNames[i-1]+StrLen(RteNames[i-1])+1,TrkNames,MaxDBNames);  /* Trk DB names */
01382   LstSetHeight (LstTrkPtr, min (i, 6));
01383   LstSetListChoices (LstTrkPtr, TrkNames, i                    );
01384   LstSetSelection (LstTrkPtr,matched);
01385   CtlSetLabel (PopupTrkPtr,TrkNames[matched]);
01386 
01387   ErrFatalDisplayIf ((TrkNames[i-1]+StrLen(TrkNames[i-1])+1) >= (gbuf1+sizeof(gbuf1)), "Buffer overflow in SetPreferences");
01388 
01389   if (FrmDoDialog (frm) == PrefBtOKID)
01390     {
01391       Prefs.utcoffset = -(LstGetSelection (LstOffsetPtr) - 13);
01392       Prefs.allowduplicate = CtlGetValue (DupPtr);
01393 #ifdef LOOSE
01394       Prefs.looseprotocol =  CtlGetValue (LoosePtr);
01395 #endif
01396       Prefs.distunit = LstGetSelection (LstUnitPtr);
01397       Prefs.displaymode = LstGetSelection (LstDispPtr);
01398       Prefs.emulatedgps = LstGetSelection (LstGPSPtr);
01399       Prefs.loginterval = LogIntervals[LstGetSelection (LstLogPtr)];
01400       Prefs.datum = LstGetSelection (LstDatumPtr);
01401       error = SwitchDB(&WptDB,WptNames[LstGetSelection (LstWptPtr)], WptDBType);
01402       if(!error)StrNCopySafe (Prefs.CurWptDBName,WptNames[LstGetSelection (LstWptPtr)] , dmDBNameLength);
01403       error = SwitchDB(&RteDB,RteNames[LstGetSelection (LstRtePtr)], RteDBType);
01404       if(!error)StrNCopySafe (Prefs.CurRteDBName,RteNames[LstGetSelection (LstRtePtr)] , dmDBNameLength);
01405       error = SwitchDB(&TrkDB,TrkNames[LstGetSelection (LstTrkPtr)], TrkDBType);
01406       if(!error)StrNCopySafe (Prefs.CurTrkDBName,TrkNames[LstGetSelection (LstTrkPtr)] , dmDBNameLength);
01407 #ifdef NEWSERIALMGR
01408       Prefs.portid = DevInfos.u[LstGetSelection (LstSerPtr)].serDevCreator;
01409       GpslibSetSerialPort (Prefs.portid);
01410 #endif
01411     }
01412   FrmSetActiveForm (previousForm);
01413   FrmDeleteForm (frm);
01414 }                                                          // SetPreferences
01415 
01416 
01431 static UInt16 FindDBNames(UInt32 type, UInt32 creator,  char * namep,Int16 * matched, char * bufp, char ** bufpp,UInt16 bufpsize){
01432   DmSearchStateType state; 
01433   UInt16 card,i=0; 
01434   LocalID currentDBid = 0; 
01435   Err error;
01436   char  name[dmDBNameLength];
01437   UInt16 l=0;
01438 
01439   name[0]=0;
01440   error = DmGetNextDatabaseByTypeCreator(true, &state,type ,creator , false, &card, &currentDBid); 
01441   while (!error && currentDBid) { 
01442     if (i>=bufpsize)break;
01443      error=DmDatabaseInfo ( card,  currentDBid,name , NULL, NULL,NULL ,NULL , NULL, NULL,NULL,NULL, NULL,NULL );
01444      if (bufpp)bufpp[i]=bufp+l;
01445      if (bufp)l+=StrPrintF(bufp+l,"%s",name);
01446      l++;
01447      if (namep&&matched)if (!StrCompare(namep,name))*matched=i;
01448 
01449     i++;
01450     error = DmGetNextDatabaseByTypeCreator( false, &state,type ,creator,false , &card, &currentDBid); 
01451   }
01452   return(i);
01453 }  /* FindDBNames */
01454 
01455 
01467 static Err SwitchDB(DmOpenRef * DBP, char *DBName, ULong DBType){
01468   Err error;
01469   DmOpenRef olddb;
01470 
01471   olddb=*DBP;
01472       error = OpenOrCreateDB (DBP,DBName, DBType, GPilotSID);
01473       if (!error) {
01474         DmCloseDatabase (olddb);
01475         *CurrentCategory=dmAllCategories;
01476         MainListDirty = 1;
01477       }
01478       else  {
01479         if (error!=dmErrAlreadyExists) FrmCustomAlert (ErrorID, "Error ", StrIToA (gbuf2, error), " when opening data base");
01480         *DBP=olddb;
01481       }
01482       return(error);
01483 } /* SwitchDB */
01484 
01485 
01493 static void NewDB (){
01494   FieldPtr FdPtr;
01495   Err error;
01496   DmOpenRef *curdbp,olddb;
01497   FormPtr previousForm = FrmGetActiveForm ();
01498   FormPtr frm = FrmInitForm (NewDBForm);
01499   UInt32 type;
01500   char  *name;
01501 
01502   switch (Prefs.todisplay)
01503     {
01504     case DispWpt:
01505       curdbp=&WptDB;
01506       type=WptDBType;
01507       name=Prefs.CurWptDBName;
01508       break;
01509     case DispTrk:
01510       curdbp = &TrkDB;
01511       type=TrkDBType;
01512       name=Prefs.CurTrkDBName;
01513       break;
01514     case DispRte:
01515       curdbp = &RteDB;
01516       type=RteDBType;
01517       name=Prefs.CurRteDBName;
01518       break;
01519     default:
01520       return;
01521     }
01522   olddb=*curdbp;
01523   FrmSetActiveForm (frm);
01524   if (FrmDoDialog (frm) == NewDBBtOKID)
01525     {
01526       FdPtr = GetObjPtr (NewDBFDNameID);
01527       error = SwitchDB(curdbp,FldGetTextPtr (FdPtr), type);
01528       if (!error) {
01529         StrNCopySafe (name,FldGetTextPtr (FdPtr) , dmDBNameLength);
01530       }
01531     }
01532   FrmSetActiveForm (previousForm);
01533   FrmDeleteForm (frm);
01534 }                 /* NewDB */
01535 
01536 
01544 static void ChangeDB (){
01545   //  FieldPtr FdPtr;
01546   Err error=0;
01547   DmOpenRef curdb,newdb;
01548   FormPtr previousForm = FrmGetActiveForm ();
01549   FormPtr frm = FrmInitForm (ChangeDBForm);
01550   UInt32 type;
01551   UInt16 i, matched,category,index,c,moved=0;
01552   char  *name;
01553   ListPtr LstWptPtr;
01554   ControlPtr PopupWptPtr;
01555   char * Names[MaxDBNames];
01556   MemHandle oldH,RecH;
01557 
01558   FrmSetActiveForm (frm);
01559   LstWptPtr = (ListPtr) (GetObjPtr (ChangeDBListID));
01560   PopupWptPtr = (ControlPtr) (GetObjPtr (ChangeDBPopupID));
01561   category = *CurrentCategory;
01562 
01563   switch (Prefs.todisplay)
01564     {
01565     case DispWpt:
01566       curdb=WptDB;
01567       type=WptDBType;
01568       name=Prefs.CurWptDBName;
01569       break;
01570     case DispTrk:
01571       curdb = TrkDB;
01572       type=TrkDBType;
01573       name=Prefs.CurTrkDBName;
01574       break;
01575     case DispRte:
01576       curdb = RteDB;
01577       type=RteDBType;
01578       name=Prefs.CurRteDBName;
01579       break;
01580     default:
01581       return;
01582     }
01583 
01584   i=FindDBNames(type,GPilotSID,name,&matched,gbuf1,Names,MaxDBNames);  /* Wpt DB names */
01585   LstSetHeight (LstWptPtr, min (i, 6));
01586   LstSetListChoices (LstWptPtr, Names, i                       );
01587   LstSetSelection (LstWptPtr,matched);
01588   CtlSetLabel (PopupWptPtr,Names[matched]);
01589 
01590   FrmSetActiveForm (frm);
01591   if (FrmDoDialog (frm) == ChangeDBBtOKID)
01592     if(LstGetSelection (LstWptPtr)!=matched)  {
01593       error = OpenOrCreateDB (&newdb,Names[LstGetSelection (LstWptPtr)], type, GPilotSID);
01594       if (!error){
01595         c = 0;
01596         while ((RecH = DmQueryNextInCategory (curdb, &c, category)))
01597           {
01598 #ifdef SELECT
01599             if (RecIsSecret (curdb, c))
01600               {
01601                 error= DmDetachRecord (curdb, c, &oldH);
01602                 index=dmMaxRecordIndex;
01603                 error|=DmAttachRecord (newdb, &index, oldH, NULL);
01604                 if (error){
01605                   DmAttachRecord (curdb, &index, oldH, NULL);
01606                   break;
01607                 }
01608                 else moved++;
01609               }
01610             else 
01611 #endif
01612               c++;
01613           }
01614       }
01615       DmCloseDatabase (newdb);
01616     }
01617   StrPrintF (gbuf1, "Error %d, %d records moved",error,moved);
01618   if (error)FrmCustomAlert (ErrorID,gbuf1," ", " ");
01619   FrmSetActiveForm (previousForm);
01620   FrmDeleteForm (frm);
01621 }  /* ChangeDB */
01622 
01623 
01631 static void
01632 AlarmProc (void)
01633 {
01634     //          EventType evt;
01635     SndPlaySystemSound (sndClick);
01636 }
01637 
01638 
01646 static Boolean
01647 ApplicationHandleEvent (EventPtr e)
01648 {
01649     FormPtr frm;
01650     Word formId;
01651     Boolean handled = false;
01652 
01653     if (e->eType == frmLoadEvent)
01654     {
01655         formId = e->data.frmLoad.formID;
01656         frm = FrmInitForm (formId);
01657         FrmSetActiveForm (frm);
01658 
01659         switch (formId)
01660         {
01661         case MainForm:
01662             FrmSetEventHandler (frm, MainFormHandleEvent);
01663             break;
01664 #ifndef SKIPEDIT
01665         case EditForm:
01666         case EditRefForm:
01667             FrmSetEventHandler (frm, EditFormHandleEvent);
01668             break;
01669 #endif
01670         case DownloadForm:
01671             FrmSetEventHandler (frm, DownloadFormHandleEvent);
01672             break;
01673         case UploadForm:
01674             FrmSetEventHandler (frm, UploadFormHandleEvent);
01675             break;
01676         case ProgressForm:
01677             FrmSetEventHandler (frm, ProgressFormHandleEvent);
01678             break;
01679         case TrackForm:
01680             FrmSetEventHandler (frm, TrackFormHandleEvent);
01681             break;
01682         case RouteForm:
01683             FrmSetEventHandler (frm, RouteFormHandleEvent);
01684             break;
01685         case HostForm:
01686             FrmSetEventHandler (frm, HostFormHandleEvent);
01687             break;
01688 #ifndef GRAPHICALROUTEEDIT
01689         case EditRouteForm:
01690             FrmSetEventHandler (frm, RteEditFormHandleEvent);
01691             break;
01692 #endif
01693         case MapForm:
01694             FrmSetEventHandler (frm, MapFormHandleEvent);
01695             break;
01696 #ifdef SELECT
01697         case CategoryForm:
01698             FrmSetEventHandler (frm, CatFormHandleEvent);
01699             break;
01700 #endif
01701         }
01702         handled = true;
01703     }
01704     return handled;
01705 }                                                          /* ApplicationHandleEvent */
01706 
01707 
01718 static Err
01719 OpenOrCreateDB (DmOpenRef * DBP, char *DBName, ULong DBType, ULong creator)
01720 {
01721   Err error = 0;
01722   VoidHand h;
01723   UInt cardNo;
01724   LocalID dbID;
01725   LocalID appinfoID;
01726   AppInfoType *appInfoP;
01727   UInt32 type,cr;
01728 
01729   *DBP=NULL;
01730   //    *DBP = DmOpenDatabaseByTypeCreator (DBType, creator, dmModeReadWrite | dmModeShowSecret);       // ouverture/creation  DB
01731   cardNo=type=cr=0;
01732   dbID= DmFindDatabase (cardNo, DBName);
01733   if(dbID) error = DmDatabaseInfo (cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL,NULL,&type , &cr);
01734   if ((type==DBType)&&(cr==creator)) *DBP=DmOpenDatabase ( cardNo,  dbID,dmModeReadWrite | dmModeShowSecret );
01735   if (!*DBP)
01736     {
01737       if ((error = DmCreateDatabase (cardNo, DBName, creator, DBType, false)))
01738         return error;
01739       //        *DBP = DmOpenDatabaseByTypeCreator (DBType, creator, dmModeReadWrite | dmModeShowSecret);
01740       dbID= DmFindDatabase (cardNo, DBName);
01741       *DBP =DmOpenDatabase ( cardNo,  dbID, dmModeReadWrite | dmModeShowSecret);
01742     }
01743   if (DmOpenDatabaseInfo (*DBP, &dbID, NULL, NULL, &cardNo, NULL))
01744     return dmErrInvalidParam;
01745   if (DmDatabaseInfo
01746       (cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appinfoID, NULL, NULL, NULL))
01747     return dmErrInvalidParam;
01748   if (appinfoID == 0)
01749     {
01750       h = DmNewHandle (*DBP, sizeof (AppInfoType));
01751       if (!h)
01752         return dmErrMemError;
01753       appinfoID = MemHandleToLocalID (h);
01754       DmSetDatabaseInfo (cardNo, dbID, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &appinfoID, NULL,
01755                          NULL, NULL);
01756       appInfoP = MemLocalIDToLockedPtr (appinfoID, cardNo);
01757       DmSet (appInfoP, 0, sizeof (AppInfoType), 0);
01758       CategoryInitialize (appInfoP, localizedAppInfo);
01759       MemPtrUnlock (appInfoP);
01760     }
01761   return (error);
01762 }                                                          /* OpenOrCreateDB */
01763 
01764 
01765 
01766 /* Get preferences, open (or create) app database */
01767 
01768 
01776 static Word
01777 StartApplication (void)
01778 {
01779     Err error;
01780     Word prefsSize = sizeof (Prefs);
01781 
01782     PrefGetAppPreferences (GPilotSID, GPilotSPrefID, &Prefs, &prefsSize, true);
01783     error = OpenOrCreateDB (&WptDB, /* WptDBName */Prefs.CurWptDBName, WptDBType, GPilotSID);
01784     error |= OpenOrCreateDB (&TrkDB, /* TrkDBName */Prefs.CurTrkDBName, TrkDBType, GPilotSID);
01785     error |= OpenOrCreateDB (&RteDB, /* RteDBName */Prefs.CurRteDBName, RteDBType, GPilotSID);
01786 #ifdef EVENTS
01787     error |= OpenOrCreateDB (&LogDB, LogDBName, LogDBType, GPilotSID);
01788 #endif
01789     if (error)
01790         return (error);
01791     error = SysLibFind (MathLibName, &MathLibRef);         /* ouverture Mathlib */
01792     if (error)
01793     {
01794         error = SysLibLoad (LibType, MathLibCreator, &MathLibRef);
01795         if (!error)
01796         {
01797             error = MathLibOpen (MathLibRef, MathLibVersion);
01798             ErrFatalDisplayIf (error, "Can't open MathLib");
01799         }
01800         else
01801         {
01802             FrmCustomAlert (ErrorID, "MathLib missing", " ", " ");
01803             return (error);
01804         }
01805     }
01806     SetMathLibRef (MathLibRef);
01807     FrmGotoForm (MainForm);
01808     return 0;
01809 }                                                          /* StartApplication */
01810 
01811 
01818 static void
01819 StopApplication (void)
01820 {
01821     UInt usecount;
01822     Err error;
01823 
01824     debug_in (GTALKDBG_CALLS, ("->StopApplication()"));
01825     //    debug_close ();
01826     PrefSetAppPreferences (GPilotSID, GPilotSPrefID, 2, &Prefs, sizeof (Prefs), true);
01827     FrmSaveAllForms ();
01828     FrmCloseAllForms ();
01829     GPSEndOfOperation ();                                  /* au cas ou */
01830     if (WptDB)DmCloseDatabase (WptDB);
01831     if (TrkDB)DmCloseDatabase (TrkDB);
01832     if (RteDB)DmCloseDatabase (RteDB);
01833 #ifdef EVENTS
01834     if (LogDB)DmCloseDatabase (LogDB);
01835 #endif
01836 
01837     debug_close ();  // $$
01838     error = MathLibClose (MathLibRef, &usecount);
01839     ErrFatalDisplayIf (error, "Can't close MathLib");
01840     if (usecount == 0)
01841         SysLibRemove (MathLibRef);
01842 }                                                          /* StopApplication */
01843 
01844 
01851 static void
01852 EventLoop (void)
01853 {
01854     Word err;
01855     EventType e;
01856 
01857     do
01858     {
01859         if (MustCallGpslibTicks)
01860             EvtGetEvent (&e, sysTicksPerSecond / 20);
01861         else
01862             EvtGetEvent (&e, evtWaitForever);
01863         if (!SysHandleEvent (&e))
01864             if (!MenuHandleEvent (NULL, &e, &err))
01865                 if (!ApplicationHandleEvent (&e))
01866                     FrmDispatchEvent (&e);
01867     }
01868     while (e.eType != appStopEvent);
01869 }
01870 
01871 
01881 DWord
01882 PilotMain (Word cmd, Ptr cmdPBP, Word launchFlags)
01883 {
01884     Err err = 0;
01885     Boolean appIsActive = launchFlags & sysAppLaunchFlagSubCall;
01886 
01887     err = RomVersionCompatible (ourMinVersion, launchFlags);
01888     if (err)
01889         return err;
01890     if (cmd == sysAppLaunchCmdNormalLaunch)
01891     {
01892         err = StartApplication ();
01893         if (err)
01894             return err;
01895         EventLoop ();
01896         StopApplication ();
01897     }
01898     else if ((cmd == sysAppLaunchCmdAlarmTriggered) && appIsActive)
01899     {
01900         AlarmProc ();
01901         ((SysAlarmTriggeredParamType *) cmdPBP)->purgeAlarm = 1;        //$$
01902     }
01903 #ifdef BEAM
01904     else if (cmd == sysAppLaunchCmdExgReceiveData)
01905     {
01906         ExgSocketPtr sockp = (ExgSocketPtr) cmdPBP;
01907         DmOpenRef DB = NULL;
01908         // This call may be made from another application, so your
01909         // app must not assume that it's globals are initialized.
01910         if (!StrCompare (sockp->name, BeamTypes[DispWpt]))
01911         {                                                  /* Wpt */
01912             if (!appIsActive)
01913                 DB = DmOpenDatabaseByTypeCreator (WptDBType, GPilotSID, dmModeReadWrite);
01914             else
01915                 DB = WptDB;
01916         }
01917         else if (!StrCompare (sockp->name, BeamTypes[DispRte]))
01918         {                                                  /* Rte */
01919             if (!appIsActive)
01920                 DB = DmOpenDatabaseByTypeCreator (RteDBType, GPilotSID, dmModeReadWrite);
01921             else
01922                 DB = RteDB;
01923         }
01924 
01925         else if (!StrCompare (sockp->name, BeamTypes[DispTrk]))
01926         {                                                  /* Trk */
01927             if (!appIsActive)
01928                 DB = DmOpenDatabaseByTypeCreator (TrkDBType, GPilotSID, dmModeReadWrite);
01929             else
01930                 DB = TrkDB;
01931         }
01932 
01933         else
01934             err = -1;
01935 
01936         if (!err)
01937             err = BeamReceive (sockp, DB);
01938         if (!appIsActive && DB)
01939             DmCloseDatabase (DB);
01940         if (appIsActive)
01941             MainListDirty = 1;
01942     }
01943 #endif
01944     return err;
01945 }                                                          // PilotMain
01946 
01947 
01956 static Err
01957 RomVersionCompatible (UInt32 requiredVersion, UInt16 launchFlags)
01958 {
01959     UInt32 romVersion;
01960     FtrGet (sysFtrCreator, sysFtrNumROMVersion, &romVersion);
01961     if (romVersion < requiredVersion)
01962     {
01963         if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) ==
01964             (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp))
01965         {
01966             FrmAlert (OSUnsupportedID);
01967             if (romVersion < 0x02000000)
01968             {
01969               //                Err err;
01970                 AppLaunchWithCommand (sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL);
01971             }
01972         }
01973         return (sysErrRomIncompatible);
01974     }
01975     return 0;
01976 }
01977 
01978 #ifdef SELECT
01979 
01987 static Boolean
01988 CatFormHandleEvent (EventPtr e)
01989 {
01990     Boolean handled = false;
01991     FormPtr frm;
01992     UInt c;
01993     static UInt category,
01994       newcategory;
01995     MemHandle RecH;
01996 
01997     frm = FrmGetActiveForm ();
01998     switch (e->eType)
01999     {
02000     case frmOpenEvent:
02001         frm = FrmGetActiveForm ();
02002         category = newcategory = *CurrentCategory;
02003         if (category == dmAllCategories)
02004             category = dmUnfiledCategory;
02005         CategoryGetName (CurrentDB, category, CategoryName);
02006         CategorySetTriggerLabel (GetObjPtr (MainCatPopupID), CategoryName);
02007         FrmDrawForm (frm);
02008         handled = true;
02009         break;
02010 
02011     case frmCloseEvent:
02012         break;
02013 
02014     case ctlSelectEvent:
02015         switch (e->data.ctlSelect.controlID)
02016         {
02017         case CatBtOKID:
02018             c = 0;
02019             while ((RecH = DmQueryNextInCategory (CurrentDB, &c, category)))
02020             {
02021                 if (RecIsSecret (CurrentDB, c))
02022                 {
02023                     SetCategory (CurrentDB, c, newcategory);
02024                     RecSetSecret (CurrentDB, c, 0);
02025                 }
02026                 c++;
02027             }
02028             MainListDirty = 1;
02029 
02030         case CatBtCancelID:
02031             FrmReturnToForm (0);
02032             break;
02033 
02034         case MainCatPopupID:
02035             CategorySelect (CurrentDB, frm, MainCatPopupID, MainCatListID, false, &newcategory,
02036                             CategoryName, 1, 0);
02037             break;
02038         }
02039         handled = true;
02040         break;
02041 
02042     default:
02043         break;
02044     }
02045 
02046     return handled;
02047 }                                                          // CatFormHandleEvent
02048 
02049 
02059 Boolean
02060 RecIsSecret (DmOpenRef * DBP, UInt16 index)
02061 {
02062     UInt attributes;
02063     DmRecordInfo (DBP, index, &attributes, NULL, NULL);
02064     return (attributes & dmRecAttrSecret);
02065 }
02066 
02067 
02077 static Err
02078 RecSetSecret (DmOpenRef * DBP, UInt16 index, Boolean value)
02079 {
02080     UInt attributes;
02081     Err error;
02082 
02083     error = DmRecordInfo (DBP, index, &attributes, NULL, NULL);
02084     if (error)
02085         return (error);
02086     if (value)
02087         attributes |= dmRecAttrSecret;
02088     else
02089         attributes &= ~dmRecAttrSecret;
02090     error = DmSetRecordInfo (DBP, index, &attributes, NULL);
02091     return (error);
02092 }
02093 
02094 #endif
02095 
02096 
02104 Err SetBackupBit (DmOpenRef * DBP) {
02105   UInt16 cardNo, attributes;
02106   LocalID dbID;
02107   Err err;
02108 
02109   err=DmOpenDatabaseInfo (DBP, &dbID, NULL, NULL, &cardNo, NULL);
02110 
02111   err|=DmDatabaseInfo ( cardNo,  dbID,NULL , &attributes, NULL,NULL ,NULL , NULL, NULL,NULL,NULL, NULL,NULL );
02112 if (!err){
02113       attributes|=dmHdrAttrBackup;
02114       err=DmSetDatabaseInfo ( cardNo,  dbID, NULL, &attributes,NULL,NULL ,NULL , NULL, NULL,NULL,NULL, NULL,NULL );
02115     }
02116    return(err);
02117 }   /* SetBackupBit */
02118 
02119 
02120 #ifdef DEBUG
02121 static char * GetCharEncoding(){
02122   UInt32 encoding; 
02123 
02124   if (FtrGet(sysFtrCreator, sysFtrNumEncoding, &encoding) != 0) encoding = charEncodingPalmLatin; //default encoding 
02125   return(TxtGlueEncodingName(encoding));
02126 }   /* GetCharEncoding */
02127 
02128 
02136 static void
02137 SetDebug ()
02138 {
02139   FormPtr previousForm = FrmGetActiveForm ();
02140   FormPtr frm = FrmInitForm (DebugForm);
02141   ControlPtr ControlP;
02142   UInt16 i, gpslib_level, gpsutil_level;
02143 
02144   FrmSetActiveForm (frm);
02145   /*
02146     for (i = 0; i < 8; i++)
02147     {
02148     ControlP = GetObjPtr (DbgGpsl1ID + i);
02149     CtlSetValue (ControlP, (DebugLevel >> i) & 0x1);
02150     }
02151   */
02152   if (FrmDoDialog (frm) == DebugBtOKID)
02153     {
02154       gpslib_level= gpsutil_level=DebugLevel=0;
02155       for (i = 0; i < 8; i++)
02156         {
02157           ControlP = GetObjPtr (DbgGpsl1ID - i);
02158           gpslib_level += CtlGetValue (ControlP) << i;
02159         }
02160       for (i = 0; i < 8; i++)
02161         {
02162           ControlP = GetObjPtr (DbgGpsu1ID - i);
02163           gpsutil_level += CtlGetValue (ControlP) << i;
02164         }
02165       for (i = 0; i < 8; i++)
02166         {
02167           ControlP = GetObjPtr (Dbg1ID - i);
02168           DebugLevel += CtlGetValue (ControlP) << i;
02169         }
02170       if (gpslib_level+gpsutil_level+DebugLevel) debug_open ();
02171       else debug_close();
02172       if (gpslib_level)  GpslibSetDebugLevel (gpslib_level, log_write);
02173       if (gpsutil_level) GpsutilSetDebugLevel (gpsutil_level, log_write);
02174       if(DebugLevel){   
02175         debug (DebugLevel, ("%s, debug level = %d", rcsid, DebugLevel));
02176         debug (DebugLevel, ("Char encoding : %s",GetCharEncoding()));
02177       }
02178     }
02179   FrmSetActiveForm (previousForm);
02180   FrmDeleteForm (frm);
02181 }                                                          /* SetDebug */
02182 
02183 #endif

Generated on Sun Aug 29 11:00:40 2004 for GPilotS by doxygen 1.3.4