rob, hi,

okay, it was a bit hairy, but here's at least a first attempt, that
shows up the following.  it leads me to conclude that dce's idl compiler
was [is] a rather delayed work-in-progress that "DidTheJob(tm)" and then
microsoft decided "here we go, here we go, here we go..." and kinda
finished it off for a more "professional" developer market rather than
the "specialist" $USD 0.5billion market... kinda amusing really.

fyi and in case you're interested, i'm putting the
auto-generated test_cstub.cxx up at:

        http://hands.com/~lkcl/public_html/test_cstub.cxx

at 172k it's ... a _little_ excessive given that the idl file it came
from is only 750 lines long!


anyway.

1) dceidl expects files to start with an interface definition
   and _then_ you can start putting structs and function definitions
   etc.

2) dceidl doesn't appear to like you declaring structs without putting
   a typedef around them - even if you don't actually use the typedef.

3) dceidl is fussy about switch_type on nonencapsulated unions.

4) case statements where the switch variable is a char i
couldn't be bothered to find a way to let it be happy with case(1)
it was bitching about 1 not being a char so i converted to
a short and it stopped bitching.

5) range isn't implemented.  i don't imagine this will be difficult to
add: there are enough examples to work from in the code to add range.

6) explicit_handle doesn't appear to be understood (but i know
implicit_handle is because wez added that) so the Test2 interface
wouldn't compile.

7) there's a warning about floats - it seems that they get converted to
doubles "automatically" by non-Ansi c compilers and obviously the
DCE/RPC guys have seen this error _so_ many times they decided to add a
compiler warning about it...

8) __stdcall isn't supported (and i haven't a _bleedin'_ clue as to what
it is, neeeiiivah)

9) [ptr] _cannot_ be left out.

10) NonEncapsulated [out] Unions you _must_ return the switch statement
so i had to change to [in,out,ref] short *type ...

11) there's something weird about the stuff in ConformantPStruct
    that you created, rob, so i had to create typedef [ptr] long*
    pLong_t because a (long **) bitched about the long** not
    being a [ptr] even though the long* is.

    hey, don't ask me!

12) the other weird thing about ConformantPStruct was that ur..
    oh yes, a [ptr] *size wasn't acceptable as a size_is, so i 
    had to convert it to a [ref] and then that appeared to be okay:

                typedef [ref] long * pLong_tr;
                typedef struct ConformantPStruct {
                        pLong_tr size;
                        [size_is(*size)] char
                        array[];
                } TConformantPStruct;

13) i had to create a typedef FakeStringPtr which oh yes, that's right,
    this was the one where it was used as a FakeStringPtr ** and there
    wasn't a declaration about each of the *s being [ptr] i.e. * being
    [ptr] and ** being [ptr][ptr] so i got round that one by doing
    this:
    
        typedef [ptr] FakeString *FakeStringPtr ;
        void FullPointerIn2([in, ptr] FakeStringPtr * pFull);

14) there was some problem with the .acf file, possibly because a syntax
of several interfaces being defined in one .acf file is not supported
by the yacc syntax but several interfaces in one .idl file _is_
supported.

so i moved the Test2 and Test3 stuff into separate idl files.

15) i had a weird encounter with wchar_t so i substituted WCHAR which
exists in wez's wtypes.idl file and the problem went away.

16) wez's wtypes.idl already has a definition for LPWSTR so i commented
that out.

17) cpp_somethingorother("#define MAGIC_CHAR 0x54") isn't supported but
a pure and simple #define MAGIC_CHAR 0x54 is - so i went with that.

_other_ than that, it's all hunky-dory :)



okay.

so, your server-side code is testp.c, and the client-side code is
main.c?

have to pay attention to lovely wife rather than boring computer so i'll
have a go at creating a Makefile cut/paste style from some examples i
know of in order to get a working client/server: will let you know how
it goes.

l.

p.s. for convenience, i might convert RpcBindingFree etc. to
rpc_binding_free - hope you don't mind.

-- 
--
<a href="http://lkcl.net";>http://lkcl.net</a>
--
#include "wtypes.idl"

[
    uuid(7a98c250-6808-11cf-b73b-00aa00b677a7),
    version(1.0)
]
interface Tests
{
        typedef struct _FakeString
        {
                byte ch;
                byte ch2;
        } FakeString;

        typedef [ptr] FakeString *FakeStringPtr ;

        /* can't be bothered to look up how to do a case((char)1)
           so am converting switch_type to short instead, and
           all uses of it too
         */
        typedef [switch_type(short)] union NonEncapsulated
        {
                [case(1)] char ch;
                [case(2)] short s;
                [case(4)] long l;
                [case(5)] FakeString str;
        } NonEncapsulated;

        typedef union switch(short key)
        {
                case 1: char ch;
                case 2: short s;
                case 4: long l;
                case 5: FakeString str;
        } Encapsulated;

        /* _not_ defined in /opt/dce/include/wtypes.idl: */
        /*typedef WCHAR WCHAR ; */

        /* already defined in the version of wtypes.idl 
           in /opt/dce/include/wtypes.idl:
           typedef [ptr, string] WCHAR * LPWSTR;*/

        #define MAGIC_CHAR 0x54
        #define MAGIC_SHORT 0x5784
        #define MAGIC_LONG 0x13578658
        #define MAGIC_DOUBLE 3.1415926535897932384626433832795
        #define MAGIC_CSTRING "Hello World!\n"

/* base types */
        void CharIn([in] char ch);
        void ByteIn([in] byte b);
        void SmallIn([in] small sm);
        void USmallIn([in] unsigned small sm);
        void WCharIn([in] WCHAR wch);
        void ShortIn([in] short sh);
        void UShortIn([in] unsigned short ush);
        void FloatIn([in] float f);
        void HyperIn([in] hyper h);
        void DoubleIn([in] double d);
        void ErrorStatusTIn([in] error_status_t err);
//      void Int3264([in] __int3264 i);
//      void UInt3264([in] unsigned __int3264 i);
/* pointers */
        void UniquePointerIn([in, unique] unsigned char *pUnique);
        void UniquePointerOut([in, out, unique] unsigned char *pUnique);
    void FullPointerIn([in, ptr] unsigned char * pFull);
    void FullPointerIn2([in, ptr] FakeStringPtr * pFull);
    void FullPointerOut([in, out, ptr] unsigned char * pFull);
/* misc */
    /* oops void RangedIn([in, range(0, 100)] unsigned long l); */
        char CharRet();
        short ShortRet();
        long LongRet();
        FakeString StructRet();
        float FloatRet();
        double DoubleRet();
        /* oops long __stdcall Stdcall([in] long l1, [in, out] long * pLong); */

/* arrays */
        void SmFixedArrayIn([in] unsigned char Array[10]);
        void SmFixedArrayOut([out] unsigned char Array[10]);
        void LgFixedArrayIn([in] unsigned char Array[65538]);
        void LgFixedArrayOut([out] unsigned char Array[65538]);
        void SmVaryingArrayIn([in] long size, [in, length_is(size)] unsigned 
char Array[10]);
        void SmVaryingArrayOut([in] long size, [out, length_is(size)] unsigned 
char Array[10]);
        void LgVaryingArrayIn([in] long size, [in, length_is(size)] unsigned 
char Array[65538]);
        void LgVaryingArrayOut([in] long size, [out, length_is(size)] unsigned 
char Array[65538]);
        void ConformantArrayIn([in] long size, [in, size_is(size)] unsigned 
char Array[]);
        void ConformantArrayOut([in] long size, [out, size_is(size)] unsigned 
char Array[]);
        void ConformantVaryingArrayIn([in] long size1, [in] long size2, [in, 
size_is(size1), length_is(size2)] unsigned char Array[]);
        void ConformantVaryingArrayOut([in] long size1, [in] long size2, [out, 
size_is(size1), length_is(size2)] unsigned char Array[]);
        void ComplexArrayIn([in] long size, [in, size_is(size)] char 
ComplexArray[][10]);

#if 0
        void DivTwoConformanceArrayIn([in] long size, [in, length_is(size/2)] 
unsigned char Array[10]);
        void MultTwoConformanceArrayIn([in] long size, [in, length_is(size*2)] 
unsigned char Array[10]);
        void AddOneConformanceArrayIn([in] long size, [in, length_is(size+1)] 
unsigned char Array[10]);
        void SubOneConformanceArrayIn([in] long size, [in, length_is(size-1)] 
unsigned char Array[10]);
        void CallbackConformanceArrayIn([in] long size, [in, 
length_is(size*2+1)] unsigned char Array[10]);
#endif

/* strings */
        void NonconformantString([in, string] char szString[10]);
        void ConformantString([in, string] char * pszString);
#if 1
        void NonconformantStructStr([in, string] FakeString szString[10]);
        void ConformantStructStr([in, string] FakeString * szString);
        void ConformantStructStrSized([in] unsigned long l, [in, 
string,size_is(l)] FakeString * pszString);
#endif
        void ConformantWideString([in, string] WCHAR * pszString);
/* structures */
        typedef [ptr] long * pLong_t;
        typedef [ref] long * pLong_tr;
        typedef struct PointerStruct {
                pLong_t pLong;
        } TPointerStruct;

        typedef struct ConformantStruct {
                long size; [size_is(size)] char array[];
        } TConformantStruct;

        typedef struct ConformantPStruct {
                pLong_tr size;
                [size_is(*size)] char array[];
        } TConformantPStruct;

        typedef struct ConformantVStruct { long len; [length_is(len)] char 
array[10]; } TConformantVStruct ;
        typedef struct HardStruct { short type; [switch_is(type)] union 
NonEncapsulated u; } THardStruct ;
        typedef struct ComplexStruct { long size; [size_is(size)] char 
ComplexArray[][10]; } TComplexStruct ;

        void SimpleStructIn([in] FakeString * s);
        void SimpleStructOut([out] FakeString * s);
        void SimplePointerStructIn([in] struct PointerStruct * s);
        void SimplePointerStructOut([out] struct PointerStruct * s);
        void ConformantStructIn([in] struct ConformantStruct * s);
        void ConformantStructOut([in, out] struct ConformantStruct * s);
        void ConformantPointerStructIn([in] struct ConformantPStruct * s);
        void ConformantPointerStructOut([in, out] struct ConformantPStruct * s);
        void ConformantVaryingStructIn([in] struct ConformantVStruct * s);
        void ConformantVaryingStructOut([out] struct ConformantVStruct * s);
/* these two should generate hard structs which are more efficient than the 
complex
 * structs MIDL actually generates */
        void HardStructIn([in] struct HardStruct * s);
        void HardStructOut([out] struct HardStruct * s);
        void ComplexStructIn([in] struct ComplexStruct * s);
        void ComplexStructOut([in] struct ComplexStruct * s);
/* unions */
        void EncapsulatedUnionIn([in] Encapsulated * u);
        void EncapsulatedUnionOut([out] Encapsulated * u);
        void NonEncapsulatedUnionIn([in] short type, [in, switch_is(type)] 
union NonEncapsulated * u);
        void NonEncapsulatedUnionOut([in,out,ref] short *type, [out, 
switch_is(*type)] union NonEncapsulated * u);
/* transmit_as */
#if 0 /* need to write to/from/free routines */
        typedef [transmit_as(long)] char XMITAS;
        typedef long REPAS;
        void TransmitAsIn([in] XMITAS s);
        void TransmitAsOut([out] XMITAS * s);
        void RepresentAsIn([in] REPAS s);
        void RepresentAsOut([out] REPAS *s);

        void RangeIn([in, range(0, 100)] long l);
        void ByteCount([in] long cbBuffer, [out] struct PointerStruct * s);
#endif

        error_status_t ErrorStatusT([out] error_status_t * funcstatus);
}

[
    implicit_handle (handle_t hello_IfHandle)
] 
interface Tests
{
#if 0
        typedef [represent_as(FakeString)] REPAS;
#endif
        [fault_status] ErrorStatusT([comm_status] funcstatus);
#if 0
        ByteCount([byte_count(cbBuffer)] s);
#endif
}

Reply via email to