os/security/securityanddataprivacytools/securitytools/certapp/encdec/encdec.inl
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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
   238