networkingutils/ipadministrationtool/src/uniload.cpp
branchRCL_3
changeset 11 493058e57c8c
parent 0 9736f095102e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkingutils/ipadministrationtool/src/uniload.cpp	Wed Sep 01 12:30:50 2010 +0100
@@ -0,0 +1,90 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// uniload.cpp - universal file load (work for narrow or wide builds)
+//
+
+#include "uniload.h"
+
+HBufC *UnicodeLoad::LoadL(RFs &aFs, const TDesC &aName)
+	{
+	RFile pf;
+	TInt size;
+	User::LeaveIfError(pf.Open(aFs, aName, EFileShareAny));
+	pf.Size(size);
+	//
+	// For narrow build, this allocates exactly right amount
+	// of space, for Unicode build, this allocates the size
+	// doubled in bytes, which is exactly what we want, if
+	// we need to widen the narrow Ascii control file (this
+	// is assumed to be the default case). For UNICODE file
+	// in UNICODE environment, this allocates too much space.
+	//
+	HBufC *data = HBufC::New(size);
+
+	if (data == NULL)
+		{
+		pf.Close();
+		User::Leave(KErrNoMemory);
+		}
+	//
+	// buf is "native" pointer, either 16 or 8 wide
+	//
+	TPtr buf(data->Des());
+#ifdef __WINS__
+	buf.Set(data->Des());		// VC6 kludge
+#endif
+	//
+	// ptr is always 8 wide
+	//
+	TPtr8 ptr((TUint8 *)buf.Ptr(), size, size);
+	pf.Read(ptr);
+	pf.Close();
+
+	if (size >= 2 && ptr[0] == 0xFF && ptr[1] == 0xFE)
+		{
+		//
+		// The file is presented as UNICODE text
+		// (for now, only one byte order supported)
+		//
+		size -= 2;
+#ifdef _UNICODE
+		Mem::Copy((TUint8 *)ptr.Ptr(), ptr.Ptr() + 2, size);
+		buf.SetLength(size / 2);	// True number of Unicode characters.
+#else
+		// Trying to load a Unicode file for Narrow build
+		size = size / 2;
+		for (TInt i = 1; i < size; ++i)
+			{
+			if (ptr[2*i] != 0)
+				ptr[i] = 0x01;	// Substitute too wide stuff with 0x1
+			else
+				ptr[i] = ptr[2*i + 1];
+			}
+		buf.SetLength(size); 
+#endif
+		}
+	else
+		{
+		//
+		// The file is narrow, 8 bit characters
+		//
+		buf.SetLength(size); 
+#ifdef _UNICODE
+		// Must "widen" the characters for unicode.
+		for (TInt i = size; --i >= 0; )
+			buf[i] = ptr[i];
+#endif
+		}
+	return data;
+	}