diff -r 5f8e5adbbed9 -r 29cda98b007e engine/src/PodcastUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/src/PodcastUtils.cpp Thu Feb 25 14:29:19 2010 +0000 @@ -0,0 +1,206 @@ +/* +* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB +* +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* EmbedDev AB - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include +#include // for ELineBreak +#include "PodcastUtils.h" +#include "debug.h" +#include "FeedEngine.h" // for KMaxDescriptionLength + +EXPORT_C void PodcastUtils::FixProtocolsL(TDes &aUrl) + { + HBufC* urlCopy = aUrl.AllocLC(); + TPtr urlCopyPtr (urlCopy->Des()); + urlCopyPtr.LowerCase(); + + // url is always present so access that + // Some pod links are written in format itpc://mylink.net/podcast.xml + // Symbian HTTP stack does not like itpc:// + // Try to use a HTTP instead. + TInt p = urlCopyPtr.Find(KItpcPrefix); + if (p >= 0) + { + aUrl.Delete(p, KItpcPrefix().Length()); + } + + // Some pod links are written in format pcast://mylink.net/podcast.xml + // Symbian HTTP stack does not like itpc:// + // Try to use a HTTP instead. + p = urlCopyPtr.Find(KPcastPrefix); + if (p >= 0) + { + aUrl.Delete(p, KPcastPrefix().Length()); + } + + // The URL must start with http://, otherwise the HTTP stack fails. + TInt pos = urlCopyPtr.Find(KURLPrefix); + if (pos == KErrNotFound) + { + HBufC* newUrl = HBufC::NewL(aUrl.Length() + KURLPrefix().Length()); + TPtr ptr = newUrl->Des(); + ptr.Append(KURLPrefix()); + ptr.Append(aUrl); + + // replace the url buffer + aUrl.Copy(*newUrl); + delete newUrl; + } + + CleanupStack::PopAndDestroy(urlCopy); + } + + +EXPORT_C void PodcastUtils::CleanHtmlL(TDes &str) +{ +#ifdef UIQ + _LIT(KLineBreak, "\r\n"); +#else + const TChar KLineBreak(CEditableText::ELineBreak); +#endif + _LIT(KNewLine, "\n"); + ReplaceString(str, KNewLine, KNullDesC); + +// DP2("CleanHtml %d, %S", str.Length(), &str); + TInt startPos = str.Locate('<'); + TInt endPos = str.Locate('>'); + //DP3("length: %d, startPos: %d, endPos: %d", str.Length(), startPos, endPos); + HBufC* tmpBuf = HBufC::NewLC(KMaxDescriptionLength); + TPtr tmp(tmpBuf->Des()); + while (startPos != KErrNotFound && endPos != KErrNotFound && endPos > startPos) { + //DP1("Cleaning out %S", &str.Mid(startPos, endPos-startPos+1)); + tmp.Copy(str.Left(startPos)); + TPtrC ptr=str.Mid(startPos, endPos-startPos+1); + _LIT(KHtmlBr, "
"); + _LIT(KHtmlBr2, "
"); + _LIT(KHtmlBr3, "
"); + _LIT(KHtmlP, "

"); + if (ptr.CompareF(KHtmlBr)== 0 || ptr.CompareF(KHtmlBr2)== 0 || ptr.CompareF(KHtmlBr3)== 0) + { + tmp.Append(KLineBreak); + } + else if (ptr.CompareF(KHtmlP) == 0) + { + tmp.Append(KLineBreak); + tmp.Append(KLineBreak); + } + + if (str.Length() > endPos+1) { + tmp.Append(str.Mid(endPos+1)); + } + + str.Copy(tmp); + startPos = str.Locate('<'); + endPos = str.Locate('>'); + } + + str.Trim(); + _LIT(KAmp, "&"); + _LIT(KQuot, """); + _LIT(KNbsp, " "); + _LIT(KCopy, "©"); + _LIT(KCopyReplacement, "(c)"); + if(str.Locate('&') != KErrNotFound) { + ReplaceString(str, KAmp, KNullDesC); + ReplaceString(str, KQuot, KNullDesC); + ReplaceString(str, KNbsp, KNullDesC); + ReplaceString(str, KCopy, KCopyReplacement); + } + ReplaceChar(str, '"', '\''); + + CleanupStack::PopAndDestroy(tmpBuf); +} + +EXPORT_C void PodcastUtils::ReplaceString(TDes & aString, const TDesC& aStringToReplace, const TDesC& aReplacement) + { + TInt pos=aString.Find(aStringToReplace); + TInt offset = 0; + while (pos != KErrNotFound) + { + aString.Replace(offset+pos, aStringToReplace.Length(), aReplacement); + offset += pos + aStringToReplace.Length()+1; + if (offset > aString.Length()) + { + return; + } + + pos=aString.Mid(offset).Find(aStringToReplace); + } + } + +EXPORT_C void PodcastUtils::ReplaceChar(TDes & aString, TUint aCharToReplace, TUint aReplacement) + { + TInt strLen=aString.Length(); + for (TInt i=0; i < strLen; i++) + { + if (aString[i] == aCharToReplace) + { + aString[i] = aReplacement; + } + } + } + +EXPORT_C void PodcastUtils::EnsureProperPathName(TFileName &aPath) + { + // from the SDK: The following characters cannot occur in the path: < >: " / |* + + ReplaceChar(aPath, '/', '_'); // better not to add \\ in case we have multiple / + ReplaceChar(aPath, ':', '_'); + ReplaceChar(aPath, '?', '_'); + ReplaceChar(aPath, '|', '_'); + ReplaceChar(aPath, '*', '_'); + ReplaceChar(aPath, '<', '_'); + ReplaceChar(aPath, '>', '_'); + ReplaceChar(aPath, '"', '_'); + + //buf.Append(_L("\\")); + } + +EXPORT_C void PodcastUtils::FileNameFromUrl(const TDesC& aUrl, TFileName &aFileName) + { + TInt pos = aUrl.LocateReverse('/'); + + if (pos != KErrNotFound) + { + TPtrC str = aUrl.Mid(pos+1); + pos = str.Locate('?'); + if (pos != KErrNotFound) + { + aFileName.Copy(str.Left(pos)); + } + else + { + aFileName.Copy(str); + } + } + DP2("FileNameFromUrl in: %S, out: %S", &aUrl, &aFileName); + } + +EXPORT_C void PodcastUtils::SQLEncode(TDes &aString) + { + ReplaceString(aString, _L("\""), _L("\"\"")); + //ReplaceString(aString, _L("'"), _L("''")); + } + +EXPORT_C void PodcastUtils::XMLEncode(TDes &aString) + { + ReplaceString(aString, _L("\""), _L(""")); + ReplaceString(aString, _L("<"), _L("<")); + ReplaceString(aString, _L(">"), _L(">")); + ReplaceString(aString, _L("&"), _L("&")); + }