00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00036 #include "OW_config.h"
00037 #include "OW_ConfigOpts.hpp"
00038 #include "OW_FileSystem.hpp"
00039 #include "OW_BinaryRequestHandler.hpp"
00040 #include "OW_BinarySerialization.hpp"
00041 #include "OW_Format.hpp"
00042 #include "OW_CIMOMHandleIFC.hpp"
00043 #include "OW_CIMFeatures.hpp"
00044 #include "OW_CIMParamValue.hpp"
00045 #include "OW_SocketUtils.hpp"
00046 #include "OW_CIMException.hpp"
00047 #include "OW_CIMProperty.hpp"
00048 #include "OW_CIMQualifier.hpp"
00049 #include "OW_Mutex.hpp"
00050 #include "OW_MutexLock.hpp"
00051 #include "OW_SocketException.hpp"
00052 #include "OW_ThreadCancelledException.hpp"
00053 #include "OW_Logger.hpp"
00054 #include "OW_OperationContext.hpp"
00055 #include "OW_UserUtils.hpp"
00056 #include "OW_ServiceIFCNames.hpp"
00057 #include "OW_ResultHandlerIFC.hpp"
00058 
00059 #include <exception>
00060 
00061 namespace OW_NAMESPACE
00062 {
00063 
00064 namespace
00065 {
00066    const String COMPONENT_NAME("ow.requesthandler.owbinary");
00067 }
00068 
00069 using namespace WBEMFlags;
00071 BinaryRequestHandler::BinaryRequestHandler()
00072    : RequestHandlerIFC()
00073    , m_userId(UserId(-1))
00074 {
00075 }
00077 RequestHandlerIFC*
00078 BinaryRequestHandler::clone() const
00079 {
00080    return new BinaryRequestHandler(*this);
00081 }
00083 String
00084 BinaryRequestHandler::getName() const
00085 {
00086    return ServiceIFCNames::BinaryRequestHandler;
00087 }
00089 void
00090 BinaryRequestHandler::setEnvironment(const ServiceEnvironmentIFCRef& env)
00091 {
00092    RequestHandlerIFC::setEnvironment(env);
00093 }
00095 void
00096 BinaryRequestHandler::doOptions(CIMFeatures& cf,
00097    OperationContext&)
00098 {
00099    cf.cimom = "openwbem";
00100    cf.cimProduct = CIMFeatures::SERVER;
00101    cf.extURL = "local_binary";
00102    cf.protocolVersion = OW_VERSION;
00103    cf.supportedGroups.clear();
00104    cf.supportedQueryLanguages.clear();
00105    cf.supportedQueryLanguages.append("WQL");
00106    cf.supportsBatch = false;
00107    cf.validation.erase();
00108 }
00110 void
00111 BinaryRequestHandler::doProcess(std::istream* istrm, std::ostream *ostrm,
00112    std::ostream* ostrError, OperationContext& context)
00113 {
00114    clearError();
00115    String userName = context.getStringDataWithDefault(OperationContext::USER_NAME);
00116    if (!userName.empty())
00117    {
00118       bool validUserName = false;
00119       m_userId = UserUtils::getUserId(userName, validUserName);
00120       if (!validUserName)
00121       {
00122          m_userId = UserId(-1);
00123       }
00124    }
00125    UInt8 funcNo = 0;
00126    LoggerRef lgr = getEnvironment()->getLogger(COMPONENT_NAME);
00127    try
00128    {
00129       CIMOMHandleIFCRef chdl = getEnvironment()->getCIMOMHandle(context);
00130       UInt32 version = 0;
00131       BinarySerialization::read(*istrm, version);
00132       if (version < MinBinaryProtocolVersion || version > BinaryProtocolVersion)
00133       {
00134          OW_THROWCIMMSG(CIMException::FAILED, "Incompatible version");
00135       }
00136       BinarySerialization::read(*istrm, funcNo);
00137       try
00138       {
00139          switch (funcNo)
00140          {
00141             case BIN_GETQUAL:
00142                OW_LOG_DEBUG(lgr, "BinaryRequestHandler get qualifier"
00143                   " request");
00144                getQual(chdl, *ostrm, *istrm);
00145                break;
00146 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00147             case BIN_SETQUAL:
00148                OW_LOG_DEBUG(lgr, "BinaryRequestHandler set qualifier"
00149                   " request");
00150                setQual(chdl, *ostrm, *istrm);
00151                break;
00152             case BIN_DELETEQUAL:
00153                OW_LOG_DEBUG(lgr, "BinaryRequestHandler delete qualifier"
00154                   " request");
00155                deleteQual(chdl, *ostrm, *istrm);
00156                break;
00157             case BIN_ENUMQUALS:
00158                OW_LOG_DEBUG(lgr, "BinaryRequestHandler enum qualifiers"
00159                   " request");
00160                enumQualifiers(chdl, *ostrm, *istrm);
00161                break;
00162 #endif // #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00163             case BIN_GETCLS:
00164                OW_LOG_DEBUG(lgr, "BinaryRequestHandler get class"
00165                   " request");
00166                getClass(chdl, *ostrm, *istrm);
00167                break;
00168 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00169             case BIN_CREATECLS:
00170                OW_LOG_DEBUG(lgr, "BinaryRequestHandler create class"
00171                   " request");
00172                createClass(chdl, *ostrm, *istrm);
00173                break;
00174             case BIN_MODIFYCLS:
00175                OW_LOG_DEBUG(lgr, "BinaryRequestHandler modify class"
00176                   " request");
00177                modifyClass(chdl, *ostrm, *istrm);
00178                break;
00179             case BIN_DELETECLS:
00180                OW_LOG_DEBUG(lgr, "BinaryRequestHandler delete class"
00181                   " request");
00182                deleteClass(chdl, *ostrm, *istrm);
00183                break;
00184 #endif // #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00185             case BIN_ENUMCLSS:
00186                OW_LOG_DEBUG(lgr, "BinaryRequestHandler enum classes"
00187                   " request");
00188                enumClasses(chdl, *ostrm, *istrm);
00189                break;
00190             case BIN_GETINST:
00191                OW_LOG_DEBUG(lgr, "BinaryRequestHandler get instance"
00192                   " request");
00193                getInstance(chdl, *ostrm, *istrm);
00194                break;
00195 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00196             case BIN_CREATEINST:
00197                OW_LOG_DEBUG(lgr, "BinaryRequestHandler create instance"
00198                   " request");
00199                createInstance(chdl, *ostrm, *istrm);
00200                break;
00201             case BIN_MODIFYINST:
00202                OW_LOG_DEBUG(lgr, "BinaryRequestHandler get instance"
00203                   " request");
00204                modifyInstance(chdl, *ostrm, *istrm);
00205                break;
00206             case BIN_DELETEINST:
00207                OW_LOG_DEBUG(lgr, "BinaryRequestHandler delete instance"
00208                   " request");
00209                deleteInstance(chdl, *ostrm, *istrm);
00210                break;
00211 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00212             case BIN_SETPROP:
00213                OW_LOG_DEBUG(lgr, "BinaryRequestHandler set property"
00214                   " request");
00215                setProperty(chdl, *ostrm, *istrm);
00216                break;
00217 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00218 #endif // #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00219 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00220             case BIN_GETPROP:
00221                OW_LOG_DEBUG(lgr, "BinaryRequestHandler get property"
00222                   " request");
00223                getProperty(chdl, *ostrm, *istrm);
00224                break;
00225 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00226             case BIN_ENUMCLSNAMES:
00227                OW_LOG_DEBUG(lgr, "BinaryRequestHandler enum class names"
00228                   " request");
00229                enumClassNames(chdl, *ostrm, *istrm);
00230                break;
00231             case BIN_ENUMINSTS:
00232                OW_LOG_DEBUG(lgr, "BinaryRequestHandler enum instances"
00233                   " request");
00234                enumInstances(chdl, *ostrm, *istrm);
00235                break;
00236             case BIN_ENUMINSTNAMES:
00237                OW_LOG_DEBUG(lgr, "BinaryRequestHandler enum instance"
00238                   " names request");
00239                enumInstanceNames(chdl, *ostrm, *istrm);
00240                break;
00241             case BIN_INVMETH:
00242                OW_LOG_DEBUG(lgr, "BinaryRequestHandler invoke method"
00243                   " request");
00244                invokeMethod(chdl, *ostrm, *istrm);
00245                break;
00246             case BIN_EXECQUERY:
00247                OW_LOG_DEBUG(lgr, "BinaryRequestHandler exec query"
00248                   " request");
00249                execQuery(chdl, *ostrm, *istrm);
00250                break;
00251 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00252             case BIN_ASSOCIATORS:
00253                OW_LOG_DEBUG(lgr, "BinaryRequestHandler associators"
00254                   " request");
00255                associators(chdl, *ostrm, *istrm);
00256                break;
00257             case BIN_ASSOCNAMES:
00258                OW_LOG_DEBUG(lgr, "BinaryRequestHandler associator names"
00259                   " request");
00260                associatorNames(chdl, *ostrm, *istrm);
00261                break;
00262             case BIN_REFERENCES:
00263                OW_LOG_DEBUG(lgr, "BinaryRequestHandler references"
00264                   " request");
00265                references(chdl, *ostrm, *istrm);
00266                break;
00267             case BIN_REFNAMES:
00268                OW_LOG_DEBUG(lgr, "BinaryRequestHandler reference names"
00269                   " request");
00270                referenceNames(chdl, *ostrm, *istrm);
00271                break;
00272 #endif
00273             case BIN_GETSVRFEATURES:
00274                OW_LOG_DEBUG(lgr, "BinaryRequestHandler get server"
00275                   " features request");
00276                getServerFeatures(chdl, *ostrm, *istrm);
00277                break;
00278             default:
00279                OW_LOG_DEBUG(lgr, Format("BinaryRequestHandler: Received"
00280                   " invalid function number: %1", funcNo));
00281                writeError(*ostrError, "Invalid function number");
00282                break;
00283          }
00284       }
00285       catch(CIMException& e)
00286       {
00287          OW_LOG_INFO(lgr, Format("CIM Exception caught in"
00288             " BinaryRequestHandler: %1", e));
00289          BinarySerialization::write(*ostrError, BIN_EXCEPTION);
00290          BinarySerialization::write(*ostrError, UInt16(e.getErrNo()));
00291          BinarySerialization::write(*ostrError, e.getMessage());
00292          setError(e.getErrNo(), e.getDescription());
00293       }
00294    }
00295    catch(Exception& e)
00296    {
00297       OW_LOG_ERROR(lgr, "Exception caught in BinaryRequestHandler");
00298       OW_LOG_ERROR(lgr, Format("Type: %1", e.type()));
00299       OW_LOG_ERROR(lgr, Format("File: %1", e.getFile()));
00300       OW_LOG_ERROR(lgr, Format("Line: %1", e.getLine()));
00301       OW_LOG_ERROR(lgr, Format("Msg: %1", e.getMessage()));
00302       writeError(*ostrError, Format("BinaryRequestHandler caught exception: %1", e).c_str());
00303       setError(CIMException::FAILED, e.getMessage());
00304       
00305    }
00306    catch(std::exception& e)
00307    {
00308       OW_LOG_ERROR(lgr, Format("Caught %1 exception in BinaryRequestHandler",
00309          e.what()));
00310       writeError(*ostrError, Format("BinaryRequestHandler caught exception: %1", e.what()).c_str());
00311       setError(CIMException::FAILED, e.what());
00312    }
00313    catch (ThreadCancelledException&)
00314    {
00315       OW_LOG_ERROR(lgr, "Thread cancelled in BinaryRequestHandler");
00316       writeError(*ostrError, "Thread cancelled");
00317       setError(CIMException::FAILED, "Thread cancelled");
00318       throw;
00319    }
00320    catch(...)
00321    {
00322       OW_LOG_ERROR(lgr, "Unknown exception caught in BinaryRequestHandler");
00323       writeError(*ostrError, "BinaryRequestHandler caught unknown exception");
00324       setError(CIMException::FAILED, "Caught unknown exception");
00325    }
00326 }
00327 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00328 
00329 void
00330 BinaryRequestHandler::createClass(const CIMOMHandleIFCRef& chdl,
00331    std::ostream& ostrm, std::istream& istrm)
00332 {
00333    String ns(BinarySerialization::readString(istrm));
00334    CIMClass cc(BinarySerialization::readClass(istrm));
00335    chdl->createClass(ns, cc);
00336    BinarySerialization::write(ostrm, BIN_OK);
00337 }
00339 void
00340 BinaryRequestHandler::modifyClass(const CIMOMHandleIFCRef& chdl,
00341    std::ostream& ostrm, std::istream& istrm)
00342 {
00343    String ns(BinarySerialization::readString(istrm));
00344    CIMClass cc(BinarySerialization::readClass(istrm));
00345    chdl->modifyClass(ns, cc);
00346    BinarySerialization::write(ostrm, BIN_OK);
00347 }
00349 void
00350 BinaryRequestHandler::deleteClass(const CIMOMHandleIFCRef& chdl,
00351    std::ostream& ostrm, std::istream& istrm)
00352 {
00353    String ns(BinarySerialization::readString(istrm));
00354    String className(BinarySerialization::readString(istrm));
00355    chdl->deleteClass(ns, className);
00356    BinarySerialization::write(ostrm, BIN_OK);
00357 }
00358 #endif // #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00359 
00360 namespace
00361 {
00362    class BinaryCIMClassWriter : public CIMClassResultHandlerIFC
00363    {
00364    public:
00365       BinaryCIMClassWriter(std::ostream& ostrm_)
00366       : ostrm(ostrm_)
00367       {}
00368    protected:
00369       virtual void doHandle(const CIMClass &c)
00370       {
00371          BinarySerialization::writeClass(ostrm, c);
00372       }
00373    private:
00374       std::ostream& ostrm;
00375    };
00376    class BinaryCIMObjectPathWriter : public CIMObjectPathResultHandlerIFC
00377    {
00378    public:
00379       BinaryCIMObjectPathWriter(std::ostream& ostrm_, const String& host_)
00380       : ostrm(ostrm_)
00381       , m_host(host_)
00382       {}
00383    protected:
00384       virtual void doHandle(const CIMObjectPath &cop_)
00385       {
00386          
00387          CIMObjectPath cop(cop_);
00388          if (cop.getFullNameSpace().isLocal())
00389          {
00390             try
00391             {
00392                cop.setHost(m_host);
00393             }
00394             catch (const SocketException& e)
00395             {
00396             }
00397          }
00398          BinarySerialization::writeObjectPath(ostrm, cop);
00399       }
00400    private:
00401       std::ostream& ostrm;
00402       String m_host;
00403    };
00404    class BinaryCIMInstanceWriter : public CIMInstanceResultHandlerIFC
00405    {
00406    public:
00407       BinaryCIMInstanceWriter(std::ostream& ostrm_, const String& ns_)
00408       : ostrm(ostrm_)
00409       , ns(ns_)
00410       {}
00411    protected:
00412       virtual void doHandle(const CIMInstance &cop)
00413       {
00414          if (cop.getNameSpace().empty())
00415          {
00416             CIMInstance ci(cop);
00417             ci.setNameSpace(ns);
00418             BinarySerialization::writeInstance(ostrm, ci);
00419          }
00420          else
00421          {
00422             BinarySerialization::writeInstance(ostrm, cop);
00423          }
00424       }
00425    private:
00426       std::ostream& ostrm;
00427       String ns;
00428    };
00429    class BinaryCIMQualifierTypeWriter : public CIMQualifierTypeResultHandlerIFC
00430    {
00431    public:
00432       BinaryCIMQualifierTypeWriter(std::ostream& ostrm_)
00433       : ostrm(ostrm_)
00434       {}
00435    protected:
00436       virtual void doHandle(const CIMQualifierType &cqt)
00437       {
00438          BinarySerialization::writeQualType(ostrm, cqt);
00439       }
00440    private:
00441       std::ostream& ostrm;
00442    };
00443    class BinaryStringWriter : public StringResultHandlerIFC
00444    {
00445    public:
00446       BinaryStringWriter(std::ostream& ostrm_)
00447       : ostrm(ostrm_)
00448       {}
00449    protected:
00450       virtual void doHandle(const String &name)
00451       {
00452          BinarySerialization::writeString(ostrm, name);
00453       }
00454    private:
00455       std::ostream& ostrm;
00456       String ns;
00457    };
00458 }
00460 void
00461 BinaryRequestHandler::enumClasses(const CIMOMHandleIFCRef& chdl,
00462    std::ostream& ostrm, std::istream& istrm)
00463 {
00464    String ns(BinarySerialization::readString(istrm));
00465    String className(BinarySerialization::readString(istrm));
00466    EDeepFlag deep(BinarySerialization::readBool(istrm) ? E_DEEP : E_SHALLOW);
00467    ELocalOnlyFlag localOnly(BinarySerialization::readBool(istrm) ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY);
00468    EIncludeQualifiersFlag includeQualifiers(BinarySerialization::readBool(istrm) ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS);
00469    EIncludeClassOriginFlag includeClassOrigin(BinarySerialization::readBool(istrm) ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN);
00470    BinarySerialization::write(ostrm, BIN_OK);
00471    BinarySerialization::write(ostrm, BINSIG_CLSENUM);
00472    BinaryCIMClassWriter handler(ostrm);
00473    chdl->enumClass(ns, className, handler, deep, localOnly,
00474       includeQualifiers, includeClassOrigin);
00475    
00476    BinarySerialization::write(ostrm, END_CLSENUM);
00477    BinarySerialization::write(ostrm, END_CLSENUM);
00478 }
00479 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00480 
00481 void
00482 BinaryRequestHandler::deleteQual(const CIMOMHandleIFCRef& chdl,
00483    std::ostream& ostrm, std::istream& istrm)
00484 {
00485    String ns(BinarySerialization::readString(istrm));
00486    String qualName(BinarySerialization::readString(istrm));
00487    chdl->deleteQualifierType(ns, qualName);
00488    BinarySerialization::write(ostrm, BIN_OK);
00489 }
00491 void
00492 BinaryRequestHandler::setQual(const CIMOMHandleIFCRef& chdl,
00493    std::ostream& ostrm, std::istream& istrm)
00494 {
00495    String ns(BinarySerialization::readString(istrm));
00496    CIMQualifierType qt(BinarySerialization::readQualType(istrm));
00497    chdl->setQualifierType(ns, qt);
00498    BinarySerialization::write(ostrm, BIN_OK);
00499 }
00501 void
00502 BinaryRequestHandler::enumQualifiers(const CIMOMHandleIFCRef& chdl,
00503    std::ostream& ostrm, std::istream& istrm)
00504 {
00505    String ns(BinarySerialization::readString(istrm));
00506    BinarySerialization::write(ostrm, BIN_OK);
00507    BinarySerialization::write(ostrm, BINSIG_QUAL_TYPEENUM);
00508    BinaryCIMQualifierTypeWriter handler(ostrm);
00509    chdl->enumQualifierTypes(ns, handler);
00510    BinarySerialization::write(ostrm, END_QUALENUM);
00511    BinarySerialization::write(ostrm, END_QUALENUM);
00512 }
00513 #endif // #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00514 
00515 void
00516 BinaryRequestHandler::getClass(const CIMOMHandleIFCRef& chdl,
00517    std::ostream& ostrm, std::istream& istrm)
00518 {
00519    StringArray propList;
00520    StringArray* propListPtr = 0;
00521    String ns(BinarySerialization::readString(istrm));
00522    String className(BinarySerialization::readString(istrm));
00523    ELocalOnlyFlag localOnly(BinarySerialization::readBool(istrm) ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY);
00524    EIncludeQualifiersFlag includeQualifiers(BinarySerialization::readBool(istrm) ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS);
00525    EIncludeClassOriginFlag includeClassOrigin(BinarySerialization::readBool(istrm) ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN);
00526    Bool nullPropertyList(BinarySerialization::readBool(istrm));
00527    if (!nullPropertyList)
00528    {
00529       propList = BinarySerialization::readStringArray(istrm);
00530       propListPtr = &propList;
00531    }
00532    CIMClass cc = chdl->getClass(ns, className, localOnly, includeQualifiers,
00533       includeClassOrigin, propListPtr);
00534    BinarySerialization::write(ostrm, BIN_OK);
00535    BinarySerialization::writeClass(ostrm, cc);
00536 }
00538 void
00539 BinaryRequestHandler::getInstance(const CIMOMHandleIFCRef& chdl,
00540    std::ostream& ostrm, std::istream& istrm)
00541 {
00542    String ns(BinarySerialization::readString(istrm));
00543    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00544    ELocalOnlyFlag localOnly(BinarySerialization::readBool(istrm) ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY);
00545    EIncludeQualifiersFlag includeQualifiers(BinarySerialization::readBool(istrm) ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS);
00546    EIncludeClassOriginFlag includeClassOrigin(BinarySerialization::readBool(istrm) ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN);
00547    StringArray propList;
00548    StringArray* propListPtr = 0;
00549    Bool nullPropertyList(BinarySerialization::readBool(istrm));
00550    if (!nullPropertyList)
00551    {
00552       propList = BinarySerialization::readStringArray(istrm);
00553       propListPtr = &propList;
00554    }
00555    CIMInstance cimInstance = chdl->getInstance(ns, op, localOnly,
00556       includeQualifiers, includeClassOrigin, propListPtr);
00557    if (cimInstance.getNameSpace().empty())
00558       cimInstance.setNameSpace(ns);
00559    BinarySerialization::write(ostrm, BIN_OK);
00560    BinarySerialization::writeInstance(ostrm, cimInstance);
00561 }
00563 void
00564 BinaryRequestHandler::getQual(const CIMOMHandleIFCRef& chdl,
00565    std::ostream& ostrm, std::istream& istrm)
00566 {
00567    String ns(BinarySerialization::readString(istrm));
00568    String qualifierName(BinarySerialization::readString(istrm));
00569    CIMQualifierType qt = chdl->getQualifierType(ns, qualifierName);
00570    BinarySerialization::write(ostrm, BIN_OK);
00571    BinarySerialization::writeQualType(ostrm, qt);
00572 }
00573 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00574 
00575 void
00576 BinaryRequestHandler::createInstance(const CIMOMHandleIFCRef& chdl,
00577    std::ostream& ostrm, std::istream& istrm)
00578 {
00579    String ns(BinarySerialization::readString(istrm));
00580    CIMInstance cimInstance(BinarySerialization::readInstance(istrm));
00581    CIMName className = cimInstance.getClassName();
00582    
00583    
00584    if (className == "__Namespace")
00585    {
00586       CIMProperty prop = cimInstance.getProperty(
00587          CIMProperty::NAME_PROPERTY);
00588       
00589       
00590       if (!prop)
00591       {
00592          OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00593             "Name property not specified for new namespace");
00594       }
00595       
00596       
00597       if (!prop.isKey())
00598       {
00599          prop.addQualifier(CIMQualifier::createKeyQualifier());
00600       }
00601       cimInstance.setProperty(prop);
00602    }
00603    
00604 
00605 
00606 
00607 
00608 
00609 
00610 
00611 
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621    CIMObjectPath newPath = chdl->createInstance(ns, cimInstance);
00622    BinarySerialization::write(ostrm, BIN_OK);
00623    BinarySerialization::writeObjectPath(ostrm, newPath);
00624 }
00626 void
00627 BinaryRequestHandler::deleteInstance(const CIMOMHandleIFCRef& chdl,
00628    std::ostream& ostrm, std::istream& istrm)
00629 {
00630    String ns(BinarySerialization::readString(istrm));
00631    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00632    chdl->deleteInstance(ns, op);
00633    BinarySerialization::write(ostrm, BIN_OK);
00634 }
00636 void
00637 BinaryRequestHandler::modifyInstance(const CIMOMHandleIFCRef& chdl,
00638    std::ostream& ostrm, std::istream& istrm)
00639 {
00640    String ns(BinarySerialization::readString(istrm));
00641    CIMInstance ci(BinarySerialization::readInstance(istrm));
00642    EIncludeQualifiersFlag includeQualifiers(BinarySerialization::readBool(istrm) ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS);
00643    StringArray propList;
00644    StringArray* propListPtr = 0;
00645    Bool nullPropertyList(BinarySerialization::readBool(istrm));
00646    if (!nullPropertyList)
00647    {
00648       propList = BinarySerialization::readStringArray(istrm);
00649       propListPtr = &propList;
00650    }
00651    chdl->modifyInstance(ns, ci, includeQualifiers, propListPtr);
00652    BinarySerialization::write(ostrm, BIN_OK);
00653 }
00654 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00655 
00656 void
00657 BinaryRequestHandler::setProperty(const CIMOMHandleIFCRef& chdl,
00658    std::ostream& ostrm, std::istream& istrm)
00659 {
00660    String ns(BinarySerialization::readString(istrm));
00661    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00662    String propName(BinarySerialization::readString(istrm));
00663    Bool isValue(BinarySerialization::readBool(istrm));
00664    CIMValue cv(CIMNULL);
00665    if (isValue)
00666    {
00667       cv = BinarySerialization::readValue(istrm);
00668    }
00669    chdl->setProperty(ns, op, propName, cv);
00670    BinarySerialization::write(ostrm, BIN_OK);
00671 }
00672 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00673 #endif // #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00674 
00675 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00676 
00677 void
00678 BinaryRequestHandler::getProperty(const CIMOMHandleIFCRef& chdl,
00679    std::ostream& ostrm, std::istream& istrm)
00680 {
00681    String ns (BinarySerialization::readString(istrm));
00682    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00683    String propName(BinarySerialization::readString(istrm));
00684    CIMValue cv = chdl->getProperty(ns, op, propName);
00685    BinarySerialization::write(ostrm, BIN_OK);
00686    Bool isValue = (cv) ? true : false;
00687    BinarySerialization::writeBool(ostrm, isValue);
00688    if (isValue)
00689    {
00690       BinarySerialization::writeValue(ostrm, cv);
00691    }
00692 }
00693 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00694 
00695 void
00696 BinaryRequestHandler::enumClassNames(const CIMOMHandleIFCRef& chdl,
00697    std::ostream& ostrm, std::istream& istrm)
00698 {
00699    String ns(BinarySerialization::readString(istrm));
00700    String className(BinarySerialization::readString(istrm));
00701    EDeepFlag deep(BinarySerialization::readBool(istrm) ? E_DEEP : E_SHALLOW);
00702    BinarySerialization::write(ostrm, BIN_OK);
00703    BinarySerialization::write(ostrm, BINSIG_STRINGENUM);
00704    BinaryStringWriter handler(ostrm);
00705    chdl->enumClassNames(ns, className, handler, deep);
00706    BinarySerialization::write(ostrm, END_STRINGENUM);
00707    BinarySerialization::write(ostrm, END_STRINGENUM);
00708 }
00710 void
00711 BinaryRequestHandler::enumInstances(const CIMOMHandleIFCRef& chdl,
00712    std::ostream& ostrm, std::istream& istrm)
00713 {
00714    StringArray propList;
00715    StringArray* propListPtr = 0;
00716    String ns(BinarySerialization::readString(istrm));
00717    String className(BinarySerialization::readString(istrm));
00718    EDeepFlag deep(BinarySerialization::readBool(istrm) ? E_DEEP : E_SHALLOW);
00719    ELocalOnlyFlag localOnly(BinarySerialization::readBool(istrm) ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY);
00720    EIncludeQualifiersFlag includeQualifiers(BinarySerialization::readBool(istrm) ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS);
00721    EIncludeClassOriginFlag includeClassOrigin(BinarySerialization::readBool(istrm) ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN);
00722    Bool nullPropertyList(BinarySerialization::readBool(istrm));
00723    if (!nullPropertyList)
00724    {
00725       propList = BinarySerialization::readStringArray(istrm);
00726       propListPtr = &propList;
00727    }
00728    BinarySerialization::write(ostrm, BIN_OK);
00729    BinarySerialization::write(ostrm, BINSIG_INSTENUM);
00730    
00731    BinaryCIMInstanceWriter handler(ostrm, ns);
00732    chdl->enumInstances(ns, className, handler, deep, localOnly,
00733       includeQualifiers, includeClassOrigin, propListPtr);
00734    BinarySerialization::write(ostrm, END_INSTENUM);
00735    BinarySerialization::write(ostrm, END_INSTENUM);
00736 }
00738 void
00739 BinaryRequestHandler::enumInstanceNames(const CIMOMHandleIFCRef& chdl,
00740    std::ostream& ostrm, std::istream& istrm)
00741 {
00742    String ns(BinarySerialization::readString(istrm));
00743    String className(BinarySerialization::readString(istrm));
00744    BinarySerialization::write(ostrm, BIN_OK);
00745    BinarySerialization::write(ostrm, BINSIG_OPENUM);
00746    BinaryCIMObjectPathWriter handler(ostrm, getHost());
00747    chdl->enumInstanceNames(ns, className, handler);
00748    BinarySerialization::write(ostrm, END_OPENUM);
00749    BinarySerialization::write(ostrm, END_OPENUM);
00750 }
00752 void
00753 BinaryRequestHandler::invokeMethod(const CIMOMHandleIFCRef& chdl,
00754    std::ostream& ostrm, std::istream& istrm)
00755 {
00756    String ns (BinarySerialization::readString(istrm));
00757    CIMObjectPath path(BinarySerialization::readObjectPath(istrm));
00758    String methodName(BinarySerialization::readString(istrm));
00759    CIMParamValueArray inparms;
00760    CIMParamValueArray outparms;
00761    
00762    BinarySerialization::verifySignature(istrm, BINSIG_PARAMVALUEARRAY);
00763    BinarySerialization::readArray(istrm, inparms);
00764    CIMValue cv = chdl->invokeMethod(ns, path, methodName, inparms, outparms);
00765    BinarySerialization::write(ostrm, BIN_OK);
00766    if (cv)
00767    {
00768       BinarySerialization::writeBool(ostrm, Bool(true));
00769       BinarySerialization::writeValue(ostrm, cv);
00770    }
00771    else
00772    {
00773       BinarySerialization::writeBool(ostrm, Bool(false));
00774    }
00775    BinarySerialization::write(ostrm, BINSIG_PARAMVALUEARRAY);
00776    BinarySerialization::writeArray(ostrm, outparms);
00777 }
00779 void
00780 BinaryRequestHandler::execQuery(const CIMOMHandleIFCRef& chdl,
00781    std::ostream& ostrm, std::istream& istrm)
00782 {
00783    String ns(BinarySerialization::readString(istrm));
00784    String query(BinarySerialization::readString(istrm));
00785    String queryLang(BinarySerialization::readString(istrm));
00786    BinarySerialization::write(ostrm, BIN_OK);
00787    BinarySerialization::write(ostrm, BINSIG_INSTENUM);
00788    BinaryCIMInstanceWriter handler(ostrm, ns);
00789    chdl->execQuery(ns, handler, query, queryLang);
00790    BinarySerialization::write(ostrm, END_INSTENUM);
00791    BinarySerialization::write(ostrm, END_INSTENUM);
00792 }
00793 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00794 
00795 void
00796 BinaryRequestHandler::associators(const CIMOMHandleIFCRef& chdl,
00797    std::ostream& ostrm, std::istream& istrm)
00798 {
00799    StringArray propList;
00800    StringArray* propListPtr = 0;
00801    String ns(BinarySerialization::readString(istrm));
00802    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00803    String assocClass(BinarySerialization::readString(istrm));
00804    String resultClass(BinarySerialization::readString(istrm));
00805    String role(BinarySerialization::readString(istrm));
00806    String resultRole(BinarySerialization::readString(istrm));
00807    EIncludeQualifiersFlag includeQualifiers(BinarySerialization::readBool(istrm) ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS);
00808    EIncludeClassOriginFlag includeClassOrigin(BinarySerialization::readBool(istrm) ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN);
00809    Bool nullPropertyList(BinarySerialization::readBool(istrm));
00810    if (!nullPropertyList)
00811    {
00812       propList = BinarySerialization::readStringArray(istrm);
00813       propListPtr = &propList;
00814    }
00815    BinarySerialization::write(ostrm, BIN_OK);
00816    if (op.isClassPath())
00817    {
00818       
00819       BinarySerialization::write(ostrm, BINSIG_CLSENUM);
00820       BinaryCIMClassWriter handler(ostrm);
00821       op.setNameSpace(ns);
00822       chdl->associatorsClasses(ns, op, handler, assocClass, resultClass,
00823          role, resultRole, includeQualifiers, includeClassOrigin, propListPtr);
00824       BinarySerialization::write(ostrm, END_CLSENUM);
00825       BinarySerialization::write(ostrm, END_CLSENUM);
00826    }
00827    else
00828    {
00829       
00830       BinarySerialization::write(ostrm, BINSIG_INSTENUM);
00831       BinaryCIMInstanceWriter handler(ostrm, ns);
00832       chdl->associators(ns, op, handler, assocClass, resultClass,
00833          role, resultRole, includeQualifiers, includeClassOrigin, propListPtr);
00834       BinarySerialization::write(ostrm, END_INSTENUM);
00835       BinarySerialization::write(ostrm, END_INSTENUM);
00836    }
00837 }
00839 void
00840 BinaryRequestHandler::associatorNames(const CIMOMHandleIFCRef& chdl,
00841    std::ostream& ostrm, std::istream& istrm)
00842 {
00843    String ns(BinarySerialization::readString(istrm));
00844    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00845    String assocClass(BinarySerialization::readString(istrm));
00846    String resultClass(BinarySerialization::readString(istrm));
00847    String role(BinarySerialization::readString(istrm));
00848    String resultRole(BinarySerialization::readString(istrm));
00849    BinarySerialization::write(ostrm, BIN_OK);
00850    BinarySerialization::write(ostrm, BINSIG_OPENUM);
00851    BinaryCIMObjectPathWriter handler(ostrm, getHost());
00852    chdl->associatorNames(ns, op, handler, assocClass,
00853       resultClass, role, resultRole);
00854    BinarySerialization::write(ostrm, END_OPENUM);
00855    BinarySerialization::write(ostrm, END_OPENUM);
00856 }
00858 void
00859 BinaryRequestHandler::references(const CIMOMHandleIFCRef& chdl,
00860    std::ostream& ostrm, std::istream& istrm)
00861 {
00862    StringArray propList;
00863    StringArray* propListPtr = 0;
00864    String ns(BinarySerialization::readString(istrm));
00865    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00866    String resultClass(BinarySerialization::readString(istrm));
00867    String role(BinarySerialization::readString(istrm));
00868    EIncludeQualifiersFlag includeQualifiers(BinarySerialization::readBool(istrm) ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS);
00869    EIncludeClassOriginFlag includeClassOrigin(BinarySerialization::readBool(istrm) ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN);
00870    Bool nullPropertyList(BinarySerialization::readBool(istrm));
00871    if (!nullPropertyList)
00872    {
00873       propList = BinarySerialization::readStringArray(istrm);
00874       propListPtr = &propList;
00875    }
00876    BinarySerialization::write(ostrm, BIN_OK);
00877    if (op.isClassPath())
00878    {
00879       
00880       BinarySerialization::write(ostrm, BINSIG_CLSENUM);
00881       BinaryCIMClassWriter handler(ostrm);
00882       chdl->referencesClasses(ns, op, handler, resultClass,
00883          role, includeQualifiers, includeClassOrigin, propListPtr);
00884       BinarySerialization::write(ostrm, END_CLSENUM);
00885       BinarySerialization::write(ostrm, END_CLSENUM);
00886    }
00887    else
00888    {
00889       
00890       BinarySerialization::write(ostrm, BINSIG_INSTENUM);
00891       BinaryCIMInstanceWriter handler(ostrm, ns);
00892       chdl->references(ns, op, handler, resultClass,
00893          role, includeQualifiers, includeClassOrigin, propListPtr);
00894       BinarySerialization::write(ostrm, END_INSTENUM);
00895       BinarySerialization::write(ostrm, END_INSTENUM);
00896    }
00897 }
00899 void
00900 BinaryRequestHandler::referenceNames(const CIMOMHandleIFCRef& chdl,
00901    std::ostream& ostrm, std::istream& istrm)
00902 {
00903    String ns(BinarySerialization::readString(istrm));
00904    CIMObjectPath op(BinarySerialization::readObjectPath(istrm));
00905    String resultClass(BinarySerialization::readString(istrm));
00906    String role(BinarySerialization::readString(istrm));
00907    BinarySerialization::write(ostrm, BIN_OK);
00908    BinarySerialization::write(ostrm, BINSIG_OPENUM);
00909    BinaryCIMObjectPathWriter handler(ostrm, getHost());
00910    chdl->referenceNames(ns, op, handler, resultClass, role);
00911    BinarySerialization::write(ostrm, END_OPENUM);
00912    BinarySerialization::write(ostrm, END_OPENUM);
00913 }
00914 #endif
00915 
00916 void
00917 BinaryRequestHandler::getServerFeatures(const CIMOMHandleIFCRef& chdl,
00918    std::ostream& ostrm, std::istream& )
00919 {
00920    CIMFeatures f = chdl->getServerFeatures();
00921    BinarySerialization::write(ostrm, BIN_OK);
00922    BinarySerialization::write(ostrm, Int32(f.cimProduct));
00923    BinarySerialization::writeString(ostrm, f.extURL);
00924    BinarySerialization::writeStringArray(ostrm, f.supportedGroups);
00925    BinarySerialization::writeBool(ostrm, f.supportsBatch);
00926    BinarySerialization::writeStringArray(ostrm, f.supportedQueryLanguages);
00927    BinarySerialization::writeString(ostrm, f.validation);
00928    BinarySerialization::writeString(ostrm, f.cimom);
00929    BinarySerialization::writeString(ostrm, f.protocolVersion);
00930 }
00932 void
00933 BinaryRequestHandler::writeError(std::ostream& ostrm, const char* msg)
00934 {
00935    BinarySerialization::write(ostrm, BIN_ERROR);
00936    BinarySerialization::write(ostrm, msg);
00937 }
00939 bool
00940 BinaryRequestHandler::writeFileName(std::ostream& ostrm,
00941    const String& fname)
00942 {
00943    LoggerRef lgr = getEnvironment()->getLogger(COMPONENT_NAME);
00944    if (m_userId == UserId(-1))
00945    {
00946       OW_LOG_ERROR(lgr, "Binary request handler cannot change file ownership:"
00947          " Owner unknown");
00948       return false;
00949    }
00950    try
00951    {
00952       if (FileSystem::changeFileOwner(fname, m_userId) != 0)
00953       {
00954          OW_LOG_ERROR(lgr, Format("Binary request handler failed changing"
00955             " ownership on file %1", fname));
00956          return false;
00957       }
00958       
00959       BinarySerialization::write(ostrm, Int32(-1));
00960       
00961       BinarySerialization::writeString(ostrm, fname);
00962    }
00963    catch(...)
00964    {
00965       FileSystem::removeFile(fname);
00966       throw;
00967    }
00968    return true;
00969 }
00971 StringArray
00972 BinaryRequestHandler::getSupportedContentTypes() const
00973 {
00974    StringArray rval;
00975    rval.push_back("application/x-owbinary");
00976    return rval;
00977 }
00979 String
00980 BinaryRequestHandler::getContentType() const
00981 {
00982    return String("application/x-owbinary");
00983 }
00984 
00986 void
00987 BinaryRequestHandler::init(const ServiceEnvironmentIFCRef& env)
00988 {
00989 }
00990 
00992 void
00993 BinaryRequestHandler::shutdown()
00994 {
00995 }
00996 
00997 } 
00998 
01000 OW_REQUEST_HANDLER_FACTORY(OW_NAMESPACE::BinaryRequestHandler,BinaryRequest);
01001