# win32_services.rb
#  enumerate/pull/release for Win32_Service
#
# Coded after wsmancli/examples/win32_service.c
#
#

require 'test/unit'
require 'rexml/document'
require File.join(File.dirname(__FILE__),'_loadpath')
require 'openwsman'
require '_client'

class WsmanTest < Test::Unit::TestCase
  def test_client
    client = Client.open
    assert client
    options = Openwsman::ClientOptions.new
    assert options
#    options.set_dump_request
#    puts "Flags = #{options.flags}"

#
# see http://msdn2.microsoft.com/en-us/library/aa386179.aspx for a list of CIM classes
#   the Win32 classes are derived from
#
#    uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/Win32_Service"
    uri = "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ComputerSystem"
    result = client.enumerate( options, nil, uri )
    assert result

    results = 0
    faults = 0
    context = nil
 
#loop do
    context = result.context
    raise "No context inside result" unless context
#    puts "Context #{context} retrieved"

    result = client.pull( options, nil, uri, context )
    raise "client.pull returned nil" unless result

    results += 1

    if result.fault?
	puts "Got fault"
	faults += 1
    end

    node = result.body.PullResponse.Items.child

    node.each do |child|
      text = child.text
      acount = child.attr_count
      puts "Child [#{acount}] #{child.name}: #{text}"
      if acount > 0
	child.each_attr{ |attr| puts "\tAttr #{attr.ns}:#{attr.name}=#{attr.value}" }
      end
      #	return false if text.nil?
    end
    name = node.Name
    state = node.State

    puts "#{name} is #{state}"
#end

    client.release( options, uri, context ) if context
    puts "Context released, #{results} results, #{faults} faults"
  end
end

