//=====================>>> vProgressCmd::initialize <<<======================= void vProgressCmd::initialize() { SysDebug(Constructor,"vProgressCmd::vProgressCmd() constructor\n") CopyToLocal(); long style; style = WS_GROUP; // Make local copies of CmdObject if (!(dlgCmd->attrs & CA_Hidden)) // Check for Hidden style |= WS_VISIBLE; style |= BS_OWNERDRAW; // We are drawing this _isVert = (dlgCmd->attrs & CA_Vertical); int ProgressHeight = (dlgCmd->attrs & CA_Large) ? 150 : 100; if ((dlgCmd->attrs) & CA_Small) ProgressHeight = 50; if (dlgCmd->size > 0) ProgressHeight = dlgCmd->size; // they gave size int* minMax = (int *)_itemList; // giving range? _minVal = 0; _maxVal = 100; // default min/max if (minMax != 0) // They gave a range list { _minVal = minMax[0]; _maxVal = minMax[1]; } if (_minVal > _maxVal) { SysDebug2(BadVals,"vProgressCmd:vProgressCmd - bad range %d to %d\n",_minVal,_maxVal) _minVal = 0; _maxVal = 100; // make some sense! } if (_retVal < _minVal) // set a legal value for the top _curVal = _minVal; else if (_retVal > _maxVal) _curVal = _maxVal; else _curVal = _retVal; if (_isVert) // set sizes for V or H { _h = ProgressHeight; _w = 10; } else { _h = 14; _w = ProgressHeight; } _parentWin->SetPosition(_x, _y, _w, _h, dlgCmd->cFrame, dlgCmd->cRightOf, dlgCmd->cBelow); _CtrlOffset = _parentWin->AddDlgControl(_x, _y, _w, _h, _cmdId, style, "BUTTON", _title, sizeof(vProgressCmd*), (LPBYTE)this); }
int PE_int_GetForwardSymbol(char *Fwd, void **Value) { char *libname; char *sym; int i; void *libbase; int ret; // -- Find seperator // PE spec says that there sould only be one, but the string may // be mutilated in the loader for(i=0;Fwd[i]!='\0';i++); for(;i&&Fwd[i]!='.';i--); Fwd[i] = '\0'; sym = &Fwd[i+1]; libname = PE_int_GetTrueFile(Fwd); DEBUGS(" PE_int_GetForwardSymbol: Get '%s' from '%s'\n", sym, libname); libbase = LoadLibrary(libname, DLL_BASE_PATH, NULL); ret = GetSymbolFromBase(libbase, sym, Value, NULL); if(!ret) { SysDebug(" PE_int_GetForwardSymbol: Unable to find '%s' in '%s'\n", sym, libname); return 0; } Fwd[i] = '.'; return ret; }
//======================>>> vTimer::vTimer <<<======================= vTimer::vTimer( ) // default constructor { SysDebug(Constructor,"vTimer::vTimer - constructor\n"); _id = 0; // no id _interval = 0; // no interval }
//================>>> vCanvasPane::vCanvasPane <<<======================== vCanvasPane::vCanvasPane(PaneType pt) : vPane(pt) { SysDebug(Constructor,"vCanvasPane::vCanvasPane() constructor\n") _cpDC = 0; // no pane DC _compressRedraw = 1; _currentCursor = VC_Arrow; }
//======================>>> vTimer::~vTimer <<<======================= vTimer::~vTimer( ) { SysDebug(Destructor,"vTimer::~vTimer - destructor\n"); if (_id) // remove timer if in effect { TimerStop(); } }
PUBLIC WORD Refine(Object *object, AccMask mask) { word rc = Err_Null; MCB *mcb ; IOCReply2 *rep; Port reply; #ifdef SYSDEB SysDebug(ioc)("Refine(%O,%A)",object,mask); #endif if( (rc = CheckObject(object,C_Locate)) != Err_Null ) return rc; reply = object->Reply; mcb = NewMsgBuf(0); InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP+FG_Refine|object->FnMod); MarshalCommon(mcb,object,NULL); MarshalWord(mcb,mask); if( (rc = IOCMsg(mcb,NULL)) < Err_Null ) goto Done; rep = (IOCReply2 *)mcb->Control; object->Access = rep->Cap; /* copy new capability in */ rc = Err_Null; Done: #ifdef SYSDEB SysDebug(ioc)("Refine: %E",rc); if( mcb->MsgHdr.Reply != NullPort ) SysDebug(error)("Refine: Non-Null Reply port %x",mcb->MsgHdr.Reply); #endif if( mcb->MsgHdr.Reply != NullPort ) FreePort(mcb->MsgHdr.Reply); FreeMsgBuf(mcb); object->Result2 = rc; return rc; }
PUBLIC WORD SetDate( Object * object, STRING name, DateSet * dates ) { word rc = Err_Null; MCB *mcb ; Port reply; #ifdef SYSDEB SysDebug(ioc)("SetDate(%O,%N)",object,name); #endif if( (rc = CheckObject(object,C_Locate)) != Err_Null ) return rc; reply = object->Reply; mcb = NewMsgBuf(0); InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP+FG_SetDate|object->FnMod); MarshalCommon(mcb,object,name); MarshalDate(mcb,dates->Creation); MarshalDate(mcb,dates->Access); MarshalDate(mcb,dates->Modified); if( (rc = IOCMsg(mcb,NULL)) < Err_Null ) goto Done; rc = Err_Null; Done: #ifdef SYSDEB SysDebug(ioc)("SetDate: %E",rc); if( mcb->MsgHdr.Reply != NullPort ) SysDebug(error)("SetDate: Non-Null Reply port %x",mcb->MsgHdr.Reply); #endif if( mcb->MsgHdr.Reply != NullPort ) FreePort(mcb->MsgHdr.Reply); FreeMsgBuf(mcb); object->Result2 = rc; return rc; }
PUBLIC WORD ObjectInfo( Object * object, STRING name, byte * info ) { word rc = Err_Null; MCB *mcb ; Port reply; #ifdef SYSDEB SysDebug(ioc)("ObjectInfo(%O,%N,%P)",object,name,info); #endif if( (rc = CheckObject(object,C_Locate)) != Err_Null ) return rc; reply = object->Reply; mcb = NewMsgBuf(0); InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP+FG_ObjectInfo|object->FnMod); MarshalCommon(mcb,object,name); if( (rc = IOCMsg(mcb,info)) < Err_Null ) goto Done; rc = Err_Null; Done: #ifdef SYSDEB SysDebug(ioc)("ObjectInfo: %E infosize %d",rc,mcb->MsgHdr.DataSize); if( mcb->MsgHdr.Reply != NullPort ) SysDebug(error)("ObjectInfo: Non-Null Reply port %x",mcb->MsgHdr.Reply); #endif if( mcb->MsgHdr.Reply != NullPort ) FreePort(mcb->MsgHdr.Reply); FreeMsgBuf(mcb); object->Result2 = rc; return rc; }
//================>>> vRadioButtonCmd::vRadioButtonCmd <<<===================== vRadioButtonCmd::vRadioButtonCmd(vCmdParent* dp, CommandObject* dc) : vCmd(dp, dc) { // Create bitmaps if need to SysDebug(Constructor,"vRadioButtonCmd::vRadioButtonCmd() constructor\n") initialize(); // and initialize }
PUBLIC WORD Link( Object * object, string name, Object * to ) { word rc = Err_Null; MCB *mcb ; Port reply; #ifdef SYSDEB SysDebug(ioc)("Link(%O,%N,%O)",object,name,to); #endif if( (rc = CheckObject(object,C_Locate)) != Err_Null ) return rc; reply = object->Reply; mcb = NewMsgBuf(0); InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP+FG_Link|object->FnMod); MarshalCommon(mcb,object,name); MarshalString(mcb,to->Name); MarshalCap(mcb,&to->Access); if( (rc = IOCMsg(mcb,NULL)) < Err_Null ) goto Done; rc = Err_Null; Done: #ifdef SYSDEB SysDebug(ioc)("Link: %E",rc); if( mcb->MsgHdr.Reply != NullPort ) SysDebug(error)("Link: Non-Null Reply port %x",mcb->MsgHdr.Reply); #endif if( mcb->MsgHdr.Reply != NullPort ) FreePort(mcb->MsgHdr.Reply); FreeMsgBuf(mcb); object->Result2 = rc; return rc; }
PUBLIC WORD Protect( Object * object, STRING name, Matrix matrix ) { word rc = Err_Null; MCB *mcb ; Port reply; #ifdef SYSDEB SysDebug(ioc)("Protect(%O,%N,%X)",object,name,matrix); #endif if( (rc = CheckObject(object,C_Locate)) != Err_Null ) return rc; reply = object->Reply; mcb = NewMsgBuf(0); InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP+FG_Protect|object->FnMod); MarshalCommon(mcb,object,name); MarshalWord(mcb,matrix); if( (rc = IOCMsg(mcb,NULL)) < Err_Null ) goto Done; rc = Err_Null; Done: #ifdef SYSDEB SysDebug(ioc)("Protect: %E",rc); if( mcb->MsgHdr.Reply != NullPort ) SysDebug(error)("Protect: Non-Null Reply port %x",mcb->MsgHdr.Reply); #endif if( mcb->MsgHdr.Reply != NullPort ) FreePort(mcb->MsgHdr.Reply); FreeMsgBuf(mcb); object->Result2 = rc; return rc; }
//=====================>>> vColorButtonCmd::initColor <<<======================= void vColorButtonCmd::initColor(void) { // wCmd is the widget of this button SysDebug(Constructor,"vColorButtonCmd::vColorButtonCmd() constructor\n") _origColor = 0; if (_itemList != 0) // an RGB provided { _origColor = (vColor*)_itemList; // point to the rgb _color = *_origColor; } }
//====================>>> vCmdWindow::vCmdWindow <<<======================= vCmdWindow::vCmdWindow(VCONST char *name, int width, int height ) : vWindow(name, width, height, CMDWINDOW) { // make widgets null SysDebug(Constructor,"vCmdWindow::vCmdWindow() constructor\n") destroyed = 0; // we haven't been destroyed NextCmdWin = CmdWins; // link in to list of cmdwindows CmdWins = this; // put on front of the list ++_numCmdWindows; // bump how many windows up }
//=====================>>> vTextInCmd::initialize <<<======================= void vTextInCmd::initialize(void) { // build a TextIn command for use in a parent window SysDebug(Constructor,"vTextInCmd::vTextInCmd() constructor\n") _msg[0] = 0; // no string yet CopyToLocal(); // Make local copies of CmdObject int defLen = strlen(_title); // length of supplied string if (defLen < 130) strcpy(_msg,_title); int defWidth = (dlgCmd->attrs & CA_Large) ? 35 : 20; if (dlgCmd->attrs & CA_Small) // allow small, too. defWidth = 10; if (dlgCmd->size > 0) // V:1.13 defWidth = dlgCmd->size; if (defLen > defWidth) // Some work space defWidth = defLen + 6; long style = ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP; // V 1.18 BEW if (dlgCmd->attrs & CA_Password) style |= ES_PASSWORD; if (!(dlgCmd->attrs & CA_NoBorder)) style |= WS_BORDER; if (!(dlgCmd->attrs & CA_Hidden)) // Check for Hidden style |= WS_VISIBLE; _w = defWidth * 4 + 6; _h = 14; // default height _parentWin->SetPosition(_x, _y, _w, _h, dlgCmd->cFrame, dlgCmd->cRightOf, dlgCmd->cBelow); _CtrlOffset = _parentWin->AddDlgControl(_x, _y , _w, _h, _cmdId, style, "EDIT", _title, sizeof(vTextInCmd*), (LPBYTE)this); }
//=================>>> vComboBoxCmd::vComboBoxCmd <<<======================= vComboBoxCmd::vComboBoxCmd(vCmdParent* dp, CommandObject* dc) : vCmd(dp, dc) { SysDebug(Constructor,"vComboBoxCmd::vComboBoxCmd() constructor\n") CopyToLocal(); // Make local copies of CmdObject // First, setup the list _maxWidth = 10; SetupComboList(); _maxWidth = (dlgCmd->attrs & CA_Large) ? (_maxWidth * 3)/2 : _maxWidth; long style = (_parentWin->_dialogType != aCmdBar) ? WS_TABSTOP | WS_GROUP : WS_GROUP; if (!(dlgCmd->attrs & CA_Hidden)) // Check for Hidden style |= WS_VISIBLE; style |= CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL; _w = _maxWidth*4+10; // set my width _h = 14; // 14 is std height for combo without list _parentWin->SetPosition(_x, _y, _w, _h, dlgCmd->cFrame, dlgCmd->cRightOf, dlgCmd->cBelow); _CtrlOffset = _parentWin->AddDlgControl(_x, _y, _w, _h, _cmdId, style, "COMBOBOX", _title, sizeof(vCmd*), (LPBYTE)this); }
//============================>>> vCmdWindow::CloseWin <<<=================== void vCmdWindow::CloseWin(void) { // close button class callback vCmdWindow* cw_list; SysDebug(Build,"vCmdWindow::CloseWin()\n"); --_numCmdWindows; // windows down by one // Remove from active list if (CmdWins == this) // first one on list { CmdWins = CmdWins->NextCmdWin; // point to next } else { for (cw_list = CmdWins ; cw_list != 0 ; cw_list = cw_list->NextCmdWin) { if (cw_list->NextCmdWin == this) { // remove from list cw_list->NextCmdWin = (cw_list->NextCmdWin)->NextCmdWin; break; } } } vWindow::CloseWin(); // Close Stuff in parent if (CmdWins == 0) // last one? { theApp->selectCmdPanes(0); // turn off all command panes // following added 25Aug99 after input from [email protected] // to force menu bar to be correctly updated. ::DrawMenuBar(theApp->winHwnd()); theApp->CloseLastCmdWindow(this,0); } }
_h = 14; // 14 is std height for combo without list _parentWin->SetPosition(_x, _y, _w, _h, dlgCmd->cFrame, dlgCmd->cRightOf, dlgCmd->cBelow); _CtrlOffset = _parentWin->AddDlgControl(_x, _y, _w, _h, _cmdId, style, "COMBOBOX", _title, sizeof(vCmd*), (LPBYTE)this); } //=======================>>> vComboBoxCmd::~vComboBoxCmd <<<======================= vComboBoxCmd::~vComboBoxCmd() { SysDebug(Constructor,"vComboBoxCmd::~vComboBoxCmd() Constructor\n") } //==================>>> vComboBoxCmd::GetCmdValue <<<========================= int vComboBoxCmd::GetCmdValue(ItemVal id) VCONST { if (id != _cmdId) return -1; return _curSelection; } //=====================>>> vComboBoxCmd::SetCmdVal <<<========================= void vComboBoxCmd::SetCmdVal(ItemVal val, ItemSetType st) {
// === CODE === void *PE_Relocate(void *Base, char **envp, const char *Filename) { tPE_DOS_HEADER *dosHdr = Base; tPE_IMAGE_HEADERS *peHeaders; tPE_DATA_DIR *directory; tPE_IMPORT_DIR *impDir; tPE_HINT_NAME *name; Uint32 *importTab, *aIAT; int i, j; intptr_t iBase = (intptr_t)Base; void *pLibBase; DEBUGS("PE_Relocate: (Base=0x%x)\n", Base); peHeaders = Base + dosHdr->PeHdrOffs; directory = peHeaders->OptHeader.Directory; // === Load Import Tables impDir = Base + directory[PE_DIR_IMPORT].RVA; for( i = 0; impDir[i].DLLName != NULL; i++ ) { impDir[i].DLLName += iBase; impDir[i].ImportLookupTable += iBase/4; impDir[i].ImportAddressTable += iBase/4; DEBUGS(" PE_Relocate: DLL Required '%s'(0x%x)\n", impDir[i].DLLName, impDir[i].DLLName); pLibBase = LoadLibrary(PE_int_GetTrueFile(impDir[i].DLLName), DLL_BASE_PATH, envp); if(pLibBase == 0) { SysDebug("Unable to load required library '%s'\n", impDir[i].DLLName); return 0; } DEBUGS(" PE_Relocate: Loaded as 0x%x\n", pLibBase); importTab = impDir[i].ImportLookupTable; aIAT = impDir[i].ImportAddressTable; for( j = 0; importTab[j] != 0; j++ ) { if( importTab[j] & 0x80000000 ) DEBUGS(" PE_Relocate: Import Ordinal %i\n", importTab[j] & 0x7FFFFFFF); else { void *symPtr = 0; name = (void*)( iBase + importTab[j] ); DEBUGS(" PE_Relocate: Import Name '%s', Hint 0x%x\n", name->Name, name->Hint); if( GetSymbolFromBase(pLibBase, name->Name, symPtr, NULL) == 0 ) { SysDebug("Unable to find symbol '%s' in library '%s'\n", name->Name, impDir[i].DLLName); return 0; } aIAT[j] = (intptr_t)symPtr; } } } #if DEBUG for(i=0;i<PE_DIR_LAST;i++) { if(directory[i].RVA == 0) continue; SysDebug("directory[%i] = {RVA=0x%x,Size=0x%x}\n", i, directory[i].RVA, directory[i].Size); } #endif DEBUGS("PE_Relocate: RETURN 0x%x\n", iBase + peHeaders->OptHeader.EntryPoint); return (void*)( iBase + peHeaders->OptHeader.EntryPoint ); }
#define TextInFont SysVariableFont // The font to use //=====================>>> vTextInCmd::vTextInCmd <<<======================= vTextInCmd::vTextInCmd(vCmdParent* dp, CommandObject* co) : vCmd(dp, co) { initialize(); } //=====================>>> vTextInCmd::~vTextInCmd <<<======================= vTextInCmd::~vTextInCmd() { SysDebug(Destructor,"vTextInCmd::~vTextInCmd() destructor\n") } //=====================>>> vTextInCmd::initialize <<<======================= void vTextInCmd::initialize(void) { // build a TextIn command for use in a parent window SysDebug(Constructor,"vTextInCmd::vTextInCmd() constructor\n") _msg[0] = 0; // no string yet CopyToLocal(); // Make local copies of CmdObject int defLen = strlen(_title); // length of supplied string
#include <v/vwin32.h> // for Win 32 stuff #include <v/vcbtncmd.h> // our definitions #include <v/vcmdprnt.h> // a command parent //=================>>> vColorButtonCmd::vColorButtonCmd <<<===================== vColorButtonCmd::vColorButtonCmd(vCmdParent* dp, CommandObject* dc) : vButtonCmd(dp, dc) { initColor(); } //====================>>> vColorButtonCmd::~vColorButtonCmd <<<================= vColorButtonCmd::~vColorButtonCmd() { SysDebug(Destructor,"vColorButtonCmd::~vColorButtonCmd() destructor\n") } //=====================>>> vColorButtonCmd::initColor <<<======================= void vColorButtonCmd::initColor(void) { // wCmd is the widget of this button SysDebug(Constructor,"vColorButtonCmd::vColorButtonCmd() constructor\n") _origColor = 0; if (_itemList != 0) // an RGB provided { _origColor = (vColor*)_itemList; // point to the rgb _color = *_origColor; }
#include <v/vapp.h> #include <v/vutil.h> //=================>>> vProgressCmd::vProgressCmd <<<======================= vProgressCmd::vProgressCmd(vCmdParent* dp, CommandObject* dc) : vCmd(dp, dc) { initialize(); // and initialize } //=======================>>> vProgressCmd::~vProgressCmd <<<=================== vProgressCmd::~vProgressCmd() { SysDebug(Constructor,"vProgressCmd::~vProgressCmd() Destructor\n") } //=====================>>> vProgressCmd::initialize <<<======================= void vProgressCmd::initialize() { SysDebug(Constructor,"vProgressCmd::vProgressCmd() constructor\n") CopyToLocal(); long style; style = WS_GROUP; // Make local copies of CmdObject
PUBLIC Stream * Open( Object * object, string name, word mode ) { word rc = Err_Null; Stream *stream = NULL; MCB *mcb; IOCReply1 *rep; word stlen; Port reply; #ifdef SYSDEB SysDebug(ioc)("Open(%O,%N,%x)",object,name,mode); #endif if( CheckObject(object,C_Locate) != Err_Null ) return Null(Stream); reply = NewPort(); mcb = NewMsgBuf(0); rep = (IOCReply1 *)mcb->Control; InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP|FG_Open|object->FnMod); MarshalCommon(mcb,object,name); MarshalWord(mcb,mode); if( (rc = IOCMsg(mcb,NULL)) < Err_Null ) goto Done; stlen = sizeof(Stream) + (word)strlen(mcb->Data+rep->Pathname) + SafetyMargin; stream = (Stream *)Malloc(stlen); if( stream == NULL ) { rc = EC_Error|SS_SysLib|EG_NoMemory|EO_Stream; goto Done; } else memclr( (void *)stream, (int)stlen ); if( SetupStream( stream, mcb ) ) { stream->Flags |= mode&Flags_SaveMode; InitSemaphore( &stream->Mutex, 1 ); stream->Pos = 0; } AddStream( stream ); rc = Err_Null; if( mode & Flags_Append ) Seek(stream, S_End, 0); Done: #ifdef SYSDEB SysDebug(ioc)("Open: %E stream: %S",rc,stream); #endif FreeMsgBuf(mcb); if( rc < Err_Null ) FreePort(reply); object->Result2 = rc; return stream; }
// make widgets null SysDebug(Constructor,"vCmdWindow::vCmdWindow() constructor\n") destroyed = 0; // we haven't been destroyed NextCmdWin = CmdWins; // link in to list of cmdwindows CmdWins = this; // put on front of the list ++_numCmdWindows; // bump how many windows up } //====================>>> vCmdWindow::~vCmdWindow <<<======================= vCmdWindow::~vCmdWindow() // destructor { SysDebug(Destructor,"vCmdWindow::~vCmdWindow() destructor\n") } //============================>>> vCmdWindow::CloseWin <<<=================== void vCmdWindow::CloseWin(void) { // close button class callback vCmdWindow* cw_list; SysDebug(Build,"vCmdWindow::CloseWin()\n"); --_numCmdWindows; // windows down by one // Remove from active list if (CmdWins == this) // first one on list
PUBLIC Object * Create( Object * object, string name, word type, word size, byte * data ) { word rc = Err_Null; Object *obj = Null(Object); MCB *mcb; IOCReply1 *rep; word oblen; Port reply; #ifdef SYSDEB SysDebug(ioc)("Create(%O,%N,%T,%d,%P)",object,name,type,size,data); #endif if ( CheckObject(object,C_Locate) != Err_Null ) { return NULL; } reply = NewPort(); mcb = NewMsgBuf(0); rep = (IOCReply1 *)mcb->Control; InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP|FG_Create|object->FnMod); MarshalCommon(mcb,object,name); MarshalWord(mcb,type); MarshalWord(mcb,size); MarshalOffset(mcb); MarshalData(mcb,size,data); mcb->Timeout = object->Timeout; /* IOdebug( "Create: sending message" ); */ if ( (rc = IOCMsg(mcb, NULL)) < Err_Null ) { /* IOdebug( "Create: message send failed" ); */ goto Done; } /* IOdebug( "Create: message sent" ); */ oblen = sizeof(Object) + (word)strlen(mcb->Data+rep->Pathname) + SafetyMargin; obj = (Object *)Malloc(oblen); if ( obj == NULL ) { rc = EC_Error|SS_SysLib|EG_NoMemory|EO_Object; goto Done; } else memclr( (void *)obj, (int)oblen ); obj->Type = rep->Type; obj->Flags = rep->Flags; obj->Access = rep->Access; obj->Reply = reply; obj->FnMod = rc & SS_Mask; obj->Timeout = IOCTimeout; strcpy(obj->Name,mcb->Data+rep->Pathname); AddObject( obj ); rc = Err_Null; Done: #ifdef SYSDEB SysDebug(ioc)("Create: %E object: %O",rc,obj); if( mcb->MsgHdr.Reply != NullPort ) SysDebug(error)("Create: Non-Null Reply port %x",mcb->MsgHdr.Reply); #endif if( mcb->MsgHdr.Reply != NullPort ) FreePort(mcb->MsgHdr.Reply); FreeMsgBuf(mcb); if( rc < Err_Null ) FreePort(reply); object->Result2 = rc; return obj; }
PUBLIC Object * Locate( Object * object, STRING name ) { word rc = Err_Null; Object *obj = Null(Object); MCB *mcb; IOCReply1 *rep; word oblen; Port reply; word fnmod = 0; #ifdef SYSDEB SysDebug(ioc)("Locate(%O,%N)",object,name); #endif /* Locate can be called with a null object pointer */ if( object != NULL ) { if( CheckObject(object,C_Locate) != Err_Null ) { return NULL; } fnmod = object->FnMod; } reply = NewPort(); mcb = NewMsgBuf(0); rep = (IOCReply1 *)mcb->Control; InitMCB(mcb,MsgHdr_Flags_preserve, MyTask->IOCPort,reply,FC_GSP|FG_Locate|fnmod); MarshalCommon(mcb,object,name); if( (rc = IOCMsg(mcb,NULL)) < Err_Null ) { goto Done; } oblen = sizeof(Object) + (word)strlen(mcb->Data+rep->Pathname) + SafetyMargin; obj = (Object *)Malloc(oblen); if( obj == NULL ) { rc = EC_Error|SS_SysLib|EG_NoMemory|EO_Object; goto Done; } else memclr( (void *)obj, (int)oblen ); obj->Type = rep->Type; obj->Flags = rep->Flags; obj->Access = rep->Access; obj->Reply = reply; obj->FnMod = rc & SS_Mask; obj->Timeout = IOCTimeout; strcpy(obj->Name,mcb->Data+rep->Pathname); AddObject( obj ); rc = Err_Null; Done: #ifdef SYSDEB SysDebug(ioc)("Locate: %E object: %O",rc,obj); if( mcb->MsgHdr.Reply != NullPort ) SysDebug(error)("Locate: Non-Null Reply port %x",mcb->MsgHdr.Reply); #endif if( mcb->MsgHdr.Reply != NullPort ) FreePort(mcb->MsgHdr.Reply); FreeMsgBuf(mcb); if( object != Null(Object) ) object->Result2 = rc; if( rc < Err_Null ) FreePort(reply); return obj; }