Hi,

There seem to be several IDL issues which prevent me retrieving
exceptions for recurring appointments. The first is a simple case of
an enum being encoded as 4 bytes instead of the 2 as spec'd:

diff -C5 openchange-1.0-BORG-original/property.idl
openchange-1.0-BORG/property.idl
*** openchange-1.0-BORG-original/property.idl   2012-03-13
10:52:50.000000000 +0000
--- openchange-1.0-BORG/property.idl    2012-03-18 15:14:49.823027524 +0000
***************
*** 118,128 ****
                FirstDOW_Thursday       = 0x4,
                FirstDOW_Friday         = 0x5,
                FirstDOW_Saturday       = 0x6
        } FirstDOW;

!       typedef [v1_enum] enum {
                ARO_SUBJECT             = 0x0001,
                ARO_MEETINGTYPE         = 0x0002,
                ARO_REMINDERDELTA       = 0x0004,
                ARO_REMINDER            = 0x0008,
                ARO_LOCATION            = 0x0010,
--- 118,128 ----
                FirstDOW_Thursday       = 0x4,
                FirstDOW_Friday         = 0x5,
                FirstDOW_Saturday       = 0x6
        } FirstDOW;

!       typedef [enum16bit] enum {
                ARO_SUBJECT             = 0x0001,
                ARO_MEETINGTYPE         = 0x0002,
                ARO_REMINDERDELTA       = 0x0004,
                ARO_REMINDER            = 0x0008,
                ARO_LOCATION            = 0x0010,

The second issue is to do with decoding Exception_Msg. The spec says
there are 2 uint16s followed by an array of chars, and this seems to
be what the idl says:


        typedef [public,flag(NDR_NOALIGN)] struct {     
                uint16                          msgLength;
                uint16                          msgLength2;
                [size_is(msgLength)]    uint8   msg[];
        } Exception_Msg;

but the emitted code looks ike this:

_PUBLIC_ enum ndr_err_code ndr_pull_Exception_Msg(struct ndr_pull
*ndr, int ndr_flags, struct Exception_Msg *r)
{
...
                        NDR_CHECK(ndr_pull_array_size(ndr, &r->msg));
                        NDR_CHECK(ndr_pull_align(ndr, 2));
                        NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, 
&r->msgLength));
                        NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, 
&r->msgLength2));
                        NDR_PULL_ALLOC_N(ndr, r->msg, ndr_get_array_size(ndr, 
&r->msg));
                        NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->msg,
ndr_get_array_size(ndr, &r->msg)));

The call to ndr_pull_array_size seems to consume 4 bytes, which are
not in the stream, and so things go wrong. It is as if the size_is
clause is somehow ignored. I've poked around the Samba pidl compiler,
but I am not sure how to fix this. I'll file a bug once my tracker
account issue is resolved, but any help would be appreciated.

Thanks, Shaheed
_______________________________________________
devel mailing list
devel@lists.openchange.org
http://mailman.openchange.org/listinfo/devel

Reply via email to