IO_stat MCCdata::save(IO_handle stream, Object_type type, uint4 p_part) { IO_stat stat; // If p_part is non-zero it means we only want to save data specific // to a given card. In this case, we simply don't save the rest. if (p_part != 0 && id != p_part) return IO_NORMAL; if ((stat = IO_write_uint1(type, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_uint4(p_part != 0 ? 0 : id, stream)) != IO_NORMAL) return stat; if (type == OT_BDATA) { uint1 set = data ? 1 : 0; return IO_write_uint1(set, stream); } else if (id & COMPACT_PARAGRAPHS) return IO_write_string((char *)data, stream, sizeof(uint1)); else { MCParagraph *tptr = (MCParagraph *)data; if (tptr != NULL) do { if ((stat = tptr->save(stream, p_part)) != IO_NORMAL) return stat; tptr = (MCParagraph *)tptr->next(); } while (tptr != data); } return IO_NORMAL; }
IO_stat MCPlayer::save(IO_handle stream, uint4 p_part, bool p_force_ext, uint32_t p_version) { IO_stat stat; if (!disposable) { if ((stat = IO_write_uint1(OT_PLAYER, stream)) != IO_NORMAL) return stat; if ((stat = MCControl::save(stream, p_part, p_force_ext, p_version)) != IO_NORMAL) return stat; // MW-2013-11-19: [[ UnicodeFileFormat ]] If sfv >= 7000, use unicode. if ((stat = IO_write_stringref_new(filename, stream, p_version >= 7000)) != IO_NORMAL) return stat; if ((stat = IO_write_uint4(starttime, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_uint4(endtime, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_int4((int4)(rate / 10.0 * MAXINT4), stream)) != IO_NORMAL) return stat; // MW-2013-11-19: [[ UnicodeFileFormat ]] If sfv >= 7000, use unicode. if ((stat = IO_write_stringref_new(userCallbackStr, stream, p_version >= 7000)) != IO_NORMAL) return stat; } return savepropsets(stream, p_version); }
IO_stat MCColors::save(IO_handle stream, uint4 p_part, bool p_force_ext) { IO_stat stat; if ((stat = IO_write_uint1(OT_COLORS, stream)) != IO_NORMAL) return stat; if ((stat = MCObject::save(stream, p_part, p_force_ext)) != IO_NORMAL) return stat; return savepropsets(stream); }
IO_stat MCCdata::save(IO_handle stream, Object_type type, uint4 p_part, MCObject *p_parent, uint32_t p_version) { IO_stat stat; // If p_part is non-zero it means we only want to save data specific // to a given card. In this case, we simply don't save the rest. if (p_part != 0 && id != p_part) return IO_NORMAL; if ((stat = IO_write_uint1(type, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_uint4(p_part != 0 ? 0 : id, stream)) != IO_NORMAL) return stat; if (type == OT_BDATA) { uint1 set = data ? 1 : 0; return IO_write_uint1(set, stream); } else if (id & COMPACT_PARAGRAPHS) { // MW-2013-11-19: [[ UnicodeFileFormat ]] This flag is never set by newer engines // so is just legacy. (Indeed, this codepath should never be hit!). return IO_write_cstring_legacy((char *)data, stream, sizeof(uint1)); } else { MCParagraph *tptr = (MCParagraph *)data; if (tptr != NULL) do { // Ensure field's saved MCCdata paragraphs have a parent when needed if (p_parent != nil) tptr -> setparent(MCObjectCast<MCField>(p_parent)); if ((stat = tptr->save(stream, p_part, p_version)) != IO_NORMAL) return stat; tptr = (MCParagraph *)tptr->next(); } while (tptr != data); } return IO_NORMAL; }
IO_stat MCMagnify::save(IO_handle stream, uint4 p_part, bool p_force_ext, uint32_t p_version) { IO_stat stat; if ((stat = IO_write_uint1(OT_MAGNIFY, stream)) != IO_NORMAL) return stat; if ((stat = MCObject::save(stream, p_part, p_force_ext, p_version)) != IO_NORMAL) return stat; return IO_NORMAL; }
IO_stat IO_write_string(const MCString &p_string, IO_handle p_stream, uint8_t p_size, bool p_write_null) { IO_stat stat = IO_NORMAL; uint32_t t_strlen = p_string.getlength(); uint4 length = 0; uint32_t t_inc = p_write_null ? 1 : 0; switch (p_size) { case 1: { uint1 len = t_strlen == 0 ? 0 : MCU_min(t_strlen + t_inc, MAXUINT1); if ((stat = IO_write_uint1(len, p_stream)) != IO_NORMAL) return stat; length = len; break; } case 2: { uint2 len = t_strlen == 0 ? 0 : MCU_min(t_strlen + t_inc, MAXUINT2); if ((stat = IO_write_uint2(len, p_stream)) != IO_NORMAL) return stat; length = len; break; } case 4: length = t_strlen == 0 ? 0 : t_strlen + t_inc; if ((stat = IO_write_uint4(length, p_stream)) != IO_NORMAL) return stat; break; } if (length) { stat = MCStackSecurityWrite(p_string.getstring(), length - t_inc, p_stream); if (stat == IO_NORMAL && p_write_null) stat = IO_write_uint1(0, p_stream); } return stat; }
IO_stat MCEPS::save(IO_handle stream, uint4 p_part, bool p_force_ext) { IO_stat stat; if ((stat = IO_write_uint1(OT_MCEPS, stream)) != IO_NORMAL) return stat; if ((stat = MCObject::save(stream, p_part, p_force_ext)) != IO_NORMAL) return stat; if ((stat = IO_write_uint4(size, stream)) != IO_NORMAL) return stat; if ((stat = IO_write(postscript, sizeof(char), size, stream)) != IO_NORMAL) return stat; // MW-2013-11-19: [[ UnicodeFileFormat ]] EPS is always ASCII so legacy. if ((stat = IO_write_cstring_legacy(prolog, stream, 2)) != IO_NORMAL) return stat; if ((stat = IO_write_int4(MCU_r8toi4(xscale), stream)) != IO_NORMAL) return stat; if (flags & F_SCALE_INDEPENDENTLY) if ((stat = IO_write_int4(MCU_r8toi4(yscale), stream)) != IO_NORMAL) return stat; if ((stat = IO_write_int2(angle, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_int2(tx, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_int2(ty, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_uint2(ex, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_uint2(ey, stream)) != IO_NORMAL) return stat; if (flags & F_RETAIN_IMAGE) if ((stat = image->save(stream, p_part, p_force_ext)) != IO_NORMAL) return stat; if ((stat = IO_write_uint2(curpage, stream)) != IO_NORMAL) return stat; if ((stat = IO_write_uint2(pagecount, stream)) != IO_NORMAL) return stat; uint2 i; for (i = 0 ; i < pagecount ; i++) if ((stat = IO_write_uint4(pageIndex[i], stream)) != IO_NORMAL) return stat; return savepropsets(stream); }
// MW-2011-01-13: As styledtext is an internal (not published in anyway) format // we can change it to include the paragraph style for now. IO_stat MCStyledText::save(IO_handle p_stream, uint4 p_part, bool p_force_ext) { IO_stat stat; if ((stat = IO_write_uint1(OT_STYLED_TEXT, p_stream)) != IO_NORMAL) return stat; MCParagraph *tptr = m_paragraphs; if (tptr != NULL) do { if ((stat = tptr->save(p_stream, p_part)) != IO_NORMAL) return stat; tptr = (MCParagraph *)tptr->next(); } while (tptr != m_paragraphs); return IO_NORMAL; }
IO_stat MCVideoClip::save(IO_handle stream, uint4 p_part, bool p_force_ext) { IO_stat stat; if ((stat = IO_write_uint1(OT_VIDEO_CLIP, stream)) != IO_NORMAL) return stat; if ((stat = MCObject::save(stream, p_part, p_force_ext)) != IO_NORMAL) return stat; if ((stat = IO_write_uint4(size, stream)) != IO_NORMAL) return stat; if ((stat = IO_write(frames, sizeof(uint1), size, stream)) != IO_NORMAL) return stat; if (flags & F_FRAME_RATE) if ((stat = IO_write_uint2(framerate, stream)) != IO_NORMAL) return stat; if (flags & F_SCALE_FACTOR) if ((stat = IO_write_int4(MCU_r8toi4(scale), stream)) != IO_NORMAL) return stat; return savepropsets(stream); }
void MCArraysEvalArrayEncode(MCExecContext& ctxt, MCArrayRef p_array, MCStringRef p_version, MCDataRef& r_encoding) { bool t_success; t_success = true; IO_handle t_stream_handle; t_stream_handle = nil; if (t_success) { t_stream_handle = MCS_fakeopenwrite(); if (t_stream_handle == nil) t_success = false; } // AL-2014-05-15: [[ Bug 12203 ]] Add version parameter to arrayEncode, to allow // version 7.0 variant to preserve unicode. MCInterfaceStackFileVersion t_version; if (p_version != nil) MCInterfaceStackFileVersionParse(ctxt, p_version, t_version); // AL-2014-05-22: [[ Bug 12547 ]] Make arrayEncode encode in 7.0 format by default. bool t_legacy; t_legacy = p_version != nil && t_version . version < 7000; if (t_legacy) { MCObjectOutputStream *t_stream; t_stream = nil; if (t_success) { t_stream = new MCObjectOutputStream(t_stream_handle); if (t_stream == nil) t_success = false; } if (t_success) { if (t_stream -> WriteU8(kMCEncodedValueTypeLegacyArray) != IO_NORMAL) t_success = false; } if (t_success) if (MCArraySaveToStreamLegacy(p_array, false, *t_stream) != IO_NORMAL) t_success = false; if (t_success) t_stream -> Flush(true); delete t_stream; } else { if (t_success) if (IO_write_uint1(kMCEncodedValueTypeArray, t_stream_handle) != IO_NORMAL) t_success = false; if (t_success) if (IO_write_valueref_new(p_array, t_stream_handle) != IO_NORMAL) t_success = false; } ////////// void *t_buffer; size_t t_length; t_buffer = nil; t_length = 0; if (MCS_closetakingbuffer(t_stream_handle, t_buffer, t_length) != IO_NORMAL) t_success = false; if (t_success) t_success = MCDataCreateWithBytes((const byte_t *)t_buffer, t_length, r_encoding); free(t_buffer); if (t_success) return; ctxt . Throw(); }
IO_stat MCDispatch::dosavestack(MCStack *sptr, const MCString &fname) { if (MCModeCheckSaveStack(sptr, fname) != IO_NORMAL) return IO_ERROR; char *linkname; if (fname.getlength() != 0) linkname = fname.clone(); else if ((linkname = strclone(sptr->getfilename())) == NULL) { MCresult->sets("stack does not have a filename"); return IO_ERROR; } if (linkname == NULL) { MCresult->sets("can't open stack file, bad path"); return IO_ERROR; } if (MCS_noperm(linkname)) { MCresult->sets("can't open stack file, no permission"); delete linkname; return IO_ERROR; } char *oldfiletype = MCfiletype; MCfiletype = MCstackfiletype; char *backup = new char[strlen(linkname) + 2]; strcpy(backup, linkname); strcat(backup, "~"); MCS_unlink(backup); if (MCS_exists(linkname, True) && !MCS_backup(linkname, backup)) { MCresult->sets("can't open stack backup file"); MCfiletype = oldfiletype; delete linkname; delete backup; return IO_ERROR; } IO_handle stream; if ((stream = MCS_open(linkname, IO_WRITE_MODE, True, False, 0)) == NULL) { MCresult->sets("can't open stack file"); cleanup(stream, linkname, backup); MCfiletype = oldfiletype; return IO_ERROR; } MCfiletype = oldfiletype; MCString errstring = "Error writing stack (disk full?)"; // MW-2012-03-04: [[ StackFile5500 ]] Work out what header to emit, and the size. const char *t_header; uint32_t t_header_size; if (MCstackfileversion >= 5500) t_header = newheader5500, t_header_size = 8; else if (MCstackfileversion >= 2700) t_header = newheader, t_header_size = 8; else t_header = header, t_header_size = HEADERSIZE; if (IO_write(t_header, sizeof(char), t_header_size, stream) != IO_NORMAL || IO_write_uint1(CHARSET, stream) != IO_NORMAL) { MCresult->sets(errstring); cleanup(stream, linkname, backup); return IO_ERROR; } if (IO_write_uint1(OT_NOTHOME, stream) != IO_NORMAL || IO_write_string(NULL, stream) != IO_NORMAL) { // was stackfiles MCresult->sets(errstring); cleanup(stream, linkname, backup); return IO_ERROR; } // MW-2012-02-22; [[ NoScrollSave ]] Adjust the rect by the current group offset. MCgroupedobjectoffset . x = 0; MCgroupedobjectoffset . y = 0; MCresult -> clear(); if (sptr->save(stream, 0, false) != IO_NORMAL || IO_write_uint1(OT_END, stream) != IO_NORMAL) { if (MCresult -> isclear()) MCresult->sets(errstring); cleanup(stream, linkname, backup); return IO_ERROR; } MCS_close(stream); uint2 oldmask = MCS_umask(0); uint2 newmask = ~oldmask & 00777; if (oldmask & 00400) newmask &= ~00100; if (oldmask & 00040) newmask &= ~00010; if (oldmask & 00004) newmask &= ~00001; MCS_umask(oldmask); MCS_chmod(linkname, newmask); if (sptr->getfilename() != NULL && !strequal(linkname, sptr->getfilename())) MCS_copyresourcefork(sptr->getfilename(), linkname); else if (sptr -> getfilename() != NULL) MCS_copyresourcefork(backup, linkname); sptr->setfilename(linkname); if (backup != NULL) { MCS_unlink(backup); delete backup; } return IO_NORMAL; }