MCStack *MCDispatch::findstackd(Window w) { if (w == DNULL) return NULL; if (stacks != NULL) { MCStack *tstk = stacks; do { MCStack *foundstk; if ((foundstk = tstk->findstackd(w)) != NULL) return foundstk; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } if (panels != NULL) { MCStack *tstk = panels; do { MCStack *foundstk; if ((foundstk = tstk->findstackd(w)) != NULL) return foundstk; tstk = (MCStack *)tstk->next(); } while (tstk != panels); } // MW-2006-04-24: [[ Purify ]] It is possible to get here after MCtooltip has been // deleted. So MCtooltip is now NULL in this situation and we test for it here. if (MCtooltip != NULL && MCtooltip->findstackd(w)) return MCtooltip; return NULL; }
Boolean MCDispatch::ismainstack(MCStack *sptr) { if (stacks != NULL) { MCStack *tstk = stacks; do { if (tstk == sptr) return True; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } return False; }
MCStack *MCDispatch::findstackid(uint4 fid) { if (fid == 0) return NULL; MCStack *tstk = stacks; do { MCStack *foundstk; if ((foundstk = (MCStack *)tstk->findsubstackid(fid)) != NULL) return foundstk; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); return NULL; }
void MCDispatch::getmainstacknames(MCExecPoint &ep) { ep.clear(); MCExecPoint ep2(ep); MCStack *tstk = stacks; bool first; first = true; do { tstk->getprop(0, P_SHORT_NAME, ep2, False); ep.concatmcstring(ep2.getsvalue(), EC_RETURN, first); first = false; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); }
MCObject *MCDispatch::getobjid(Chunk_term type, uint4 inid) { if (stacks != NULL) { MCStack *tstk = stacks; do { MCObject *optr; if ((optr = tstk->getsubstackobjid(type, inid)) != NULL) return optr; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } return NULL; }
MCStack *MCStack::findstackd(Window w) { if (w == window) return this; if (substacks != NULL) { MCStack *tptr = substacks; do { if (w == tptr->window) return tptr; tptr = (MCStack *)tptr->next(); } while (tptr != substacks); } return NULL; }
MCStack *MCDispatch::findchildstackd(Window w,uint2 cindex) { uint2 ccount = 0; if (stacks != NULL) { MCStack *tstk = stacks; do { MCStack *foundstk; if ((foundstk = (MCStack *)tstk->findchildstackd(w,ccount,cindex))!= NULL) return foundstk; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } return NULL; }
MCStack *MCStack::findstackd(Window w) { if (w == NULL) return NULL; if ((window != DNULL) && (w->handle.window == window->handle.window)) return this; if (substacks != NULL) { MCStack *tptr = substacks; do { if ((tptr->window != DNULL) && (w->handle.window == tptr->window->handle.window)) return tptr; tptr = (MCStack *)tptr->next(); } while (tptr != substacks); } return NULL; }
MCStack *MCStack::findchildstackd(Window w,uint2 &ccount,uint2 cindex) { Window pwindow = getparentwindow(); if (pwindow != DNULL && w->handle.window == pwindow->handle.window) if (++ccount == cindex) return this; if (substacks != NULL) { MCStack *tptr = substacks; do { pwindow = tptr->getparentwindow(); if (pwindow != DNULL && w->handle.window == pwindow->handle.window) { ccount++; if (ccount == cindex) return tptr; } tptr = (MCStack *)tptr->next(); } while (tptr != substacks); } return NULL; }
// MW-2012-02-17: [[ LogFonts ]] Actually load the stack file (wrapped by readfile // to handle font table cleanup). IO_stat MCDispatch::doreadfile(const char *openpath, const char *inname, IO_handle &stream, MCStack *&sptr) { Boolean loadhome = False; char version[8]; if (readheader(stream, version) == IO_NORMAL) { if (strcmp(version, MCversionstring) > 0) { MCresult->sets("stack was produced by a newer version"); return IO_ERROR; } // MW-2008-10-20: [[ ParentScripts ]] Set the boolean flag that tells us whether // parentscript resolution is required to false. s_loaded_parent_script_reference = false; uint1 charset, type; char *newsf; if (IO_read_uint1(&charset, stream) != IO_NORMAL || IO_read_uint1(&type, stream) != IO_NORMAL || IO_read_string(newsf, stream) != IO_NORMAL) { MCresult->sets("stack is corrupted, check for ~ backup file"); return IO_ERROR; } delete newsf; // stackfiles is obsolete MCtranslatechars = charset != CHARSET; sptr = nil; /* UNCHECKED */ MCStackSecurityCreateStack(sptr); if (stacks == NULL) sptr->setparent(this); else sptr->setparent(stacks); sptr->setfilename(strclone(openpath)); if (MCModeCanLoadHome() && type == OT_HOME) { char *lstring = NULL; char *cstring = NULL; IO_read_string(lstring, stream); IO_read_string(cstring, stream); delete lstring; delete cstring; } MCresult -> clear(); if (IO_read_uint1(&type, stream) != IO_NORMAL || type != OT_STACK && type != OT_ENCRYPT_STACK || sptr->load(stream, version, type) != IO_NORMAL) { if (MCresult -> isclear()) MCresult->sets("stack is corrupted, check for ~ backup file"); destroystack(sptr, False); sptr = NULL; return IO_ERROR; } // MW-2011-08-09: [[ Groups ]] Make sure F_GROUP_SHARED is set // appropriately. sptr -> checksharedgroups(); if (sptr->load_substacks(stream, version) != IO_NORMAL || IO_read_uint1(&type, stream) != IO_NORMAL || type != OT_END) { if (MCresult -> isclear()) MCresult->sets("stack is corrupted, check for ~ backup file"); destroystack(sptr, False); sptr = NULL; return IO_ERROR; } if (stacks != NULL) { MCStack *tstk = stacks; do { if (sptr->hasname(tstk->getname())) { MCAutoNameRef t_stack_name; /* UNCHECKED */ t_stack_name . Clone(sptr -> getname()); delete sptr; sptr = NULL; if (strequal(tstk->getfilename(), openpath)) sptr = tstk; else { MCdefaultstackptr->getcard()->message_with_args(MCM_reload_stack, MCNameGetOldString(tstk->getname()), openpath); tstk = stacks; do { if (MCNameIsEqualTo(t_stack_name, tstk->getname(), kMCCompareCaseless)) { sptr = tstk; break; } tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } return IO_NORMAL; } tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } appendstack(sptr); sptr->extraopen(false); // MW-2008-10-28: [[ ParentScript ]] // We just loaded a stackfile, so check to see if parentScript resolution // is required and if so do it. // MW-2009-01-28: [[ Inherited parentScripts ]] // Resolving parentScripts may allocate memory, so 'resolveparentscripts' // will return false if it fails to allocate what it needs. At some point // this needs to be dealt with by deleting the stack and returning an error, // *However* at the time of writing, 'readfile' isn't designed to handle // this - so we just ignore the result for now (note that all the 'load' // methods *fail* to check for no-memory errors!). if (s_loaded_parent_script_reference) sptr -> resolveparentscripts(); } else { MCS_seek_set(stream, 0); if (stacks == NULL) { MCnoui = True; MCscreen = new MCUIDC; /* UNCHECKED */ MCStackSecurityCreateStack(stacks); MCdefaultstackptr = MCstaticdefaultstackptr = stacks; stacks->setparent(this); stacks->setname_cstring("revScript"); uint4 size = (uint4)MCS_fsize(stream); char *script = new char[size + 2]; script[size] = '\n'; script[size + 1] = '\0'; if (IO_read(script, sizeof(char), size, stream) != IO_NORMAL || !stacks->setscript(script)) { delete script; return IO_ERROR; } } else { char *tname = strclone(inname); // MW-2008-06-12: [[ Bug 6476 ]] Media won't open HC stacks if (!MCdispatcher->cut(True) || hc_import(tname, stream, sptr) != IO_NORMAL) { MCresult->sets("file is not a stack"); delete tname; return IO_ERROR; } } } return IO_NORMAL; }
MCObject *MCDispatch::getobjname(Chunk_term type, const MCString &s) { if (stacks != NULL) { MCStack *tstk = stacks; do { MCObject *optr; if ((optr = tstk->getsubstackobjname(type, s)) != NULL) return optr; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } if (type == CT_IMAGE) { const char *sptr = s.getstring(); uint4 l = s.getlength(); MCAutoNameRef t_image_name; if (MCU_strchr(sptr, l, ':')) /* UNCHECKED */ t_image_name . CreateWithOldString(s); MCImage *iptr = imagecache; if (iptr != NULL) { do { check: if (t_image_name != nil && iptr -> hasname(t_image_name)) return iptr; if (!iptr->getopened()) { iptr->remove(imagecache); delete iptr; iptr = imagecache; if (iptr == NULL) break; goto check; } iptr = (MCImage *)iptr->next(); } while (iptr != imagecache); } if (MCU_strchr(sptr, l, ':')) { MCresult->clear(False); MCExecPoint ep(MCdefaultstackptr, NULL, NULL); MCExecPoint *epptr = MCEPptr == NULL ? &ep : MCEPptr; epptr->setsvalue(s); MCU_geturl(*epptr); if (MCresult->isempty()) { iptr = new MCImage; iptr->appendto(imagecache); iptr->setprop(0, P_TEXT, *epptr, False); iptr->setname(t_image_name); return iptr; } } } return NULL; }
MCStack *MCDispatch::findstackname(const MCString &s) { if (s.getlength() == 0) return NULL; MCStack *tstk = stacks; if (tstk != NULL) { do { MCStack *foundstk; if ((foundstk = (MCStack *)tstk->findsubstackname(s)) != NULL) return foundstk; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } tstk = stacks; if (tstk != NULL) { do { MCStack *foundstk; if ((foundstk = (MCStack *)tstk->findstackfile(s)) != NULL) return foundstk; tstk = (MCStack *)tstk->next(); } while (tstk != stacks); } char *sname = s.clone(); if (loadfile(sname, tstk) != IO_NORMAL) { char *buffer = new char[s.getlength() + 5]; MCU_lower(buffer, s); strcpy(&buffer[s.getlength()], ".mc"); delete sname; char *sptr = buffer; while (*sptr) { if (strchr("\r\n\t *?*<>/\\()[]{}|'`\"", *sptr) != NULL) *sptr = '_'; sptr++; } if (loadfile(buffer, tstk) != IO_NORMAL) { strcpy(&buffer[s.getlength()], ".rev"); if (loadfile(buffer, tstk) != IO_NORMAL) { delete buffer; return NULL; } } delete buffer; } else delete sname; return tstk; }