Re: New Features Question

Alexander Malysh <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
Hi,

sorry seems I overlooked your mail :(

Jonathan Houser wrote:

> 
> Alex,
> 
>> how about somathing like this?
>> 
>> #define smpp_pdu(name) \
>> static int smpp_##name_to_msg(SMPP_PDU pdu, ...)
>> {
>>     struct name cmd = pdu->u.name;
>>     cmd->source_addr = octstr_create(XXX);
>>     ...
>> }
>> smpp_pdu(submit_sm);
>> smpp_pdu(data_sm);
>> 
>> 
>> now to patch: please split your patch in changesets (e.g. add data_sm
>> handling, add new struct members to msg struct, etc...)
>> 
>> Thanks in advance!
> 
>       Finally got some free time to look back at that code again.  I see
> kind of what you are doing above, but don't really see how it fixes what
> I'm having an issue with.  Could you give a quick example of the
> following code being revamped to work in one equivalent line (so I don't
> have to duplicate code thus making maintenance a nightmare for those who
> come after me)?
> 
> ---
> 
> if ( /* we are doing submit_sm */ )
> {
>     pdu->u.submit_sm.source_addr = octstr_duplicate(msg->sms.sender);
> }
> else if ( /* we are doing data_sm */ )
> {
>     pdu->u.data_sm.source_addr = octstr_duplicate(msg->sms.sender);
> }
> 
> ---
> 
>       I mean I understand the structure that is being used above.  It
> seems a bit messy to me as you're allocating the same memory for shared
> fields over and over (ie. source_addr is allocated for both submit_sm
> and data_sm), and yet you have to make sure you fill the correct
> instance for the message you're building. 

hmm, I don't see a problem with this... pdu struct is a union (means always
fixed size) and only the needed values are filled/allocated.
as to the macros above... the idea is pretty simple, you let compiler
generate 2 functions for submit_sm and data_sm at the same time just
maintaining only one copy of shared operations. so you have something like
this:

static int smpp_data_sm_to_msg_extras(pdu, msg)
{
    /* here do some extras that needed only for data_sm */
}

/* shared stuff for submit_sm & data_sm */
#define smpp_pdu(name) \
static int smpp_##name_to_msg(SMPP_PDU pdu, Msg *msg, ...) \
{
     struct name cmd = pdu->u.name; \
     cmd->source_addr = octstr_duplicate(msg->sms.sender); \
     cmd->destination_addr = octstr_duplicate(msg->sms.receiver); \
     ...
     smpp_##name_to_msg_extras(pdu, msg); \
}
smpp_pdu(submit_sm);
smpp_pdu(data_sm);

static int hanle_pdu(...)
{
    if (data_sm)
        smpp_data_sm_to_msg(pdu, msg);
    else
        smpp_submit_sm_to_msg(pdu, msg);
}


hope it's clear now...

> That is unless the site I saw 
> (not a Kannel site) the structure definition style used by the SMPP code
> was lying to me.  :P  I mean, if it were a simple struct like I've used
> for everything I've implemented (GSM SMS, IS-41 SMS, MMS, RADIUS), then
> you'd just write the above code as...
> 
> ---
> 
> pdu.source_addr = octstr_duplicate(msg->sms.sender);
> 
> ---
> 
>       ...and be done with it.  If the message you're sending doesn't use
> source_addr, you may needlessly fill it, but the actual 'encoder' will
> not use it to build the message (as it's smart enough to know not to,
> which it would have to be anyway).  Needlessly allocated memory ensues
> in that case, but the code stays nice and simple.  Perhaps I'm just
> missing something with this allocation style being used?
> 
> Jon

-- 
Thanks,
Alex
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.