diff options
Diffstat (limited to 'symbian/PerlUtil.cpp')
-rw-r--r-- | symbian/PerlUtil.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/symbian/PerlUtil.cpp b/symbian/PerlUtil.cpp new file mode 100644 index 0000000000..75c2cffe39 --- /dev/null +++ b/symbian/PerlUtil.cpp @@ -0,0 +1,116 @@ +/* Copyright (c) 2004-2005 Nokia. All rights reserved. */ + +/* The PerlUtil class is licensed under the same terms as Perl itself. */ + +/* See PerlUtil.pod for documentation. */ + +#define PERLUTIL_CPP + +#include "PerlUtil.h" + +#include <utf.h> + +#undef Copy + +EXPORT_C SV* PerlUtil::newSvPVfromTDesC8(const TDesC8& aDesC8) { + dTHX; + return newSVpvn((const char *)aDesC8.Ptr(), aDesC8.Size()); +} + +EXPORT_C void PerlUtil::setSvPVfromTDesC8(SV* sv, const TDesC8& aDesC8) { + dTHX; + sv_setpvn(sv, (const char *)aDesC8.Ptr(), aDesC8.Size()); +} + +EXPORT_C HBufC8* PerlUtil::newHBufC8fromSvPV(SV* sv) { + dTHX; + return PerlUtil::newHBufC8fromPVn((const U8 *)SvPV_nolen(sv), SvLEN(sv)); +} + +EXPORT_C void PerlUtil::setTDes8fromSvPV(TDes8& aDes8, SV* sv) { + dTHX; + PerlUtil::setTDes8fromPVn(aDes8, (const U8 *)SvPV_nolen(sv), SvLEN(sv)); +} + +EXPORT_C SV* PerlUtil::newSvPVfromTDesC16(const TDesC16& aDesC16) { + dTHX; + SV* sv = NULL; + HBufC8* hBuf8 = HBufC8::New(aDesC16.Length() * 3); + + if (hBuf8) { + TPtr8 aPtr8(hBuf8->Des()); + CnvUtfConverter::ConvertFromUnicodeToUtf8(aPtr8, aDesC16); + sv = newSVpvn((const char *)(hBuf8->Ptr()), hBuf8->Size()); + delete hBuf8; + hBuf8 = NULL; + SvUTF8_on(sv); + } + + return sv; +} + +EXPORT_C void PerlUtil::setSvPVfromTDesC16(SV* sv, const TDesC16& aDesC16) { + dTHX; + HBufC8* hBuf8 = HBufC8::New(aDesC16.Length() * 3); + + if (hBuf8) { + TPtr8 aPtr8(hBuf8->Des()); + CnvUtfConverter::ConvertFromUnicodeToUtf8(aPtr8, aDesC16); + sv_setpvn(sv, (const char *)(hBuf8->Ptr()), hBuf8->Size()); + delete hBuf8; + hBuf8 = NULL; + SvUTF8_on(sv); + } +} + +EXPORT_C HBufC16* PerlUtil::newHBufC16fromSvPV(SV* sv) { + dTHX; + return PerlUtil::newHBufC16fromPVn((const U8 *)SvPV_nolen(sv), SvLEN(sv), SvUTF8(sv)); +} + +void PerlUtil::setTDes16fromSvPV(TDes16& aDes16, SV* sv) { + dTHX; + PerlUtil::setTDes16fromPVn(aDes16, (const U8 *)SvPV_nolen(sv), SvLEN(sv), SvUTF8(sv)); +} + +EXPORT_C HBufC8* PerlUtil::newHBufC8fromPVn(const U8* s, STRLEN n) { + HBufC8* aBuf8 = HBufC8::New(n); + if (aBuf8) { + TPtr8 ptr8 = aBuf8->Des(); + ptr8.Copy(s, n); + } + return aBuf8; +} + +EXPORT_C void PerlUtil::setTDes8fromPVn(TDes8& aDes8, const U8* s, STRLEN n) { + // TODO: grow aDes8 if needed + aDes8.Copy(s, n); +} + +EXPORT_C HBufC16* PerlUtil::newHBufC16fromPVn(const U8 *s, STRLEN n, bool utf8) { + HBufC16 *hBuf16 = HBufC16::New(n); // overallocate + + if (hBuf16) { + if (utf8) { + TPtr16 aPtr16(hBuf16->Des()); + TPtrC8 aPtrC8(s, n); + CnvUtfConverter::ConvertToUnicodeFromUtf8(aPtr16, aPtrC8); + } else { + TPtrC8 aPtrC8(s, n); + hBuf16->Des().Copy(aPtrC8); + } + } + + return hBuf16; +} + +EXPORT_C void PerlUtil::setTDes16fromPVn(TDes16& aDes16, const U8 *s, STRLEN n, bool utf8) { + // TODO: grow aDes16 if needed + if (utf8) { + TPtrC8 aPtrC8(s, n); + CnvUtfConverter::ConvertToUnicodeFromUtf8(aDes16, aPtrC8); + } else { + TPtrC8 aPtrC8(s, n); + aDes16.Copy(aPtrC8); + } +} |