// --------------------------------------------------------------------------------- // CUpnpTmFilteredAppList::ParseAppFilterStringL // Method parses the descriptor containing the filter string // It parses the comma-separated list of A_ARG_TYPE_AppList schema // elements, attributes and their values // eg: "name="*Audio*",description="*",icon@mimetype="*svg+xml*", remotingInfo@protocolID="*", // appInfo@appCategory="*",audioInfo@audioType="*",resourceStatus="free",signature="*"" // @param aAppFilter Buffer containing application filter string // @param aErr[out] Terminal Mode error code // --------------------------------------------------------------------------------- // void CUpnpTmFilteredAppList::ParseAppFilterStringL( const TDesC8& aAppFilter, TTerminalModeErrorCode& aErr ) { OstTraceFunctionEntry0( CUPNPTMFILTEREDAPPLIST_PARSEAPPFILTERSTRINGL_ENTRY ); // Validate the filter string aErr = ETerminalModeSuccess; TInt quotePos = aAppFilter.Locate( KQuote ); if ( ( quotePos != 0 ) || ( aAppFilter.Find(KDoubleQuote) == KErrNotFound )) { // corrupt filter string aErr = ETerminalModeInvalidArgument; OstTrace1( TRACE_ERROR, DUP2_CUPNPTMFILTEREDAPPLIST_PARSEAPPFILTERSTRINGL, "CUpnpTmFilteredAppList::ParseAppFilterStringL;quotePos=%d", quotePos ); return; } RBuf8 filterBuffer; CleanupClosePushL(filterBuffer); /* Create a buffer having the content of AppFilter buffer but without the leading quote(") */ filterBuffer.CreateL(aAppFilter.Mid(quotePos+1)); TInt equalToQuoteToken; while( ( equalToQuoteToken = filterBuffer.Find(Keq)) != KErrNotFound ) { // Fetch the full key string TPtrC8 key = filterBuffer.Left(equalToQuoteToken); // Check for the presence of sub element by checking the @ in the key string TInt atTokenPos = key.Find(KAtToken); TBool displayInfo(EFalse); if ( atTokenPos != KErrNotFound ) { // @ is found in the key string // Now extract the parent element TPtrC8 parentKey = key.Left(atTokenPos); //Remove any leading and trailing whitespaces in the parent element const TDesC8& parentKeyWithoutSpace = RemoveWhiteSpace(parentKey); // Check if the parent elemet is one of desired element or not. // It should be one of the following : // <1> icon <2> remotingInfo <3> appInfo <4> displayInfo <5> audioInfo if ( ( parentKeyWithoutSpace.Compare(KIconElement) != KErrNone ) && ( parentKeyWithoutSpace.Compare(KRemotingInfo) != KErrNone ) && ( parentKeyWithoutSpace.Compare(KAppInfo) != KErrNone ) && ( parentKeyWithoutSpace.Compare(KDisplayInfo) != KErrNone ) && ( parentKeyWithoutSpace.Compare(KAudioInfo) != KErrNone ) ) { // parent element is not proper aErr = ETerminalModeInvalidArgument; break; } if ( parentKeyWithoutSpace.Compare(KDisplayInfo) == KErrNone ) { // The parent key element is displayInfo displayInfo = ETrue; } // Fetch the actual key name ( child element ) key.Set(key.Mid(atTokenPos+1)); } //Remove any leading and trailing whitespaces in the key const TDesC8& keyWithoutSpace = RemoveWhiteSpace(key); if ( (filterBuffer.Mid(equalToQuoteToken) ).Locate(KQuote) != 1 ) { // Missing quote(") ahead of the value aErr = ETerminalModeInvalidArgument; break; } TPtrC8 bufPtr = filterBuffer.Mid(equalToQuoteToken+2); quotePos = bufPtr.Locate( KQuote ); if ( quotePos == KErrNotFound ) { // missing quote (") at the end of the value aErr = ETerminalModeInvalidArgument; break; } /* Add the filter info as key-value pairs. // Also check if the parent key is display info. If display info flag is true then use the method with non default parameter */ if ( displayInfo ) { iFilterInfo->SetFilterInfoL( keyWithoutSpace, bufPtr.Left(quotePos), aErr, ETrue ); } else { // Use the method with default parameter iFilterInfo->SetFilterInfoL( keyWithoutSpace, bufPtr.Left(quotePos), aErr ); } if ( aErr != ETerminalModeSuccess ) { // Return the error code in case the key element is not as per the schema aErr = ETerminalModeInvalidArgument; break; } // Skip the quote position and set the buffer bufPtr.Set(bufPtr.Mid(quotePos+1)); if ( ( bufPtr.Locate(KCommaSeparator) != 0 ) && ( bufPtr.Locate(KQuote) != 0 ) ) { // missing quote (") or comma (,) following the quote. // Expected to be something of this kind ( ", or "" ) aErr = ETerminalModeInvalidArgument; break; } //Copy the residual content skipping two characters(", or "" ) in the actual buffer filterBuffer.Copy(bufPtr.Mid(UpnpString::KLinefeedLength)); } CleanupStack::PopAndDestroy(&filterBuffer); OstTrace1( TRACE_FLOW, CUPNPTMFILTEREDAPPLIST_PARSEAPPFILTERSTRINGL, "CUpnpTmFilteredAppList::ParseAppFilterStringL;aErr=%d", aErr ); OstTraceFunctionExit0( CUPNPTMFILTEREDAPPLIST_PARSEAPPFILTERSTRINGL_EXIT ); }
/** * Write the file to the hard drive. * * @param aFileName * @param aBodyPartArray */ void CMultipartTestContainer::WriteFileL( const TDesC& aFileName, RPointerArray<CBodyPart>& aBodyPartArray ) { RFs fs; fs.Connect(); CleanupClosePushL(fs); RFile output; TInt err = output.Open(fs, aFileName, EFileWrite); if (err == KErrNotFound) { User::LeaveIfError(output.Create(fs, aFileName, EFileWrite)); } // output file TInt size = aBodyPartArray.Count(); TInt i; _LIT8(KEol, "\r\n"); for (i = 0; i < size; i++) { CBodyPart* bodyPart = aBodyPartArray[i]; if( bodyPart->Url().Ptr() ) { output.Write(_L8("***************Ur")); output.Write(KEol); RBuf8 narrow; err = narrow.Create(bodyPart->Url().Length()*2); if (err != KErrNone) { INFO_PRINTF1(_L("Error printing Url to output file; continueing...")); } narrow.Copy(bodyPart->Url()); output.Write(narrow.Left(narrow.Length())); output.Write(KEol); } if( bodyPart->ContentID().Ptr() ) { output.Write(_L8("***************ContentID")); output.Write(KEol); output.Write(bodyPart->ContentID() ); output.Write(KEol); } if( bodyPart->Charset().Ptr() ) { output.Write(_L8("***************Charset")); output.Write(KEol); output.Write( bodyPart->Charset() ); output.Write(KEol); } if( bodyPart->ContentType().Ptr() ) { output.Write(_L8("***************ContentType")); output.Write(KEol); output.Write( bodyPart->ContentType() ); output.Write(KEol); } if( bodyPart->Headers().Ptr() ) { output.Write(_L8("***************Headers")); output.Write(KEol); output.Write(bodyPart->Headers() ); output.Write(KEol); } if( bodyPart->Body().Ptr() ) { output.Write(_L8("***************Body")); output.Write(KEol); output.Write(bodyPart->Body() ); output.Write(KEol); } output.Write(_L8("=========================================part ends")); output.Write(KEol); } // end of loop output.Close(); CleanupStack::PopAndDestroy(1, &fs); fs.Close(); }