home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / samples / som / somd / cpp / event / eventsvr.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-22  |  13.2 KB  |  459 lines

  1. //
  2. //   COMPONENT_NAME: somx
  3. //
  4. //   ORIGINS: 27
  5. //
  6. //
  7. //   10H9767, 10H9769  (C) COPYRIGHT International Business Machines Corp. 1992,1994
  8. //   All Rights Reserved
  9. //   Licensed Materials - Property of IBM
  10. //   US Government Users Restricted Rights - Use, duplication or
  11. //   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  12. //
  13.  
  14. /* %Z% %I% %W% %G% %U% [%H% %T%] */
  15. /*
  16.  *
  17.  * DISCLAIMER OF WARRANTIES.
  18.  * The following [enclosed] code is sample code created by IBM
  19.  * Corporation. This sample code is not part of any standard or IBM
  20.  * product and is provided to you solely for the purpose of assisting
  21.  * you in the development of your applications.  The code is provided
  22.  * "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
  23.  * NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  24.  * FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
  25.  * THIS CODE.  IBM shall not be liable for any damages arising out of
  26.  * your use of the sample code, even if they have been advised of the
  27.  * possibility of such damages.
  28.  *
  29.  * DISTRIBUTION.
  30.  * This sample code can be freely distributed, copied, altered, and
  31.  * incorporated into other software, provided that it bears the above
  32.  * Copyright notice and DISCLAIMER intact.
  33.  */
  34.  
  35.  
  36. /*
  37.  *  This is a generic server which can use the shared server or persistent
  38.  *  server activation policy.
  39.  *
  40.  */
  41.  
  42. #ifndef _ALL_SOURCE
  43. #define _ALL_SOURCE
  44. #endif
  45.  
  46. #include <windows.h>
  47. #include <stdlib.h>
  48. #include <string.h>
  49. #include <signal.h>
  50. #include <somd.xh>
  51. #include <orb.xh>
  52. #include <somoa.xh>
  53. #include <implrep.xh>
  54. #include <impldef.xh>
  55. #include <intfacdf.xh>
  56. #include <somdom.xh>
  57.  
  58. #include "cell.xh"
  59. #include "eventcom.xh"
  60. #include "eventch.xh"
  61.  
  62. /************************************************************
  63. 19982
  64. Given file name, return a file name with the prefix for
  65. the temporary directory . Return NULL if insufficient buffer space.
  66. Note: This implementation returns pointer to a static variable.
  67. *************************************************************/
  68. #define TEMP_FILE_NAME_SIZE 256
  69. static char tempFileName[TEMP_FILE_NAME_SIZE];
  70. char *TmpFileName(char *fname){
  71. int len;
  72.     len = GetEnvironmentVariable("TEMP", tempFileName, TEMP_FILE_NAME_SIZE);
  73.     if ( len == 0 || (len+strlen(fname)+1 > TEMP_FILE_NAME_SIZE) )
  74.         return NULL;
  75.     strcat(tempFileName,"\\");
  76.     strcat(tempFileName, fname);
  77.     return tempFileName;
  78. }
  79.  
  80. /***************************************************
  81. Messages for NLS support
  82. ****************************************************/
  83. #include "eventsvr.h"
  84. #include "nlsutil.h"
  85. static char *nlsmsgs[ENDNLSID-STARTNLSID+1];
  86. #define GetNlsMessage(id) nlsmsgs[id-STARTNLSID]
  87. #define SetNlsMessage(id, str) nlsmsgs[id-STARTNLSID] = (str);
  88.  
  89. /**********************************************************
  90. 18953: NLS support
  91. This procedure must be called first to initialize all the messages
  92. to be used by irdump. These messages are obtained from the resource file.
  93. ****************************************************************/
  94. static void InitNlsMsgs(){
  95. SetNlsMessage(ImplDefAliasId  , NlsMsgAlloc(ImplDefAliasId));
  96. SetNlsMessage(InvalidArgsId, NlsMsgAlloc(InvalidArgsId));
  97. SetNlsMessage(ImplreadyId , NlsMsgAlloc(ImplreadyId));
  98. SetNlsMessage(InitializeId     , NlsMsgAlloc(InitializeId));
  99. SetNlsMessage(FileCreateId , NlsMsgAlloc(FileCreateId));
  100. SetNlsMessage(LoopId     , NlsMsgAlloc(LoopId));
  101. SetNlsMessage(StartThreadId    , NlsMsgAlloc(StartThreadId));
  102. }
  103.  
  104. void cleanup(Environment *, long);
  105.  
  106. DWORD WINAPI  request_loop_thread(LPVOID);
  107. static HANDLE gThreadId = 0;
  108. static BOOL   gShutdown = 0;
  109.  
  110. typedef struct _THREADPARMS  {
  111.   HWND hwnd;
  112.   Cell *cellObj;
  113.   EventChannelAdmin_EventChannel *evchObj;
  114. } THREADPARMS;
  115.  
  116. #define WM_SOMDSVR  (WM_USER+0)
  117. #define checkEv(ev) ((ev)->_major != NO_EXCEPTION)
  118.  
  119. long APIENTRY WndProc(HWND, UINT, UINT, LONG);
  120. DWORD WINAPI eventsvrProcess(LPVOID);
  121.  
  122. #define MAX_ARGS 25
  123. #define ARG_LENGTH 80
  124.  
  125. char **Argv = NULL;
  126. long Argc = 1;
  127. long ProcessInputArgs(LPSTR, long *Argc, char **Argv, long argSize);
  128. int write_obj_ref(SOMDObject *objref, char *file);
  129.  
  130. char buffer[100] = "";
  131. static char szAppName[] = "Eventsvr";
  132.  
  133. Environment ev;
  134.  
  135. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
  136.                     LPSTR lpszCmdLine, int nCmdShow)
  137. {
  138.     HWND hwnd;
  139.     MSG nlsmsg;
  140.     WNDCLASS wndclass;
  141.     long i;
  142.  
  143.     InitNlsMsgs();
  144.     somEnvironmentNew();
  145.  
  146.     if (!hPrevInstance) {
  147.         wndclass.style = CS_HREDRAW | CS_VREDRAW;
  148.         wndclass.lpfnWndProc = WndProc;
  149.         wndclass.cbClsExtra = 0;
  150.         wndclass.cbWndExtra = 0;
  151.         wndclass.hInstance = hInstance;
  152.         wndclass.hIcon = LoadIcon(hInstance, szAppName);
  153.         wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  154.         wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
  155.         wndclass.lpszMenuName = NULL;
  156.         wndclass.lpszClassName = szAppName;
  157.         RegisterClass(&wndclass);
  158.     }
  159.  
  160.     hwnd = CreateWindow(szAppName, szAppName,
  161.                         WS_OVERLAPPEDWINDOW | WS_MINIMIZE,
  162.                         CW_USEDEFAULT, CW_USEDEFAULT,
  163.                         CW_USEDEFAULT, CW_USEDEFAULT,
  164.                         NULL, NULL, hInstance, NULL);
  165.  
  166.     ShowWindow(hwnd, SW_SHOW);
  167.  
  168.  
  169.     Argv = (char **) malloc(sizeof(char *) * MAX_ARGS);
  170.     for (i = 0; i < MAX_ARGS; ++i)
  171.         Argv[i] = (char *) calloc(ARG_LENGTH, sizeof(char *));
  172.  
  173.     ProcessInputArgs(lpszCmdLine, &Argc, Argv, MAX_ARGS);
  174.  
  175.     /* Start the server with Windows user message */
  176.     PostMessage(hwnd, WM_SOMDSVR, 0, 0);
  177.  
  178.     /* Windows message loop */
  179.     while (GetMessage(&nlsmsg, NULL, 0, 0)) {
  180.         TranslateMessage(&nlsmsg);
  181.         DispatchMessage(&nlsmsg);
  182.     }
  183.  
  184.     return nlsmsg.wParam;
  185.  
  186. }                                      /* end main */
  187.  
  188. long APIENTRY WndProc(HWND hwnd, UINT message, UINT wParam,
  189.                       LONG lParam)
  190. {
  191.     switch (message) {
  192.         case WM_SOMDSVR:
  193.             eventsvrProcess((LPVOID)hwnd);
  194.             return 0;
  195.  
  196.         case WM_DESTROY:
  197.             gShutdown = TRUE;
  198.             if (gThreadId)  {
  199.               Sleep(0);
  200.             }
  201.             cleanup(0,0);
  202.             PostQuitMessage(0);
  203.             return 0;
  204.     }
  205.     return DefWindowProc(hwnd, message, wParam, lParam);
  206. }
  207.  
  208.  
  209. DWORD WINAPI
  210. eventsvrProcess(LPVOID params)
  211. {
  212.     HWND hwnd = (HWND)(params);
  213.     int rc;
  214.     char *alias;
  215.     char buf[75] = "DSOM Server - ";
  216.     static THREADPARMS threadps;
  217.     static Cell *cellObj;
  218.     static SOMDObject *cellObj_proxy;
  219.     static SOMDObject *evchObj_proxy;
  220.     static EventChannelAdmin_EventChannel *evchObj;
  221.     static EventChannelAdmin_SupplierAdmin *supp_admin;
  222.     static EventComm_EventConnection *evcon_if;
  223.     static EventComm_Consumer *cons_if;
  224.     char *fname; /* 19982 */
  225.  
  226.     /* initialization */
  227.     SOM_InitEnvironment(&ev);
  228.     SOMD_Init(&ev);
  229.     SOMD_SOMOAObject = new SOMOA;
  230.  
  231.     /* Parse arguments */
  232.     switch (Argc) {
  233.  
  234.         case 2:
  235.  
  236.             /* alias passed  */
  237.             alias = Argv[1];
  238.             strcat(buf, alias);
  239.             SetWindowText(hwnd, buf);
  240.             /* get ImplementationDef from input alias */
  241.             SOMD_ImplDefObject = SOMD_ImplRepObject->find_impldef_by_alias(&ev, alias);
  242.             if ((SOMD_ImplDefObject == NULL) || checkEv(&ev)) {
  243.                 wsprintf(buffer, GetNlsMessage(ImplDefAliasId),
  244.                          (LPSTR) somExceptionId(&ev));
  245.                 MessageBox(hwnd, buffer, "TstServer", MB_ICONSTOP);
  246.                 cleanup(&ev,1);
  247.             }
  248.             break;
  249.  
  250.  
  251.         default:
  252.             MessageBox(hwnd, GetNlsMessage(InvalidArgsId), "TstServer",
  253.                        MB_ICONSTOP);
  254.             cleanup(&ev,1);
  255.             break;
  256.  
  257.     }                                  /* switch */
  258.  
  259.     EventComm_EventConnectionNewClass(0, 0);
  260.  
  261.     if ((SOMD_ImplDefObject == NULL) || (SOMD_ORBObject == NULL)) {
  262.         MessageBox(hwnd, GetNlsMessage(InitializeId), "TstServer", MB_ICONSTOP);
  263.         cleanup(&ev,1);
  264.     }
  265.  
  266.     /* implementation now ready to process requests */
  267.     SOMD_SOMOAObject->impl_is_ready(&ev, SOMD_ImplDefObject);
  268.     if (checkEv(&ev)) {
  269.         sprintf(GetNlsMessage(ImplreadyId),
  270.                 (LPSTR) somExceptionId(&ev));
  271.         MessageBox(hwnd, buffer, "TstServer", MB_ICONSTOP);
  272.         cleanup(&ev,1);
  273.     }
  274.  
  275.     /* Create the cell object  */
  276.     cellObj = new Cell;
  277.  
  278.     /* Create a DSOM object reference for the cellObj  */
  279.     cellObj_proxy = SOMD_SOMOAObject->create_SOM_ref(&ev, cellObj, SOMD_ImplDefObject);
  280.  
  281.     /* Create EventChannel object  */
  282.     evchObj = new EventChannelAdmin_EventChannel;
  283.  
  284.     /* Create a DSOM object reference for evch  */
  285.     evchObj_proxy = SOMD_SOMOAObject->create_SOM_ref(&ev, evchObj, SOMD_ImplDefObject);
  286.  
  287.     /*
  288.      * Get a supplier admin obj and add a push style supplier onto the event
  289.      * channel using this admin interface. Returns a consumer interface which
  290.      * will be used by the supplier
  291.      */
  292.     supp_admin = evchObj->for_suppliers(&ev);
  293.     evcon_if = new EventComm_EventConnection;
  294.     cons_if = supp_admin->add_push_supplier(&ev, evcon_if);
  295.  
  296.     /* let the cell object know what the consumer_if is */
  297.     cellObj->setConsumerIf(&ev, cons_if);
  298.  
  299.     /* Write out the string representations of the object references */
  300.     /* 19982 */
  301.     fname = TmpFileName("cell.rep");
  302.     if (fname == NULL){
  303.         SOMD_ImplDefObject->somFree();
  304.         cellObj->somFree();
  305.         evchObj->somFree();
  306.         cleanup(&ev,1);
  307.     }
  308.  
  309.     rc = write_obj_ref(cellObj_proxy, fname /* 19982 "cell.rep"*/ );
  310.     if (rc) {
  311.         SOMD_ImplDefObject->somFree();
  312.         cellObj->somFree();
  313.         evchObj->somFree();
  314.         cleanup(&ev,1);
  315.     }
  316.  
  317.     /* 19982 */
  318.     fname = TmpFileName("event.rep");
  319.     if (fname == NULL){
  320.         SOMD_ImplDefObject->somFree();
  321.         cellObj->somFree();
  322.         evchObj->somFree();
  323.         cleanup(&ev,1);
  324.     }
  325.  
  326.     rc = write_obj_ref(evchObj_proxy, fname /* 19982 "event.rep"*/);
  327.     if (rc) {
  328.         SOMD_ImplDefObject->somFree();
  329.         cellObj->somFree();
  330.         evchObj->somFree();
  331.         cleanup(&ev,1);
  332.     }
  333.  
  334.     /*
  335.     **  kick off a thread to process the messages so control can
  336.     **  can go back top our message loop
  337.     */
  338.     threadps.hwnd = hwnd;
  339.     threadps.cellObj = cellObj;
  340.     threadps.evchObj = evchObj;
  341.  
  342.     if ((gThreadId = CreateThread(NULL, /* security descriptor */
  343.                                   0L, /* stack size - 0 means use default */
  344.                                   request_loop_thread, /* thread function */
  345.                                   (LPVOID)&threadps, /* function parameters */
  346.                                   0, /* startup flags */
  347.                                   (LPDWORD)&gThreadId)) == NULL) {
  348.        MessageBox(hwnd, "could_not_start_thread\n", "EventServer", MB_ICONSTOP);
  349.        cleanup(&ev, 1);
  350.     }
  351.  
  352.     return 0;
  353. }
  354.  
  355. long ProcessInputArgs(LPSTR lpszCmdLine, long *Argc, char **Argv, long
  356.                        argSize)
  357. {
  358.  
  359.     char *c;
  360.     long i;
  361.  
  362.     *Argc = 1;                         /* lpszCmdLine does not argv[0] */
  363.  
  364.     /* lpszCmdLine has command line arguments delimited by blanks */
  365.  
  366.     c = strtok((char *) lpszCmdLine, " ");
  367.  
  368.     for (i = 0; i < argSize; ++i) {
  369.         if (c == NULL)
  370.             break;
  371.         strcpy((char *) Argv[*Argc], (char *) c);
  372.         c = strtok(NULL, " ");
  373.         *Argc += 1;
  374.     }
  375.     return *Argc;
  376. }
  377.  
  378.  
  379. /*
  380.  *  Frees local and global DSOM objects.
  381.  */
  382.  
  383. void cleanup(Environment * ev, long rc)
  384. {
  385.   Environment  lev;
  386.   Environment *pev = &lev;
  387.  
  388.   if (!ev)
  389.     SOM_InitEnvironment(pev);
  390.   else
  391.     pev = ev;
  392.  
  393.   if (SOMD_SOMOAObject && SOMD_ImplDefObject)
  394.      SOMD_SOMOAObject->deactivate_impl(pev, SOMD_ImplDefObject);
  395.  
  396.   SOMD_Uninit(pev);
  397.   SOM_UninitEnvironment(pev);
  398.   somEnvironmentEnd();
  399.  
  400.   if (ev) exit((int)rc);
  401. }
  402.  
  403.  
  404. int write_obj_ref(SOMDObject *objref, char *file)
  405. {
  406.     FILE *fd;
  407.     char *objRefStr;
  408.  
  409.     objRefStr = (char *)(SOMD_ORBObject->object_to_string(&ev, objref));
  410.  
  411.     if ((fd = fopen(file, "w")) == (FILE *) NULL) {
  412.         sprintf(buffer, GetNlsMessage(FileCreateId), 
  413.                 (LPSTR) file, errno);
  414.         MessageBox((HWND) NULL, buffer, "TstServer", MB_ICONSTOP);
  415.         return -1;
  416.     }
  417.  
  418.     fwrite((void *) objRefStr, sizeof(char), strlen(objRefStr), fd);
  419.  
  420.     ORBfree(objRefStr);
  421.     fclose(fd);
  422.     return (0);
  423. }
  424.  
  425. /*
  426. ** thread for the request loop.
  427. */
  428.  
  429. DWORD WINAPI
  430. request_loop_thread(LPVOID params)
  431. {
  432.   THREADPARMS  *tparams = (THREADPARMS *)params;
  433.   HWND         hwnd = tparams->hwnd;
  434.   Environment  ev;
  435.   char         lbuffer[64];
  436.  
  437.   SOM_InitEnvironment(&ev);
  438.  
  439.   while (gShutdown == 0) {
  440.     /* process requests until deactivation */
  441.     (void) SOMD_SOMOAObject->execute_request_loop(&ev, SOMD_WAIT);
  442.     if (checkEv(&ev)) {
  443.         wsprintf(lbuffer, GetNlsMessage(LoopId),
  444.                  (LPSTR) somExceptionId(&ev));
  445.         MessageBox(hwnd, lbuffer, "EventServer", MB_ICONSTOP);
  446.         cleanup(&ev,1);
  447.     }
  448.   }
  449.  
  450.   tparams->cellObj->somFree();
  451.   tparams->evchObj->somFree();
  452.  
  453.   SOM_UninitEnvironment(&ev);
  454.  
  455.   return(0L);
  456.   
  457. }
  458.  
  459.