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];
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
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
00119 goto recv_done;
00120 }
00121 left -= read;
00122 bof += read;
00123 }
00124 if (MemCmp(SAVEGAMEVERSION, gs->version, 4) != 0) {
00125
00126 err = exgErrBadData;
00127 goto recv_done;
00128 }
00129
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
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
00190
00191
00192
00193
00194