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?
/**
 * (C) 2009-2010 by Simon Busch <[email protected]>
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 **/

/*
 * Questions for morphis
 *
 * 1.) These messages have different sizes, right? What about the free functions?
 * 2.) Can we rename the 'event' to 'urc'? URC stands for unsolicited response code and is more in line
 * with the telephony taxonomy. If we call it 'event', it's unclear whether it's a solicited response or not.
 * 3.) Is msm communication sync. or async. on the individual command level?
 * 4.) If 'async', do we have sequence numbers to match reponses to requests?
*/

[CCode (cheader_filename = "msmcomm.h")]
namespace Msmcomm
{
    [CCode (cname = "int", has_type_id = false, cprefix = "MSMCOMM_MESSAGE_CMD_", cheader_filename = "msmcomm.h")]
    public enum CommandType
    {
        CHANGE_OPERATION_MODE,
        GET_IMEI,
        GET_FIRMWARE_INFO,
        TEST_ALIVE,
        GET_PHONE_STATE_INFO,
        VERIFY_PIN,
        GET_VOICEMAIL_NR,
        GET_LOCATION_PRIV_PREF,
        ANSWER_CALL,
        SET_AUDIO_PROFILE,
        END_CALL,
        GET_CHARGER_STATUS,
        CHARGING,
        DIAL_CALL
    }

    [CCode (cname = "int", has_type_id = false, cprefix = "MSMCOMM_RESPONSE_", cheader_filename = "msmcomm.h")]
    public enum ResponseType
    {
        TEST_ALIVE,
        GET_FIRMWARE_INFO,
        GET_IMEI,
        PDSM_PD_GET_POS,
        PDSM_PD_END_SESSION,
        PA_SET_PARAM,
        LCS_AGENT_CLIENT_RSP,
        XTRA_SET_DATA,
        GET_SIM_CAPABILITIES,
        GET_VOICEMAIL_NR,
        SOUND,
        CM_CALL,
        CHARGER_STATUS,
        CHARGING
    }

    [CCode (cname = "int", has_type_id = false, cprefix = "MSMCOMM_EVENT_", cheader_filename = "msmcomm.h")]
    public enum EventType
    {
        RESET_RADIO_IND,
        CHARGER_STATUS,
        OPERATION_MODE,
        CM_PH_INFO_AVAILABLE,
        POWER_STATE,
        NETWORK_STATE_INFO,
        PDSM_PD_DONE,
        PD_POSITION_DATA,
        PD_PARAMETER_CHANGE,
        PDSM_LCS,
        PDSM_XTRA,
        CALL_STATUS,
        CALL_INCOMMING,
        CALL_ORIGINATION,
        CALL_CONNECT,
        CALL_END,
        SIM_INSERTED,
        SIM_PIN1_VERIFIED,
        SIM_PIN1_BLOCKED,
        SIM_PIN1_UNBLOCKED,
        SIM_PIN1_ENABLED,
        SIM_PIN1_DISABLED,
        SIM_PIN1_CHANGED,
        SIM_PIN1_PERM_BLOCKED,
        SIM_PIN2_VERIFIED,
        SIM_PIN2_BLOCKED,
        SIM_PIN2_UNBLOCKED,
        SIM_PIN2_ENABLED,
        SIM_PIN2_DISABLED,
        SIM_PIN2_CHANGED,
        SIM_PIN2_PERM_BLOCKED,
        SIM_REFRESH_RESET,
        SIM_REFRESH_INIT,
        SIM_REFRESH_INIT_FCN,
        SIM_REFRESH_FAILED,
        SIM_FDN_ENABLE,
        SIM_FDN_DISABLE,
        SIM_ILLEGAL,
        SIM_REMOVED,
        SIM_NO_SIM_EVENT,
        SIM_NO_SIM,
        SIM_DRIVER_ERROR,
        SIM_INTERNAL_RESET,
        SIM_OK_FOR_TERMINAL_PROFILE_DL,
        SIM_NOT_OK_FOR_TERMINAL_PROFILE_DL,
        SIM_INIT_COMPLETED_NO_PROV,
        SIM_MEMORY_WARNING,
        SIM_SIM2_EVENT,
        SIM_REAL_RESET_FAILURE,
        SIM_CARD_ERROR,
        SIM_NO_EVENT,
        SIM_GET_PERSO_NW_FAILURE,
        SIM_GET_PERSO_NW_BLOCKED,
        SIM_REFRESH_APP_RESET,
        SIM_REFRESH_3G_SESSION_RESET,
        SIM_APP_SELECTED,
        SIM_DEFAULT,
        SUPS_PROCESS_USS,
        SUPS_PROCESS_USS_CONF,
        SUPS_USS_RES,
        SUPS_RELEASE_USS_IND,
        SUPS_USS_NOTIFY_IND,
        SUPS_USS_NOTIFY_RES,
        SUPS_RELEASE,
        SUPS_ABORT,
        SUPS_ERASE,
        SUPS_REGISTER,
        SUPS_REGISTER_CONF,
        SUPS_GET_PASSWORD_IN,
        SUPS_GET_PASSWORD_RES,
        SUPS_INTERROGATE,
        SUPS_INTERROGATE_CONF,
        SUPS_ACTIVATE,
        SUPS_ACTIVATE_CONF,
        SUPS_DEACTIVATE,
        SUPS_DEACTIVATE_CONF
    }

    public string eventTypeToString( int t )
    {
        switch ( t )
        {
            // ResponseType
            case ResponseType.TEST_ALIVE:
            return "RESPONSE_TEST_ALIVE";
            case ResponseType.GET_FIRMWARE_INFO:
			return "RESPONSE_GET_FIRMWARE_INFO";
            case ResponseType.GET_IMEI:
			return "RESPONSE_GET_IMEI";
            case ResponseType.PDSM_PD_GET_POS:
			return "RESPONSE_PDSM_PD_GET_POS";
            case ResponseType.PDSM_PD_END_SESSION:
			return "RESPONSE_PDSM_PD_END_SESSION";
            case ResponseType.PA_SET_PARAM:
			return "RESPONSE_PA_SET_PARAM";
            case ResponseType.LCS_AGENT_CLIENT_RSP:
			return "RESPONSE_LCS_AGENT_CLIENT_RSP";
            case ResponseType.XTRA_SET_DATA:
			return "RESPONSE_XTRA_SET_DATA";
            case ResponseType.GET_SIM_CAPABILITIES:
			return "RESPONSE_GET_SIM_CAPABILITIES";
            case ResponseType.GET_VOICEMAIL_NR:
			return "RESPONSE_GET_VOICEMAIL_NR";
            case ResponseType.SOUND:
			return "RESPONSE_SOUND";
            case ResponseType.CM_CALL:
			return "RESPONSE_CM_CALL";
            case ResponseType.CHARGER_STATUS:
			return "RESPONSE_CHARGER_STATUS";
            case ResponseType.CHARGING:
            return "RESPONSE_CHARGING";
            // EventType
        	case EventType.RESET_RADIO_IND:
			return "URC_RESET_RADIO_IND";
        	case EventType.CHARGER_STATUS:
			return "URC_CHARGER_STATUS";
        	case EventType.OPERATION_MODE:
			return "URC_OPERATION_MODE";
        	case EventType.CM_PH_INFO_AVAILABLE:
			return "URC_CM_PH_INFO_AVAILABLE";
        	case EventType.POWER_STATE:
			return "URC_POWER_STATE";
        	case EventType.NETWORK_STATE_INFO:
			return "URC_NETWORK_STATE_INFO";
        	case EventType.PDSM_PD_DONE:
			return "URC_PDSM_PD_DONE";
        	case EventType.PD_POSITION_DATA:
			return "URC_PD_POSITION_DATA";
        	case EventType.PD_PARAMETER_CHANGE:
			return "URC_PD_PARAMETER_CHANGE";
        	case EventType.PDSM_LCS:
			return "URC_PDSM_LCS";
        	case EventType.PDSM_XTRA:
			return "URC_PDSM_XTRA";
        	case EventType.CALL_STATUS:
			return "URC_CALL_STATUS";
        	case EventType.CALL_INCOMMING:
			return "URC_CALL_INCOMMING";
        	case EventType.CALL_ORIGINATION:
			return "URC_CALL_ORIGINATION";
        	case EventType.CALL_CONNECT:
			return "URC_CALL_CONNECT";
        	case EventType.CALL_END:
			return "URC_CALL_END";
        	case EventType.SIM_INSERTED:
			return "URC_SIM_INSERTED";
        	case EventType.SIM_PIN1_VERIFIED:
			return "URC_SIM_PIN1_VERIFIED";
        	case EventType.SIM_PIN1_BLOCKED:
			return "URC_SIM_PIN1_BLOCKED";
        	case EventType.SIM_PIN1_UNBLOCKED:
			return "URC_SIM_PIN1_UNBLOCKED";
        	case EventType.SIM_PIN1_ENABLED:
			return "URC_SIM_PIN1_ENABLED";
        	case EventType.SIM_PIN1_DISABLED:
			return "URC_SIM_PIN1_DISABLED";
        	case EventType.SIM_PIN1_CHANGED:
			return "URC_SIM_PIN1_CHANGED";
        	case EventType.SIM_PIN1_PERM_BLOCKED:
			return "URC_SIM_PIN1_PERM_BLOCKED";
        	case EventType.SIM_PIN2_VERIFIED:
			return "URC_SIM_PIN2_VERIFIED";
        	case EventType.SIM_PIN2_BLOCKED:
			return "URC_SIM_PIN2_BLOCKED";
        	case EventType.SIM_PIN2_UNBLOCKED:
			return "URC_SIM_PIN2_UNBLOCKED";
        	case EventType.SIM_PIN2_ENABLED:
			return "URC_SIM_PIN2_ENABLED";
        	case EventType.SIM_PIN2_DISABLED:
			return "URC_SIM_PIN2_DISABLED";
        	case EventType.SIM_PIN2_CHANGED:
			return "URC_SIM_PIN2_CHANGED";
        	case EventType.SIM_PIN2_PERM_BLOCKED:
			return "URC_SIM_PIN2_PERM_BLOCKED";
        	case EventType.SIM_REFRESH_RESET:
			return "URC_SIM_REFRESH_RESET";
        	case EventType.SIM_REFRESH_INIT:
			return "URC_SIM_REFRESH_INIT";
        	case EventType.SIM_REFRESH_INIT_FCN:
			return "URC_SIM_REFRESH_INIT_FCN";
        	case EventType.SIM_REFRESH_FAILED:
			return "URC_SIM_REFRESH_FAILED";
        	case EventType.SIM_FDN_ENABLE:
			return "URC_SIM_FDN_ENABLE";
        	case EventType.SIM_FDN_DISABLE:
			return "URC_SIM_FDN_DISABLE";
        	case EventType.SIM_ILLEGAL:
			return "URC_SIM_ILLEGAL";
        	case EventType.SIM_REMOVED:
			return "URC_SIM_REMOVED";
        	case EventType.SIM_NO_SIM_EVENT:
			return "URC_SIM_NO_SIM_EVENT";
        	case EventType.SIM_NO_SIM:
			return "URC_SIM_NO_SIM";
        	case EventType.SIM_DRIVER_ERROR:
			return "URC_SIM_DRIVER_ERROR";
        	case EventType.SIM_INTERNAL_RESET:
			return "URC_SIM_INTERNAL_RESET";
        	case EventType.SIM_OK_FOR_TERMINAL_PROFILE_DL:
			return "URC_SIM_OK_FOR_TERMINAL_PROFILE_DL";
        	case EventType.SIM_NOT_OK_FOR_TERMINAL_PROFILE_DL:
			return "URC_SIM_NOT_OK_FOR_TERMINAL_PROFILE_DL";
        	case EventType.SIM_INIT_COMPLETED_NO_PROV:
			return "URC_SIM_INIT_COMPLETED_NO_PROV";
        	case EventType.SIM_MEMORY_WARNING:
			return "URC_SIM_MEMORY_WARNING";
        	case EventType.SIM_SIM2_EVENT:
			return "URC_SIM_SIM2_EVENT";
        	case EventType.SIM_REAL_RESET_FAILURE:
			return "URC_SIM_REAL_RESET_FAILURE";
        	case EventType.SIM_CARD_ERROR:
			return "URC_SIM_CARD_ERROR";
        	case EventType.SIM_NO_EVENT:
			return "URC_SIM_NO_EVENT";
        	case EventType.SIM_GET_PERSO_NW_FAILURE:
			return "URC_SIM_GET_PERSO_NW_FAILURE";
        	case EventType.SIM_GET_PERSO_NW_BLOCKED:
			return "URC_SIM_GET_PERSO_NW_BLOCKED";
        	case EventType.SIM_REFRESH_APP_RESET:
			return "URC_SIM_REFRESH_APP_RESET";
        	case EventType.SIM_REFRESH_3G_SESSION_RESET:
			return "URC_SIM_REFRESH_3G_SESSION_RESET";
        	case EventType.SIM_APP_SELECTED:
			return "URC_SIM_APP_SELECTED";
        	case EventType.SIM_DEFAULT:
			return "URC_SIM_DEFAULT";
            case EventType.SUPS_PROCESS_USS:
            return "SUPS_PROCESS_USS";
            case EventType.SUPS_PROCESS_USS_CONF:
            return "SUPS_PROCESS_USS_CONF";
            case EventType.SUPS_USS_RES:
            return "SUPS_USS_RES";
            case EventType.SUPS_RELEASE_USS_IND:
            return "SUPS_RELEASE_USS_IND";
            case EventType.SUPS_USS_NOTIFY_IND:
            return "SUPS_USS_NOTIFY_IND";
            case EventType.SUPS_USS_NOTIFY_RES:
            return "SUPS_USS_NOTIFY_RES";
            case EventType.SUPS_RELEASE:
            return "SUPS_RELEASE";
            case EventType.SUPS_ABORT:
            return "SUPS_ABORT";
            case EventType.SUPS_ERASE:
            return "SUPS_ERASE";
            case EventType.SUPS_REGISTER:
            return "SUPS_REGISTER";
            case EventType.SUPS_REGISTER_CONF:
            return "SUPS_REGISTER_CONF";
            case EventType.SUPS_GET_PASSWORD_IN:
            return "SUPS_GET_PASSWORD_IN";
            case EventType.SUPS_GET_PASSWORD_RES:
            return "SUPS_GET_PASSWORD_RES";
            case EventType.SUPS_INTERROGATE:
            return "SUPS_INTERROGATE";
            case EventType.SUPS_INTERROGATE_CONF:
            return "SUPS_INTERROGATE_CONF";
            case EventType.SUPS_ACTIVATE:
            return "SUPS_ACTIVATE";
            case EventType.SUPS_ACTIVATE_CONF:
            return "SUPS_ACTIVATE_CONF";
            case EventType.SUPS_DEACTIVATE:
            return "SUPS_DEACTIVATE";
            case EventType.SUPS_DEACTIVATE_CONF:
            return "SUPS_DEACTIVATE_CONF";
            default:
			return "%d (unknown)".printf( t );
        }
    }

    [CCode (cname = "int", has_type_id = false, cprefix = "MSMCOMM_OPERATION_MODE_", cheader_filename = "msmcomm.h")]
    public enum OperationMode
    {
        RESET,
        ONLINE,
        OFFLINE
    }

    [CCode (cname = "int", has_type_id = false, cprefix = "MSMCOMM_CHARGING_VOLTAGE_", cheader_filename = "msmcomm.h")]
    public enum UsbVoltageMode
    {
        MODE_250mA,
        MODE_500mA,
        MODE_1A
    }

    [CCode (cname = "int", has_type_id = false, cprefix = "MSMCOMM_CHARGING_MODE_", cheader_filename = "msmcomm.h")]
    public enum ChargingMode
    {
        USB,
        INDUCTIVE
    }

    [CCode (cname = "msmcomm_event_handler_cb", instance_pos = 0)]
    public delegate void EventHandlerCb(int event, Message message);
    [CCode (cname = "msmcomm_write_handler_cb", instance_pos = 0)]
    public delegate void WriteHandlerCb(void *data, int len);
    [CCode (cname = "msmcomm_read_handler_cb", instance_pos = 0)]
    public delegate void ReadHandlerCb(void *data, int len);
    [CCode (cname = "msmcomm_network_state_info_changed_field_type_cb", instance_pos = 0)]
    public delegate void ChangedFieldTypeCb(void *data, int type);

    [CCode (cname = "msmcomm_check_hci_version")]
    public bool checkHciVersion(uint version);

    [Compact]
    [CCode (cname = "struct msmcomm_context", free_function = "msmcomm_shutdown")]
    public class Context
    {
        [CCode (cname = "msmcomm_new")]
        public Context();

        [CCode (cname = "msmcomm_read_from_modem")]
        public bool readFromModem();

        [CCode (cname = "msmcomm_send_message")]
        public void sendMessage(Message message);

        [CCode (cname = "msmcomm_register_event_handler")]
        public void registerEventHandler(EventHandlerCb eventHandlerCb);

        [CCode (cname = "msmcomm_register_write_handler")]
        public void registerWriteHandler(WriteHandlerCb writeHandlerCb);

        [CCode (cname = "msmcomm_register_read_handler")]
        public void registerReadHandler(ReadHandlerCb readHandlerCb);
    }

    [CCode (cname = "struct msmcomm_message", free_function = "msmcomm_free_message")]
    public class Message
    {
       [CCode (cname = "msmcomm_create_message")]
       public Message(int type);

       [CCode (cname = "msmcomm_message_get_size")]
       public int getSize();

       [CCode (cname = "msmcomm_message_get_type")]
       public int getType();

       [CCode (cname = "msmcomm_message_get_ref_id")]
       public uint8 getRefId();

       [CCode (cname = "msmcomm_message_set_ref_id")]
       public void setRefId(uint8 refId);
    }

    namespace Command
    {
        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class ChangeOperationMode : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public ChangeOperationMode(CommandType t = CommandType.CHANGE_OPERATION_MODE);

            [CCode (cname = "msmcomm_message_change_operation_mode_set_operation_mode")]
            public void setOperationMode(OperationMode oprtMode);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class Charging : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public Charging(CommandType t = CommandType.CHARGING);

            [CCode (cname = "msmcomm_message_charging_set_voltage")]
            public void setVoltage(UsbVoltageMode voltage);

            [CCode (cname = "msmcomm_message_charging_set_mode")]
            public void setMode(ChargingMode mode);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class GetImei : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public GetImei(CommandType t = CommandType.GET_IMEI);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class GetChargerStatus : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public GetChargerStatus(CommandType t = CommandType.GET_CHARGER_STATUS);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class GetFirmwareInfo : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public GetFirmwareInfo(CommandType t = CommandType.GET_FIRMWARE_INFO);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class GetPhoneStateInfo : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public GetPhoneStateInfo(CommandType t = CommandType.GET_PHONE_STATE_INFO);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class TestAlive : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public TestAlive(CommandType t = CommandType.TEST_ALIVE);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class VerifyPin : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public VerifyPin(CommandType t = CommandType.VERIFY_PIN);

            [CCode (cname = "msmcomm_message_verify_pin_set_pin")]
            public void _setPin(string pin, uint length);

            public void setPin(string pin)
            {
                GLib.assert( pin.length <= 8 );
                _setPin( pin, (uint)pin.length );
            }
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class EndCall : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public EndCall(CommandType t = CommandType.END_CALL);

            [CCode (cname = "msmcomm_message_end_call_set_call_number")]
            public void setCallNumber(uint8 call_nr);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class AnswerCall : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public AnswerCall(CommandType t = CommandType.ANSWER_CALL);

            [CCode (cname = "msmcomm_message_answer_call_set_call_number")]
            public void setCallNumber(uint8 call_nr);
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class DialCall : Message
        {
            [CCode (cname = "msmcomm_create_message")]
            public DialCall(CommandType t = CommandType.DIAL_CALL);

            [CCode (cname = "msmcomm_message_dial_call_set_caller_id")]
            private void _setCallerId(string callerId, uint length);

            public void setCallerId(string caller_id)
            {
                _setCallerId(caller_id, (uint)caller_id.length);
            }
        }
    }

    [CCode (cprefix = "")]
    namespace Reply
    {
        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class GetFirmwareInfo : Message
        {
            [CCode (cname = "msmcomm_resp_get_firmware_info_get_info")]
            public void _getInfo(char[] info);

            public string getInfo()
            {
                var info = new char[100];
                _getInfo( info );
                return ((string)info).dup();
            }

            [CCode (cname = "msmcomm_resp_get_firmware_info_get_hci_version")]
            public uint8 getHciVersion();
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class GetImei : Message
        {
            [CCode (cname = "msmcomm_resp_get_imei_get_imei")]
            private void _getImei(char[] imei);

            public string getImei()
            {
                var imei = new char[17];
                _getImei(imei);
                // FIXME: Is this ok or do we have a leak now?
                return ((string)imei).dup();
            }
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class Charging : Message
        {
            [CCode (cname = "msmcomm_resp_charging_get_voltage")]
            public uint getVoltage();
            
            [CCode (cname = "msmcomm_resp_charging_get_mode")]
            public uint getMode();
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class ChargerStatus : Message
        {
            [CCode (cname = "msmcomm_resp_charger_status_get_voltage")]
            public uint getVoltage();

            [CCode (cname = "msmcomm_resp_charger_status_get_mode")]
            public uint getMode();
        }
    
        [CCode (cname = "struct msmcomm_message", free_function = "")]
		public class Call : Message
		{
			[CCode (cname = "msmcomm_resp_cm_call_get_ref_id")]
			public uint getRefId();

			[CCode (cname = "msmcomm_resp_cm_call_get_cmd")]
			public uint16 getCmd();

			[CCode (cname = "msmcomm_resp_cm_call_get_error_code")]
			public uint16 getErrorCode();
		}
    }

    namespace Unsolicited
    {
        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class PowerState : Message
        {
            [CCode (cname = "msmcomm_event_power_state_get_state")]
            public uint8 getState();
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class ChargerStatus : Message
        {
            [CCode (cname = "msmcomm_event_charger_status_get_voltage")]
            public uint getVoltage();
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public abstract class CallStatus : Message
        {
            [CCode (cname = "msmcomm_event_call_status_get_caller_id")]
            private void _getCallerId(string callerId);

            public string getCallerId()
            {
                string callerId;
                _getCallerId(callerId);
                return callerId;
            }

            [CCode (cname = "msmcomm_event_call_status_get_call_id")]
            public uint getCallId();

            [CCode (cname = "msmcomm_event_call_status_get_reject_type")]
            public uint getRejectType();

            [CCode (cname = "msmcomm_event_call_status_get_reject_value")]
            public uint getRejectValue();

        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class CallIncoming : CallStatus
        {
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class CallConnect : CallStatus
        {
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class CallEnd : CallStatus
        {
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class CallOrigination : CallStatus
        {
        }

        [CCode (cname = "struct msmcomm_message", free_function = "")]
        public class NetworkStateInfo : Message
        {
            [CCode (cname = "msmcomm_event_network_state_info_get_change_field")]
            public uint getChangeField(); 

            [CCode (cname = "msmcomm_event_network_state_info_get_new_value")]
            public uint8 getNewValue();

            [CCode (cname = "msmcomm_event_network_state_info_trace_changes")]
            public void traceChanges(ChangedFieldTypeCb type_handler);

            [CCode (cname = "msmcomm_event_network_state_info_get_operator_name")]
            private string _getOperatorName(string operatorName);

            public string getOperatorName()
            {
                string operatorName;
                _getOperatorName(operatorName);
                return operatorName;
            }

            [CCode (cname = "msmcomm_event_network_state_info_get_rssi")]
            public uint16 getRssi();

            [CCode (cname = "msmcomm_event_network_state_info_get_ecio")]
            public uint16 getEcio();

            [CCode (cname = "msmcomm_event_network_state_info_get_service_domain")]
            public uint8 getServiceDomain();

            [CCode (cname = "msmcomm_event_network_state_info_get_service_capability")]
            public uint8 getServiceCapability();

            [CCode (cname = "msmcomm_event_network_state_info_get_gprs_attached")]
            public uint8 getGrpsAttached();

            [CCode (cname = "msmcomm_event_network_state_info_get_roam")]
            public uint16 getRoam();
        }
    } /* namespace Unsolicited */
}

_______________________________________________
Vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to