Re: octet sequence problem with ORBit2 client



Bart,

I am confident that this is a bug in ORBit-2 so I suggest reporting it
using the bugzilla which can be located using the followingg URI:

	http://bugzilla.gnome.org/buglist.cgi?product=ORBit2

You can enter the bug using:

	http://bugzilla.gnome.org/enter_bug.cgi?product=ORBit2


On Fri, 2004-09-24 at 09:40 +0200, Bart Vanherck wrote:
> Hello,
> 
> I have a question about sequences.
> I have the following idl :
> 
> typedef sequence<octet> HelloBuf;
> module Hello{
>         struct T_HELLOWORLD{
>                 string name;
>                 short type;
>                 HelloBuf data;
>         };
>         interface World {
>                 T_HELLOWORLD GetData(in string name);
>         };
> };
> 
> 
> Now I want to allocate a data buffer in the server and send this buffer
> back to our client. The data buffer contains some binary data.
> 
> When I ask to our server such a buffer, the client gets an error.
> "IDL:omg.org/CORBA/COMM_FAILURE:1.0" (in ev )
> 
> 
> Now the strange thing is that this happens when server and client are
> not on the same machine AND if the client is linked with orbit2. If the 
> client is linked with orbit1 there is no problem.
> 
> This only happens if the structure that contains the buffer has a length
> that is greater than 2^18 ! So a length of 300 or 30000 works, but not a
> buffer of 3000000 bytes.
> 
> Is this a bug in orbit2 or did I make a mistake ?
> 
> I include here an example HelloWorld in which the problem can be 
> reproduced.  I did include just the code that is not generated with 
> orbit-idl (or orbit-idl-2) 
> 
> #include <glib.h>
> #include <stdio.h>
> #include "glib.h"
> #include "test.h"    /* comes from test.idl */
> /////////////////////////////////////////////////////////////////////////////////
> // skelimpl
> /////////////////////////////////////////////////////////////////////////////////
> #include "skelimpl.c"
> /* I include here the function which I implement */
> static Hello_T_HELLOWORLD *
> impl_Hello_World_GetData(impl_POA_Hello_World * servant,
>                          CORBA_char * name, CORBA_Environment * ev)
> {
>         Hello_T_HELLOWORLD *retval=NULL;
>         CORBA_octet *kar=NULL;
>         CORBA_unsigned_long length=0;
>         unsigned char j=0;
>         long i=0;
> 
>         retval = Hello_T_HELLOWORLD__alloc();
>         retval->name = CORBA_string_dup(name);
>         length = atoi(name);
>         retval->type = 3;
>         retval->data._maximum = length;
>         retval->data._length  = length;
>         retval->data._buffer  =
> CORBA_sequence_CORBA_octet_allocbuf(retval->data._maximum);
> 
>         kar = retval->data._buffer;
>         for (i=0;i<retval->type;i++){
>                 *kar = ( CORBA_octet )j;
>                 kar++;
>                 j++;
>         }
>         CORBA_sequence_set_release( &retval->data, TRUE );
>         return retval;
> }
> 
> int main(int argc,char **argv){
>         CORBA_ORB                       orb;
>         CORBA_Environment       *ev;
>         Hello_World                     obj;
>         CORBA_char*         objref;
>         PortableServer_POA        root_poa;
>         PortableServer_POAManager manager;
>         gchar *filename;
>         FILE *ofp;
> 
>         filename =     
> g_strdup_printf("%s/helloworld.ior",getenv("IORFILE"));
>         if (filename) {
>                 ofp = fopen(filename,"w");
>                 if (ofp){
>                         ev = g_new0(CORBA_Environment,1);
>                         CORBA_exception_init(ev);
>                         orb =
> CORBA_ORB_init(&argc,argv,"orbit-local-orb",ev);
>                         root_poa =
> (PortableServer_POA)CORBA_ORB_resolve_initial_references(
>                                   orb,"RootPOA",ev);
>                         manager =
> PortableServer_POA__get_the_POAManager(root_poa,ev);
>                         PortableServer_POAManager_activate(manager,ev);
>                         obj = impl_Hello_World__create(root_poa,ev);
>                         objref = CORBA_ORB_object_to_string(orb,obj,ev);
>                         fprintf(ofp,"%s",objref);
>                         fclose(ofp);
>                 }
>                 g_free(filename);
>                 CORBA_ORB_run(orb,ev);
>                 CORBA_Object_release(obj,ev);
>                 CORBA_ORB_shutdown(orb,CORBA_FALSE,ev);
>         }
>         
>         return 0;
> }
> 
> 
> 
> ///////////////////////////////////////////
> // CLIENT CODE 
> ///////////////////////////////////////////
> #include <stdio.h>
> #include <glib.h>
> #include "test.h"
> 
> int main(int argc,char **argv){
>         char filebuf[1024];
>         CORBA_Environment ev;
>         CORBA_ORB orb;
>         Hello_World  world;
>         gchar *filename;
>         gchar *genior=NULL;
>         gchar *name=NULL;
>         Hello_T_HELLOWORLD *retval=NULL;
>         FILE *ifp;
> 
>         filename =     
> g_strdup_printf("%s/helloworld.ior",getenv("IORFILE"));
> 
>         if (filename){
>                 CORBA_exception_init (&ev);
>                 orb = CORBA_ORB_init (&argc, argv, "orbit-local-orb",
> &ev);
>                 ifp = fopen (filename, "r");
>                 if (ifp){
>                         fgets (filebuf, 1023, ifp);
>                         genior = g_strdup (filebuf);
>                         fclose(ifp);
>                 }
>                 if (genior){
>                         world = CORBA_ORB_string_to_object (orb, genior,
> &ev);
>                         g_free(genior);
>                 }
>                 g_free(filename);
>         }
>         if (world){
>                 name = g_strdup_printf("%s","3000000");
>                 if (name){
>                         retval = Hello_World_GetData(world,name,&ev);
> 
>                         if (ev._major == CORBA_NO_EXCEPTION ){
>                                 g_print("RETVAL is valid\n");
>                         } else {
>                                 g_print("RETVAL is NOT valid\n");
>                         }
>                         g_free(name);
>                 }
>         }
>         return 0;
> }
> 
> regards,
> Bart
> 
> 
> _______________________________________________
> orbit-list mailing list
> orbit-list gnome org
> http://mail.gnome.org/mailman/listinfo/orbit-list
-- 
Philip Van Hoof, Software Developer @ Cronos
home: me at freax dot org
gnome: pvanhoof at gnome dot org
work: Philip dot VanHoof at Cronos dot Be
http://www.freax.be, http://www.freax.eu.org



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]