�򵥵���Ŀ�ͻ��ͷ�����

����������������У����ǽ������������һ�����޸Ĵ洢�ڷ������ϵı�����ֵ�Ŀͻ������������������Ŀ���������ķ�ʽ���洢�ı����� balance (���)���������������Ŀ�� idl ����(account.idl)�� ��

Example 5-7. ��Ŀ IDL �ļ�

   interface Account {
      void deposit (in unsigned long amount);
      void withdraw (in unsigned long amount);
      readonly attribute long balance;
   };

��Ŀ�ͻ�

���ÿͻ�û��ʲô�ѵ�(���ٲ���ǰһ�����Ӹ���)��ֻ������һ���£��ڵ��÷�����֮ǰ���Է������Ƿ��ǿɻ�õġ�(����if (!acc_client)�ж�)

Example 5-8. �ʻ��ͻ�Դ����

/*------- Account client (account-client.c)-----------------------------------------*/
#include <stdio.h>
#include <orb/orbit.h>
#include "account.h" 
 
int main (int argc, char *argv[]) {

  Account acc_client;         /* The client-side Account object 
                                 �ͻ�����Ŀ���� */
  CORBA_long val;             /* client stores the balance here
                                 �ͻ��ڴʴ洢��� */
  PortableServer_POA poa;
  CORBA_ORB orb=NULL;         /* This is our ORB �������ǵ� ORB */
  char *ior;                  /* an IOR is one way a client can locate a server
                                 IOR �ǿͻ���λ��������һ�ַ�ʽ*/
  CORBA_Environment ev;       /* CORBA exception information
                                 CORBA ������Ϣ */

  CORBA_exception_init(&ev);

  /* 
   * Initialize the orb. The initialization routine checks the command
   * line parameters for directives that affect the orb
   * ��ʼ�� orb����ʼ�����̼�������в������ҳ�Ӱ�� orb ��ָʾ
   */
   
  orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);
 
  /*
   * Bind  our client Account to the account on the server using the
   * IOR to look it up (the ior was gotten above in the server code)
   * �����ǵĿͻ� Account �󶨵��� IOR �ҵ�����Ŀ��( IOR �ڷ����������л��)
   */

  acc_client = CORBA_ORB_string_to_object(orb, argv[1], &ev);
  if (!acc_client) {
    printf("Cannot bind to %s\n (pass the IOR as arg 1)\n", argv[1]);
    exit(1);
  }
  val = Account__get_balance(acc_client, &ev);
  printf ("Initial balance is %d.\n",val);

  printf("Make a deposit, how :");
  scanf("%d",&val); 
  Account_deposit(acc_client, (CORBA_unsigned_long) val, &ev);
  val = Account__get_balance(acc_client, &ev);
  printf ("Balance is %d.\n",val);

  Account_withdraw(acc_client, (CORBA_unsigned_long) 5, &ev);
  val = Account__get_balance(acc_client, &ev);
  printf ("Balance is %d.\n",val);

  /*
   * We're done now. Do some cleanup
   * �����깤�ˣ���Щ����
   */
   
  CORBA_Object_release(acc_client, &ev);
  exit (0);
}

��Ŀ������

���ڷ������������ϸ�����������������������Դ�ļ� account-skelimpl.c �������м��뷽����ʵ�ִ��롣����ͨ�� orbit-idl --skeleton-impl account.idl ���ġ�

�������DZ༭ account-skelimpl.c �ļ��������ҵ��� IDL �ļ��ж���� balance ���ԡ����ļ��Ŀ�ͷ�����ǿɷ��ֱ� idl ������ת���� C �ķ�ʽ��

Example 5-9. ��Ŀ�������Ŀ��ʵ��

/*** App-specific servant structures ***/
typedef struct {
POA_Account servant;
PortableServer_POA poa;

CORBA_long attr_balance;

} impl_POA_Account;

���ԣ��������ķ���(withdraw �� deposit)����ͨ�� servant->attr_balance ��������Ŀ�����(servant ��������Ϊ�������ݸ�ÿ������)��

�������ǵ��ļ��ĺ����ҵ������Ĵ���������ҵ��� impl_Account_* ���������������ʵ�ִ��롣���������������

static void
impl_Account_deposit(impl_POA_Account *servant,
CORBA_unsigned_long amount,
CORBA_Environment *ev)
{
    printf("server calls deposit method...\n");
    servant->attr_balance += amount;
}

static void
impl_Account_withdraw(impl_POA_Account *servant,
CORBA_unsigned_long amount,
CORBA_Environment *ev)
{
    printf("server calls withdraw method...\n");
    servant->attr_balance -= amount;
}

static CORBA_long
impl_Account__get_balance(impl_POA_Account *servant,
CORBA_Environment *ev)
{
CORBA_long retval;
     retval= servant->attr_balance;
return retval;
}

�������дһЩ��һ��Ĵ��������������������ǽ��� account-server.c����ͬ�������� echo ���ӵĴ����������ͬ����Щ����ֻ�dz�ʼ�� ORB ��Ϊ�������Ķ��󹫲�һ�� IOR��

Example 5-10. ��Ŀ�������� C Դ����

/*------- Account server (account-server.c)-----------------------------------------*/
#include "account-skelimpl.c"
#include <stdio.h>

int main (int argc, char *argv[]) {
  CORBA_ORB                 orb;
  CORBA_Environment*        ev;
  PortableServer_ObjectId*  oid;
  Account                   account;
  PortableServer_POA        root_poa;
  PortableServer_POAManager pm;
  CORBA_char*               ior;

  ev = g_new0(CORBA_Environment,1);
  CORBA_exception_init(ev);
  
  /* 
   * Initialize the orb. The initialization routine checks the command
   * line parameters for directives that affect the orb
   * ��ʼ�� orb����ʼ�����̼�������в������ҳ�Ӱ�� orb ��ָʾ
   */
   
  orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", ev);

  root_poa = (PortableServer_POA)
    CORBA_ORB_resolve_initial_references(orb, "RootPOA", ev);

  /* 
   * ask for instanciation of one object account
   * Ҫ����һ�� account �����ʵ��
   */
  account = impl_Account__create(root_poa, ev);

  /*
   * Here we get the IOR for the acc object.  Our "client" will use
   * the IOR to  find the server to connect to
   * �������ǵõ� acc ����� IOR�����ǵ� "client" ��ʹ��
   * IOR �ҵ���������������
   */
   
  ior = CORBA_ORB_object_to_string(orb, account, ev);

  /* 
   * print out the IOR, just so you can see what it looks like
   * ��� IOR����������Կ�������ʵ������
   */
  printf ("%s\n", ior);

  pm = PortableServer_POA__get_the_POAManager(root_poa, ev);
  PortableServer_POAManager_activate(pm,ev);

  CORBA_ORB_run(orb, ev);
  return (0);
}

����������Ϳͻ�

Makefile ������ͬ���ϸ����������ӡ����������һЩ�仯ʹ�����ӿɶ��ƻ�(customizable)��ͨ���ı� PROJECT ����������ڴ�����С������������� Makefile��

Example 5-11. ��Ŀ���ӳ���� Makefile

PROJECT = account
CC = gcc
ORBIT_IDL = /usr/bin/orbit-idl
ORBIT_CFLAGS = -I/usr/lib/glib/include -I/usr/include
ORBIT_LIBS = -L/usr/lib -lORBit -lIIOP -lORBitutil -lglib -lm
CFLAGS = $(ORBIT_CFLAGS)
LFLAGS = $(ORBIT_LIBS)

all : idltargets $(PROJECT)-client $(PROJECT)-server

$(PROJECT)-client : $(PROJECT)-client.o $(PROJECT)-common.o $(PROJECT)-stubs.o
    $(CC) -o $(PROJECT)-client $(PROJECT)-client.o $(PROJECT)-stubs.o $(PROJECT)-common.o  -lIIOP -lORBit -lORBitutil $(LFLAGS)

$(PROJECT)-server : $(PROJECT)-server.o $(PROJECT)-skels.o $(PROJECT)-common.o
    $(CC) -o $(PROJECT)-server $(PROJECT)-server.o $(PROJECT)-skels.o $(PROJECT)-common.o  -lIIOP -lORBit -lORBitutil $(LFLAGS)


clean :
    rm *.[oa] $(PROJECT)-client $(PROJECT)-server

real-clean : clean
    rm -f $(PROJECT)-stubs.[oc] $(PROJECT)-skels.[oc] $(PROJECT).h $(PROJECT)-common.[oc]
 
idltargets : $(PROJECT).idl
    $(ORBIT_IDL) $(PROJECT).idl

# individual rules

$(PROJECT)-stubs.c : $(PROJECT).idl
    $(ORBIT_IDL) $(PROJECT).idl

$(PROJECT)-common.c : $(PROJECT).idl
    $(ORBIT_IDL) $(PROJECT).idl

$(PROJECT)-skels.c : $(PROJECT).idl
    $(ORBIT_IDL) $(PROJECT).idl

$(PROJECT)-client.c : $(PROJECT).h

$(PROJECT)-server.c : $(PROJECT).h

$(PROJECT).h : $(PROJECT).idl
    $(ORBIT_IDL) $(PROJECT).idl