securityanddataprivacytools/securitytools/certapp/encdec/encdec.inl
changeset 0 2c201484c85f
child 8 35751d3474b7
equal deleted inserted replaced
-1:000000000000 0:2c201484c85f
       
     1 /*
       
     2 * Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 template <class T>
       
    20 inline REncodeWriteStream& operator<<(REncodeWriteStream& aStream,const T& anObject)
       
    21 {
       
    22 	const std::string &name = anObject.Name();
       
    23 
       
    24 	if(!aStream.Quiet())
       
    25 		{
       
    26 		// Generate human readable progress
       
    27 		REncodeWriteStream tmp(prog);
       
    28 		tmp << anObject;
       
    29 		}
       
    30 
       
    31 	if(aStream.HumanReadable())
       
    32 		{
       
    33 		if(anObject.CommentOnlyInHumanMode() && !aStream.Verbose())
       
    34 			{
       
    35 			return aStream;
       
    36 			}
       
    37 		
       
    38 		aStream.WriteIndent();
       
    39 		if(anObject.CommentOnlyInHumanMode())
       
    40 			{
       
    41 			aStream.WriteByte('#');
       
    42 			}
       
    43 		aStream.WriteBin(name.data(), name.size());
       
    44 		aStream.WriteSpace();
       
    45 		EncodeHuman(aStream, anObject.Value());
       
    46 		aStream.WriteLineEnd();
       
    47 		}
       
    48 	else
       
    49 		{
       
    50 		// Just write as binary "store" format
       
    51 		aStream.StoreWriteStream() << anObject.Value();
       
    52 		}
       
    53 	return aStream;
       
    54 }
       
    55 
       
    56 template <typename T>
       
    57 REncodeWriteStream& operator<<(REncodeWriteStream& aStream, const EncDecEnum<T> &aEncDecEnum)
       
    58 {
       
    59 	const std::string &name = aEncDecEnum.Name();
       
    60 
       
    61 	if(!aStream.Quiet())
       
    62 		{
       
    63 		// Generate human readable progress
       
    64 		REncodeWriteStream tmp(prog);
       
    65 		tmp << aEncDecEnum;
       
    66 		}
       
    67 
       
    68 	if(aStream.HumanReadable())
       
    69 		{
       
    70 		if(aEncDecEnum.CommentOnlyInHumanMode() && !aStream.Verbose())
       
    71 			{
       
    72 			return aStream;
       
    73 			}
       
    74 		aStream.WriteIndent();
       
    75 		if(aEncDecEnum.CommentOnlyInHumanMode())
       
    76 			{
       
    77 			aStream.WriteByte('#');
       
    78 			}
       
    79 		aStream.WriteBin(name.data(), name.size());
       
    80 		aStream.WriteSpace();
       
    81 		const char *enumName = aEncDecEnum.ValueName();
       
    82 		if(enumName)
       
    83 			{
       
    84 			aStream.WriteByte('"');
       
    85 			aStream.WriteBin(enumName, strlen(enumName));
       
    86 			aStream.WriteByte('"');
       
    87 			if(aStream.Verbose())
       
    88 				{
       
    89 				// In verbose mode so include numeric value as a comment
       
    90 				aStream.WriteCStr(" # ");
       
    91 				EncodeHuman(aStream, TUint32(aEncDecEnum.Value()));		
       
    92 				}
       
    93 			}
       
    94 		else
       
    95 			{
       
    96 			// Symbolic value not available, so write as numeric
       
    97 			EncodeHuman(aStream, TUint32(aEncDecEnum.Value()));		
       
    98 			}
       
    99 		aStream.WriteLineEnd();
       
   100 		}
       
   101 	else
       
   102 		{
       
   103 		// Just write as binary "store" format
       
   104 		aStream.StoreWriteStream() << aEncDecEnum.Value();
       
   105 		}
       
   106 	return aStream;
       
   107 }
       
   108 
       
   109 
       
   110 template <class T>
       
   111 inline RDecodeReadStream& operator>>(RDecodeReadStream& aStream,T& anObject)
       
   112 {
       
   113 	const std::string &name = anObject.Name();
       
   114 	if(aStream.HumanReadable())
       
   115 		{
       
   116 		if(anObject.CommentOnlyInHumanMode())
       
   117 			{
       
   118 			return aStream; // Not accepted in human mode, so just return...
       
   119 			}
       
   120 		// Need to convert to ascii
       
   121 		aStream.CheckName(name);
       
   122 		DecodeHuman(aStream, anObject.Value());
       
   123 		}
       
   124 	else
       
   125 		{
       
   126 		// Just read binary
       
   127 		aStream.iReadStream >> anObject.Value();
       
   128 		}
       
   129 
       
   130 	// Generate human readable progress
       
   131 	//	prog.WriteIndent();
       
   132 	REncodeWriteStream tmp(prog);
       
   133 	tmp << anObject;
       
   134 
       
   135 	return aStream;
       
   136 }
       
   137 
       
   138 template <typename T>
       
   139 RDecodeReadStream& operator>>(RDecodeReadStream& aStream, EncDecEnum<T> &aEncDecEnum)
       
   140 {
       
   141 	const std::string &name = aEncDecEnum.Name();
       
   142 	if(aStream.HumanReadable())
       
   143 		{
       
   144 		if(aEncDecEnum.CommentOnlyInHumanMode())
       
   145 			{
       
   146 			return aStream; // Not accepted in human mode, so just return...
       
   147 			}
       
   148 		// Need to convert to ascii
       
   149 		aStream.CheckName(name);
       
   150 
       
   151 		aStream.ReadNextToken();
       
   152 		aEncDecEnum.SetValue(aStream.Token().c_str());
       
   153 		}
       
   154 	else
       
   155 		{
       
   156 		// Just read binary
       
   157 		aStream.iReadStream >> aEncDecEnum.Value();
       
   158 		}
       
   159 
       
   160 	// Generate human readable progress
       
   161 	//	prog.WriteIndent();
       
   162 	REncodeWriteStream tmp(prog);
       
   163 	tmp << aEncDecEnum;
       
   164 
       
   165 	return aStream;
       
   166 }
       
   167 
       
   168 
       
   169 
       
   170 template<typename T>
       
   171 EncDecEnum<T>::EncDecEnum(const char *aName, const EnumEntry *aEnumEntries, bool aCommentOnlyInHumanMode)
       
   172 	: iName(aName), iEnumEntries(aEnumEntries), iCommentOnlyInHumanMode(aCommentOnlyInHumanMode), iValue(0)
       
   173 {
       
   174 	if(iEnumEntries == 0)
       
   175 		{
       
   176 		FatalError(); // programing error
       
   177 		}
       
   178 }
       
   179 
       
   180 
       
   181 
       
   182 template<typename T>
       
   183 void EncDecEnum<T>::SetValue(const T &aValue)
       
   184 {
       
   185 	// Search enum entires which one which matches
       
   186 	if(ValueToName(aValue) == 0)
       
   187 		{
       
   188 		dbg << Log::Endl();
       
   189 		dbg << Log::Indent() << "Unknown value for enum " << iName << " value " << TUint32(aValue) << Log::Endl();
       
   190 		//		FatalError();
       
   191 		}
       
   192 
       
   193 	iValue = aValue;
       
   194 	return;
       
   195 }
       
   196 
       
   197 template<typename T>
       
   198 void EncDecEnum<T>::SetValue(const char *aName)
       
   199 {
       
   200 	// Search enum entires which one which matches
       
   201 	const EnumEntry *p = iEnumEntries;
       
   202 	while(p && p->iName)
       
   203 		{
       
   204 		// We ignore case when matching enums
       
   205 		if(strcasecmp(aName, p->iName) == 0)
       
   206 			{
       
   207 			// Found it
       
   208 			iValue = p->iValue;
       
   209 			return;
       
   210 			}
       
   211 		++p;
       
   212 		}
       
   213 
       
   214 	dbg << Log::Endl();
       
   215 	dbg << Log::Indent() << "Unknown value for enum " << iName << " value '" << aName << "'" << Log::Endl();
       
   216 	std::string str(aName);
       
   217 	iValue = ReadUnsignedNumber(str,sizeof(T));
       
   218 }
       
   219 
       
   220 template<typename T>
       
   221 const char *EncDecEnum<T>::ValueToName(const T &aValue) const
       
   222 {
       
   223 	if(iEnumEntries == 0) FatalError();
       
   224 	const EnumEntry *p = iEnumEntries;
       
   225 	while(p && p->iName)
       
   226 		{
       
   227 		if(p->iValue == aValue)
       
   228 			{
       
   229 			return p->iName;
       
   230 			}
       
   231 		++p;
       
   232 		}
       
   233 	return 0;
       
   234 }
       
   235 
       
   236 
       
   237 // end of file