(C) 1998 AROS - The Amiga Research OS


NAME

()

SYNOPSIS

FUNCTION

INPUTS
RESULT

EXAMPLE
SEE ALSO

NOTES

BUGS

INTERNALS

HISTORY
** Unimplemented methods *//* switch(msg->MethodID) { case OM_NEW: retval = DoSuperMethodA(cl, o, msg); if(!retval) break; hd = INST_DATA(cl, retval); if( hd != NULL) { struct TagItem *list = ((struct opSet *)msg)->ops_AttrList; hd->hd_Type = GetTagData(aHidd_Type, 0, list); hd->hd_SubType = GetTagData(aHidd_SubType, 0, list); hd->hd_Producer = GetTagData(aHidd_Producer, 0, list); hd->hd_Name = (STRPTR)GetTagData(aHidd_Name, (IPTR)unknown, list); hd->hd_HWName = (STRPTR)GetTagData(aHidd_HardwareName, (IPTR)unknown, list); hd->hd_Active = TRUE; hd->hd_Status = GetTagData(aHidd_Status, HIDDV_StatusUnknown, list); hd->hd_ErrorCode = GetTagData(aHidd_ErrorCode, 0, list); hd->hd_Locking = GetTagData(aHidd_Locking, HIDDV_LockShared, list); } case OM_SET: { struct TagItem *tstate = ((struct opSet *)msg)->ops_AttrList; struct TagItem *tag; while((tag = NextTagItem(&tstate))) { switch(tag->ti_Tag) { case aHidd_Active: hd->hd_Active = tag->ti_Data; break; } } break; } case OM_GET: { switch(((struct opGet *)msg)->opg_AttrID) { case aHidd_Type: *((struct opGet *)msg)->opg_Storage = hd->hd_Type; break; case aHidd_SubType: *((struct opGet *)msg)->opg_Storage = hd->hd_SubType; break; case aHidd_Producer: *((struct opGet *)msg)->opg_Storage = hd->hd_Producer; break; case aHidd_Name: *((struct opGet *)msg)->opg_Storage = (IPTR)hd->hd_Name; break; case aHidd_HardwareName: *((struct opGet *)msg)->opg_Storage = (IPTR)hd->hd_HWName; break; case aHidd_Active: *((struct opGet *)msg)->opg_Storage = hd->hd_Active; break; case aHidd_Status: *((struct opGet *)msg)->opg_Storage = hd->hd_Status; break; case aHidd_ErrorCode: *((struct opGet *)msg)->opg_Storage = hd->hd_ErrorCode; break; case aHidd_Locking: *((struct opGet *)msg)->opg_Storage = hd->hd_Locking; break; } }*/ /* These are the "hiddclass" methods. */ /* These two are invalid, since we don't have anything to get from a class, so the superclass should handle these. This is especially the case since the only place that we can get the information for these methods is from an object, but we don't have any objects if this method is called. *//* case HIDDM_Meta_Get: case HIDDM_Meta_MGet: retval = 0; break;*/ /* Yet to determine the semantics of these so we just let them return 0 for now. *//* case HIDDM_BeginIO: case HIDDM_AbortIO: retval = 0; break; case HIDDM_LoadConfigPlugin: case HIDDM_Lock: case HIDDM_Unlock: retval = NULL; break; case HIDDM_AddHIDD: { Class *hc = ((hmAdd *)msg)->hma_Class; if( (hc->cl_Flags & CLF_INLIST) == 0 ) { ObtainSemaphore(&((struct HCD *)cl->cl_UserData)->listLock); AddTail( (struct List *)&((struct HCD *)cl->cl_UserData)->hiddList, (struct Node *)hc ); ReleaseSemaphore(&((struct HCD *)cl->cl_UserData)->listLock); hc->cl_Flags |= CLF_INLIST; retval = TRUE; } break; } case HIDDM_RemoveHIDD: { struct IClass *hc = ((hmAdd *)msg)->hma_Class; if( hc->cl_Flags & CLF_INLIST ) { ObtainSemaphore(&((struct HCD *)cl->cl_UserData)->listLock); Remove((struct Node *)hc); ReleaseSemaphore(&((struct HCD *)cl->cl_UserData)->listLock); hc->cl_Flags &= ~CLF_INLIST; } } case OM_DISPOSE: default: retval = DoSuperMethodA(cl, o, msg); } return retval;}*/#endif/*************************** Classes *****************************/#undef SysBase#undef UtilityBase#undef OOPBase#define SysBase (lh->hd_SysBase)#define UtilityBase (csd->UtilityBase)#define OOPBase (csd->OOPBase)#define NUM_ROOT_METHODS 3#define NUM_HIDD_METHODS 0ULONG init_hiddclass(struct IntHIDDClassBase *lh){ Class *cl = NULL; struct class_static_data *csd; ULONG alert = AT_DeadEnd | AN_Unknown | AO_Unknown; ULONG ok = 0; struct MethodDescr root_mdescr[NUM_ROOT_METHODS + 1] = { { (IPTR (*)())hidd_new, moRoot_New }, { (IPTR (*)())hidd_set, moRoot_Set }, { (IPTR (*)())hidd_get, moRoot_Get }, { NULL, 0UL } }; struct MethodDescr hidd_mdescr[NUM_HIDD_METHODS + 1] = { { NULL, 0UL } }; struct InterfaceDescr ifdescr[] = { {root_mdescr, IID_Root, NUM_ROOT_METHODS}, {hidd_mdescr, IID_Hidd, NUM_HIDD_METHODS}, {NULL, NULL, 0UL} }; /* We map the memory into the shared memory space, because it is to be accessed by many processes, eg searching for a HIDD etc. Well, maybe once we've got MP this might help...:-) */ EnterFunc(bug("HIDD::Init()\n")); /* If you are not running from ROM, don't use Alert() */ alert = AT_DeadEnd | AG_NoMemory | AN_Unknown; csd = lh->hd_csd = AllocMem(sizeof(struct class_static_data), MEMF_CLEAR|MEMF_PUBLIC); if(csd) { D(bug("Got CSD\n")); NEWLIST(&csd->hiddList); InitSemaphore(&csd->listLock); csd->sysBase = SysBase; alert = AT_DeadEnd | AG_OpenLib | AN_Unknown | AO_Unknown; OOPBase = OpenLibrary(AROSOOP_NAME, 0); if(OOPBase) { D(bug("Got OOPBase\n")); UtilityBase = OpenLibrary("utility.library", 0); if(UtilityBase) { /* Create the class structure for the "hiddclass" */ AttrBase MetaAttrBase = GetAttrBase(IID_Meta); struct TagItem tags[] = { {aMeta_SuperID, (IPTR)CLID_Root}, {aMeta_InterfaceDescr, (IPTR)ifdescr}, {aMeta_ID, (IPTR)CLID_Hidd}, {aMeta_InstSize, (IPTR)sizeof (struct HIDDData) }, {TAG_DONE, 0UL} }; D(bug("Got UtilityBase\n")); alert = AT_DeadEnd | AN_Unknown | AO_Unknown; cl = csd->hiddclass = NewObject(NULL, CLID_HiddMeta, tags); if(cl) { D(bug("Class created\n")); cl->UserData = csd; HiddAttrBase = ObtainAttrBase(IID_Hidd); if(HiddAttrBase) { D(bug("Got HiddAttrBase\n")); AddClass(cl); ok = 1; } /* if(HiddAttrBase) */ } /* if(cl) */ } /* if(UtilityBase) */ } /* if(OOPBase) */ } if(ok == 0) { free_hiddclass(lh); lh->hd_csd = NULL; /* If you are not running from ROM, don't use Alert() */ Alert(alert); } ReturnInt("HIDD::Init", ULONG, ok);}VOID free_hiddclass(struct IntHIDDClassBase *lh){ struct class_static_data *csd = lh->hd_csd; EnterFunc(bug("HIDD::Free()\n")); if(csd) { if(csd->hiddclass) { RemoveClass(csd->hiddclass); if(HiddAttrBase) { ReleaseAttrBase(IID_Hidd); HiddAttrBase = 0; } DisposeObject((Object *) csd->hiddclass); } if(OOPBase) CloseLibrary(OOPBase); if(UtilityBase) CloseLibrary(UtilityBase); FreeMem(csd, sizeof(struct class_static_data)); lh->hd_csd = NULL; } ReturnVoid("HIDD::Free");}