ObjPath.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:4k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*++
  2. // Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved 
  3. Module Name:
  4.     OBJPATH.H
  5. Abstract:
  6.     object path parser
  7. History:
  8. --*/
  9. #ifndef _OBJPATH_H_
  10. #define _OBJPATH_H_
  11. #include <opathlex.h>
  12. #define DELETE_ME
  13. struct KeyRef
  14. {
  15.     LPWSTR  m_pName;
  16.     VARIANT m_vValue;
  17.     HRESULT m_hRes;
  18.     KeyRef();
  19.     KeyRef(LPCWSTR wszKeyName, const VARIANT* pvValue);
  20.    ~KeyRef();
  21.     BOOL IsValid(){  return (m_pName && (S_OK == m_hRes)); };
  22. };
  23. struct ParsedObjectPath
  24. {
  25.     LPWSTR      m_pServer;              // NULL if no server
  26.     DWORD       m_dwNumNamespaces;      // 0 if no namespaces
  27.     DWORD       m_dwAllocNamespaces;    // size of m_paNamespaces
  28.     LPWSTR     *m_paNamespaces;         // NULL if no namespaces
  29.     LPWSTR      m_pClass;               // Class name
  30.     DWORD       m_dwNumKeys;            // 0 if no keys (just a class name)
  31.     DWORD       m_dwAllocKeys;          // size of m_paKeys
  32.     KeyRef    **m_paKeys;               // NULL if no keys specified
  33.     BOOL        m_bSingletonObj;        // true if object of class with no keys
  34.     ParsedObjectPath();
  35.    ~ParsedObjectPath();
  36. public:
  37.     BOOL SetClassName(LPCWSTR wszClassName);
  38.     BOOL AddKeyRef(LPCWSTR wszKeyName, const VARIANT* pvValue);
  39.     BOOL AddKeyRef(KeyRef* pAcquireRef);
  40.     BOOL AddKeyRefEx(LPCWSTR wszKeyName, const VARIANT* pvValue);
  41.     BOOL AddNamespace(LPCWSTR wszNamespace);
  42.     LPWSTR GetKeyString();
  43.     LPWSTR GetNamespacePart();
  44.     LPWSTR GetParentNamespacePart();
  45.     void ClearKeys () ;
  46.     BOOL IsRelative(LPCWSTR wszMachine, LPCWSTR wszNamespace);
  47.     BOOL IsLocal(LPCWSTR wszMachine);
  48.     BOOL IsClass();
  49.     BOOL IsInstance();
  50.     BOOL IsObject();
  51.     BOOL IsValid()
  52.     {
  53.     return (m_paNamespaces && m_paKeys);
  54.     };
  55.     
  56. };
  57. // NOTE:
  58. // The m_vValue in the KeyRef may not be of the expected type, i.e., the parser
  59. // cannot distinguish 16 bit integers from 32 bit integers if they fall within the
  60. // legal subrange of a 16 bit value.  Therefore, the parser only uses the following
  61. // types for keys:
  62. //      VT_I4, VT_R8, VT_BSTR
  63. // If the underlying type is different, the user of this parser must do appropriate
  64. // type conversion.
  65. //  
  66. typedef enum
  67. {
  68.     e_ParserAcceptRelativeNamespace,    // Allow a relative namespace
  69.     e_ParserAbsoluteNamespaceOnly,      // Require a full object path
  70.     e_ParserAcceptAll                   // Accept any recognizable subset of a path
  71. } ObjectParserFlags;
  72. class CObjectPathParser
  73. {
  74.     LPWSTR m_pInitialIdent;
  75.     int m_nCurrentToken;
  76.     CGenLexer *m_pLexer;
  77.     ParsedObjectPath *m_pOutput;
  78.     KeyRef *m_pTmpKeyRef;
  79.     
  80.     ObjectParserFlags m_eFlags;
  81. private:
  82.     void Zero();
  83.     void Empty();
  84.     int begin_parse();
  85.     int ns_or_server();
  86.     int ns_or_class();
  87.     int objref();
  88.     int ns_list();
  89.     int ident_becomes_ns();
  90.     int ident_becomes_class();
  91.     int objref_rest();
  92.     int ns_list_rest();
  93.     int key_const();
  94.     int keyref_list();
  95.     int keyref();
  96.     int keyref_term();
  97.     int propname();    
  98.     int optional_objref();
  99.     int NextToken();
  100. public:
  101.     enum { NoError, SyntaxError, InvalidParameter, OutOfMemory };
  102.     CObjectPathParser(ObjectParserFlags eFlags = e_ParserAbsoluteNamespaceOnly);
  103.    ~CObjectPathParser();
  104.     int Parse(
  105.         LPCWSTR RawPath,
  106.         ParsedObjectPath **pOutput
  107.         );
  108.     static int WINAPI Unparse(
  109.         ParsedObjectPath* pInput,
  110.         DELETE_ME LPWSTR* pwszPath);
  111.     static LPWSTR WINAPI GetRelativePath(LPWSTR wszFullPath);
  112.     void Free(ParsedObjectPath *pOutput);
  113.     void Free( LPWSTR wszUnparsedPath );
  114. };
  115. #endif