Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

palm/beam.c

Go to the documentation of this file.
00001 
00012 #include <UIResources.h>
00013 #include <StringMgr.h>
00014 #include <ErrorMgr.h>
00015 #include <ExgMgr.h>
00016 #include <palmutils.h>
00017 #include <mem_compat.h>
00018 #include <simcity.h>
00019 #include <appconfig.h>
00020 #include <beam.h>
00021 #include <savegame_be.h>
00022 #include <logging.h>
00023 #include <simcity_resconsts.h>
00024 
00025 static char *mime_type = "application/x-pocketcity";
00026 static char *pcity_extension = "cty";
00027 
00028 int
00029 BeamSend(UInt8 *map_ptr)
00030 {
00031         ExgSocketType exs;
00032         Err rv;
00033         UInt32 sent;
00034         UInt32 toSend;
00035         GameStruct *gs = (GameStruct *)map_ptr;
00036 
00037         char beamName[50]; /* city name length + .cty + "?: " */
00038 
00039         gMemSet((void *)&exs, (Int32)sizeof (exs), 0);
00040         StrPrintF(beamName, "?_beam;_send:%s.%s", gs->cityname,
00041             pcity_extension);
00042         exs.target = GetCreatorID();
00043         exs.count = 1;
00044         exs.length = saveGameSize(gs);
00045         exs.description = gs->cityname;
00046         exs.name = beamName;
00047         exs.length += StrLen(exs.description);
00048         exs.type = mime_type;
00049 
00050         WriteLog("pre-exgput\n");
00051         rv = ExgPut(&exs);
00052         if (rv != errNone) {
00053                 return (-1);
00054         }
00055         WriteLog("post-exgput\n");
00056         toSend = saveGameSize(gs);
00057         WriteLog("pre all send\n");
00058         while (toSend != 0) {
00059                 sent = ExgSend(&exs, map_ptr, toSend, &rv);
00060                 WriteLog("send bits\n");
00061                 toSend -= sent;
00062                 map_ptr += sent;
00063                 if (rv != errNone) {
00064                         ExgDisconnect(&exs, rv);
00065                         return (-1);
00066                 }
00067         }
00068         WriteLog("Post all send (%d)\n", rv);
00069         ExgDisconnect(&exs, rv);
00070         WriteLog("Post Disconnect\n");
00071         return (0);
00072 }
00073 
00074 Err
00075 BeamReceive(ExgSocketType *ptr)
00076 {
00077         UInt8 *bof;
00078         Char *tl;
00079         UInt32 left;
00080         UInt32 read;
00081         GameStruct *gs;
00082         MemHandle mh;
00083         MemPtr mp;
00084         Err err = errNone;
00085         UInt16 reci;
00086         DmOpenRef dbP = OpenMyDB();
00087 
00088         if (dbP == NULL)
00089                 return (-1);
00090 
00091         gs = gMalloc(sizeof (GameStruct));
00092         if (gs == NULL)
00093                 return (-1);
00094 
00095         err = ExgAccept(ptr);
00096         if (err != errNone)
00097                 goto recv_done;
00098         /* read the gamestruct - gives size for other elements */
00099         left = sizeof (GameStruct);
00100         bof = (UInt8 *)gs;
00101         while (left != 0) {
00102                 read = ExgReceive(ptr, bof, left, &err);
00103                 if (err != errNone)
00104                         goto recv_done;
00105                 left -= read;
00106                 bof += read;
00107         }
00108         left = saveGameSize(gs);
00109         gs = gRealloc(gs, left);
00110         if (gs == NULL)
00111                 goto recv_done;
00112         bof = (UInt8 *)gs + sizeof (GameStruct);
00113         
00114         left -= sizeof (GameStruct);
00115         while (left != 0) {
00116                 read = ExgReceive(ptr, bof, left, &err);
00117                 if (err != errNone) {
00118                         /* XXX: notify error */
00119                         goto recv_done;
00120                 }
00121                 left -= read;
00122                 bof += read;
00123         }
00124         if (MemCmp(SAVEGAMEVERSION, gs->version, 4) != 0) {
00125                 /* XXX: Invalid savegame - warning */
00126                 err = exgErrBadData;
00127                 goto recv_done;
00128         }
00129         /* At this point we've been successful at reading all the structure */
00130         left = StrLen(gs->cityname);
00131         if (left < 18) {
00132                 tl = gs->cityname + left;
00133         } else {
00134                 tl = gs->cityname + 18;
00135         }
00136         tl[1] = '\0';
00137         if (FindGameByName(gs->cityname) != LASTGAME) {
00138                 *tl = '0';
00139                 do {
00140                         if (*tl == '9')
00141                                 *tl = 'A';
00142                         *tl = *tl + 1;
00143                 } while (FindGameByName(gs->cityname) != LASTGAME);
00144         }
00145         reci = dmMaxRecordIndex;
00146         mh = DmNewRecord(dbP, &reci, saveGameSize(gs));
00147         if (mh == NULL) {
00148                 /* XXX: notify memory error */
00149                 err = exgErrBadData;
00150                 goto recv_done;
00151         }
00152         mp = MemHandleLock(mh);
00153         if (mp == NULL) {
00154                 DmReleaseRecord(dbP, reci, false);
00155                 DmRemoveRecord(dbP, reci);
00156                 goto recv_done;
00157         }
00158         DmWrite(mp, 0, gs, saveGameSize(gs));
00159         DmReleaseRecord(dbP, reci, true);
00160         SetAutoSave(&gs->cityname[0]);
00161         MemHandleUnlock(mh);
00162 recv_done:
00163         CloseMyDB();
00164         err = ExgDisconnect(ptr, err);
00165         if (gs) gFree(gs);
00166         return (err);
00167 }
00168 
00169 void
00170 BeamRegister(void)
00171 {
00172         if (Is40ROM()) {
00173                 MemHandle mh = DmGetResource(strRsc, pcity_description);
00174                 MemPtr memp = MemHandleLock(mh);
00175                 ExgRegisterDatatype(GetCreatorID(), exgRegTypeID, mime_type,
00176                     memp, 0);
00177                 ExgRegisterDatatype(GetCreatorID(), exgRegExtensionID,
00178                     pcity_extension, memp, 0);
00179                 MemHandleUnlock(mh);
00180                 DmReleaseResource(mh);
00181         } else {
00182                 ExgRegisterData(GetCreatorID(), exgRegTypeID, mime_type);
00183                 ExgRegisterData(GetCreatorID(), exgRegExtensionID,
00184                     pcity_extension);
00185         }
00186 }
00187 
00188 /*
00189 void
00190 BeamUnregister(void)
00191 {
00192         ExgRegisterData(GetCreatorID(), exgRegTypeID, NULL);
00193 }
00194 */

Generated on Mon Aug 30 19:44:15 2004 for pocketcity by doxygen1.2.18