[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-client-cvs
Subject:    [Client-cvs] encodesvc/engine/encsession encodingjob.cpp, 1.8.2.26,
From:       tburton () helixcommunity ! org
Date:       2010-01-27 8:52:20
Message-ID: 201001270852.o0R8qVrN006199 () mailer ! progressive-comp ! com
[Download RAW message or body]

Update of /cvsroot/client/encodesvc/engine/encsession
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv20875

Modified Files:
      Tag: PRODUCER_13_0_RN
	encodingjob.cpp encodingjob.h jobserial.cpp 
	settingsadvisor.cpp 
Log Message:
Description: Fixed Bug 256585: Producer treats output filenames containing 
substitution vars as relative and prepends working dir
================================================
The problem here was that HXBuildInstanceAfterTransformFromBuffer was 
returning HXR_FAIL if a file destination was invalid 
(i.e. Filename=“%InputFilePath%/test.rm”). This result was then used to tell 
the cli or activex that the job was invalid.

The solution was to do token substitution in deserializeJobFromBuffer and 
deserializeJob.
- These two functions are called when HXBuildInstanceFromFile and 
HXBuildInstanceFromBuffer are called.
- Each function has a CHXTElement (xml element)
- Add JobFile to the CHXTElement in deserializeJob (from file).
- Do token substitution on each CHXTElement with a new token replacer.
- Let the ReadEncodingJob create the encoding job from the CHXTElement 
that has substitution.


Description: Fixed Bug 256913: 
Remove job filename argument from StartEncoding function.
================================================
Job filename was provided to StartEncoding because the token replacer in 
StartEncoding needed to know the job file path to do substitution. To provide 
this, I was passing job filename to start encoding and then to the token 
replacer. This was not a good fix because of bug 256585 preventing job creation
 and StartEncoding was a common function that should not need job filename. 
 A new fix was to add the job filename to the encoding job. 
This fix required the following:
1) Add JobFile to the job xsd
2) Remove the job filename from StartEncoding calls (remove old fix)
3) Insert the job filename into the encoding job
4) Have the gui insert JobFile into the job buffer (Dura did this)
5) Handle JobFile similar to JobName. This includes passing on it in 
OnSetString calls.
 

Files Changed:
================================================ 
client/encodesvc/activex/ctrl/ProducerCtrl.cpp
producerapps/cmdproducer/session.cpp
client/encodesvc/common/util/hxccfhelper.cpp
client/encodesvc/include/ihxtconstants.h
client/encodesvc/include/ihxtencodingjob.h
client/encodesvc/engine/encsession/encodingjob.cpp
client/encodesvc/engine/encsession/encodingjob.h
client/encodesvc/engine/encsession/jobserial.cpp
client/encodesvc/engine/encsession/settingsadvisor.cpp
client/encodesvc/common/tokenreplacer/Umakefil
client/encodesvc/common/tokenreplacer/hxtbagtokenreplacer.cpp
client/encodesvc/common/tokenreplacer/hxtjobtokenreplacer.cpp
client/encodesvc/common/tokenreplacer/pub/hxtbagtokenreplacer.h
client/encodesvc/common/tokenreplacer/pub/hxtjobtokenreplacer.h
producerapps/installer/root/xmlschemas/job.3.0.xsd
 

Files Added:
================================================ 
client/encodesvc/common/tokenreplacer/hxtelementtokenreplacer.cpp
client/encodesvc/common/tokenreplacer/pub/hxtelementtokenreplacer.h


Branches:
================================================
13_0, HEAD

Index: encodingjob.cpp
===================================================================
RCS file: /cvsroot/client/encodesvc/engine/encsession/encodingjob.cpp,v
retrieving revision 1.8.2.26
retrieving revision 1.8.2.27
diff -u -d -r1.8.2.26 -r1.8.2.27
--- encodingjob.cpp	15 Jan 2010 22:06:15 -0000	1.8.2.26
+++ encodingjob.cpp	27 Jan 2010 08:52:16 -0000	1.8.2.27
@@ -657,7 +657,7 @@
     // 3) Cycle over each output
     // 4) If the output is a file, get the filename
     // 5) Log "Preparing to encode file [Input Filename] to file [Output Filename]"
-	HX_RESULT res = HXR_OK;
+    HX_RESULT res = HXR_OK;
     IHXTInput2Ptr spInputGroup;
     IHXTInputPtr spInput;
     if(SUCCEEDED(this->GetInput(spInput.Adopt())))
@@ -732,7 +732,7 @@
 //  CHXTEncodingJob::StartEncoding
 // Purpose:
 //  Starts actual encoding
-STDMETHODIMP CHXTEncodingJob::StartEncoding(BOOL bBlockUntilFinished, const char* \
szJobFilePath) +STDMETHODIMP CHXTEncodingJob::StartEncoding(BOOL bBlockUntilFinished)
 {
     HX_RESULT res = HXR_OK;
     
@@ -774,25 +774,15 @@
     }
 
     // For Token Substitution
-    IHXValues* pValues = NULL;
-    res = m_spFactory->CreateInstance(CLSID_IHXValues, (void**)&pValues);
-    if(SUCCEEDED(res) && szJobFilePath)
-    {
-        IHXBuffer *pIBuffer = NULL;
-        res = m_spFactory->CreateInstance(CLSID_IHXBuffer, (void**)&pIBuffer);
-        pIBuffer->Set((const unsigned char*)szJobFilePath, strlen( szJobFilePath ) + \
                1);
-        pValues->SetPropertyCString("JobPath", pIBuffer);
-        HX_RELEASE(pIBuffer);
-    }
     if(SUCCEEDED(res))
     {
-        HXTJobTokenReplacer pTokenReplacer((IHXTEncodingJob*) this, pValues, \
m_spFactory); +        HXTJobTokenReplacer pTokenReplacer((IHXTEncodingJob*) this, \
m_spFactory);  pTokenReplacer.ReplaceTokens();
     }
 
-	// Log message(s) for file input to all file outputs
-	// Logs "Preparing to encoding file <input> to file <output>" for each file output.
-	LogFileToFileMessages();
+    // Log message(s) for file input to all file outputs
+    // Logs "Preparing to encoding file <input> to file <output>" for each file \
output. +    LogFileToFileMessages();
     
     // Dump all user-specified properties to log
     LogUserSpecifiedProperties("EncodingJob");
@@ -1770,7 +1760,11 @@
     else if (strcmp(szName, kPropJobName) == 0)
     {
        res = HXR_OK;
-    }    
+    }
+    else if (strcmp(szName, kPropJobFile) == 0)
+    {
+       res = HXR_OK;
+    } 
     else
     {
     res = HXR_S_NOT_HANDLED;

Index: encodingjob.h
===================================================================
RCS file: /cvsroot/client/encodesvc/engine/encsession/encodingjob.h,v
retrieving revision 1.4.2.6
retrieving revision 1.4.2.7
diff -u -d -r1.4.2.6 -r1.4.2.7
--- encodingjob.h	14 Jan 2010 21:21:56 -0000	1.4.2.6
+++ encodingjob.h	27 Jan 2010 08:52:17 -0000	1.4.2.7
@@ -70,7 +70,7 @@
 class CHXTEncodingJob:
     public CUnknownIMP
     ,public CHXTConfigurationHelper<IHXTEncodingJob>
-    ,public IHXTSerializeBuffer 
+    ,public IHXTSerializeBuffer
     ,public IHXTUserConfigFile
     ,public IHXTStatistics
     ,public IHXTAggregateStatistics
@@ -82,7 +82,7 @@
     ~CHXTEncodingJob();
     
     // IHXTEncodingJob methods
-    STDMETHOD(StartEncoding) (THIS_ BOOL bBlockUntilFinished, const char* \
szJobFilePath); +    STDMETHOD(StartEncoding) (THIS_ BOOL bBlockUntilFinished);
     STDMETHOD(StopEncoding) (THIS);
     STDMETHOD(CancelEncoding) (THIS);
     
@@ -160,7 +160,7 @@
     BOOL m_bDoTwoPassEncoding;
     BOOL m_bDisableWallclock;
     BOOL m_bDisableLoadManagement;
-    BOOL m_bEnableSNMP; 
+    BOOL m_bEnableSNMP;
     HXBOOL m_bFirstStatsFill;
     UINT32 m_uLoadManagementJitterThreshold;
     UINT32 m_uDelayScaleThreshold;
@@ -217,8 +217,8 @@
             HX_VECTOR_DELETE(pPropertyBagName);
         };
 
-        IHXTStatisticsPtr       spStats;
-        char*                           pPropertyBagName;
+        IHXTStatisticsPtr spStats;
+        char*             pPropertyBagName;
     };
 
     CHXSimpleList*  m_pAggregateStatsList;

Index: jobserial.cpp
===================================================================
RCS file: /cvsroot/client/encodesvc/engine/encsession/jobserial.cpp,v
retrieving revision 1.4.2.5
retrieving revision 1.4.2.6
diff -u -d -r1.4.2.5 -r1.4.2.6
--- jobserial.cpp	24 Sep 2009 01:41:30 -0000	1.4.2.5
+++ jobserial.cpp	27 Jan 2010 08:52:17 -0000	1.4.2.6
@@ -63,6 +63,7 @@
 #include "hxstrutl.h"
 #include "hxtxmlparser.h"
 #include "hxbuffer.h"
+#include "hxtelementtokenreplacer.h"
 
 #include "hxheap.h"
 #ifdef _DEBUG
@@ -76,7 +77,7 @@
 #endif
 
 CHXTJobSerializer::CHXTJobSerializer() :
-	m_XMLVersionedIO(&m_XMLVersion, CHXTXMLVersionedIO::JOB_FILE)
+    m_XMLVersionedIO(&m_XMLVersion, CHXTXMLVersionedIO::JOB_FILE)
 {
 }
 
@@ -104,10 +105,11 @@
 
     list<realstring> toSkip;
     toSkip.push_back( kPropName );
-    toSkip.push_back( kPropJobName );	
+    toSkip.push_back( kPropJobName );
+    toSkip.push_back( kPropJobFile );
     toSkip.push_back( kszSNMPEnable );
 
-    CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);	
+    CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);  
     if (SUCCEEDED(res))
         res = cSerializer.Init(m_spFactory);
 
@@ -120,7 +122,7 @@
         parser.WriteBuffer(NULL, &size, false);
         pBuf->SetSize( size );
 
-        res= parser.WriteBuffer( (char*)pBuf->GetBuffer(), &size, false );		
+        res= parser.WriteBuffer( (char*)pBuf->GetBuffer(), &size, false );      
     }
 
     if (FAILED(res))
@@ -143,30 +145,31 @@
     HX_RESULT res = HXR_OK;
 
     CHXTElement elemEncodingJob;
-	m_XMLVersionedIO.WriteHeaders(elemEncodingJob);
+    m_XMLVersionedIO.WriteHeaders(elemEncodingJob);
 
     CHXTXmlParser parser;
     parser.AddRootElement( elemEncodingJob );
 
     list<realstring> toSkip;
     toSkip.push_back( kPropName );
-    toSkip.push_back( kPropJobName );	
+    toSkip.push_back( kPropJobName );   
+    toSkip.push_back( kPropJobFile );
     toSkip.push_back( kszSNMPEnable );
 
-	CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);	
-	if (SUCCEEDED(res))
-		res = cSerializer.Init(m_spFactory);
+    CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);  
+    if (SUCCEEDED(res))
+        res = cSerializer.Init(m_spFactory);
 
-	if (SUCCEEDED(res))
-		res = cSerializer.WriteEncodingJob(pJob, elemEncodingJob, &toSkip, \
pSerialCallback); +    if (SUCCEEDED(res))
+        res = cSerializer.WriteEncodingJob(pJob, elemEncodingJob, &toSkip, \
pSerialCallback);  
-	if (SUCCEEDED(res))
-    	res = parser.WriteFile( strJobFile, true );
+    if (SUCCEEDED(res))
+        res = parser.WriteFile( strJobFile, true );
 
-	if (FAILED(res))
-	{
-		HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10005,  "Unable to write job file %s", \
                strJobFile);
-	}
+    if (FAILED(res))
+    {
+        HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10005,  "Unable to write job file \
%s", strJobFile); +    }
 
     return res;
 }
@@ -190,61 +193,75 @@
         return HXR_INVALID_PARAMETER;
     }
 
-	xv.init(kValueJobXSDFileName);
-	HXBOOL bRet = xv.validateFile(strJobFile);
-	
-	if(bRet)
-	{
-		CHXTXmlParser parser;
-		if ( FAILED(res = parser.ParseFile(strJobFile)) )
-		{
-			if (res == HXR_INVALID_FILE )
-			{
-				HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10006,  "Unable to find or open jobfile: \
                %s", strJobFile );
-			}
-			else
-			{
-				const char* pErr=0;
-				UINT32 line=0;
-				parser.GetLastError( &pErr, &line );
-				HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10007,  "XML parsing error in jobfile: \
                %s, line#: %d, error: %s\n",strJobFile, line, pErr );
-			}
-			return HXR_FAIL;
-		}
+    xv.init(kValueJobXSDFileName);
+    HXBOOL bRet = xv.validateFile(strJobFile);
+    
+    if(bRet)
+    {
+        CHXTXmlParser parser;
+        if ( FAILED(res = parser.ParseFile(strJobFile)) )
+        {
+            if (res == HXR_INVALID_FILE )
+            {
+                HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10006,  "Unable to find or \
open jobfile: %s", strJobFile ); +            }
+            else
+            {
+                const char* pErr=0;
+                UINT32 line=0;
+                parser.GetLastError( &pErr, &line );
+                HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10007,  "XML parsing error in \
jobfile: %s, line#: %d, error: %s\n",strJobFile, line, pErr ); +            }
+            return HXR_FAIL;
+        }
 
-		CHXTElement& elemEncodingJob = (CHXTElement&) parser.GetRootElement();
+        CHXTElement& elemEncodingJob = (CHXTElement&) parser.GetRootElement();
 
-		if ( !elemEncodingJob || strcasecmp(elemEncodingJob.GetName(), kPropEncodingJob ) \
                != 0  )
-		{
-			HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10008,  "No <%s> root element found in \
                jobfile %s", kPropEncodingJob, strJobFile );
-			return HXR_FAIL;
-		}
+        if ( !elemEncodingJob || strcasecmp(elemEncodingJob.GetName(), \
kPropEncodingJob ) != 0  ) +        {
+            HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, 10008,  "No <%s> root element \
found in jobfile %s", kPropEncodingJob, strJobFile ); +            return HXR_FAIL;
+        }
 
-		CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);	
-		if (SUCCEEDED(res))
-			res = cSerializer.Init(m_spFactory, bForceInit, &xv);
+        CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);  
+        if (SUCCEEDED(res))
+            res = cSerializer.Init(m_spFactory, bForceInit, &xv);
 
-		if (SUCCEEDED(res))
-			res = cSerializer.VerifyVersion(elemEncodingJob, "");
+        if (SUCCEEDED(res))
+            res = cSerializer.VerifyVersion(elemEncodingJob, "");
 
-		CHXFileSpecifier fs(strJobFile);
-		CHXString oFilename = fs.GetName();
-		INT32 nExtOffset = oFilename.ReverseFind('.');
+        CHXFileSpecifier fs(strJobFile);
+        CHXString oFilename = fs.GetName();
+        INT32 nExtOffset = oFilename.ReverseFind('.');
 
-		// Add/override name property
-		CHXTElement elemName;
-		elemName.SetName(kPropName);
-		elemName.SetValue((nExtOffset > 0 ) ? oFilename.Left(nExtOffset) : oFilename);
-		elemName.AddAttribute(kAttribType, kAttrib_string);
-		elemEncodingJob.AddChildElement(elemName);
+        // Add/override name property
+        CHXTElement elemName;
+        elemName.SetName(kPropName);
+        elemName.SetValue((nExtOffset > 0 ) ? oFilename.Left(nExtOffset) : \
oFilename); +        elemName.AddAttribute(kAttribType, kAttrib_string);
+        elemEncodingJob.AddChildElement(elemName);
 
-		if (SUCCEEDED(res))
-			res = cSerializer.ReadEncodingJob(elemEncodingJob, pJob);
-	}
-	else
-	{
-		res = HXR_FAIL;
-	}
+        // Add JobFile to the encoding job if not already present
+        const CHXTAttribute& attrJobFile = \
elemEncodingJob.FindAttribute(kPropJobFile); +        if(!attrJobFile)
+        {
+            elemEncodingJob.AddAttribute(kPropJobFile, strJobFile);
+        }
+
+        // Do token substitution on CHXTElement encoding job
+        if (SUCCEEDED(res))
+        {
+            HXTElementTokenReplacer pTokenReplacer(elemEncodingJob, m_spFactory);
+            pTokenReplacer.ReplaceTokens();
+        }
+
+        if (SUCCEEDED(res))
+            res = cSerializer.ReadEncodingJob(elemEncodingJob, pJob);
+    }
+    else
+    {
+        res = HXR_FAIL;
+    }
     
     return res;
 }
@@ -260,54 +277,61 @@
         return HXR_INVALID_PARAMETER;
     }
     
-	xv.init(kValueJobXSDFileName);
+    xv.init(kValueJobXSDFileName);
 
     CHXString szString((const char*) pBuf->GetBuffer(), pBuf->GetSize());
-	HXBOOL bRet = xv.validateBuffer((const char*)szString);
-	
-	if(bRet)
-	{
+    HXBOOL bRet = xv.validateBuffer((const char*)szString);
+    
+    if(bRet)
+    {
 
 
-		CHXTXmlParser parser;
-		if ( FAILED(res = parser.ParseBuffer( (const char*) pBuf->GetBuffer(), \
                pBuf->GetSize() )) )
-		{
-			if (res == HXR_INVALID_FILE )
-			{
-				HXTLOG(LC_APP_ERROR, JOBFILE,  "Unable to find or open job buffer" );
-			}
-			else
-			{
-				const char* pErr=0;
-				UINT32 line=0;
-				parser.GetLastError( &pErr, &line );
-				HXTLOG(LC_APP_ERROR, JOBFILE, "XML parsing error in buffer: line#: %d, error: \
                %s", line, pErr );
-			}
-			return HXR_FAIL;
-		}
+        CHXTXmlParser parser;
+        if ( FAILED(res = parser.ParseBuffer( (const char*) pBuf->GetBuffer(), \
pBuf->GetSize() )) ) +        {
+            if (res == HXR_INVALID_FILE )
+            {
+                HXTLOG(LC_APP_ERROR, JOBFILE,  "Unable to find or open job buffer" \
); +            }
+            else
+            {
+                const char* pErr=0;
+                UINT32 line=0;
+                parser.GetLastError( &pErr, &line );
+                HXTLOG(LC_APP_ERROR, JOBFILE, "XML parsing error in buffer: line#: \
%d, error: %s", line, pErr ); +            }
+            return HXR_FAIL;
+        }
 
-		CHXTElement& elemEncodingJob = (CHXTElement&) parser.GetRootElement();
+        CHXTElement& elemEncodingJob = (CHXTElement&) parser.GetRootElement();
 
-		if ( !elemEncodingJob || strcasecmp(elemEncodingJob.GetName(), kPropEncodingJob ) \
                != 0  )
-		{
-			HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, "No <%s> root element found", \
                kPropEncodingJob);
-			res = HXR_FAIL;
-		}
+        if ( !elemEncodingJob || strcasecmp(elemEncodingJob.GetName(), \
kPropEncodingJob ) != 0  ) +        {
+            HXTLOG_APPROVED(LC_APP_ERROR, JOBFILE, "No <%s> root element found", \
kPropEncodingJob); +            res = HXR_FAIL;
+        }
 
-		CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);	
-		if (SUCCEEDED(res))
-			res = cSerializer.Init(m_spFactory, bForceInit, &xv);
+        CHXTSerializerUtils cSerializer(CHXTXMLVersionedIO::JOB_FILE);  
+        if (SUCCEEDED(res))
+            res = cSerializer.Init(m_spFactory, bForceInit, &xv);
 
-		if (SUCCEEDED(res))
-			res = cSerializer.VerifyVersion(elemEncodingJob, "");
+        if (SUCCEEDED(res))
+            res = cSerializer.VerifyVersion(elemEncodingJob, "");
 
-		if (SUCCEEDED(res))
-			res = cSerializer.ReadEncodingJob(elemEncodingJob, pJob);
-	}
-	else
-	{
-		res = HXR_FAIL;
-	}
+        // Do token substitution on CHXTElement encoding job
+        if (SUCCEEDED(res))
+        {   
+            HXTElementTokenReplacer pTokenReplacer(elemEncodingJob, m_spFactory);
+            pTokenReplacer.ReplaceTokens();
+        }
+
+        if (SUCCEEDED(res))
+            res = cSerializer.ReadEncodingJob(elemEncodingJob, pJob);
+    }
+    else
+    {
+        res = HXR_FAIL;
+    }
     
     return res;
 }
@@ -320,8 +344,8 @@
 {
     HX_RESULT res = HXR_OK;
     
-	HX_ASSERT(FALSE);
-	res = HXR_FAIL;
+    HX_ASSERT(FALSE);
+    res = HXR_FAIL;
 
 /*    
     UINT32 ic = spParInput->GetInputCount();
@@ -388,8 +412,8 @@
 {
     HX_RESULT res = HXR_OK;
 
-	HX_ASSERT(FALSE);
-	res = HXR_FAIL;
+    HX_ASSERT(FALSE);
+    res = HXR_FAIL;
 /*    
     UINT32 ic = spSeqInput->GetInputCount();
     if ( ic == 0 )

Index: settingsadvisor.cpp
===================================================================
RCS file: /cvsroot/client/encodesvc/engine/encsession/settingsadvisor.cpp,v
retrieving revision 1.1.2.35
retrieving revision 1.1.2.36
diff -u -d -r1.1.2.35 -r1.1.2.36
--- settingsadvisor.cpp	26 Jan 2010 04:12:50 -0000	1.1.2.35
+++ settingsadvisor.cpp	27 Jan 2010 08:52:17 -0000	1.1.2.36
@@ -876,8 +876,8 @@
     {
         // Save the file name
         m_strBufferFileName = pszXMLFile;
-	    // Save the job file name
-		m_strJobFileName = pszXMLFile;
+        // Save the job file name
+        m_strJobFileName = pszXMLFile;
         // Call ValidateJobBuffer()
         retVal = ValidateJobBuffer(pBuffer, bXSDOnly, rbValid, rpMsgList, pValues);
         // Clear the file name
@@ -966,10 +966,24 @@
                             pJobFileBuffer->Set((const unsigned char*)((const char*) \
                m_strJobFileName), m_strJobFileName.GetLength() + 1);
                             retVal = pValues->SetPropertyCString("JobPath", \
pJobFileBuffer);  }
+						HX_RELEASE(pJobFileBuffer);
                     }
 
-                    HXTBagTokenReplacer pTokenReplacer(pBag, pValues);
-                    pTokenReplacer.ReplaceTokens();
+                    if(SUCCEEDED(retVal))
+                    {
+                        // QI for CCF from the context
+                        IHXCommonClassFactory* pCCF = NULL;
+                        retVal = \
m_pContext->QueryInterface(IID_IHXCommonClassFactory, (void**) &pCCF); +
+                        if(SUCCEEDED(retVal))
+                        {
+                            HXTBagTokenReplacer pTokenReplacer(pBag, pValues, pCCF);
+                            pTokenReplacer.ReplaceTokens();
+							
+                        }
+
+                        HX_RELEASE(pCCF);
+                    }
                 }
 
                 if (SUCCEEDED(retVal))


_______________________________________________
Client-cvs mailing list
Client-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/client-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic