[omniORB] Returning complex types from server

graeme smith graeme.smith28 at ntlworld.com
Tue Apr 26 21:05:07 BST 2005


This looks like memory management

Here's an extract from a server sending a complex object, although its
an OUT parameter rather than a return parameter the memory management
rules are the same for both, I believe.
Fintan Bolton's book goes into this in detail.
If you want to see the IDL behind the object see
http://www.qmiss.org.uk/download/repository/


Subscriptions::DataNotification oDataNotification;
oDataNotification.userName = CORBA::string_dup("UTMCSimpleServer");
oDataNotification.tableName = CORBA::string_dup("HEARTBEAT" );
oDataNotification.viewName  = CORBA::string_dup("HEARTBEAT");
oDataNotification.action = Subscriptions::UPDATE;
TabularResults::ResultSet ResultSet;
BuildHeartbeat(ResultSet);
oDataNotification.results = ResultSet;
pPushSubscriptionSupplier->SendDataNotification(oDataNotification);


support code mentioned in above

void
CPushSubscriptionSupplier::BuildHeartbeat(TabularResults::ResultSet&
rResultSet)
{
	rResultSet.rows = 1;
	rResultSet.columns.length(1);
//	Column 0- long reserved 
	{
		TabularResults::Column oColumn;
		oColumn.flags = TabularResults::FLAG_NOT_NULLABLE |
TabularResults::FLAG_READONLY;
		oColumn.width = 10+1;
		oColumn.scale = 0;
		oColumn.name  = CORBA::string_dup("Reserved");
		oColumn.label = CORBA::string_dup("");
		oColumn.values.longValues(1);
		oColumn.nulls.length(0);
		oColumn.values.longValues().length(1);
		oColumn.values.longValues()[0] = 0;

		// Deep copy ?
		rResultSet.columns[0] = oColumn;
	}
}



void CPushSubscriptionSupplier::SendDataNotification(const
Subscriptions::DataNotification& oDataNotification)
{

	
m_pNotificationTargetVar->notificationReceived(oDataNotification);

}







-----Original Message-----
From: omniorb-list-bounces at omniorb-support.com
[mailto:omniorb-list-bounces at omniorb-support.com] On Behalf Of Clarke
Brunt
Sent: 26 April 2005 15:10
To: omniorb-list at omniorb-support.com
Subject: RE: [omniORB] Returning complex types from server

> -----Original Message-----
> From: omniorb-list-bounces at omniorb-support.com 
> [mailto:omniorb-list-bounces at omniorb-support.com] On Behalf 
> Of Frederico Faria
>
>  I have a general doubt about CORBA. I want return a
> struct composed from another struct from my corba
> server. But it looks that my returned struct is empty
> when the client trys print its fields.
> How can I do the right memory allocation in the server
> to return correctly the struct ?
> 
> Example: ( it doesnt work )
> 
>   struct MyTime {
> short   day;
> short   month;
> short   year;
> short   second;
> short   minute;
> short   hour;
> };
> 
>   struct MyEvent {
>    short eventType;   
>    MyTime eventTime;
> }
> interface  I1 
> {
>   MyEvent   getEvent()
> }
> ---------------------------------------------
> // generated serevr implementation code
> 
>  MyEvent getEvent()
> {
>   MyEvent  event;
>  // some code
>   
>  return  event;
> }

I can't see anything wrong. You have a fixed length struct (one of its
members happens to be another fixed length struct). Fixed length struct
is
returned from a method by value, so the signature of your getEvent
method is
correct, and it shouldn't matter that 'event' is a local variable in
getEvent(), since a copy of it is being returned.

Unless I'm missing something (or indeed there's a bug - possibly I never
used a fixed length struct myself), then I can only suggest you trying
more
experiments. Try something just returning an integer. Then try a struct
that
_doesn't_ have another struct as a member. etc...

-- 
Clarke Brunt, Principal Software Engineer, Trafficmaster


_______________________________________________
omniORB-list mailing list
omniORB-list at omniorb-support.com
http://www.omniorb-support.com/mailman/listinfo/omniorb-list




More information about the omniORB-list mailing list