// handle callback from remote DrawLink. void DrawServ::grid_message_callback(DrawLink* link, unsigned int id, unsigned int selector, int state, unsigned int oldselector) { void* ptr = nil; gridtable()->find(ptr, id); if (ptr) { GraphicId* grid = (GraphicId*)ptr; /* if request is granted, add to selection */ if (grid->selected()==LinkSelection::WaitingToBeSelected && selector==sessionid()) { grid->selector(selector); fprintf(stderr, "grid: request granted, add to selection now\n"); OverlayComp* comp = (OverlayComp*)grid->grcomp(); LinkSelection* sel = (LinkSelection*)DrawKit::Instance()->GetEditor()->GetSelection(); sel->AddComp(comp); } /* otherwise, pass the granting message along */ else { fprintf(stderr, "grid: pass grant request along\n"); char buf[BUFSIZ]; snprintf(buf, BUFSIZ, "grid(chgid(0x%08x) chgid(0x%08x) :grant chgid(0x%08x))%c", grid->id(), selector, oldselector, '\0'); SendCmdString(linkget(selector), buf); } } }
void DrawServ::print_gridtable() { GraphicIdTable* table = gridtable(); GraphicIdTable_Iterator it(*table); printf("id &grid &grcomp selector selected\n"); printf("---------- ---------- ---------- ---------- --------\n"); while(it.more()) { GraphicId* grid = (GraphicId*)it.cur_value(); printf("0x%08x 0x%08lx 0x%08lx 0x%08lx %s\n", (unsigned int)it.cur_key(), (unsigned long)grid, (unsigned long)grid->grcomp(), (unsigned long)grid->selector(), LinkSelection::selected_string(grid->selected())); it.next(); } }
void DrawServ::ExecuteCmd(Command* cmd) { static int grid_sym = symbol_add("grid"); static int sid_sym = symbol_add("sid"); boolean original = false; unsigned int from_sid = 0; if(!_linklist || _linklist->Number()==0) /* normal Unidraw command execution */ Unidraw::ExecuteCmd(cmd); else { /* indirect command execution, all by script */ std::ostrstream sbuf; boolean oldflag = OverlayScript::ptlist_parens(); OverlayScript::ptlist_parens(false); switch (cmd->GetClassId()) { case PASTE_CMD: { boolean scripted = false; Clipboard* cb = cmd->GetClipboard(); if (cb) { Iterator it; for (cb->First(it); !cb->Done(it); cb->Next(it)) { OverlayComp* comp = (OverlayComp*)cb->GetComp(it); AttributeList* al = comp->GetAttributeList(); AttributeValue* idv = al->find(grid_sym); AttributeValue* sidv = al->find(sid_sym); from_sid = sidv ? sidv->uint_val() : 0; /* unique id already remotely assigned */ if (idv && idv->uint_val() !=0 && sidv && sidv->uint_val() !=0) { GraphicId* graphicid = new GraphicId(); graphicid->grcomp(comp); graphicid->id(idv->uint_val()); graphicid->selector(sidv->uint_val()); graphicid->selected(LinkSelection::RemotelySelected); } /* generate unique id and add as attribute */ /* also mark with selector id */ else { GraphicId* graphicid = new GraphicId(sessionid()); graphicid->grcomp(comp); graphicid->selector(((DrawServ*)unidraw)->sessionid()); AttributeValue* gridv = new AttributeValue(graphicid->id(), AttributeValue::UIntType); gridv->state(AttributeValue::HexState); al->add_attr(grid_sym, gridv); AttributeValue* sidv = new AttributeValue(graphicid->selector(), AttributeValue::UIntType); sidv->state(AttributeValue::HexState); al->add_attr(sid_sym, sidv); original = true; } if (comp && (original || linklist()->Number()>1)) { Creator* creator = unidraw->GetCatalog()->GetCreator(); OverlayScript* scripter = (OverlayScript*) creator->Create(Combine(comp->GetClassId(), SCRIPT_VIEW)); if (scripter) { scripter->SetSubject(comp); if (scripted) sbuf << ';'; else scripted = true; boolean status = scripter->Definition(sbuf); delete scripter; } } } } if (original || linklist()->Number()>1) { if (!scripted) sbuf << "print(\"Failed attempt to generate script for a PASTE_CMD\\n\" :err)"; sbuf.put('\0'); cout << sbuf.str() << "\n"; cout.flush(); } /* first execute here */ #if 0 ((ComEditor*)cmd->GetEditor())->GetComTerp()->run(sbuf.str()); ((PasteCmd*)cmd)->executed(true); #else cmd->Execute(); #endif /* then send everywhere else */ if (original || linklist()->Number()>1) DistributeCmdString(sbuf.str(), linkget(from_sid)); } break; default: sbuf << "print(\"Attempt to convert unknown command (id == %d) to interpretable script\\n\" " << cmd->GetClassId() << " :err)"; cmd->Execute(); break; } if (cmd->Reversible()) { cmd->Log(); } else { delete cmd; } OverlayScript::ptlist_parens(oldflag); } }