971 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			971 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //***************************************************************************
 | |
| 
 | |
| //
 | |
| 
 | |
| //  OBJPATH.CPP
 | |
| 
 | |
| //
 | |
| 
 | |
| //  Module: OLE MS Provider Framework
 | |
| 
 | |
| //
 | |
| 
 | |
| // Copyright (c) 1996-2001 Microsoft Corporation, All Rights Reserved
 | |
| //
 | |
| //***************************************************************************
 | |
| 
 | |
| #include "precomp.h"
 | |
| #include <provtempl.h>
 | |
| #include <provmt.h>
 | |
| #include <instpath.h>
 | |
| 
 | |
| WbemObjectPath :: WbemObjectPath () :       status ( TRUE ) ,
 | |
|                                             pushedBack ( FALSE ) ,
 | |
|                                             pushBack ( NULL ) ,
 | |
|                                             propertyName ( NULL ) ,
 | |
|                                             propertyValue ( NULL ) ,
 | |
|                                             reference ( NULL )
 | |
| {
 | |
| }
 | |
| 
 | |
| void WbemObjectPath :: SetUp ()
 | |
| {
 | |
|     status = TRUE ;
 | |
|     pushedBack = FALSE ;
 | |
|     pushBack = NULL ;
 | |
|     propertyName = NULL ;
 | |
|     propertyValue = NULL ;
 | |
|     reference = NULL ;
 | |
| }
 | |
| 
 | |
| WbemObjectPath :: WbemObjectPath (
 | |
| 
 | |
|     const WbemObjectPath &objectPathArg
 | |
| 
 | |
| ) : status ( TRUE ) ,
 | |
|     pushedBack ( FALSE ) ,
 | |
|     pushBack ( NULL ) ,
 | |
|     propertyName ( NULL ) ,
 | |
|     propertyValue ( NULL ) ,
 | |
|     reference ( NULL )
 | |
| {
 | |
| }
 | |
| 
 | |
| WbemObjectPath :: ~WbemObjectPath () 
 | |
| {
 | |
|     CleanUp () ;
 | |
| }
 | |
| 
 | |
| void WbemObjectPath :: CleanUp ()
 | |
| {
 | |
|     delete pushBack ;
 | |
|     delete [] propertyName ;
 | |
|     delete propertyValue ;
 | |
|     delete reference ;
 | |
| }
 | |
| 
 | |
| WbemObjectPath :: operator void *() 
 | |
| {
 | |
|     return status ? this : NULL ;
 | |
| }
 | |
|     
 | |
| void WbemObjectPath :: PushBack ()
 | |
| {
 | |
|     pushedBack = TRUE ;
 | |
| }
 | |
| 
 | |
| WbemLexicon *WbemObjectPath :: Get ()
 | |
| {
 | |
|     if ( pushedBack )
 | |
|     {
 | |
|         pushedBack = FALSE ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         delete pushBack ;
 | |
|         pushBack = analyser.Get () ;
 | |
|     }
 | |
| 
 | |
|     return pushBack ;
 | |
| }
 | |
|     
 | |
| WbemLexicon *WbemObjectPath :: Match ( WbemLexicon :: LexiconToken tokenType )
 | |
| {
 | |
|     WbemLexicon *lexicon = Get () ;
 | |
|     status = ( lexicon->GetToken () == tokenType ) ;
 | |
|     return status ? lexicon : NULL ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: SetObjectPath ( wchar_t *tokenStream )
 | |
| {
 | |
|     CleanUp () ;
 | |
|     SetUp () ;
 | |
| 
 | |
|     analyser.Set ( tokenStream ) ;
 | |
| 
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: TOKEN_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             TokenFactoredObjectSpecNamespace () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: BACKSLASH_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             BackSlashFactoredServerNamespace () &&
 | |
|             Match ( WbemLexicon :: COLON_ID ) &&
 | |
|             ObjectSpec () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: DOT_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             NameSpaceRel () &&
 | |
|             Match ( WbemLexicon :: COLON_ID ) &&
 | |
|             ObjectSpec () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon ::OID_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             OidReferenceSpec () ;
 | |
|         } 
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     Match ( WbemLexicon :: EOF_ID ) ;
 | |
| 
 | |
|     return status ;
 | |
| } 
 | |
| 
 | |
| BOOL WbemObjectPath :: BackSlashFactoredServerNamespace ()
 | |
| {
 | |
|     if ( Match ( WbemLexicon :: BACKSLASH_ID ) )
 | |
|     {
 | |
|         WbemLexicon *lookAhead = Get () ;
 | |
|         switch ( lookAhead->GetToken () ) 
 | |
|         {
 | |
|             case WbemLexicon :: BACKSLASH_ID:
 | |
|             {
 | |
|                 PushBack () ;
 | |
|                 BackSlashFactoredServerSpec () ;
 | |
|             }
 | |
|             break ;
 | |
| 
 | |
|             case WbemLexicon :: DOT_ID:
 | |
|             {
 | |
|                 PushBack () ;
 | |
|                 NameSpaceRel () ;
 | |
|             }
 | |
|             break ;
 | |
| 
 | |
|             case WbemLexicon :: TOKEN_ID:
 | |
|             {
 | |
|                 PushBack () ;
 | |
|                 NameSpaceRel () ;
 | |
|             }
 | |
|             break ;
 | |
| 
 | |
|             default:
 | |
|             {
 | |
|                 status = FALSE ;
 | |
|             }
 | |
|             break ;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: BackSlashFactoredServerSpec ()
 | |
| {
 | |
|     if ( Match ( WbemLexicon :: BACKSLASH_ID ) )
 | |
|     {
 | |
|         WbemLexicon *lookAhead = Get () ;
 | |
|         switch ( lookAhead->GetToken () ) 
 | |
|         {
 | |
|             case WbemLexicon :: DOT_ID:
 | |
|             {
 | |
|                 PushBack () ;
 | |
|                 WbemLexicon *token ;
 | |
|                 if ( token = Match ( WbemLexicon :: DOT_ID ) )
 | |
|                 {
 | |
|                     GetNamespacePath ()->SetServer ( L"." ) ;
 | |
| 
 | |
|                     WbemLexicon *lookAhead = Get () ;
 | |
|                     switch ( lookAhead->GetToken () ) 
 | |
|                     {
 | |
|                         case WbemLexicon :: BACKSLASH_ID:
 | |
|                         {
 | |
|                             PushBack () ;
 | |
|                             NameSpaceAbs () ;
 | |
|                         }
 | |
|                         break ;
 | |
| 
 | |
|                         case WbemLexicon :: COLON_ID:
 | |
|                         {
 | |
|                             PushBack () ;
 | |
|                         }
 | |
|                         break ;
 | |
| 
 | |
|                         default:
 | |
|                         {
 | |
|                             status = FALSE ;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             break ;
 | |
| 
 | |
|             case WbemLexicon :: TOKEN_ID:
 | |
|             {
 | |
|                 PushBack () ;
 | |
|                 WbemLexicon *token ;
 | |
|                 if ( token = Match ( WbemLexicon :: TOKEN_ID ) )
 | |
|                 {
 | |
|                     GetNamespacePath ()->SetServer ( token->GetValue ()->token ) ;
 | |
| 
 | |
|                     WbemLexicon *lookAhead = Get () ;
 | |
|                     switch ( lookAhead->GetToken () ) 
 | |
|                     {
 | |
|                         case WbemLexicon :: BACKSLASH_ID:
 | |
|                         {
 | |
|                             PushBack () ;
 | |
|                             NameSpaceAbs () ;
 | |
|                         }
 | |
|                         break ;
 | |
| 
 | |
|                         case WbemLexicon :: COLON_ID:
 | |
|                         {
 | |
|                             PushBack () ;
 | |
|                         }
 | |
|                         break ;
 | |
| 
 | |
|                         default:
 | |
|                         {
 | |
|                             status = FALSE ;
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             break ;
 | |
| 
 | |
|             default:
 | |
|             {
 | |
|                 status = FALSE ;
 | |
|             }
 | |
|             break ;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: TokenFactoredObjectSpecNamespace ()
 | |
| {
 | |
|     WbemLexicon *token ;
 | |
|     if ( token = Match ( WbemLexicon :: TOKEN_ID ) )
 | |
|     {
 | |
|         wchar_t *classOrNamespace = token->GetValue ()->token ;
 | |
| 
 | |
| 		if ( classOrNamespace )
 | |
| 		{
 | |
| 			wchar_t *copy = new wchar_t [ wcslen ( classOrNamespace ) + 1 ] ;
 | |
| 			wcscpy ( copy , classOrNamespace ) ;
 | |
| 
 | |
| 			WbemLexicon *lookAhead = Get () ;
 | |
| 			switch ( lookAhead->GetToken () ) 
 | |
| 			{
 | |
| 				case WbemLexicon :: BACKSLASH_ID:
 | |
| 				{
 | |
| 					GetNamespacePath()->Add ( copy ) ;
 | |
| 
 | |
| 					PushBack () ;
 | |
| 					NameSpaceAbs () &&
 | |
| 					Match ( WbemLexicon :: COLON_ID ) &&
 | |
| 					ObjectSpec () ;
 | |
| 				}
 | |
| 				break ;
 | |
| 
 | |
| 				case WbemLexicon :: COLON_ID:
 | |
| 				{
 | |
| 					PushBack () ;
 | |
| 					Match ( WbemLexicon :: COLON_ID ) &&
 | |
| 					ObjectSpec () ;
 | |
| 				}
 | |
| 				break ;
 | |
| 
 | |
| 				case WbemLexicon :: DOT_ID:
 | |
| 				{
 | |
| 					reference = new WbemInstanceSpecification ;
 | |
| 					( ( WbemInstanceSpecification * ) reference ) ->SetClass ( copy ) ;
 | |
| 					delete [] copy ;
 | |
| 
 | |
| 					PushBack () ;
 | |
| 					Match ( WbemLexicon :: DOT_ID ) &&
 | |
| 					KeyPropertySpec () ;
 | |
| 				}
 | |
| 				break ;
 | |
| 
 | |
| 				case WbemLexicon :: EQUALS_ID:
 | |
| 				{
 | |
| 					PushBack () ;
 | |
| 					Match ( WbemLexicon :: EQUALS_ID ) &&
 | |
| 					FactoredAtPropertyValueSpec ( copy ) ;
 | |
| 
 | |
| 					delete [] copy ;
 | |
| 				}
 | |
| 				break ;
 | |
| 
 | |
| 				case WbemLexicon :: EOF_ID:
 | |
| 				{
 | |
| 					reference = new WbemClassReference ;
 | |
| 					( ( WbemClassReference * ) reference )->SetClass ( copy ) ;
 | |
| 					delete [] copy ;
 | |
| 
 | |
| 					PushBack () ;
 | |
| 				}
 | |
| 				break ;
 | |
| 
 | |
| 				default:
 | |
| 				{
 | |
| 					status = FALSE ;
 | |
| 					delete [] copy ;
 | |
| 				}
 | |
| 				break ;
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			status = FALSE ;
 | |
| 		}
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: NameSpaceName ()
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: TOKEN_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             WbemLexicon *token ;
 | |
|             if ( token = Match ( WbemLexicon :: TOKEN_ID ) )
 | |
|             {
 | |
|                 wchar_t *namespaceValue = token->GetValue ()->token ;
 | |
| 
 | |
| 				if ( namespaceValue )
 | |
| 				{
 | |
| 					wchar_t *copy = new wchar_t [ wcslen ( namespaceValue ) + 1 ] ;
 | |
| 					wcscpy ( copy , namespaceValue ) ;
 | |
| 
 | |
| 					GetNamespacePath ()->Add ( copy ) ;
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					status = FALSE ;
 | |
| 				}
 | |
|             }
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: DOT_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             WbemLexicon *token ;
 | |
|             if ( token = Match ( WbemLexicon :: DOT_ID ) )
 | |
|             {
 | |
|                 wchar_t *copy = new wchar_t [ wcslen ( L"." ) + 1 ] ;
 | |
|                 wcscpy ( copy , L"." ) ;
 | |
| 
 | |
|                 GetNamespacePath ()->Add ( copy ) ;
 | |
|             }
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: NameSpaceRel ()
 | |
| {
 | |
|     GetNamespacePath ()->SetRelative ( TRUE ) ;
 | |
| 
 | |
|     NameSpaceName () &&
 | |
|     RecursiveNameSpaceRel () ;
 | |
|     
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: RecursiveNameSpaceRel ()
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: BACKSLASH_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             Match ( WbemLexicon :: BACKSLASH_ID ) &&
 | |
|             NameSpaceName () &&
 | |
|             RecursiveNameSpaceRel () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: COLON_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| 
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: NameSpaceAbs ()
 | |
| {
 | |
|     Match ( WbemLexicon :: BACKSLASH_ID ) &&
 | |
|     NameSpaceName () &&
 | |
|     RecursiveNameSpaceAbs () ;
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: RecursiveNameSpaceAbs ()
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: BACKSLASH_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
| 
 | |
|             Match ( WbemLexicon :: BACKSLASH_ID ) &&
 | |
|             NameSpaceName () &&
 | |
|             RecursiveNameSpaceAbs () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: COLON_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: ObjectSpec ()
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: TOKEN_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             FactoredClassSpec () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: OID_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             OidReferenceSpec () ;
 | |
|         } 
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: OidReferenceSpec ()
 | |
| {
 | |
|     Oid () ;
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: Oid ()
 | |
| {
 | |
|     WbemLexicon *token ;
 | |
|     if ( token = Match ( WbemLexicon :: OID_ID ) )
 | |
|     {
 | |
|         reference = new WbemOidReference ;
 | |
|         ( ( WbemOidReference * ) reference )->Set ( token->GetValue ()->guid ) ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         propertyValue = NULL ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: String ()
 | |
| {
 | |
|     WbemLexicon *token = NULL;
 | |
| 	propertyValue = NULL ;
 | |
| 
 | |
|     if ( token = Match ( WbemLexicon :: STRING_ID ) )
 | |
|     {   
 | |
|         wchar_t *string = token->GetValue()->string ;
 | |
| 
 | |
| 		if ( string )
 | |
| 		{
 | |
| 			propertyValue = new WbemPropertyStringValue ( string ) ;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			status = FALSE ;
 | |
| 		}
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: Token ()
 | |
| {
 | |
|     WbemLexicon *token = NULL;
 | |
| 	propertyValue = NULL ;
 | |
| 
 | |
|     if ( token = Match ( WbemLexicon :: TOKEN_ID ) )
 | |
|     {
 | |
|         wchar_t *tokenString = token->GetValue()->token ;
 | |
| 
 | |
| 		if ( tokenString )
 | |
| 		{
 | |
| 			propertyValue = new WbemPropertyTokenValue ( tokenString ) ;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			status = FALSE ;
 | |
| 		}
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: Integer ()
 | |
| {
 | |
|     WbemLexicon *token = NULL ;
 | |
| 
 | |
|     if ( token = Match ( WbemLexicon :: INTEGER_ID ) )
 | |
|     {
 | |
|         LONG integer  = token->GetValue()->integer ;
 | |
|         propertyValue = new WbemPropertyIntegerValue ( integer ) ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         propertyValue = NULL ;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: FactoredClassSpec ()
 | |
| {
 | |
|     WbemLexicon *token = NULL ;
 | |
|     if ( token = Match ( WbemLexicon :: TOKEN_ID ) )
 | |
|     {
 | |
|         wchar_t *classNameValue = token->GetValue ()->token ;
 | |
| 
 | |
| 		if ( classNameValue )
 | |
| 		{
 | |
| 			wchar_t *className = new wchar_t [ wcslen ( classNameValue ) + 1 ] ;
 | |
| 
 | |
| 			try
 | |
| 			{
 | |
| 				wcscpy ( className , classNameValue ) ;
 | |
| 
 | |
| 				PushBack () ;
 | |
| 				ClassReference () ;
 | |
| 
 | |
| 				WbemLexicon *lookAhead = Get () ;
 | |
| 				switch ( lookAhead->GetToken () ) 
 | |
| 				{
 | |
| 					case WbemLexicon :: DOT_ID:
 | |
| 					{
 | |
| 						reference = new WbemInstanceSpecification ;
 | |
| 						( ( WbemInstanceSpecification * ) reference )->SetClass ( className ) ;
 | |
| 						delete [] className ;
 | |
| 						className = NULL;
 | |
| 
 | |
| 						PushBack () ;
 | |
| 						Match ( WbemLexicon :: DOT_ID ) &&
 | |
| 						KeyPropertySpec () ;
 | |
| 					}
 | |
| 					break ;
 | |
| 
 | |
| 					case WbemLexicon :: EQUALS_ID:
 | |
| 					{
 | |
| 						PushBack () ;
 | |
| 						Match ( WbemLexicon :: EQUALS_ID ) &&
 | |
| 						FactoredAtPropertyValueSpec ( className ) ;
 | |
| 
 | |
| 						delete [] className ;
 | |
| 						className = NULL;
 | |
| 					}
 | |
| 					break ;
 | |
| 
 | |
| 					case WbemLexicon :: EOF_ID:
 | |
| 					{
 | |
| 						reference = new WbemClassReference ;
 | |
| 						( ( WbemClassReference * ) reference )->SetClass ( className ) ;
 | |
| 						delete [] className ;
 | |
| 						className = NULL;
 | |
| 
 | |
| 						PushBack () ;
 | |
| 					}
 | |
| 					break ;
 | |
| 
 | |
| 					default:
 | |
| 					{
 | |
| 						delete [] className ;
 | |
| 						className = NULL;
 | |
| 						status = FALSE ;
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			catch (...)
 | |
| 			{
 | |
| 				if (className)
 | |
| 				{
 | |
| 					delete [] className;
 | |
| 				}
 | |
| 
 | |
| 				throw;
 | |
| 			}
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			status = FALSE ;
 | |
| 		}
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: FactoredAtPropertyValueSpec ( wchar_t *className )
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: AT_ID:
 | |
|         {
 | |
|             reference = new WbemKeyLessClassReference ;
 | |
|             ( ( WbemKeyLessClassReference * ) reference )->SetClass ( className ) ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             reference = new WbemClassKeySpecification ;
 | |
|             ( ( WbemClassKeySpecification * ) reference )->SetClass ( className ) ;
 | |
| 
 | |
|             PushBack () ;
 | |
|             PropertyValueSpec () ;
 | |
| 
 | |
|             ( ( WbemClassKeySpecification * ) reference )->SetClassValue ( propertyValue ) ;
 | |
|             propertyValue = NULL ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: PropertyReference ()
 | |
| {
 | |
|     WbemLexicon *token = NULL ;
 | |
|     propertyName = NULL ;
 | |
| 
 | |
|     if ( token = Match ( WbemLexicon :: TOKEN_ID ) )
 | |
|     {   
 | |
|         wchar_t *tokenArg = token->GetValue()->token ;
 | |
| 
 | |
| 		if ( tokenArg )
 | |
| 		{
 | |
| 			wchar_t *token = new wchar_t [ wcslen ( tokenArg ) + 1 ] ;
 | |
| 			wcscpy ( token , tokenArg ) ;
 | |
| 			propertyName = token ;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			status = FALSE ;
 | |
| 		}
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: ClassReference ()
 | |
| {
 | |
|     if ( Match ( WbemLexicon :: TOKEN_ID ) )
 | |
|     {   
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: KeyPropertyPair ()
 | |
| {
 | |
|     PropertyReference () &&
 | |
|     Match ( WbemLexicon :: EQUALS_ID ) &&
 | |
|     PropertyValueSpec () ;
 | |
| 
 | |
|     if ( status )
 | |
|     {
 | |
|         WbemPropertyNameValue *propertyNameValue = new WbemPropertyNameValue (
 | |
| 
 | |
|             propertyName ,
 | |
|             propertyValue
 | |
|         ) ;
 | |
| 
 | |
|         ( ( WbemInstanceSpecification * ) reference )->Add ( propertyNameValue ) ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         delete [] propertyName ;
 | |
|         delete propertyValue ;
 | |
|     }
 | |
| 
 | |
|     propertyName = NULL ;
 | |
|     propertyValue = NULL ;
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: KeyPropertySpec ()
 | |
| {
 | |
|     KeyPropertyPair () &&
 | |
|     RecursiveKeyPropertyPair () ;
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: RecursiveKeyPropertyPair ()
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: COMMA_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             Match ( WbemLexicon :: COMMA_ID ) &&
 | |
|             KeyPropertyPair () &&
 | |
|             RecursiveKeyPropertyPair () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: EOF_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|         } 
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: PropertyValueSpec () 
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: INTEGER_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             AtomicPropertyValueSpec () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: TOKEN_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             AtomicPropertyValueSpec () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: OID_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             AtomicPropertyValueSpec () ;
 | |
|         } 
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: STRING_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             AtomicPropertyValueSpec () ;
 | |
|         } 
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: OPEN_BRACE_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             ArraySpec () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: AtomicPropertyValueSpec () 
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: INTEGER_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             Integer () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: TOKEN_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             Token () ;
 | |
|         }
 | |
|         break ;
 | |
|         
 | |
|         case WbemLexicon :: STRING_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             String () ;
 | |
|         } 
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: OID_ID:
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: ArrayAtomicPropertyValueSpec ()
 | |
| {
 | |
|     AtomicPropertyValueSpec () ;
 | |
|     if ( status ) 
 | |
|     {
 | |
|         arrayPropertyValue->Add ( propertyValue ) ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         delete propertyValue ;
 | |
|     }
 | |
| 
 | |
|     propertyValue = NULL ;
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: ArraySpec () 
 | |
| {
 | |
|     arrayPropertyValue = new WbemPropertyListValue ;
 | |
| 
 | |
|     Match ( WbemLexicon :: OPEN_BRACE_ID ) &&
 | |
|     PropertyAtomicValueList () &&
 | |
|     Match ( WbemLexicon :: CLOSE_BRACE_ID ) ;
 | |
| 
 | |
|     propertyValue = arrayPropertyValue ;
 | |
|     arrayPropertyValue = NULL ;
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: PropertyAtomicValueList ()
 | |
| {
 | |
|     ArrayAtomicPropertyValueSpec () &&
 | |
|     RecursiveAtomicPropertyValueSpec () ;
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 | |
| BOOL WbemObjectPath :: RecursiveAtomicPropertyValueSpec ()
 | |
| {
 | |
|     WbemLexicon *lookAhead = Get () ;
 | |
|     switch ( lookAhead->GetToken () ) 
 | |
|     {
 | |
|         case WbemLexicon :: COMMA_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|             Match ( WbemLexicon :: COMMA_ID ) &&
 | |
|             ArrayAtomicPropertyValueSpec () &&
 | |
|             RecursiveAtomicPropertyValueSpec () ;
 | |
|         }
 | |
|         break ;
 | |
| 
 | |
|         case WbemLexicon :: CLOSE_BRACE_ID:
 | |
|         {
 | |
|             PushBack () ;
 | |
|         } 
 | |
|         break ;
 | |
| 
 | |
|         default:
 | |
|         {
 | |
|             status = FALSE ;
 | |
|         }
 | |
|         break ;
 | |
|     }
 | |
| 
 | |
|     return status ;
 | |
| }
 | |
| 
 |