IOFireWireLibUnitDirectory.cpp [plain text]
#import "IOFireWireLibUnitDirectory.h"
#import <CoreFoundation/CoreFoundation.h>
namespace IOFireWireLib {
LocalUnitDirectory::Interface LocalUnitDirectory::sInterface =
{
INTERFACEIMP_INTERFACE,
1, 0, & LocalUnitDirectory::SAddEntry_Ptr,
& LocalUnitDirectory::SAddEntry_UInt32,
& LocalUnitDirectory::SAddEntry_FWAddress,
& LocalUnitDirectory::SPublish,
& LocalUnitDirectory::SUnpublish
} ;
LocalUnitDirectory::LocalUnitDirectory( Device& userclient )
: IOFireWireIUnknown( reinterpret_cast<IUnknownVTbl*>(& sInterface) ),
mUserClient(userclient),
mPublished(false)
{
IOConnectMethodScalarIScalarO( mUserClient.GetUserClientConnection(), kUnitDirCreate,
0, 1, & mKernUnitDirRef ) ;
}
LocalUnitDirectory::~LocalUnitDirectory()
{
if (mPublished)
Unpublish() ;
}
LocalUnitDirectory::Interface**
LocalUnitDirectory::Alloc( Device& userclient )
{
LocalUnitDirectory* me = new LocalUnitDirectory( userclient ) ;
if( !me )
return nil ;
return reinterpret_cast<Interface**>(&me->GetInterface()) ;
}
HRESULT STDMETHODCALLTYPE
LocalUnitDirectory::QueryInterface(REFIID iid, LPVOID* ppv)
{
HRESULT result = S_OK ;
*ppv = nil ;
CFUUIDRef interfaceID = CFUUIDCreateFromUUIDBytes(kCFAllocatorDefault, iid) ;
if (CFEqual(interfaceID, IUnknownUUID) || CFEqual(interfaceID, kIOFireWireLocalUnitDirectoryInterfaceID) )
{
*ppv = & GetInterface() ;
AddRef() ;
}
else
{
*ppv = nil ;
result = E_NOINTERFACE ;
}
CFRelease(interfaceID) ;
return result ;
}
IOReturn
LocalUnitDirectory::AddEntry( int key, void* inBuffer, size_t inLen, CFStringRef )
{
if (inLen > 0xC00)
{
IOFireWireLibLog_(("LocalUnitDirectory::AddEntry: entry too large\n")) ;
return kIOReturnBadArgument ;
}
return IOConnectMethodScalarIStructureI( mUserClient.GetUserClientConnection(), kUnitDirAddEntry_Buffer, 2,
inLen, mKernUnitDirRef, key, inBuffer ) ;
}
IOReturn
LocalUnitDirectory::AddEntry(
int key,
UInt32 value,
CFStringRef ) {
IOReturn err = IOConnectMethodScalarIScalarO( mUserClient.GetUserClientConnection(), kUnitDirAddEntry_UInt32, 3, 0, mKernUnitDirRef, key, value ) ;
IOFireWireLibLogIfErr_(err, "LocalUnitDirectory::AddEntry[UInt32](): result = 0x%08x\n", err) ;
return err ;
}
IOReturn
LocalUnitDirectory::AddEntry(
int key,
const FWAddress & value,
CFStringRef ) {
return IOConnectMethodScalarIStructureI( mUserClient.GetUserClientConnection(), kUnitDirAddEntry_FWAddr,
2, sizeof(value), mKernUnitDirRef, key, & value ) ;
}
IOReturn
LocalUnitDirectory::Publish()
{
if (mPublished)
return kIOReturnSuccess ;
IOReturn err = IOConnectMethodScalarIScalarO( mUserClient.GetUserClientConnection(), kUnitDirPublish, 1, 0, mKernUnitDirRef ) ;
mPublished = ( kIOReturnSuccess == err ) ;
return err ;
}
IOReturn
LocalUnitDirectory::Unpublish()
{
if (!mPublished)
return kIOReturnSuccess ;
IOReturn err = IOConnectMethodScalarIScalarO( mUserClient.GetUserClientConnection(), kUnitDirUnpublish, 1, 0, mKernUnitDirRef) ;
if ( kIOReturnSuccess == err )
mPublished = false ;
return err ;
}
IOReturn
LocalUnitDirectory::SAddEntry_Ptr(
DirRef self,
int key,
void* inBuffer,
size_t inLen,
CFStringRef inDesc)
{
return IOFireWireIUnknown::InterfaceMap<LocalUnitDirectory>::GetThis(self)->AddEntry(key, inBuffer, inLen, inDesc);
}
IOReturn
LocalUnitDirectory::SAddEntry_UInt32(
DirRef self,
int key,
UInt32 value,
CFStringRef inDesc)
{
return IOFireWireIUnknown::InterfaceMap<LocalUnitDirectory>::GetThis(self)->AddEntry(key, value, inDesc);
}
IOReturn
LocalUnitDirectory::SAddEntry_FWAddress(
DirRef self,
int key,
const FWAddress* inAddr,
CFStringRef inDesc)
{
return IOFireWireIUnknown::InterfaceMap<LocalUnitDirectory>::GetThis(self)->AddEntry(key, *inAddr, inDesc);
}
IOReturn
LocalUnitDirectory::SPublish(
DirRef self)
{
return IOFireWireIUnknown::InterfaceMap<LocalUnitDirectory>::GetThis(self)->Publish();
}
IOReturn
LocalUnitDirectory::SUnpublish(
DirRef self)
{
return IOFireWireIUnknown::InterfaceMap<LocalUnitDirectory>::GetThis(self)->Unpublish();
}
}