Hi folks, in one of our projects, we have the following .vapi (see attachement). There's a callback that sends us messages via void callback( int event, Message message ) We then have to cast to the actual type like that: switch ( event ) { case Msmcomm.ResponseType.GET_IMEI: unowned Msmcomm.Reply.GetImei msg = (Msmcomm.Reply.GetImei) message; details = @"IMEI = $(msg.getImei())"; break; case Msmcomm.ResponseType.GET_FIRMWARE_INFO: // We want something like: var msg = message.safeCast<Msmcomm.Reply.GetImei>( message ); unowned Msmcomm.Reply.GetFirmwareInfo msg = (Msmcomm.Reply.GetFirmwareInfo) message; details = @"FIRMWARE = $(msg.getInfo())"; break; case Msmcomm.ResponseType.CM_CALL: unowned Msmcomm.Reply.Call msg = (Msmcomm.Reply.Call) message; details = @"refId = $(msg.getRefId()) cmd = $(msg.getCmd()) err = $(msg.getErrorCode())"; break; ... If I compile this code, it errors out with: /local/pkg/fso/msmcomm/msmvterm/src/terminal.c:870: undefined reference to `MSMCOMM_REPLY_GET_FIRMWARE_INFO' /local/pkg/fso/msmcomm/msmvterm/src/terminal.c:860: undefined reference to `MSMCOMM_REPLY_GET_IMEI' /local/pkg/fso/msmcomm/msmvterm/src/terminal.c:882: undefined reference to `MSMCOMM_REPLY_CALL' /local/pkg/fso/msmcomm/msmvterm/src/terminal.c:895: undefined reference to `MSMCOMM_REPLY_CHARGER_STATUS' src/commands.o: In function `commands_end_call': /local/pkg/fso/msmcomm/msmvterm/src/commands.c:772: undefined reference to `msmcomm_message_unref' src/commands.o: In function `commands_answer_call': /local/pkg/fso/msmcomm/msmvterm/src/commands.c:762: undefined reference to `msmcomm_message_unref' src/commands.o: In function `commands_get_charger_status': /local/pkg/fso/msmcomm/msmvterm/src/commands.c:675: undefined reference to `msmcomm_message_unref' src/commands.o: In function `commands_test_alive': /local/pkg/fso/msmcomm/msmvterm/src/commands.c:638: undefined reference to `msmcomm_message_unref' all which I don't quite understand. The offending code is the message cast, i.e. the line: msg = MSMCOMM_REPLY_GET_FIRMWARE_INFO (message); I have two questions now: 1.) Where does Vala take that MSMCOMM_REPLY_GET_FIRMWARE_INFO and how can I fix the problem? Since all the concrete messages inherit from the base class I would expect this to be a no-op in C, as we're just ensuring Vala that we know which message type it is. 2.) Is there a better way to handle C-APIs like that?
Attachment:
msmcomm-1.0.vapi
Description: Text Data