HIDEvent+HIDEventFields.m   [plain text]



// HIDEvent+HIDEventDesc.m
// HID


#import "HIDEvent+HIDEventFields.h"

#import "HIDEventFieldsPrivate.h"
#import <AssertMacros.h>

NS_ASSUME_NONNULL_BEGIN

#define IS_VALID_EVENT_FIELD(info) (info.field == 0 && info.fieldType == kEventFieldDataType_None && info.name == NULL) ? 0 : 1

@implementation HIDEvent (HIDEventDesc)

-(void) enumerateFieldsWithBlock:(HIDEventFieldInfoBlock) block
{
    HIDEventFieldInfo *info = nil;
    NSInteger index = 0;
    require(block, exit);
    
    info = [self getEventFields];
    require(info, exit);
    
    while(IS_VALID_EVENT_FIELD(info[index])) {
        block(&info[index]);
        index++;
    }
exit:
    return;
}
-(HIDEventFieldInfo* __nullable) getEventFields
{
    HIDEventFieldInfo *info = NULL;
    NSInteger index = 0;
    while (!info && hidEventFieldDescTable[index].type != kIOHIDEventTypeCount) {
        
        if (hidEventFieldDescTable[index].type != self.type) {
            index++;
            continue;
        }
        
        if (!hidEventFieldDescTable[index].selectors) {
            info = hidEventFieldDescTable[index].eventFieldDescTable;
        } else {
            
            NSInteger selectorIndex = 0;
            while (!info && hidEventFieldDescTable[index].selectors[selectorIndex].selectorTables != NULL) {
                
                
                NSInteger selectorValueIndex = 0;
                NSInteger selectorValue =  [self integerValueForField:hidEventFieldDescTable[index].selectors[selectorIndex].value];
                
                while(!info && hidEventFieldDescTable[index].selectors[selectorIndex].selectorTables[selectorValueIndex].eventFieldDescTable
                      != NULL) {
                    
                    if (hidEventFieldDescTable[index].selectors[selectorIndex].selectorTables[selectorValueIndex].value != selectorValue) {
                        selectorValueIndex++;
                        continue;
                    }
                    
                    info = hidEventFieldDescTable[index].selectors[selectorIndex].selectorTables[selectorValueIndex].eventFieldDescTable;
                    selectorValueIndex++;
                }
                
                selectorIndex++;
            }
            
        }
        
        index++;
    }
    
    return info;
}

@end

NS_ASSUME_NONNULL_END