bool parseCinematic(Cinematic * c, const char * data, size_t size) { const char * cinematicId = safeGetString(data, size); if(!cinematicId) { LogError << "Error parsing file magic number"; return false; } if(std::strcmp(cinematicId, "KFA")) { LogError << "Wrong magic number"; return false; } s32 version; if(!safeGet(version, data, size)) { LogError << "Error reading file version"; return false; } LogDebug("version " << version); if(version < CINEMATIC_VERSION_1_75) { LogError << "Too old version " << version << " expected at least " << CINEMATIC_VERSION_1_75; } if(version > CINEMATIC_VERSION_1_76) { LogError << "Wrong version " << version << " expected max " << CINEMATIC_VERSION_1_76; return false; } // Ignore a string. safeGetString(data, size); // Load bitmaps. s32 nbitmaps; if(!safeGet(nbitmaps, data, size)) { LogError << "Error reading bitmap count"; return false; } LogDebug(nbitmaps << " images:"); c->m_bitmaps.reserve(nbitmaps); for(int i = 0; i < nbitmaps; i++) { s32 scale = 0; if(!safeGet(scale, data, size)) { LogError << "Error reading bitmap scale"; return false; } const char * str = safeGetString(data, size); if(!str) { LogError << "Error reading bitmap path"; return false; } LogDebug(" - " << i << ": \"" << str << '"'); res::path path = fixTexturePath(str); LogDebug(" => " << path << " (scale x" << scale << ')'); CinematicBitmap * newBitmap = CreateCinematicBitmap(path, scale); if(newBitmap) { c->m_bitmaps.push_back(newBitmap); } } // Load sounds. s32 nsounds; if(!safeGet(nsounds, data, size)) { LogError << "Error reading sound count"; return false; } LogDebug(nsounds << " sounds:"); for(int i = 0; i < nsounds; i++) { if(version >= CINEMATIC_VERSION_1_76) { s16 ignored; if(!safeGet(ignored, data, size)) { LogError << "Error reading sound id"; return false; } } const char * str = safeGetString(data, size); if(!str) { LogError << "Error reading sound path"; return false; } LogDebug(" - " << i << ": \"" << str << '"'); std::pair<res::path, bool> path = fixSoundPath(str); LogDebug(" => " << path.first << (path.second ? " (speech)" : "")); AddSoundToList(path.first, path.second); } // Load track and keys. SavedCinematicTrack t; if(!safeGet(t, data, size)) { LogError << "Error reading track"; return false; } AllocTrack(t.startframe, t.endframe, t.fps); LogDebug(t.nbkey << " keyframes:"); for(int i = 0; i < t.nbkey; i++) { C_KEY k; int idsound; if(version <= CINEMATIC_VERSION_1_75) { C_KEY_1_75 k175; if(!safeGet(k175, data, size)) { LogError << "Error reading key v1.75"; return false; } k.angz = k175.angz; k.color = k175.color; k.colord = k175.colord; k.colorf = k175.colorf; k.frame = k175.frame; k.fx = k175.fx; k.numbitmap = k175.numbitmap; k.pos = k175.pos.toVec3(); k.speed = k175.speed; k.typeinterp = k175.typeinterp; k.force = k175.force; idsound = k175.idsound; k.idsound = -1; k.light = k175.light; k.posgrille = k175.posgrille.toVec3(); k.angzgrille = k175.angzgrille; k.speedtrack = k175.speedtrack; } else { C_KEY_1_76 k176; if(!safeGet(k176, data, size)) { LogError << "Error reading key v1.76"; return false; } k.angz = k176.angz; k.color = k176.color; k.colord = k176.colord; k.colorf = k176.colorf; k.frame = k176.frame; k.fx = k176.fx; k.numbitmap = k176.numbitmap; k.pos = k176.pos.toVec3(); k.speed = k176.speed; k.typeinterp = k176.typeinterp; k.force = k176.force; k.light = k176.light; k.posgrille = k176.posgrille.toVec3(); k.angzgrille = k176.angzgrille; k.speedtrack = k176.speedtrack; idsound = k176.idsound[0]; // 0 was the language code for 'French' k.idsound = k176.idsound[3]; // 3 was the language code for 'English' } if(k.force < 0) { k.force = 1; } FillKeyTemp(&k.pos, k.angz, k.frame, k.numbitmap, k.fx, k.typeinterp, k.color, k.colord, k.colorf, k.speed, k.idsound, k.force, &k.light, &k.posgrille, k.angzgrille, k.speedtrack); AddKeyLoad(&KeyTemp); LogDebug(" - " << i << ": frame " << k.frame << " image: " << k.numbitmap); if(k.idsound >= 0) { LogDebug(" + sound: " << k.idsound); } if(i == 0) { c->pos = k.pos; c->angz = k.angz; c->numbitmap = k.numbitmap; c->fx = k.fx; c->ti = c->tichoose = k.typeinterp; c->color = c->colorchoose = k.color; c->colord = c->colorchoosed = k.colord; c->colorflash = c->colorflashchoose = k.colorf; c->speed = c->speedchoose = k.speed; c->idsound = idsound; c->force = k.force; c->light = c->lightchoose = k.light; c->posgrille = k.posgrille; c->angzgrille = k.angzgrille; c->speedtrack = k.speedtrack; } } UpDateAllKeyLight(); SetCurrFrame(0); GereTrackNoPlay(c); c->projectload = true; LogDebug("loaded cinematic"); return true; }
int sns_processSnsMessage(char *snsmsg, int(*msg_handler)(SNSMessage*)) { char *type; TRACE(stderr, "incoming message: \"%s\"\n", snsmsg); cJSON *snsroot = cJSON_Parse(snsmsg); if (!snsroot) { syslog(LOG_ERR, "sns bad json input: %s", snsmsg); return (400); } if (!(type=safeGetString(snsroot, "Type"))) { syslog(LOG_ERR, "sns no type: %s", snsmsg); cJSON_Delete(snsroot); return (400); } SNSMessage *sns = (SNSMessage*) malloc(sizeof(SNSMessage)); memset(sns, '\0', sizeof(SNSMessage)); sns->type = strdup(type); sns->messageId = safeDupString(snsroot, "MessageId"); sns->subject = safeDupString(snsroot, "Subject"); sns->timestamp = safeDupString(snsroot, "Timestamp"); sns->topicArn = safeDupString(snsroot, "TopicArn"); if (strcmp(type, "Notification")) { fprintf(stderr, "message (%s) not a notification\n", type); if (!strcmp(type, "SubscriptionConfirmation")) { fprintf(stderr, "message is the subscription confirmation: %s\n", snsmsg); } freeSNSMessage(sns); cJSON_Delete(snsroot); return (200); } // get the message content char *msg = safeGetString(snsroot, "Message"); if (!msg) { syslog(LOG_ERR, "no message content"); freeSNSMessage(sns); cJSON_Delete(snsroot); return (400); } TRACE(stderr, "message is: %s \n", msg); // verify the SNS signature char *vfytxt = (char*) malloc(strlen(msg) + 1024); sprintf(vfytxt, "Message\n%s\nMessageId\n%s\nSubject\n%s\nTimestamp\n%s\nTopicArn\n%s\nType\n%s\n", msg, sns->messageId, sns->subject, sns->timestamp, sns->topicArn, sns->type); TRACE(stderr, "sigmsg: %s\n", vfytxt); int v = iam_verifySignature(vfytxt, safeGetString(snsroot, "Signature"), safeGetString(snsroot, "SigningCertURL")); if (v==0) syslog(LOG_ERR, "signature verify fails: %d", v); sns->verified = v; free (vfytxt); sns->message = iam_base64ToText(msg); cJSON_Delete(snsroot); return ((*msg_handler)(sns)); }