home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / edispm11.zip / EDisPM / SRC / Client / EDCSTUB.CPP < prev    next >
Text File  |  1996-05-17  |  12KB  |  453 lines

  1. /* EDCStub.cpp: EDClientStub:   EDisPM.EXE V 1.1 */
  2. /* Editorclient - DSOM-Anbindungsverwaltung      */
  3. /*                                               */
  4. /* (C) 1995 M.Schwarz, FoPra TU-Muenchen SS1995  */
  5. /* (C) 1996 M.Schwarz, SOMObjects-Programmierung */
  6. /*                     OS/2 Inside 7/96          */
  7. /*                                               */
  8. /* latest changes: 11.5.1996                     */
  9. /*-----------------------------------------------*/
  10.  
  11. #include "EDCStub.HPP"
  12. #include "EDADM.HPP"
  13.  
  14. /* IUICL Headers */
  15. #include <imsgbox.hpp>
  16. #include <iwindow.hpp>
  17.  
  18.  
  19. EDClientStub::EDClientStub (IWindow *fw, IString uname) :
  20.    userName(uname)
  21. {
  22.    edClientStatus = 0;
  23.  
  24.    ev = new Environment;
  25.  
  26.   // Initialisierung von SOM/DSOM
  27.    SOM_InitEnvironment(ev);
  28.    SOMD_Init(ev);
  29.  
  30.    /*
  31.       Prüfung, ob Server "EDisServ" im Implementation Repository
  32.       eingetragen ist, wenn nein, wird ein Eintrag erstellt
  33.    */
  34.  
  35.    sequence(ImplementationDef) impldefs;
  36.    ImplementationDef *impldef;
  37.  
  38.    impldefs = SOMD_ImplRepObject->find_impldef_by_class(ev, "EDService");
  39.    if ((sequenceLength(impldefs)<=0) || (ev->_major == SYSTEM_EXCEPTION)) {
  40.      /* Fehler im ImplRep, Eintrag neu einfügen */
  41.      /* Eintrag: Server EDService, Klassen: EDisServ, EDText, EDLine */
  42.  
  43.      // get hostname from environment
  44.       IString hostname(getenv("HOSTNAME"));
  45.       if ((hostname == "") || (hostname == "0"))
  46.          hostname = "localhost";
  47.  
  48.       impldef = new ImplementationDef();
  49.       impldef->_set_impl_alias(ev, "EDisServ");
  50.       impldef->_set_impl_program(ev, "SOMDSVR.EXE");
  51.       impldef->_set_impl_flags(ev, 0);
  52.       impldef->_set_impl_server_class(ev, "SOMDServer");
  53.       impldef->_set_impl_hostname(ev, hostname);
  54.  
  55.       SOMD_ImplRepObject->add_impldef(ev, impldef);
  56.       impldef = SOMD_ImplRepObject->find_impldef_by_alias(ev, "EDisServ");
  57.       if (!SOMOpOK(ev)) {
  58.          return;
  59.       } /* endif */
  60.  
  61.       ImplId implid;
  62.  
  63.       implid = impldef->_get_impl_id(ev);
  64.       SOMD_ImplRepObject->add_class_to_impldef(ev, implid, "EDLine");
  65.       SOMD_ImplRepObject->add_class_to_impldef(ev, implid, "EDText");
  66.       SOMD_ImplRepObject->add_class_to_impldef(ev, implid, "EDService");
  67.  
  68.    } /* endif */
  69.  
  70. }
  71.  
  72.  
  73.  
  74. EDClientStub::~EDClientStub()
  75. {
  76.    /* SOM/DSOM: Entinitialisieren von SOM/DSOM */
  77.     SOMD_Uninit(ev);
  78.     SOM_UninitEnvironment(ev);
  79. }
  80.  
  81.  
  82.  
  83. short EDClientStub::isClientStubReady()
  84. {
  85.    short rc = 0;
  86.  
  87.    return rc;
  88. }
  89.  
  90.  
  91.  
  92. short EDClientStub::logonEDSObj(IString *docId, IString *docFilePath, IString *docDSomServer, IString uName)
  93. {
  94.    short rc = 0;
  95.    long lines = 0;
  96.  
  97.    userName = uName;
  98.    fileName = *docFilePath;
  99.  
  100.    edClientStatus = 0;
  101.  
  102.    if (*docDSomServer == "NO") {
  103.  
  104.      /* Neues EDService-Object erstellen */
  105.       ed = (EDService *) SOMD_ObjectMgr->somdNewObject(ev, "EDService", NULL);
  106.       if (!SOMOpOK(ev)) return -1;
  107.  
  108.       edClientStatus = 1;
  109.  
  110.      /* Object-Reference als docDSomServer zurückgeben (CORBA) */
  111.       *docDSomServer = SOMD_ORBObject->object_to_string(ev, (SOMDObject*)ed);
  112.  
  113.      /* EDService-Object: Laden der Datei *docFilePath */
  114.       rc = loadtext(fileName);
  115.       if (rc < 0) {
  116.         /* Lösche EDService-Object (auf lokaler und Server-Seite) */
  117.          SOMD_ObjectMgr->somdDestroyObject(ev, ed);
  118.          edClientStatus = 0;
  119.          return -1;
  120.       } /* endif */
  121.  
  122.       rc = 1;
  123.    } else {
  124.  
  125.      /* Verbindung zu EDService-Object aufbauen (CORBA) */
  126.       ed = (EDService*) SOMD_ORBObject->string_to_object(ev, *docDSomServer);
  127.       if (!SOMOpOK(ev)) return -1;
  128.  
  129.       edClientStatus = 1;
  130.  
  131.       rc = 0;
  132.    } /* endif */
  133.  
  134.    edClientStatus = 2;
  135.    eventCnt = 0;
  136.    dokuName = *docId;
  137.  
  138.   // Registerung beim EDService text server
  139.    short nameCount = joinsession(userName);
  140.    if (nameCount < 0) {         // error
  141.       edClientStatus = 0;
  142.       SOMD_ObjectMgr->somdReleaseObject(ev, ed);
  143.       return -1;
  144.    } else if (nameCount > 0) {  // username already in userlist
  145.      userName = userName + ":" + IString(nameCount);
  146.    } /* endif */
  147.    return rc;
  148. }
  149.  
  150.  
  151. short EDClientStub::logoffEDSObj()
  152. {
  153.    short rc;
  154.    _IDL_SEQUENCE_string ulist;
  155.  
  156.   // Unregistriere dich beim EDService text server
  157.    leavesession(userName);
  158.  
  159.   /* Prüfe, ob noch User den Text bearbeiten */
  160.    rc = getusers(&ulist);
  161.  
  162.    if (ulist._length == 0) {
  163.      /* Kein User mehr, beende EDService-Object */
  164.       EDDocAdmin DocVerw(IWindow::objectWindow());
  165.       IString    noEDServiceRef("NO");
  166.  
  167.      /* Lösche EDService-Object-Reference aus Profile */
  168.       DocVerw.openProfile();
  169.       DocVerw.setServer(&dokuName, &noEDServiceRef);
  170.      /* EDService-Object:Text speichern */
  171.       savetext(fileName);
  172.      /* Lösche EDService-Object (auf lokaler und Server-Seite) */
  173.       SOMD_ObjectMgr->somdDestroyObject(ev, ed);
  174.  
  175.    } else {
  176.  
  177.      /* EDService-Object:Text speichern */
  178.       savetext(fileName);
  179.      /* Lösche lokalen Vertreter des EDService-Objects */
  180.       SOMD_ObjectMgr->somdReleaseObject(ev, ed);
  181.  
  182.    } /* endif */
  183.  
  184.    dokuName = "";
  185.    fileName = "";
  186.  
  187.    return 0;
  188. }
  189.  
  190.  
  191. IString EDClientStub::getLogonFileNameStr()
  192. {
  193.    return fileName;
  194. }
  195.  
  196.  
  197. IString EDClientStub::getLogonUserNameStr()
  198. {
  199.    return userName;
  200. }
  201.  
  202. Boolean EDClientStub::changeLogonUserNameStr(IString uName)
  203. {
  204.    IString oldUserName = userName;
  205.  
  206.    userName = uName;
  207.  
  208.   // Registerung beim EDService text server
  209.    short nameCount = joinsession(userName);
  210.    if (nameCount < 0) {         // error
  211.       userName = oldUserName;
  212.       return false;
  213.    } else if (nameCount > 0) {  // username already in userlist
  214.      userName = userName + ":" + IString(nameCount);
  215.    } /* endif */
  216.  
  217.   // Jetzt alten Benutzernamen unregistrieren
  218.    leavesession(oldUserName);
  219.  
  220.    return true;
  221. }
  222.  
  223.  
  224. short EDClientStub::SOMOpOK(Environment *ev)
  225. {
  226.     char *exID;
  227.  
  228.     switch (ev->_major)
  229.     {
  230.       case SYSTEM_EXCEPTION:
  231.         {
  232.            exID = somExceptionId(ev);
  233.            errorMsgBox("SOM / DSOM", "System exception: " + IString(exID) + ".");
  234.            exception_free(ev);
  235.         }
  236.         return (FALSE);
  237.  
  238.       case USER_EXCEPTION:
  239.         {
  240.            exID = somExceptionId(ev);
  241.            errorMsgBox("SOM / DSOM", "User exception: " + IString(exID) + ".");
  242.            exception_free(ev);
  243.         }
  244.         return (FALSE);
  245.  
  246.       case NO_EXCEPTION:
  247.         return (TRUE);
  248.  
  249.       default:
  250.         {
  251.            errorMsgBox("SOM / DSOM", "Ungültige SOM-Fehlerbehandlungsangabe.");
  252.            exception_free(ev);
  253.         }
  254.         return (FALSE);
  255.    }
  256. }
  257.  
  258.  
  259.  
  260. void EDClientStub::errorMsgBox(IString title, IString text) {
  261.    IMessageBox imb(IWindow::objectWindow());
  262.    imb.setTitle("Fehler: "+title);
  263.    imb.show(text, IMessageBox::okButton);
  264. }
  265.  
  266.  
  267.  
  268. /* EDClient -> EDService Funktionen */
  269.  
  270. short EDClientStub::loadtext(IString filePath) {
  271.    short rc;
  272.    IString inActTxt = infoA->inactiveText();
  273.  
  274.    infoA->setInactiveText("SOM/DSOM: loadtext");
  275.    rc = ed->loadtext(ev, filePath);
  276.    SOMOpOK(ev);
  277.    switch (rc) {
  278.    case -1:
  279.    {  /* fileName ungültig bzw. sonstiger Ladefehler! */
  280.       IMessageBox imb(IWindow::objectWindow());
  281.       imb.setTitle("Benutzerfehler");
  282.       imb.show("Auf die Datei "+filePath+" konnte vom EDisPM-Server nicht zugegriffen werden.", IMessageBox::cancelButton);
  283.    }   break;
  284.    case -2:
  285.    case -3:
  286.    {   IMessageBox imb(IWindow::objectWindow());
  287.       imb.setTitle("EDisPM-Textverwaltungsfehler");
  288.       imb.show("Beim Laden des Dokuments ist ein (Speicher-)Fehler aufgetreten.", IMessageBox::cancelButton);
  289.    }   break;
  290.    default:
  291.      break;
  292.    } /* endswitch */
  293.    infoA->setInactiveText(inActTxt);
  294.    return(rc);
  295. }
  296.  
  297. short EDClientStub::savetext(IString filePath) {
  298.    short rc;
  299.    IString inActTxt = infoA->inactiveText();
  300.  
  301.    infoA->setInactiveText("SOM/DSOM: savetext");
  302.    rc = ed->savetext(ev, filePath);
  303.    SOMOpOK(ev);
  304.    infoA->setInactiveText(inActTxt);
  305.    return(rc);
  306. }
  307.  
  308. short EDClientStub::gettext(_IDL_SEQUENCE_long *llist) {
  309.    short rc;
  310.    IString inActTxt = infoA->inactiveText();
  311.  
  312.    infoA->setInactiveText("SOM/DSOM: gettext");
  313.    rc = ed->getText(ev, llist);
  314.    SOMOpOK(ev);
  315.    infoA->setInactiveText(inActTxt);
  316.    return(rc);
  317. };
  318.  
  319. short EDClientStub::getline(long lnr, EDLine **edLine, char* uName) {
  320.    short rc;
  321.    IString inActTxt = infoA->inactiveText();
  322.  
  323.    infoA->setInactiveText("SOM/DSOM: getline");
  324.    rc = ed->get_edline(ev, lnr, edLine, uName);
  325.    SOMOpOK(ev);
  326.    infoA->setInactiveText(inActTxt);
  327.    return(rc);
  328. }
  329.  
  330. short EDClientStub::putline(long lnr, IString line, long vnr, char* uName) {
  331.    short rc;
  332.    IString inActTxt = infoA->inactiveText();
  333.  
  334.    infoA->setInactiveText("SOM/DSOM: putline");
  335.    rc = ed->put_edline(ev, lnr, line, vnr, uName);
  336.    SOMOpOK(ev);
  337.    infoA->setInactiveText(inActTxt);
  338.    return(rc);
  339. }
  340.  
  341. short EDClientStub::insline(long prelnr, EDLine **edLine, char *uName) {
  342.    short rc;
  343.    IString inActTxt = infoA->inactiveText();
  344.  
  345.    infoA->setInactiveText("SOM/DSOM: insline");
  346.    rc = ed->ins_edline(ev, prelnr, edLine, uName);
  347.    SOMOpOK(ev);
  348.    infoA->setInactiveText(inActTxt);
  349.    return(rc);
  350. }
  351.  
  352. short EDClientStub::delline(long lnr, long vnr, char *uName) {
  353.    short rc;
  354.     IString inActTxt = infoA->inactiveText();
  355.  
  356.    infoA->setInactiveText("SOM/DSOM: delline");
  357.    rc = ed->del_edline(ev, lnr, vnr, uName);
  358.    SOMOpOK(ev);
  359.    infoA->setInactiveText(inActTxt);
  360.    return(rc);
  361. }
  362.  
  363. short EDClientStub::getlock(long lnr, long vnr, char* uName) {
  364.    short rc;
  365.    EDLine *eline;
  366.    IString inActTxt = infoA->inactiveText();
  367.    infoA->setInactiveText("SOM/DSOM: getlock");
  368.    rc = ed->getlock(ev, lnr, vnr, uName);
  369.    SOMOpOK(ev);
  370.    infoA->setInactiveText(inActTxt);
  371.    return(rc);
  372. }
  373.  
  374. short EDClientStub::rellock(long lnr, char* uName) {
  375.    short rc;
  376.    IString inActTxt = infoA->inactiveText();
  377.  
  378.    infoA->setInactiveText("SOM/DSOM: rellock");
  379.    rc = ed->rellock(ev, lnr, uName);
  380.    SOMOpOK(ev);
  381.    infoA->setInactiveText(inActTxt);
  382.    return(rc);
  383. }
  384.  
  385. short EDClientStub::appendline(long lnr, long vnr, char* uName) {
  386.    short rc;
  387.    IString inActTxt = infoA->inactiveText();
  388.  
  389.    infoA->setInactiveText("SOM/DSOM: appendline");
  390.    rc = ed->appendline(ev, lnr, vnr, uName);
  391.    SOMOpOK(ev);
  392.    infoA->setInactiveText(inActTxt);
  393.    return(rc);
  394. };
  395.  
  396.  
  397. short EDClientStub::getinfo(long * nlines, long* ecnt, char* uName) {
  398.    short rc;
  399.    IString inActTxt = infoA->inactiveText();
  400.  
  401.    infoA->setInactiveText("SOM/DSOM: getinfo");
  402.    rc = ed->getinfo(ev, nlines, ecnt, uName);
  403.    SOMOpOK(ev);
  404.    infoA->setInactiveText(inActTxt);
  405.    return(rc);
  406. };
  407.  
  408. short EDClientStub::joinsession(char *uName) {
  409.    short rc;
  410.    IString inActTxt = infoA->inactiveText();
  411.  
  412.    infoA->setInactiveText("SOM/DSOM: joinsession");
  413.    rc = ed->joinsession(ev, uName);
  414.    if (!SOMOpOK(ev))
  415.       rc = -10;
  416.    infoA->setInactiveText(inActTxt);
  417.    return(rc);
  418. };
  419.  
  420. short EDClientStub::leavesession(char *uName) {
  421.    short rc;
  422.    IString inActTxt = infoA->inactiveText();
  423.  
  424.    infoA->setInactiveText("SOM/DSOM: leavesession");
  425.    rc = ed->leavesession(ev, uName);
  426.    SOMOpOK(ev);
  427.    infoA->setInactiveText(inActTxt);
  428.    return(rc);
  429. };
  430.  
  431. short EDClientStub::getusers(_IDL_SEQUENCE_string *ulist) {
  432.    short rc;
  433.    IString inActTxt = infoA->inactiveText();
  434.  
  435.    infoA->setInactiveText("SOM/DSOM: getusers");
  436.    rc = ed->getusers(ev, ulist);
  437.    SOMOpOK(ev);
  438.    infoA->setInactiveText(inActTxt);
  439.    return(rc);
  440. };
  441.  
  442. short EDClientStub::getevents(_IDL_SEQUENCE_long *elist, char *uName) {
  443.    short rc;
  444.    IString inActTxt = infoA->inactiveText();
  445.  
  446.    infoA->setInactiveText("SOM/DSOM: getevents");
  447.    rc = ed->getevents(ev, &eventCnt, elist, uName);
  448.    SOMOpOK(ev);
  449.    infoA->setInactiveText(inActTxt);
  450.    return(rc);
  451. };
  452.  
  453.