The following example shows the source modules for the sample Workplace Shell DSOM program:

/*
 * Purpose..: To demonstrate how to call Workplace Shell
 * methods using DSOM.
 *
 * Workplace Shell methods called:
 *        _wpclsQueryFolder()
 *        _wpclsNew()
 *        _wpSetup()
 *        _wpOpen()
 *        _wpDelete()
 */

#pragma info(nogen)

#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#define  INCL_DOS
#define  INCL_WINWORKPLACE
#define  INCL_PM
#include <os2.h>
#include <somd.h>
#include <somtcnst.h>
#include <wpobject.h>
#include <wpdesk.h>
#include <wpabs.h>
#include <wpfolder.h>
#include <wptrans.h>
#include <wpmet.h>
#include <wpclrpal.h>
#include <wpdataf.h>
#include <wpclsmgr.h>

enum {STOP, START};

WPClassManager *vWPClassManagerObject;

BOOL       checkForError(Environment *, char *, ...);
SOMClass * getClassObject(SOMClass *, Environment *, string);

int main(int argc, char *argv[])
{
  Environment *ev;
  SOMClass   *Server;
  SOMObject  *objDesktop;
  SOMObject  *objWPAbs;
  SOMObject  *objWPFolder;
  SOMObject  *object;
  M_WPFolder *classFolder;
  APIRET     apiRtnCd;
  BOOL       fDaemonUp;
  BOOL       fServerUp;

  /*
   * Check if the DSOM daemon is active.
   * If not, it needs to be started before continuing.
   */
  fDaemonUp = WinIsSOMDDReady();
  if (!fDaemonUp)
  {
    apiRtnCd = WinRestartSOMDD(START);
    if (apiRtnCd)
    {
      somPrintf("Unable to start the DSOM dameon, rc=%ld\n", apiRtnCd);
      exit(apiRtnCd);
    }
  }

  /*
   * Check if the Workplace Shell DSOM server is up and running.
   * If not, it needs to be started before continuing.
   */
  fServerUp = WinIsWPDServerReady();
  if (!fServerUp)
  {
    apiRtnCd = WinRestartWPDServer(START);
    if (apiRtnCd)
    {
      somPrintf("Unable to start the DSOM server, rc=%ld\n", apiRtnCd ;
      exit(apiRtnCd);
    }
  }

  /*
   * Create the local DSOM environment
   */
  ev = SOM_CreateLocalEnvironment();
  SOMD_Init(ev);

  /*
   * Merge the Workplace Shell class manager with the
   * SOM class manager
   */
  vWPClassManagerObject = WPClassManagerNew();
  _somMergeInto(SOMClassMgrObject, vWPClassManagerObject);

  /*
   * Initialize all the Workplace Shell classes used by the program
   */
  WPObjectNewClass( 1, 1 );
  WPTransientNewClass( 1, 1 );
  WPAbstractNewClass( 1, 1 );
  WPFileSystemNewClass( 1, 1 );
  WPDataFileNewClass( 1, 1 );
  WPFolderNewClass( 1, 1 );
  WPMetNewClass( 1, 1 );
  WPDesktopNewClass( 1, 1 );

  /*
   * Find the Workplace Shell DSOM server by its name
   */
  Server = _somdFindServerByName(SOMD_ObjectMgr, ev, "wpdServer");
  checkForError(ev, "Could not find server 'wpdServer'\n");

  /*
   * Get a pointer to the WPFolder's class object
   */
  classFolder = getClassObject(Server, ev, "WPFolder");

  /*
   * Get the object pointer of the Desktop folder
   */
  objDesktop = _wpclsQueryFolder(classFolder, "<WP_DESKTOP>", TRUE);
  if (objDesktop)
  {
    /* Create an abstract object on the Desktop */
    somPrintf("Creating a WPAbstract object on Desktop: ");
    objWPAbs = _wpclsNew(getClassObject(Server, ev, "WPAbstract"),
                         "WPAbstract Object",   /* Title of the object */
                         "",                    /* Setup string        */
                         objDesktop,            /* Target folder       */
                         TRUE);                 /* Never dormant       */
    somPrintf("%s\n", objWPAbs ? "Succeeded" : "\aFailed");

    /*
     * Create a WPFolder object on the Desktop
     */
    somPrintf("Creating a opened WPFolder object on Desktop: ");
    objWPFolder = _wpclsNew(classFolder,                 /* Object's class name  */
                            "WPFolder Object",           /* Title of the object  */
                            "OPEN=ICON;ALWAYSSORT=YES",  /* Setup string         */
                            objDesktop,                  /* Target folder        */
                            TRUE );                      /* Never dormant        */
    somPrintf("%s\n", objWPFolder ? "Succeeded" : "\aFailed");

    /*
     * Create a WPDataFile object in the new folder on the Desktop
     */
    somPrintf("Creating a WPDataFile object in folder: ");
    object = _wpclsNew(getClassObject(Server, ev, "WPDataFile"),
                       "WPDataFile Object",   /* Title of the object */
                       "",                    /* Setup string        */
                       objWPFolder,           /* Target folder       */
                       TRUE);                 /* Never dormant       */
    somPrintf("%s\n", object ? "Succeeded" : "\aFailed");

    /*
     * Create a WPTransient object in the folder
     */
    somPrintf("Creating a WPTransient object in folder: ");
    object = _wpclsNew(getClassObject(Server, ev, "WPTransient"),
                       "WPTransient Object",   /* Title of the object */
                       "",                     /* setup string        */
                       objWPFolder,            /* Target folder       */
                       TRUE);                  /* Never dormant       */
    somPrintf( "%s\n", object ? "Succeeded" : "\aFailed" );

    /*
     * Create a metafile object in the folder
     */
    somPrintf("Creating a WPMet object in folder: ");
    object = _wpclsNew(getClassObject(Server, ev, "WPMet"),
                       "WPMet Object",   /* Title of the object */
                       "",               /* setup string        */
                       objWPFolder,      /* Target folder       */
                       TRUE);            /* Never dormant       */
    somPrintf("%s\n", object ? "Succeeded" : "\aFailed");

    /*
     * Open a Detail view of the folder
     */
    _wpSetup(objWPFolder, "OPEN=DETAILS");

    /*
     * Create a color palette in the folder and open palette
     */
    somPrintf("Creating a WPColorPalette object in folder: ");
    object = _wpclsNew(getClassObject(Server, ev, "WPColorPalette") ,
                       "WPColorPalette Object",   /* Title of the object */
                       "",                        /* Setup string        */
                       objWPFolder,               /* Target folder       */
                       TRUE);                     /* Never dormant       */

    somPrintf("%s\n", object ? "Succeeded" : "\aFailed");
    _wpOpen(object, NULLHANDLE, OPEN_DEFAULT, 0L);
    somPrintf("Deleting the WPAbstract object on the Desktop.\n");
    _wpDelete(objWPAbs, 0);
  }
  else
  {
    somPrintf("\aUnable to acquire the Desktop object pointer\n");
  }

  /*
   * Clean up the DSOM environment
   */
  _somdReleaseObject(SOMD_ObjectMgr, ev, Server);
  checkForError(ev, "_somdReleaseObject failed\n");
  SOMD_Uninit(ev);
  SOM_DestroyLocalEnvironment(ev);

  /*
   * If the Workplace Shell DSOM server was started
   * then, lets stop it before terminating
   */
  if (!fServerUp)
  {
    apiRtnCd = WinRestartWPDServer(STOP);
    if (apiRtnCd)
      somPrintf("Stopping the DSOM server was unsucessful, rc=%ld\n", apiRtnCd);
  }

  if (!fDaemonUp)
  {
    ULONG count = 0;

    /*
     * Loop until the server thread ends or the program times out
     */
    while(WinIsWPDServerReady())
    {
      HEV hev;

      /*
       * First create a private, reset, event semaphore.
       * Wait for 1 second, then try again for a maximum
       * of 30 seconds
       */
      DosCreateEventSem((PSZ) NULL, &hev, 0, FALSE);
      DosWaitEventSem(hev, 1000);
      if (count++ > 30)
        break;
    }
    apiRtnCd = WinRestartSOMDD(STOP);
    if (apiRtnCd)
      somPrintf("Stopping the DSOM daemon was unsucessful, rc=%ld\n", apiRtnCd);
  }
  return 0;
} /* End of main() */

/* getClassObject */
SOMClass *getClassObject(SOMClass *Server, Environment *ev, string sClassName)
{
  SOMClass *ClassObj = NULL;
  ClassObj = _somdGetClassObj(Server, ev, sClassName);
  if (checkForError(ev, NULL) || ClassObj == NULL)
  {
    somPrintf("\aCould not find class '%s'\n", sClassName);
    ClassObj = NULL;
  }
  return ClassObj;
}

/* Check for errors */
BOOL checkForError(Environment *ev, char *pchFmt, ...)
{
  va_list  vargs;
  char *exId;
  APIRET apiRtnCd = FALSE;

  switch(ev->_major)
  {
    case SYSTEM_EXCEPTION:
    {
      StExcep *params;
      exId   = somExceptionId(ev);
      params = somExceptionValue(ev);
      somPrintf("\a** Error Occurred **\n");
      somPrintf("** exception string: %s\n", exId);
      somPrintf("** minor error code: %u\n", params->minor);
      somPrintf("** completion code: %s\n",
                (params->completed == YES ? "YES" :
                 params->completed == NO ? "NO": "MAYBE" ));
      somExceptionFree(ev);

      if (pchFmt)
      {
        char achBuf[1024];
        va_start(vargs, pchFmt);
        vsprintf(achBuf, pchFmt, vargs);
        somPrintf(achBuf);
        va_end(vargs);
        SOMD_Uninit(ev);
        SOM_DestroyLocalEnvironment(ev);
        exit(1);
      }
      apiRtnCd = TRUE;
      break;
    }

    case USER_EXCEPTION:
    {
      if (pchFmt)
      {
        char achBuf[1024];
        va_start(vargs, pchFmt);
        vsprintf(achBuf, pchFmt, vargs);
        somPrintf(achBuf);
        va_end(vargs);
      }
      apiRtnCd = TRUE;
      break;
    }

    default:
    case NO_EXCEPTION:
    {
      apiRtnCd = FALSE;
      break;
    }
  }
  return(apiRtnCd);
}
#pragma info(nouse)


[Back] [Next]