diff -r 4ca382093dae -r 493058e57c8c networkingutils/ipadministrationtool/src/uniload.cpp --- /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; + }