Subversion Repositories DevTools

Rev

Rev 2222 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2218 sbetterm 1
//## begin module%1.7%.codegen_version preserve=yes
2
//   Read the documentation to learn more about C++ code generator
3
//   versioning.
4
//## end module%1.7%.codegen_version
5
 
6
//## begin module%41F607FA0261.cm preserve=no
7
//## end module%41F607FA0261.cm
8
 
9
//## begin module%41F607FA0261.cp preserve=no
10
//	C O P Y R I G H T   N O T I C E
11
//	This material is confidential to ERG and may not be disclosed in whole
12
//	or in part to any third party nor used in any manner whatsoever other
13
//	than for the purposes expressly consented to by ERG in writing.
14
//
15
//	This material is also copyright and may not be reproduced, stored in a
16
//	retrieval system or transmitted in any form or by any means in whole or
17
//	in part without the express written consent of ERG.
18
//## end module%41F607FA0261.cp
19
 
20
//## Module: TransactionSpecification%41F607FA0261; Pseudo Package body
21
//## Subsystem: MASS::Dev::Tools::TxnTestManager::src%41F5A79001E4
22
//## Source file: Z:\MASS_Dev\Tools\TxnTestManager\src\TransactionSpecification.cpp
23
 
24
//## begin module%41F607FA0261.additionalIncludes preserve=no
25
//## end module%41F607FA0261.additionalIncludes
26
 
27
//## begin module%41F607FA0261.includes preserve=yes
28
#pragma warn -com
29
#include <LoggingMacros.h>
30
#pragma warn +com
31
//## end module%41F607FA0261.includes
32
 
33
// IXmlSchemaWrapperFactory
34
#include "IXmlSchemaWrapperFactory.h"
35
// IXmlSchemaWrapperSchema
36
#include "IXmlSchemaWrapperSchema.h"
37
// IXmlSchemaWrapperString
38
#include "IXmlSchemaWrapperString.h"
39
// TransactionSpecification
40
#include "TransactionSpecification.h"
41
// IXmlSchemaWrapperByteArray
42
#include "IXmlSchemaWrapperByteArray.h"
43
// IXmlSchemaWrapperElement
44
#include "IXmlSchemaWrapperElement.h"
45
// IMessageDigest
46
#include "IMessageDigest.h"
47
// MacCallback
48
#include "MacCallback.h"
49
// EvaluationCallback
50
#include "EvaluationCallback.h"
51
// EvaluationContext
52
#include "EvaluationContext.h"
53
// TransactionStream
54
#include "TransactionStream.h"
55
// TransactionStructure
56
#include "TransactionStructure.h"
57
// Iteration
58
#include "Iteration.h"
59
// TestScenario
60
#include "TestScenario.h"
61
// TimeEstimate
62
#include "TimeEstimate.h"
63
// ProgressBar
64
#include "ProgressBar.h"
65
// TransactionSpecificationValue
66
#include "TransactionSpecificationValue.h"
67
//## begin module%41F607FA0261.additionalDeclarations preserve=yes
68
#include <sstream>
69
#include "Utilities.h"
70
//## end module%41F607FA0261.additionalDeclarations
71
 
72
 
73
// Class TransactionSpecification 
74
 
75
//## begin TransactionSpecification::headerStructureName%4206D764033E.attr preserve=no  private: static char {RAC} "SysHdr_t"
76
const char *TransactionSpecification::g_headerStructureName = "SysHdr_t";
77
//## end TransactionSpecification::headerStructureName%4206D764033E.attr
78
 
79
//## Operation: TransactionSpecification%41F7060D0204
80
TransactionSpecification::TransactionSpecification (const int &transactionSpecificationNumber)
81
  //## begin TransactionSpecification::TransactionSpecification%41F7060D0204.hasinit preserve=no
82
      : m_structureIndex(0),
83
        m_transactionSpecificationNumber(0),
84
        m_udSubtype(0),
85
        m_udType(0),
86
        m_formatVersion(0),
87
        m_scenario(0),
88
        m_string(0),
89
        m_structure(0),
90
        m_macFields(0)
91
  //## end TransactionSpecification::TransactionSpecification%41F7060D0204.hasinit
92
  //## begin TransactionSpecification::TransactionSpecification%41F7060D0204.initialization preserve=yes
93
  //## end TransactionSpecification::TransactionSpecification%41F7060D0204.initialization
94
{
95
  //## begin TransactionSpecification::TransactionSpecification%41F7060D0204.body preserve=yes
96
 
97
  m_transactionSpecificationNumber = transactionSpecificationNumber;
98
 
99
  //## end TransactionSpecification::TransactionSpecification%41F7060D0204.body
100
}
101
 
102
//## Operation: TransactionSpecification%42045473030D
103
TransactionSpecification::TransactionSpecification (const int &transactionSpecificationNumber, const std::string &payloadStructureName, TestScenario& scenario)
104
  //## begin TransactionSpecification::TransactionSpecification%42045473030D.hasinit preserve=no
105
      : m_structureIndex(0),
106
        m_transactionSpecificationNumber(0),
107
        m_udSubtype(0),
108
        m_udType(0),
109
        m_formatVersion(0),
110
        m_scenario(0),
111
        m_string(0),
112
        m_structure(0),
113
        m_macFields(0)
114
  //## end TransactionSpecification::TransactionSpecification%42045473030D.hasinit
115
  //## begin TransactionSpecification::TransactionSpecification%42045473030D.initialization preserve=yes
116
  //## end TransactionSpecification::TransactionSpecification%42045473030D.initialization
117
{
118
  //## begin TransactionSpecification::TransactionSpecification%42045473030D.body preserve=yes
119
 
120
	m_formatVersion	= scenario.getIteration().getFormatVersion();
121
	m_scenario		= &scenario;
122
	m_string
123
		= &scenario.getIteration().getSchemaWrapperFactory().createString();
124
	m_structureName	= payloadStructureName;
125
	m_transactionSpecificationNumber
126
		= transactionSpecificationNumber;
127
 
128
	// Allocate the structures that we'll need for this transaction.
129
	TransactionStructure * object = 0;
130
	try
131
	{
132
		object =new TransactionStructure(
133
			g_headerStructureName,
134
			m_scenario->getIteration().getIterationId(),
135
			m_scenario->getIteration().getSchemaWrapperFactory(),
136
			m_scenario->getIteration().getSchema(),
137
			true );
138
		m_structure.push_back( object );
139
		object = 0;
140
 
141
		object =new TransactionStructure(
142
			payloadStructureName,
143
			m_scenario->getIteration().getIterationId(),
144
			m_scenario->getIteration().getSchemaWrapperFactory(),
145
			m_scenario->getIteration().getSchema(),
146
			false );
147
		m_structure.push_back( object );
148
		object = 0;
149
	}
150
	catch ( ... )
151
	{
152
		// Rollback.
153
		delete object;
154
		object = 0;
155
 
156
		for ( std::vector< TransactionStructure * >::iterator
157
				structure = m_structure.begin();
158
			  structure != m_structure.end();
159
			  ++structure )
160
		{
161
			delete *structure;
162
			*structure = 0;
163
		}
164
		m_structure.clear();
165
 
166
		throw;
167
	}
168
 
169
  //## end TransactionSpecification::TransactionSpecification%42045473030D.body
170
}
171
 
172
 
173
TransactionSpecification::~TransactionSpecification()
174
{
175
  //## begin TransactionSpecification::~TransactionSpecification%41F607FA0261_dest.body preserve=yes
176
 
177
	for ( std::map< std::string, TransactionSpecificationValue * >::iterator
178
			transaction = m_value.begin();
179
		  transaction != m_value.end();
180
		  ++transaction )
181
	{
182
		delete transaction->second;
183
		transaction->second = 0;
184
	}
185
	m_value.clear();
186
 
187
	for ( std::vector< TransactionStructure * >::iterator
188
			structure = m_structure.begin();
189
		  structure != m_structure.end();
190
		  ++structure )
191
	{
192
		delete *structure;
193
		*structure = 0;
194
	}
195
	m_structure.clear();
196
 
197
	if ( m_string && m_scenario )
198
	{
199
		m_scenario->getIteration().getSchemaWrapperFactory().destroyString( *m_string );
200
		m_string = 0;
201
	}
202
	m_scenario = 0;	// We don't own this object.
203
 
204
  //## end TransactionSpecification::~TransactionSpecification%41F607FA0261_dest.body
205
}
206
 
207
 
208
 
209
//## Other Operations (implementation)
210
//## Operation: addMacField%4212DBC1031E
211
void TransactionSpecification::addMacField (XMLSchema::IXmlSchemaWrapperElement &element)
212
{
213
  //## begin TransactionSpecification::addMacField%4212DBC1031E.body preserve=yes
214
 
215
	m_macFields.push_back( &element );  
216
 
217
  //## end TransactionSpecification::addMacField%4212DBC1031E.body
218
}
219
 
220
//## Operation: addValue%41F70652035C
221
void TransactionSpecification::addValue (const std::string &xPath, const std::string &value, const bool &obsolete)
222
{
223
  //## begin TransactionSpecification::addValue%41F70652035C.body preserve=yes
224
 
225
	TransactionSpecificationValue * theValue = 0;
226
 
227
	try
228
	{
229
		theValue = new TransactionSpecificationValue( xPath, value, obsolete );
230
 
231
		if ( !m_value.insert(
232
				std::map< std::string, TransactionSpecificationValue * >::value_type(
233
					theValue->getXPath(),
234
					theValue ) ).second )
235
		{
236
			MTHROW( std::runtime_error, \
237
				"Cannot add value \"" \
238
				<< theValue->getXPath() \
239
				<< "\" to transaction " \
240
				<< m_transactionSpecificationNumber \
241
				<< '.' );
242
		}
243
	}
244
	catch ( ... )
245
	{
246
		delete theValue;
247
		theValue = 0;
248
 
249
		throw;
250
	}
251
 
252
  //## end TransactionSpecification::addValue%41F70652035C.body
253
}
254
 
255
//## Operation: clearMacFields%42130B2D0377
256
void TransactionSpecification::clearMacFields ()
257
{
258
  //## begin TransactionSpecification::clearMacFields%42130B2D0377.body preserve=yes
259
 
260
	XMLSchema::IXmlSchemaWrapperFactory & factory
261
		= m_scenario->getIteration().getSchemaWrapperFactory();
262
	for ( std::vector< XMLSchema::IXmlSchemaWrapperElement * >
263
			::iterator element = m_macFields.begin();
264
		  element != m_macFields.end();
265
		  ++element )
266
	{
267
		factory.destroySchemaElement( **element );
268
		*element = 0;
269
	}
270
	m_macFields.clear();
271
 
272
  //## end TransactionSpecification::clearMacFields%42130B2D0377.body
273
}
274
 
275
//## Operation: clearMarks%41F705790276
276
void TransactionSpecification::clearMarks ()
277
{
278
  //## begin TransactionSpecification::clearMarks%41F705790276.body preserve=yes
279
 
280
	for ( std::map< std::string, TransactionSpecificationValue * >::iterator
281
			where = m_value.begin();
282
		  where != m_value.end();
283
		  ++where )
284
	{
285
		where->second->unmark();
286
	}
287
 
288
  //## end TransactionSpecification::clearMarks%41F705790276.body
289
}
290
 
291
//## Operation: generate%4204564D02F3
292
const bool TransactionSpecification::generate (TransactionStream& stream, const bool &generateHeaders, EvaluationContext& evaluationContext)
293
{
294
  //## begin TransactionSpecification::generate%4204564D02F3.body preserve=yes
295
 
296
	/**
297
	 *	Traverse the structures associated with this transaction  in order,
298
	 *	querying our collection of defined fields for every schema element
299
	 *	that we encounter.  When we have a match, then we evaluate the
300
	 *	expression found, and assign the result to the schema element currently
301
	 * 	being visited.
302
	 */
303
 
304
	evaluationContext.setTransaction( *this );
305
 
306
	EvaluationCallback callback( *this, evaluationContext );
307
 
308
	bool generated = false;
309
	m_structureIndex = 0;
310
	std::vector< TransactionStructure * >::iterator structure;
311
	for ( structure = m_structure.begin();
312
		  structure != m_structure.end();
313
		  ++structure )
314
	{
315
		if ( generateHeaders || !(*structure)->isHeader() )
316
		{
317
			generated = (*structure)->getSchemaElement().traverse( callback );
318
			if ( !generated )
319
			{
320
				break;
321
			}
322
		}
323
		++m_structureIndex;
324
	}
325
 
326
	if ( generated )
327
	{
328
		/**
329
		 *	If we have any MAC fields, then we must compute the MAC and assign
330
		 *	the MAC to each element in the collection.
331
		 */
332
		if ( m_macFields.size() )
333
		{
334
			if ( evaluationContext.haveMessageDigest() )
335
			{
336
				XMLSchema::IXmlSchemaWrapperByteArray * value = 0;
337
				try
338
				{
339
					value = &m_scenario->getIteration().
340
						getSchemaWrapperFactory().createByteArray();
341
					MacCallback macCallback(
342
						evaluationContext,
343
						*value );
344
 
345
					m_structureIndex = 0;
346
					for ( structure = m_structure.begin();
347
						  structure != m_structure.end();
348
						  ++structure )
349
					{
350
						if ( !(*structure)->isHeader() )
351
						{
352
							generated = (*structure)->getSchemaElement().
353
								traverse( macCallback );
354
							if ( !generated )
355
							{
356
								break;
357
							}
358
						}
359
						++m_structureIndex;
360
					}
361
 
362
					if ( evaluationContext.getMessageDigest().getLength() )
363
					{
364
						value->assign(
365
							evaluationContext.getMessageDigest().getValue(),
366
							evaluationContext.getMessageDigest().getLength() );
367
						for ( std::vector< XMLSchema::IXmlSchemaWrapperElement * >
368
								::iterator macField = m_macFields.begin();
369
							  macField != m_macFields.end();
370
							  ++macField )
371
						{
372
							if ( !(*macField)->setByteArray( *value ) )
373
							{
374
								generated = false;
375
								break;
376
							}
377
						}
378
					}
379
				}
380
				__finally
381
				{
382
					if ( value )
383
					{
384
						m_scenario->getIteration().getSchemaWrapperFactory().
385
							destroyByteArray( *value );
386
						value = 0;
387
					}
388
				}
389
			}
390
			else
391
			{
392
				std::stringstream message;
393
				message
394
					<< "Cannot compute MAC.  Is the security subsystem operational?";
395
				MERROR( message.str() );
396
				message << "  Ignore the error and continue?";
397
 
398
				if ( MessageDlg(
399
						message.str().c_str(),
400
						mtConfirmation,
401
						TMsgDlgButtons() << mbYes << mbNo,
402
 
403
				{
404
					generated = false;
405
				}
406
			}
407
			clearMacFields();
408
		}
409
	}
410
 
411
	if ( generated )
412
	{
413
		for ( std::vector< TransactionStructure * >::iterator
414
				structure = m_structure.begin();
415
			  structure != m_structure.end();
416
			  ++structure )
417
		{
418
			if ( generateHeaders || !(*structure)->isHeader() )
419
			{
420
				/**
421
				 *	Serialise the structure into the transaction stream.
422
				 */
423
				generated = (*structure)->write( stream );
424
				if ( !generated )
425
				{
426
					break;
427
				}
428
				stream.incrementCount();
429
				if ( evaluationContext.haveProgressBar() )
430
				{
431
					evaluationContext.getProgressBar().increment();
432
				}
433
			}
434
		}
435
 
436
		evaluationContext.getTimeEstimate().increment();
437
	}
438
 
439
	return ( generated );
440
 
441
  //## end TransactionSpecification::generate%4204564D02F3.body
442
}
443
 
444
//## Operation: getCurrentStructure%4213183F01DD
445
const TransactionStructure & TransactionSpecification::getCurrentStructure () const
446
{
447
  //## begin TransactionSpecification::getCurrentStructure%4213183F01DD.body preserve=yes
448
 
449
	return ( *m_structure[ m_structureIndex ] );  
450
 
451
  //## end TransactionSpecification::getCurrentStructure%4213183F01DD.body
452
}
453
 
454
//## Operation: getFormatVersion%4208BB80011D
455
const int & TransactionSpecification::getFormatVersion () const
456
{
457
  //## begin TransactionSpecification::getFormatVersion%4208BB80011D.body preserve=yes
458
 
459
	return ( m_formatVersion );
460
 
461
  //## end TransactionSpecification::getFormatVersion%4208BB80011D.body
462
}
463
 
464
//## Operation: getScenario%420471B00192
465
const TestScenario & TransactionSpecification::getScenario () const
466
{
467
  //## begin TransactionSpecification::getScenario%420471B00192.body preserve=yes
468
 
469
	return ( *m_scenario );
470
 
471
  //## end TransactionSpecification::getScenario%420471B00192.body
472
}
473
 
474
//## Operation: getTransactionField%4204283B033E
475
TransactionSpecificationValue& TransactionSpecification::getTransactionField (const std::string &xpath)
476
{
477
  //## begin TransactionSpecification::getTransactionField%4204283B033E.body preserve=yes
478
 
479
	std::map< std::string, TransactionSpecificationValue * >::const_iterator
480
		instance = m_value.find( xpath );
481
 
482
	if ( instance != m_value.end() )
483
	{
484
		return ( *instance->second );
485
	}
486
	else
487
	{
488
		TransactionSpecificationValue * object = 0;
489
 
490
		try
491
		{
492
			object = new TransactionSpecificationValue( xpath, *this );
493
 
494
			if ( m_value.insert(
495
					std::map< std::string, TransactionSpecificationValue * >::value_type(
496
						xpath,
497
						object ) ).second )
498
			{
499
				return ( *object );
500
			}
501
			else
502
			{
503
				MTHROW( std::runtime_error, \
504
					"Cannot add transaction field \"" \
505
					<< xpath \
506
					<< "\" to transaction " \
507
					<< m_transactionSpecificationNumber \
508
					<< '.' );
509
			}
510
		}
511
		catch ( ... )
512
		{
513
			delete object;
514
			object = 0;
515
 
516
			throw;
517
		}
518
	}
519
 
520
  //## end TransactionSpecification::getTransactionField%4204283B033E.body
521
}
522
 
523
//## Operation: getTransactionSpecificationNumber%41F71AD2002F
524
const int & TransactionSpecification::getTransactionSpecificationNumber () const
525
{
526
  //## begin TransactionSpecification::getTransactionSpecificationNumber%41F71AD2002F.body preserve=yes
527
 
528
	return ( m_transactionSpecificationNumber );
529
 
530
  //## end TransactionSpecification::getTransactionSpecificationNumber%41F71AD2002F.body
531
}
532
 
533
//## Operation: getUdSubtype%4208AFAF01F7
534
const unsigned short & TransactionSpecification::getUdSubtype () const
535
{
536
  //## begin TransactionSpecification::getUdSubtype%4208AFAF01F7.body preserve=yes
537
 
538
	return ( m_udSubtype );
539
 
540
  //## end TransactionSpecification::getUdSubtype%4208AFAF01F7.body
541
}
542
 
543
//## Operation: getUdType%4208AFAF0245
544
const unsigned short & TransactionSpecification::getUdType () const
545
{
546
  //## begin TransactionSpecification::getUdType%4208AFAF0245.body preserve=yes
547
 
548
	return ( m_udType );
549
 
550
  //## end TransactionSpecification::getUdType%4208AFAF0245.body
551
}
552
 
553
//## Operation: getValues%41F705A600AC
554
const std::map< std::string, TransactionSpecificationValue * > & TransactionSpecification::getValues () const
555
{
556
  //## begin TransactionSpecification::getValues%41F705A600AC.body preserve=yes
557
 
558
	return ( m_value );
559
 
560
  //## end TransactionSpecification::getValues%41F705A600AC.body
561
}
562
 
563
//## Operation: isContained%41F70575014E
564
const bool TransactionSpecification::isContained (const std::string &xPath) const
565
{
566
  //## begin TransactionSpecification::isContained%41F70575014E.body preserve=yes
567
 
568
  return ( m_value.find( xPath ) != m_value.end() );
569
 
570
  //## end TransactionSpecification::isContained%41F70575014E.body
571
}
572
 
573
//## Operation: isMarked%41F708CB0307
574
const bool TransactionSpecification::isMarked (const std::string &xPath) const
575
{
576
  //## begin TransactionSpecification::isMarked%41F708CB0307.body preserve=yes
577
 
578
	std::map< std::string, TransactionSpecificationValue * >::const_iterator
579
		instance = m_value.find( xPath );
580
 
581
	if ( instance != m_value.end() )
582
	{
583
		return ( instance->second->isMarked() );
584
	}
585
	else
586
	{
587
		MTHROW( std::runtime_error, \
588
			"Cannot find value " << xPath << '.' );
589
	}
590
 
591
  //## end TransactionSpecification::isMarked%41F708CB0307.body
592
}
593
 
594
//## Operation: markValue%41F7069E002F
595
void TransactionSpecification::markValue (const std::string &xPath)
596
{
597
  //## begin TransactionSpecification::markValue%41F7069E002F.body preserve=yes
598
 
599
	std::map< std::string, TransactionSpecificationValue * >::const_iterator
600
		instance = m_value.find( xPath );
601
 
602
	if ( instance != m_value.end() )
603
	{
604
		instance->second->mark();
605
	}
606
	else
607
	{
608
		MTHROW( std::runtime_error, \
609
			"Cannot find value " << xPath << '.' );
610
	}
611
 
612
  //## end TransactionSpecification::markValue%41F7069E002F.body
613
}
614
 
615
//## Operation: setUdSubtype%42044110019A
616
const unsigned short & TransactionSpecification::setUdSubtype (const unsigned short &value)
617
{
618
  //## begin TransactionSpecification::setUdSubtype%42044110019A.body preserve=yes
619
 
620
	return ( m_udSubtype = value );
621
 
622
  //## end TransactionSpecification::setUdSubtype%42044110019A.body
623
}
624
 
625
//## Operation: setUdType%420440DE038E
626
const unsigned short & TransactionSpecification::setUdType (const unsigned short &value)
627
{
628
  //## begin TransactionSpecification::setUdType%420440DE038E.body preserve=yes
629
 
630
	return ( m_udType = value );
631
 
632
  //## end TransactionSpecification::setUdType%420440DE038E.body
633
}
634
 
635
//## Operation: evaluate%4205C6F500FC
636
const bool TransactionSpecification::evaluate (XMLSchema::IXmlSchemaWrapperElement &element, EvaluationContext& context)
637
{
638
  //## begin TransactionSpecification::evaluate%4205C6F500FC.body preserve=yes
639
 
640
	/**
641
	 *	Build an XPath from the name of the structure that we are traversing
642
	 *	right now and the xpath reported by the element being visited.  Then
643
	 *	look for a field with that XPath.
644
	 */
645
 
646
	std::stringstream xpath;
647
	if ( element.getAttributeValue( "xpath", *m_string ) )
648
	{
649
		xpath
650
			<< '/'
651
			<< m_structure[ m_structureIndex ]->getName()
652
			<< m_string->c_str();
653
 
654
		/**
655
		 *	Find the element if we have it.  We get calls for everything, not
656
		 *	just for what we have.  When we don't have the element, then we
657
		 *	have nothing to set, which is fine.
658
		 */
659
		std::map< std::string, TransactionSpecificationValue * >::iterator
660
			field = m_value.find( xpath.str() );
661
		if ( field != m_value.end() )
662
		{
663
			std::string value;
664
			bool postponed = false;
665
			if ( field->second->evaluate( value, true, context, postponed ) )
666
			{
667
				if ( !postponed )
668
				{
669
					*m_string = value.c_str();
670
					if ( element.setString( *m_string ) )
671
					{
672
						return ( true );
673
					}
674
					else
675
					{
676
						std::string datatype;
677
						if ( element.getAttributeValue( "datatype", *m_string ) )
678
						{
679
							datatype = m_string->c_str();
680
						}
681
 
682
						std::stringstream message;
683
						message
684
							<< "Cannot set value of \""
685
							<< xpath.str()
686
							<< "\" to \""
687
							<< value
688
							<< "\" as \""
689
							<< datatype
690
							<< "\".";
691
						MERROR( message.str() );
692
						message << "  Continue?";
693
 
694
						return ( MessageDlg(
695
									message.str().c_str(),
696
									mtConfirmation,
697
									TMsgDlgButtons() << mbYes << mbNo,
698
 
699
					}
700
				}
701
				else
702
				{
703
					return ( true );
704
				}
705
			}
706
			else
707
			{
708
				std::stringstream message;
709
				message
710
					<< "Cannot evaluate value of \"" \
711
					<< field->second->getExpression() \
712
					<< "\" for \"" \
713
					<< xpath.str() \
714
					<< "\".";
715
				MERROR( message.str() );
716
				message << "  Continue?";
717
 
718
				return ( MessageDlg(
719
							message.str().c_str(),
720
							mtConfirmation,
721
							TMsgDlgButtons() << mbYes << mbNo,
722
 
723
			}
724
		}
725
		else
726
		{
727
			// We have no value for this element, which is fine.
728
			return ( true );
729
		}
730
	}
731
	else
732
	{
733
		MERROR( "Cannot get xpath for schema element " << &element << '.' );
734
	}
735
 
736
	return ( false );
737
 
738
  //## end TransactionSpecification::evaluate%4205C6F500FC.body
739
}
740
 
741
// Additional Declarations
742
  //## begin TransactionSpecification%41F607FA0261.declarations preserve=yes
743
  //## end TransactionSpecification%41F607FA0261.declarations
744
 
745
//## begin module%41F607FA0261.epilog preserve=yes
746
//## end module%41F607FA0261.epilog