I am working on a project that uses ffi to interact with a compiled C library. I am trying to get some complex data structures to work and am having problems figuring out the proper way to get values inside these data structures. I have two instances I'm trying to figure out. I am not a C guy so I'm winging it on that end.
Instance 1
There is a C struct that contains properties that are, what look like pointers to character arrays. Here's the C-code that defines the struct:
#define RPC_STRING_LENGTH           32
#define RPC_STRING_LENGTH_CALLID    128
typedef struct {
    E_CALL_STATE eCallState;
    BOOL bInboundCall;
    BOOL bVideoCall;
    BOOL bRecording;
    BOOL bEncrypted;
    BOOL bHDAudio;
    BOOL bVirtualMeetingCall;
    E_PROTOCOL_CODEC eCurrentCodec;
    E_PROTOCOL_ALERT_INFO_CALL_TYPE eAlertInfoType;
    double dAccumulatedMOSLQ;
    int  nVideoState;
    int  nErrorCode;
    unsigned int nCallStartTime;
    char cPhoneNumber[RPC_STRING_LENGTH];
    char cName[RPC_STRING_LENGTH];
    char cCallId[RPC_STRING_LENGTH_CALLID];
    char cPreviousCallId[RPC_STRING_LENGTH_CALLID];
} RPC_CALL_STATE;
Now, I've been able to successfully extract the E_CALL_STATE value and the BOOL properties but I'm having difficulty getting the strings stores in cPhoneNumber, cName, cCallId, and cPreviousCallId. Here's how I have the it setup using ref-struct:
import ref from 'ref';
import StructType from 'ref-struct';
const RPC_CALL_STATE = StructType({
    eCallState: ref.types.int,
    bInboundCall: ref.types.bool,
    bVideoCall: ref.types.bool,
    bRecording: ref.types.bool,
    bEncrypted: ref.types.bool,
    bHDAudio: ref.types.bool,
    bVirtualMeetingCall: ref.types.bool,
    dAccumulatedMOSLQ: ref.types.double,
    nVideoState: ref.types.int,
    nErrorCode: ref.types.int,
    nCallStartTime: ref.types.uint,
    cPhoneNumber: ref.types.char,
    cName: ref.types.char,
    cCallId: ref.types.char,
    cPreviousCallId: ref.types.char,
});
Here's the Javascript that interprets this struct (for reference, RPC_CALL_STATE is an externally defined enum):
pDataRef = ref.reinterpret(pData, RPC_CALL_STATE.size);
pDataRef.type = RPC_CALL_STATE;
const callProgressStruct = ref.get(pDataRef);
If I look at the value stored on callProgressStruct.cPhoneNumber, I get 0. So, a few questions:
- What is the correct ref.typesto use here?- Is charcorrect?
- If not, what should this be?
 
- Is 
- How do I extract the actual string value stored in cPhoneNumber?
- Is there a way to use ref-arrayhere?
Instance 2
I have a C struct that is defined as such:
typedef struct AUDIO_OS_DEVICES {
    int nNumberDevices;
    AUDIO_OS_DEVICE *pDevices;
} AUDIO_OS_DEVICES;
In this code, *pDevices ends up being an array of AUDIO_OS_DEVICE structs. Those structs are defined in C as:
typedef struct AUDIO_OS_DEVICE {
    int deviceId;
    int deviceFlags;
    char deviceName[AUDIO_OS_DEVICE_NAME_MAX_LEN];
    char deviceUID[AUDIO_OS_DEVICE_UID_MAX_LEN];
    char manufacturerName[AUDIO_OS_DEVICE_MANUFACTURER_MAX_LEN];
} AUDIO_OS_DEVICE;
In Javascript I have this setup using ref-struct:
const AUDIO_OS_DEVICE = StructType({
  deviceId: ref.types.int,
  deviceFlags: ref.types.int,
  deviceName: ref.types.char,
  deviceUID: ref.types.char,
  manufacturerName: ref.types.char,
});
const AUDIO_OS_DEVICES = StructType({
    nNumberDevices: ref.types.int,
    pDevices: [???],
});
I have no idea what type to cast pDevices to here nor do I know how to extract the array of AUDIO_OS_DEVICE structs. I am also hitting the issue already described with character arrays.
Any help would be appreciated. I'm at a dead-end until I can figure this out.
 
    